mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Sprinkle some constexpr around to make Jason happy
Most of these will not matter in practice due to C++14 imposing significant limitations on what else we can make constexpr, and we cannot have references outliving the constexpr context either way.
This commit is contained in:
		| @@ -195,7 +195,6 @@ set(IMPL_SOURCES | |||||||
|   ${SOURCES_DIR}/internal/catch_random_seed_generation.cpp |   ${SOURCES_DIR}/internal/catch_random_seed_generation.cpp | ||||||
|   ${SOURCES_DIR}/internal/catch_reporter_registry.cpp |   ${SOURCES_DIR}/internal/catch_reporter_registry.cpp | ||||||
|   ${SOURCES_DIR}/internal/catch_reporter_spec_parser.cpp |   ${SOURCES_DIR}/internal/catch_reporter_spec_parser.cpp | ||||||
|   ${SOURCES_DIR}/internal/catch_result_type.cpp |  | ||||||
|   ${SOURCES_DIR}/internal/catch_reusable_string_stream.cpp |   ${SOURCES_DIR}/internal/catch_reusable_string_stream.cpp | ||||||
|   ${SOURCES_DIR}/internal/catch_run_context.cpp |   ${SOURCES_DIR}/internal/catch_run_context.cpp | ||||||
|   ${SOURCES_DIR}/internal/catch_section.cpp |   ${SOURCES_DIR}/internal/catch_section.cpp | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ namespace Catch { | |||||||
|             int high_mild = 0;      // 1.5 to 3 times IQR above Q3 |             int high_mild = 0;      // 1.5 to 3 times IQR above Q3 | ||||||
|             int high_severe = 0;    // more than 3 times IQR above Q3 |             int high_severe = 0;    // more than 3 times IQR above Q3 | ||||||
|  |  | ||||||
|             int total() const { |             constexpr int total() const { | ||||||
|                 return low_severe + low_mild + high_mild + high_severe; |                 return low_severe + low_mild + high_mild + high_severe; | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|  |  | ||||||
| namespace Catch { | namespace Catch { | ||||||
|  |  | ||||||
|     AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression): |     AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const& _lazyExpression): | ||||||
|         lazyExpression(_lazyExpression), |         lazyExpression(_lazyExpression), | ||||||
|         resultType(_resultType) {} |         resultType(_resultType) {} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,26 +22,26 @@ namespace Catch { | |||||||
|         static_assert(sizeof(TestCaseProperties) == sizeof(TCP_underlying_type), |         static_assert(sizeof(TestCaseProperties) == sizeof(TCP_underlying_type), | ||||||
|                       "The size of the TestCaseProperties is different from the assumed size"); |                       "The size of the TestCaseProperties is different from the assumed size"); | ||||||
|  |  | ||||||
|         TestCaseProperties operator|(TestCaseProperties lhs, TestCaseProperties rhs) { |         constexpr TestCaseProperties operator|(TestCaseProperties lhs, TestCaseProperties rhs) { | ||||||
|             return static_cast<TestCaseProperties>( |             return static_cast<TestCaseProperties>( | ||||||
|                 static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs) |                 static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs) | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         TestCaseProperties& operator|=(TestCaseProperties& lhs, TestCaseProperties rhs) { |         constexpr TestCaseProperties& operator|=(TestCaseProperties& lhs, TestCaseProperties rhs) { | ||||||
|             lhs = static_cast<TestCaseProperties>( |             lhs = static_cast<TestCaseProperties>( | ||||||
|                 static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs) |                 static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs) | ||||||
|             ); |             ); | ||||||
|             return lhs; |             return lhs; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         TestCaseProperties operator&(TestCaseProperties lhs, TestCaseProperties rhs) { |         constexpr TestCaseProperties operator&(TestCaseProperties lhs, TestCaseProperties rhs) { | ||||||
|             return static_cast<TestCaseProperties>( |             return static_cast<TestCaseProperties>( | ||||||
|                 static_cast<TCP_underlying_type>(lhs) & static_cast<TCP_underlying_type>(rhs) |                 static_cast<TCP_underlying_type>(lhs) & static_cast<TCP_underlying_type>(rhs) | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool applies(TestCaseProperties tcp) { |         constexpr bool applies(TestCaseProperties tcp) { | ||||||
|             static_assert(static_cast<TCP_underlying_type>(TestCaseProperties::None) == 0, |             static_assert(static_cast<TCP_underlying_type>(TestCaseProperties::None) == 0, | ||||||
|                           "TestCaseProperties::None must be equal to 0"); |                           "TestCaseProperties::None must be equal to 0"); | ||||||
|             return tcp != TestCaseProperties::None; |             return tcp != TestCaseProperties::None; | ||||||
| @@ -80,7 +80,7 @@ namespace Catch { | |||||||
|             return "Anonymous test case " + std::to_string(++counter); |             return "Anonymous test case " + std::to_string(++counter); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         StringRef extractFilenamePart(StringRef filename) { |         constexpr StringRef extractFilenamePart(StringRef filename) { | ||||||
|             size_t lastDot = filename.size(); |             size_t lastDot = filename.size(); | ||||||
|             while (lastDot > 0 && filename[lastDot - 1] != '.') { |             while (lastDot > 0 && filename[lastDot - 1] != '.') { | ||||||
|                 --lastDot; |                 --lastDot; | ||||||
| @@ -98,7 +98,7 @@ namespace Catch { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Returns the upper bound on size of extra tags ([#file]+[.]) |         // Returns the upper bound on size of extra tags ([#file]+[.]) | ||||||
|         size_t sizeOfExtraTags(StringRef filepath) { |         constexpr size_t sizeOfExtraTags(StringRef filepath) { | ||||||
|             // [.] is 3, [#] is another 3 |             // [.] is 3, [#] is another 3 | ||||||
|             const size_t extras = 3 + 3; |             const size_t extras = 3 + 3; | ||||||
|             return extractFilenamePart(filepath).size() + extras; |             return extractFilenamePart(filepath).size() + extras; | ||||||
| @@ -259,8 +259,4 @@ namespace Catch { | |||||||
|         return lhs.tags < rhs.tags; |         return lhs.tags < rhs.tags; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     TestCaseInfo const& TestCaseHandle::getTestCaseInfo() const { |  | ||||||
|         return *m_info; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } // end namespace Catch | } // end namespace Catch | ||||||
|   | |||||||
| @@ -109,7 +109,7 @@ namespace Catch { | |||||||
|         TestCaseInfo* m_info; |         TestCaseInfo* m_info; | ||||||
|         ITestInvoker* m_invoker; |         ITestInvoker* m_invoker; | ||||||
|     public: |     public: | ||||||
|         TestCaseHandle(TestCaseInfo* info, ITestInvoker* invoker) : |         constexpr TestCaseHandle(TestCaseInfo* info, ITestInvoker* invoker) : | ||||||
|             m_info(info), m_invoker(invoker) {} |             m_info(info), m_invoker(invoker) {} | ||||||
|  |  | ||||||
|         void prepareTestCase() const { |         void prepareTestCase() const { | ||||||
| @@ -124,7 +124,9 @@ namespace Catch { | |||||||
|             m_invoker->invoke(); |             m_invoker->invoke(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         TestCaseInfo const& getTestCaseInfo() const; |         constexpr TestCaseInfo const& getTestCaseInfo() const { | ||||||
|  |             return *m_info; | ||||||
|  |         } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     Detail::unique_ptr<TestCaseInfo> |     Detail::unique_ptr<TestCaseInfo> | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ namespace Catch { | |||||||
|         class ExceptionTranslator : public IExceptionTranslator { |         class ExceptionTranslator : public IExceptionTranslator { | ||||||
|         public: |         public: | ||||||
|  |  | ||||||
|             ExceptionTranslator( std::string(*translateFunction)( T const& ) ) |             constexpr ExceptionTranslator( std::string(*translateFunction)( T const& ) ) | ||||||
|             : m_translateFunction( translateFunction ) |             : m_translateFunction( translateFunction ) | ||||||
|             {} |             {} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ namespace Catch { | |||||||
|  |  | ||||||
|  |  | ||||||
|         template<typename T> |         template<typename T> | ||||||
|         void handleExpr( ExprLhs<T> const& expr ) { |         constexpr void handleExpr( ExprLhs<T> const& expr ) { | ||||||
|             handleExpr( expr.makeUnaryExpr() ); |             handleExpr( expr.makeUnaryExpr() ); | ||||||
|         } |         } | ||||||
|         void handleExpr( ITransientExpression const& expr ); |         void handleExpr( ITransientExpression const& expr ); | ||||||
|   | |||||||
| @@ -27,12 +27,6 @@ namespace Catch { | |||||||
|         return *Context::currentContext; |         return *Context::currentContext; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void Context::setResultCapture( IResultCapture* resultCapture ) { |  | ||||||
|         m_resultCapture = resultCapture; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void Context::setConfig( IConfig const* config ) { m_config = config; } |  | ||||||
|  |  | ||||||
|     SimplePcg32& sharedRng() { |     SimplePcg32& sharedRng() { | ||||||
|         static SimplePcg32 s_rng; |         static SimplePcg32 s_rng; | ||||||
|         return s_rng; |         return s_rng; | ||||||
|   | |||||||
| @@ -26,10 +26,15 @@ namespace Catch { | |||||||
|         friend void cleanUpContext(); |         friend void cleanUpContext(); | ||||||
|  |  | ||||||
|     public: |     public: | ||||||
|         IResultCapture* getResultCapture() const { return m_resultCapture; } |         constexpr IResultCapture* getResultCapture() const { | ||||||
|         IConfig const* getConfig() const { return m_config; } |             return m_resultCapture; | ||||||
|         void setResultCapture( IResultCapture* resultCapture ); |         } | ||||||
|         void setConfig( IConfig const* config ); |         constexpr IConfig const* getConfig() const { return m_config; } | ||||||
|  |         constexpr void setResultCapture( IResultCapture* resultCapture ) { | ||||||
|  |             m_resultCapture = resultCapture; | ||||||
|  |         } | ||||||
|  |         constexpr void setConfig( IConfig const* config ) { m_config = config; } | ||||||
|  |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     Context& getCurrentMutableContext(); |     Context& getCurrentMutableContext(); | ||||||
|   | |||||||
| @@ -157,6 +157,9 @@ namespace Catch { | |||||||
|         bool m_isBinaryExpression; |         bool m_isBinaryExpression; | ||||||
|         bool m_result; |         bool m_result; | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         ~ITransientExpression() = default; | ||||||
|  |  | ||||||
|     public: |     public: | ||||||
|         constexpr auto isBinaryExpression() const -> bool { return m_isBinaryExpression; } |         constexpr auto isBinaryExpression() const -> bool { return m_isBinaryExpression; } | ||||||
|         constexpr auto getResult() const -> bool { return m_result; } |         constexpr auto getResult() const -> bool { return m_result; } | ||||||
| @@ -168,17 +171,13 @@ namespace Catch { | |||||||
|             m_result( result ) |             m_result( result ) | ||||||
|         {} |         {} | ||||||
|  |  | ||||||
|         ITransientExpression() = default; |         constexpr ITransientExpression( ITransientExpression const& ) = default; | ||||||
|         ITransientExpression(ITransientExpression const&) = default; |         constexpr ITransientExpression& operator=( ITransientExpression const& ) = default; | ||||||
|         ITransientExpression& operator=(ITransientExpression const&) = default; |  | ||||||
|  |  | ||||||
|         friend std::ostream& operator<<(std::ostream& out, ITransientExpression const& expr) { |         friend std::ostream& operator<<(std::ostream& out, ITransientExpression const& expr) { | ||||||
|             expr.streamReconstructedExpression(out); |             expr.streamReconstructedExpression(out); | ||||||
|             return out; |             return out; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     protected: |  | ||||||
|         ~ITransientExpression() = default; |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ); |     void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ); | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ namespace Catch { | |||||||
|                   typename Sentinel, |                   typename Sentinel, | ||||||
|                   typename T, |                   typename T, | ||||||
|                   typename Comparator> |                   typename Comparator> | ||||||
|  |         constexpr | ||||||
|         ForwardIter find_sentinel( ForwardIter start, |         ForwardIter find_sentinel( ForwardIter start, | ||||||
|                                    Sentinel sentinel, |                                    Sentinel sentinel, | ||||||
|                                    T const& value, |                                    T const& value, | ||||||
| @@ -33,6 +34,7 @@ namespace Catch { | |||||||
|                   typename Sentinel, |                   typename Sentinel, | ||||||
|                   typename T, |                   typename T, | ||||||
|                   typename Comparator> |                   typename Comparator> | ||||||
|  |         constexpr | ||||||
|         std::ptrdiff_t count_sentinel( ForwardIter start, |         std::ptrdiff_t count_sentinel( ForwardIter start, | ||||||
|                                        Sentinel sentinel, |                                        Sentinel sentinel, | ||||||
|                                        T const& value, |                                        T const& value, | ||||||
| @@ -46,6 +48,7 @@ namespace Catch { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         template <typename ForwardIter, typename Sentinel> |         template <typename ForwardIter, typename Sentinel> | ||||||
|  |         constexpr | ||||||
|         std::enable_if_t<!std::is_same<ForwardIter, Sentinel>::value, |         std::enable_if_t<!std::is_same<ForwardIter, Sentinel>::value, | ||||||
|                          std::ptrdiff_t> |                          std::ptrdiff_t> | ||||||
|         sentinel_distance( ForwardIter iter, const Sentinel sentinel ) { |         sentinel_distance( ForwardIter iter, const Sentinel sentinel ) { | ||||||
| @@ -58,8 +61,8 @@ namespace Catch { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         template <typename ForwardIter> |         template <typename ForwardIter> | ||||||
|         std::ptrdiff_t sentinel_distance( ForwardIter first, |         constexpr std::ptrdiff_t sentinel_distance( ForwardIter first, | ||||||
|                                           ForwardIter last ) { |                                                     ForwardIter last ) { | ||||||
|             return std::distance( first, last ); |             return std::distance( first, last ); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -68,11 +71,11 @@ namespace Catch { | |||||||
|                   typename ForwardIter2, |                   typename ForwardIter2, | ||||||
|                   typename Sentinel2, |                   typename Sentinel2, | ||||||
|                   typename Comparator> |                   typename Comparator> | ||||||
|         bool check_element_counts( ForwardIter1 first_1, |         constexpr bool check_element_counts( ForwardIter1 first_1, | ||||||
|                                    const Sentinel1 end_1, |                                              const Sentinel1 end_1, | ||||||
|                                    ForwardIter2 first_2, |                                              ForwardIter2 first_2, | ||||||
|                                    const Sentinel2 end_2, |                                              const Sentinel2 end_2, | ||||||
|                                    Comparator cmp ) { |                                              Comparator cmp ) { | ||||||
|             auto cursor = first_1; |             auto cursor = first_1; | ||||||
|             while ( cursor != end_1 ) { |             while ( cursor != end_1 ) { | ||||||
|                 if ( find_sentinel( first_1, cursor, *cursor, cmp ) == |                 if ( find_sentinel( first_1, cursor, *cursor, cmp ) == | ||||||
| @@ -102,11 +105,11 @@ namespace Catch { | |||||||
|                   typename ForwardIter2, |                   typename ForwardIter2, | ||||||
|                   typename Sentinel2, |                   typename Sentinel2, | ||||||
|                   typename Comparator> |                   typename Comparator> | ||||||
|         bool is_permutation( ForwardIter1 first_1, |         constexpr bool is_permutation( ForwardIter1 first_1, | ||||||
|                              const Sentinel1 end_1, |                                        const Sentinel1 end_1, | ||||||
|                              ForwardIter2 first_2, |                                        ForwardIter2 first_2, | ||||||
|                              const Sentinel2 end_2, |                                        const Sentinel2 end_2, | ||||||
|                              Comparator cmp ) { |                                        Comparator cmp ) { | ||||||
|             // TODO: no optimization for stronger iterators, because we would also have to constrain on sentinel vs not sentinel types |             // TODO: no optimization for stronger iterators, because we would also have to constrain on sentinel vs not sentinel types | ||||||
|             // TODO: Comparator has to be "both sides", e.g. a == b => b == a |             // TODO: Comparator has to be "both sides", e.g. a == b => b == a | ||||||
|             // This skips shared prefix of the two ranges |             // This skips shared prefix of the two ranges | ||||||
|   | |||||||
| @@ -22,13 +22,13 @@ namespace Catch { | |||||||
|         ITransientExpression const* m_transientExpression = nullptr; |         ITransientExpression const* m_transientExpression = nullptr; | ||||||
|         bool m_isNegated; |         bool m_isNegated; | ||||||
|     public: |     public: | ||||||
|         LazyExpression( bool isNegated ): |         constexpr LazyExpression( bool isNegated ): | ||||||
|             m_isNegated(isNegated) |             m_isNegated(isNegated) | ||||||
|         {} |         {} | ||||||
|         LazyExpression(LazyExpression const& other) = default; |         constexpr LazyExpression(LazyExpression const& other) = default; | ||||||
|         LazyExpression& operator = ( LazyExpression const& ) = delete; |         LazyExpression& operator = ( LazyExpression const& ) = delete; | ||||||
|  |  | ||||||
|         explicit operator bool() const { |         constexpr explicit operator bool() const { | ||||||
|             return m_transientExpression != nullptr; |             return m_transientExpression != nullptr; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -69,7 +69,7 @@ namespace Catch { | |||||||
|         struct ExtendedMultResult { |         struct ExtendedMultResult { | ||||||
|             T upper; |             T upper; | ||||||
|             T lower; |             T lower; | ||||||
|             bool operator==( ExtendedMultResult const& rhs ) const { |             constexpr bool operator==( ExtendedMultResult const& rhs ) const { | ||||||
|                 return upper == rhs.upper && lower == rhs.lower; |                 return upper == rhs.upper && lower == rhs.lower; | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
| @@ -187,6 +187,7 @@ namespace Catch { | |||||||
|          * get by simple casting ([0, ..., INT_MAX, INT_MIN, ..., -1]) |          * get by simple casting ([0, ..., INT_MAX, INT_MIN, ..., -1]) | ||||||
|          */ |          */ | ||||||
|         template <typename OriginalType, typename UnsignedType> |         template <typename OriginalType, typename UnsignedType> | ||||||
|  |         constexpr | ||||||
|         std::enable_if_t<std::is_signed<OriginalType>::value, UnsignedType> |         std::enable_if_t<std::is_signed<OriginalType>::value, UnsignedType> | ||||||
|         transposeToNaturalOrder( UnsignedType in ) { |         transposeToNaturalOrder( UnsignedType in ) { | ||||||
|             static_assert( |             static_assert( | ||||||
| @@ -207,6 +208,7 @@ namespace Catch { | |||||||
|  |  | ||||||
|         template <typename OriginalType, |         template <typename OriginalType, | ||||||
|                   typename UnsignedType> |                   typename UnsignedType> | ||||||
|  |         constexpr | ||||||
|         std::enable_if_t<std::is_unsigned<OriginalType>::value, UnsignedType> |         std::enable_if_t<std::is_unsigned<OriginalType>::value, UnsignedType> | ||||||
|             transposeToNaturalOrder(UnsignedType in) { |             transposeToNaturalOrder(UnsignedType in) { | ||||||
|             static_assert( |             static_assert( | ||||||
|   | |||||||
| @@ -1,26 +0,0 @@ | |||||||
|  |  | ||||||
| //              Copyright Catch2 Authors |  | ||||||
| // Distributed under the Boost Software License, Version 1.0. |  | ||||||
| //   (See accompanying file LICENSE.txt or copy at |  | ||||||
| //        https://www.boost.org/LICENSE_1_0.txt) |  | ||||||
|  |  | ||||||
| // SPDX-License-Identifier: BSL-1.0 |  | ||||||
| #include <catch2/internal/catch_result_type.hpp> |  | ||||||
|  |  | ||||||
| namespace Catch { |  | ||||||
|  |  | ||||||
|     bool isOk( ResultWas::OfType resultType ) { |  | ||||||
|         return ( resultType & ResultWas::FailureBit ) == 0; |  | ||||||
|     } |  | ||||||
|     bool isJustInfo( int flags ) { |  | ||||||
|         return flags == ResultWas::Info; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { |  | ||||||
|         return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     bool shouldContinueOnFailure( int flags )    { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } |  | ||||||
|     bool shouldSuppressFailure( int flags )      { return ( flags & ResultDisposition::SuppressFail ) != 0; } |  | ||||||
|  |  | ||||||
| } // end namespace Catch |  | ||||||
| @@ -33,8 +33,10 @@ namespace Catch { | |||||||
|  |  | ||||||
|     }; }; |     }; }; | ||||||
|  |  | ||||||
|     bool isOk( ResultWas::OfType resultType ); |     constexpr bool isOk( ResultWas::OfType resultType ) { | ||||||
|     bool isJustInfo( int flags ); |         return ( resultType & ResultWas::FailureBit ) == 0; | ||||||
|  |     } | ||||||
|  |     constexpr bool isJustInfo( int flags ) { return flags == ResultWas::Info; } | ||||||
|  |  | ||||||
|  |  | ||||||
|     // ResultDisposition::Flags enum |     // ResultDisposition::Flags enum | ||||||
| @@ -46,11 +48,18 @@ namespace Catch { | |||||||
|         SuppressFail = 0x08         // Failures are reported but do not fail the test |         SuppressFail = 0x08         // Failures are reported but do not fail the test | ||||||
|     }; }; |     }; }; | ||||||
|  |  | ||||||
|     ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ); |     constexpr ResultDisposition::Flags operator|( ResultDisposition::Flags lhs, | ||||||
|  |                                         ResultDisposition::Flags rhs ) { | ||||||
|  |         return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | | ||||||
|  |                                                       static_cast<int>( rhs ) ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     bool shouldContinueOnFailure( int flags ); |     constexpr bool isFalseTest( int flags ) { | ||||||
|     inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } |         return ( flags & ResultDisposition::FalseTest ) != 0; | ||||||
|     bool shouldSuppressFailure( int flags ); |     } | ||||||
|  |     constexpr bool shouldSuppressFailure( int flags ) { | ||||||
|  |         return ( flags & ResultDisposition::SuppressFail ) != 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
| } // end namespace Catch | } // end namespace Catch | ||||||
|  |  | ||||||
|   | |||||||
| @@ -54,7 +54,7 @@ namespace Catch { | |||||||
|             TestType m_testAsFunction; |             TestType m_testAsFunction; | ||||||
|  |  | ||||||
|         public: |         public: | ||||||
|             TestInvokerAsFunction( TestType testAsFunction ) noexcept: |             constexpr TestInvokerAsFunction( TestType testAsFunction ) noexcept: | ||||||
|                 m_testAsFunction( testAsFunction ) {} |                 m_testAsFunction( testAsFunction ) {} | ||||||
|  |  | ||||||
|             void invoke() const override { m_testAsFunction(); } |             void invoke() const override { m_testAsFunction(); } | ||||||
|   | |||||||
| @@ -32,7 +32,8 @@ template<typename C> | |||||||
| class TestInvokerAsMethod : public ITestInvoker { | class TestInvokerAsMethod : public ITestInvoker { | ||||||
|     void (C::*m_testAsMethod)(); |     void (C::*m_testAsMethod)(); | ||||||
| public: | public: | ||||||
|     TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {} |     constexpr TestInvokerAsMethod( void ( C::*testAsMethod )() ) noexcept: | ||||||
|  |         m_testAsMethod( testAsMethod ) {} | ||||||
|  |  | ||||||
|     void invoke() const override { |     void invoke() const override { | ||||||
|         C obj; |         C obj; | ||||||
| @@ -53,7 +54,8 @@ class TestInvokerFixture : public ITestInvoker { | |||||||
|     Detail::unique_ptr<C> m_fixture = nullptr; |     Detail::unique_ptr<C> m_fixture = nullptr; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     TestInvokerFixture( void ( C::*testAsMethod )() const) noexcept : m_testAsMethod( testAsMethod ) {} |     constexpr TestInvokerFixture( void ( C::*testAsMethod )() const ) noexcept: | ||||||
|  |         m_testAsMethod( testAsMethod ) {} | ||||||
|  |  | ||||||
|     void prepareTestCase() override { |     void prepareTestCase() override { | ||||||
|         m_fixture = Detail::make_unique<C>(); |         m_fixture = Detail::make_unique<C>(); | ||||||
|   | |||||||
| @@ -48,24 +48,24 @@ class uniform_integer_distribution { | |||||||
|     // distribution will be reused many times and this is an optimization. |     // distribution will be reused many times and this is an optimization. | ||||||
|     UnsignedIntegerType m_rejection_threshold = 0; |     UnsignedIntegerType m_rejection_threshold = 0; | ||||||
|  |  | ||||||
|     UnsignedIntegerType computeDistance(IntegerType a, IntegerType b) const { |     static constexpr UnsignedIntegerType computeDistance(IntegerType a, IntegerType b) { | ||||||
|         // This overflows and returns 0 if a == 0 and b == TYPE_MAX. |         // This overflows and returns 0 if a == 0 and b == TYPE_MAX. | ||||||
|         // We handle that later when generating the number. |         // We handle that later when generating the number. | ||||||
|         return transposeTo(b) - transposeTo(a) + 1; |         return transposeTo(b) - transposeTo(a) + 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     static UnsignedIntegerType computeRejectionThreshold(UnsignedIntegerType ab_distance) { |     static constexpr UnsignedIntegerType computeRejectionThreshold(UnsignedIntegerType ab_distance) { | ||||||
|         // distance == 0 means that we will return all possible values from |         // distance == 0 means that we will return all possible values from | ||||||
|         // the type's range, and that we shouldn't reject anything. |         // the type's range, and that we shouldn't reject anything. | ||||||
|         if ( ab_distance == 0 ) { return 0; } |         if ( ab_distance == 0 ) { return 0; } | ||||||
|         return ( ~ab_distance + 1 ) % ab_distance; |         return ( ~ab_distance + 1 ) % ab_distance; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     static UnsignedIntegerType transposeTo(IntegerType in) { |     static constexpr UnsignedIntegerType transposeTo(IntegerType in) { | ||||||
|         return Detail::transposeToNaturalOrder<IntegerType>( |         return Detail::transposeToNaturalOrder<IntegerType>( | ||||||
|             static_cast<UnsignedIntegerType>( in ) ); |             static_cast<UnsignedIntegerType>( in ) ); | ||||||
|     } |     } | ||||||
|     static IntegerType transposeBack(UnsignedIntegerType in) { |     static constexpr IntegerType transposeBack(UnsignedIntegerType in) { | ||||||
|         return static_cast<IntegerType>( |         return static_cast<IntegerType>( | ||||||
|             Detail::transposeToNaturalOrder<IntegerType>(in) ); |             Detail::transposeToNaturalOrder<IntegerType>(in) ); | ||||||
|     } |     } | ||||||
| @@ -73,7 +73,7 @@ class uniform_integer_distribution { | |||||||
| public: | public: | ||||||
|     using result_type = IntegerType; |     using result_type = IntegerType; | ||||||
|  |  | ||||||
|     uniform_integer_distribution( IntegerType a, IntegerType b ): |     constexpr uniform_integer_distribution( IntegerType a, IntegerType b ): | ||||||
|         m_a( transposeTo(a) ), |         m_a( transposeTo(a) ), | ||||||
|         m_ab_distance( computeDistance(a, b) ), |         m_ab_distance( computeDistance(a, b) ), | ||||||
|         m_rejection_threshold( computeRejectionThreshold(m_ab_distance) ) { |         m_rejection_threshold( computeRejectionThreshold(m_ab_distance) ) { | ||||||
| @@ -81,7 +81,7 @@ public: | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     template <typename Generator> |     template <typename Generator> | ||||||
|     result_type operator()( Generator& g ) { |     constexpr result_type operator()( Generator& g ) { | ||||||
|         // All possible values of result_type are valid. |         // All possible values of result_type are valid. | ||||||
|         if ( m_ab_distance == 0 ) { |         if ( m_ab_distance == 0 ) { | ||||||
|             return transposeBack( Detail::fillBitsFrom<UnsignedIntegerType>( g ) ); |             return transposeBack( Detail::fillBitsFrom<UnsignedIntegerType>( g ) ); | ||||||
| @@ -99,8 +99,8 @@ public: | |||||||
|         return transposeBack(m_a + emul.upper); |         return transposeBack(m_a + emul.upper); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     result_type a() const { return transposeBack(m_a); } |     constexpr result_type a() const { return transposeBack(m_a); } | ||||||
|     result_type b() const { return transposeBack(m_ab_distance + m_a - 1); } |     constexpr result_type b() const { return transposeBack(m_ab_distance + m_a - 1); } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| } // end namespace Catch | } // end namespace Catch | ||||||
|   | |||||||
| @@ -53,36 +53,16 @@ namespace { | |||||||
|         os.flags(f); |         os.flags(f); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     bool shouldNewline(XmlFormatting fmt) { |     constexpr bool shouldNewline(XmlFormatting fmt) { | ||||||
|         return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Newline)); |         return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Newline)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     bool shouldIndent(XmlFormatting fmt) { |     constexpr bool shouldIndent(XmlFormatting fmt) { | ||||||
|         return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Indent)); |         return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Indent)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } // anonymous namespace | } // anonymous namespace | ||||||
|  |  | ||||||
|     XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) { |  | ||||||
|         return static_cast<XmlFormatting>( |  | ||||||
|             static_cast<std::underlying_type_t<XmlFormatting>>(lhs) | |  | ||||||
|             static_cast<std::underlying_type_t<XmlFormatting>>(rhs) |  | ||||||
|         ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) { |  | ||||||
|         return static_cast<XmlFormatting>( |  | ||||||
|             static_cast<std::underlying_type_t<XmlFormatting>>(lhs) & |  | ||||||
|             static_cast<std::underlying_type_t<XmlFormatting>>(rhs) |  | ||||||
|         ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     XmlEncode::XmlEncode( StringRef str, ForWhat forWhat ) |  | ||||||
|     :   m_str( str ), |  | ||||||
|         m_forWhat( forWhat ) |  | ||||||
|     {} |  | ||||||
|  |  | ||||||
|     void XmlEncode::encodeTo( std::ostream& os ) const { |     void XmlEncode::encodeTo( std::ostream& os ) const { | ||||||
|         // Apostrophe escaping not necessary if we always use " to write attributes |         // Apostrophe escaping not necessary if we always use " to write attributes | ||||||
|         // (see: http://www.w3.org/TR/xml/#syntax) |         // (see: http://www.w3.org/TR/xml/#syntax) | ||||||
|   | |||||||
| @@ -15,14 +15,22 @@ | |||||||
| #include <vector> | #include <vector> | ||||||
|  |  | ||||||
| namespace Catch { | namespace Catch { | ||||||
|     enum class XmlFormatting { |     enum class XmlFormatting : uint8_t { | ||||||
|         None = 0x00, |         None = 0x00, | ||||||
|         Indent = 0x01, |         Indent = 0x01, | ||||||
|         Newline = 0x02, |         Newline = 0x02, | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs); |     constexpr XmlFormatting operator|( XmlFormatting lhs, XmlFormatting rhs ) { | ||||||
|     XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs); |         return static_cast<XmlFormatting>( static_cast<uint8_t>( lhs ) | | ||||||
|  |                                            static_cast<uint8_t>( rhs ) ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     constexpr XmlFormatting operator&( XmlFormatting lhs, XmlFormatting rhs ) { | ||||||
|  |         return static_cast<XmlFormatting>( static_cast<uint8_t>( lhs ) & | ||||||
|  |                                            static_cast<uint8_t>( rhs ) ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Helper for XML-encoding text (escaping angle brackets, quotes, etc) |      * Helper for XML-encoding text (escaping angle brackets, quotes, etc) | ||||||
| @@ -34,7 +42,9 @@ namespace Catch { | |||||||
|     public: |     public: | ||||||
|         enum ForWhat { ForTextNodes, ForAttributes }; |         enum ForWhat { ForTextNodes, ForAttributes }; | ||||||
|  |  | ||||||
|         XmlEncode( StringRef str, ForWhat forWhat = ForTextNodes ); |         constexpr XmlEncode( StringRef str, ForWhat forWhat = ForTextNodes ): | ||||||
|  |             m_str( str ), m_forWhat( forWhat ) {} | ||||||
|  |  | ||||||
|  |  | ||||||
|         void encodeTo( std::ostream& os ) const; |         void encodeTo( std::ostream& os ) const; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,12 +28,14 @@ namespace Catch { | |||||||
|  |  | ||||||
|         public: |         public: | ||||||
|             template <typename TargetRangeLike2, typename Equality2> |             template <typename TargetRangeLike2, typename Equality2> | ||||||
|  |             constexpr | ||||||
|             RangeEqualsMatcher( TargetRangeLike2&& range, |             RangeEqualsMatcher( TargetRangeLike2&& range, | ||||||
|                                 Equality2&& predicate ): |                                 Equality2&& predicate ): | ||||||
|                 m_desired( CATCH_FORWARD( range ) ), |                 m_desired( CATCH_FORWARD( range ) ), | ||||||
|                 m_predicate( CATCH_FORWARD( predicate ) ) {} |                 m_predicate( CATCH_FORWARD( predicate ) ) {} | ||||||
|  |  | ||||||
|             template <typename RangeLike> |             template <typename RangeLike> | ||||||
|  |             constexpr | ||||||
|             bool match( RangeLike&& rng ) const { |             bool match( RangeLike&& rng ) const { | ||||||
|                 auto rng_start = begin( rng ); |                 auto rng_start = begin( rng ); | ||||||
|                 const auto rng_end = end( rng ); |                 const auto rng_end = end( rng ); | ||||||
| @@ -66,12 +68,14 @@ namespace Catch { | |||||||
|  |  | ||||||
|         public: |         public: | ||||||
|             template <typename TargetRangeLike2, typename Equality2> |             template <typename TargetRangeLike2, typename Equality2> | ||||||
|  |             constexpr | ||||||
|             UnorderedRangeEqualsMatcher( TargetRangeLike2&& range, |             UnorderedRangeEqualsMatcher( TargetRangeLike2&& range, | ||||||
|                                          Equality2&& predicate ): |                                          Equality2&& predicate ): | ||||||
|                 m_desired( CATCH_FORWARD( range ) ), |                 m_desired( CATCH_FORWARD( range ) ), | ||||||
|                 m_predicate( CATCH_FORWARD( predicate ) ) {} |                 m_predicate( CATCH_FORWARD( predicate ) ) {} | ||||||
|  |  | ||||||
|             template <typename RangeLike> |             template <typename RangeLike> | ||||||
|  |             constexpr | ||||||
|             bool match( RangeLike&& rng ) const { |             bool match( RangeLike&& rng ) const { | ||||||
|                 using std::begin; |                 using std::begin; | ||||||
|                 using std::end; |                 using std::end; | ||||||
| @@ -95,6 +99,7 @@ namespace Catch { | |||||||
|          * Uses `std::equal_to` to do the comparison |          * Uses `std::equal_to` to do the comparison | ||||||
|          */ |          */ | ||||||
|         template <typename RangeLike> |         template <typename RangeLike> | ||||||
|  |         constexpr | ||||||
|         std::enable_if_t<!Detail::is_matcher<RangeLike>::value, |         std::enable_if_t<!Detail::is_matcher<RangeLike>::value, | ||||||
|                          RangeEqualsMatcher<RangeLike, std::equal_to<>>> |                          RangeEqualsMatcher<RangeLike, std::equal_to<>>> | ||||||
|         RangeEquals( RangeLike&& range ) { |         RangeEquals( RangeLike&& range ) { | ||||||
| @@ -108,6 +113,7 @@ namespace Catch { | |||||||
|          * Uses to provided predicate `predicate` to do the comparisons |          * Uses to provided predicate `predicate` to do the comparisons | ||||||
|          */ |          */ | ||||||
|         template <typename RangeLike, typename Equality> |         template <typename RangeLike, typename Equality> | ||||||
|  |         constexpr | ||||||
|         RangeEqualsMatcher<RangeLike, Equality> |         RangeEqualsMatcher<RangeLike, Equality> | ||||||
|         RangeEquals( RangeLike&& range, Equality&& predicate ) { |         RangeEquals( RangeLike&& range, Equality&& predicate ) { | ||||||
|             return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) }; |             return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) }; | ||||||
| @@ -120,6 +126,7 @@ namespace Catch { | |||||||
|          * Uses `std::equal_to` to do the comparison |          * Uses `std::equal_to` to do the comparison | ||||||
|          */ |          */ | ||||||
|         template <typename RangeLike> |         template <typename RangeLike> | ||||||
|  |         constexpr | ||||||
|         std::enable_if_t< |         std::enable_if_t< | ||||||
|             !Detail::is_matcher<RangeLike>::value, |             !Detail::is_matcher<RangeLike>::value, | ||||||
|             UnorderedRangeEqualsMatcher<RangeLike, std::equal_to<>>> |             UnorderedRangeEqualsMatcher<RangeLike, std::equal_to<>>> | ||||||
| @@ -134,6 +141,7 @@ namespace Catch { | |||||||
|          * Uses to provided predicate `predicate` to do the comparisons |          * Uses to provided predicate `predicate` to do the comparisons | ||||||
|          */ |          */ | ||||||
|         template <typename RangeLike, typename Equality> |         template <typename RangeLike, typename Equality> | ||||||
|  |         constexpr | ||||||
|         UnorderedRangeEqualsMatcher<RangeLike, Equality> |         UnorderedRangeEqualsMatcher<RangeLike, Equality> | ||||||
|         UnorderedRangeEquals( RangeLike&& range, Equality&& predicate ) { |         UnorderedRangeEquals( RangeLike&& range, Equality&& predicate ) { | ||||||
|             return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) }; |             return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) }; | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ namespace Catch { | |||||||
|         ArgT && m_arg; |         ArgT && m_arg; | ||||||
|         MatcherT const& m_matcher; |         MatcherT const& m_matcher; | ||||||
|     public: |     public: | ||||||
|         MatchExpr( ArgT && arg, MatcherT const& matcher ) |         constexpr MatchExpr( ArgT && arg, MatcherT const& matcher ) | ||||||
|         :   ITransientExpression{ true, matcher.match( arg ) }, // not forwarding arg here on purpose |         :   ITransientExpression{ true, matcher.match( arg ) }, // not forwarding arg here on purpose | ||||||
|             m_arg( CATCH_FORWARD(arg) ), |             m_arg( CATCH_FORWARD(arg) ), | ||||||
|             m_matcher( matcher ) |             m_matcher( matcher ) | ||||||
| @@ -63,7 +63,8 @@ namespace Catch { | |||||||
|     void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher ); |     void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher ); | ||||||
|  |  | ||||||
|     template<typename ArgT, typename MatcherT> |     template<typename ArgT, typename MatcherT> | ||||||
|     auto makeMatchExpr( ArgT && arg, MatcherT const& matcher ) -> MatchExpr<ArgT, MatcherT> { |     constexpr MatchExpr<ArgT, MatcherT> | ||||||
|  |     makeMatchExpr( ArgT&& arg, MatcherT const& matcher ) { | ||||||
|         return MatchExpr<ArgT, MatcherT>( CATCH_FORWARD(arg), matcher ); |         return MatchExpr<ArgT, MatcherT>( CATCH_FORWARD(arg), matcher ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -234,7 +234,6 @@ internal_sources = files( | |||||||
|   'internal/catch_random_seed_generation.cpp', |   'internal/catch_random_seed_generation.cpp', | ||||||
|   'internal/catch_reporter_registry.cpp', |   'internal/catch_reporter_registry.cpp', | ||||||
|   'internal/catch_reporter_spec_parser.cpp', |   'internal/catch_reporter_spec_parser.cpp', | ||||||
|   'internal/catch_result_type.cpp', |  | ||||||
|   'internal/catch_reusable_string_stream.cpp', |   'internal/catch_reusable_string_stream.cpp', | ||||||
|   'internal/catch_run_context.cpp', |   'internal/catch_run_context.cpp', | ||||||
|   'internal/catch_section.cpp', |   'internal/catch_section.cpp', | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský