From 1967feac498795615d512d1de43bf2140575e597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Fri, 14 Jun 2019 14:59:19 +0200 Subject: [PATCH] Introduce stubs for throwing specific exception types This allows us to move out of the common path, and replace it with just . The difference between these two headers is ~13k lines after preprocessing on libstdc++ (16k vs 3k) and ~17k lines for MS's STL(33k vs 16k). Note that this is only beneficial if no other stdlib header we use includes . AFAIK this is true for the newest MS's STL, but I have no idea of the applicability for libstdc++ and libc++. --- include/internal/catch_enforce.cpp | 21 ++++++++++++++++++ include/internal/catch_enforce.h | 35 ++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/include/internal/catch_enforce.cpp b/include/internal/catch_enforce.cpp index f4db1c15..903d43be 100644 --- a/include/internal/catch_enforce.cpp +++ b/include/internal/catch_enforce.cpp @@ -7,6 +7,9 @@ #include "catch_enforce.h" +#include + + namespace Catch { #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER) [[noreturn]] @@ -16,4 +19,22 @@ namespace Catch { std::terminate(); } #endif + + [[noreturn]] + void throw_logic_error(std::string const& msg) { + throw_exception(std::logic_error(msg)); + } + + [[noreturn]] + void throw_domain_error(std::string const& msg) { + throw_exception(std::domain_error(msg)); + } + + [[noreturn]] + void throw_runtime_error(std::string const& msg) { + throw_exception(std::runtime_error(msg)); + } + + + } // namespace Catch; diff --git a/include/internal/catch_enforce.h b/include/internal/catch_enforce.h index 00694023..ad11c815 100644 --- a/include/internal/catch_enforce.h +++ b/include/internal/catch_enforce.h @@ -11,8 +11,7 @@ #include "catch_compiler_capabilities.h" #include "catch_stream.h" - -#include +#include namespace Catch { #if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) @@ -25,18 +24,30 @@ namespace Catch { [[noreturn]] void throw_exception(std::exception const& e); #endif + + [[noreturn]] + void throw_logic_error(std::string const& msg); + [[noreturn]] + void throw_domain_error(std::string const& msg); + [[noreturn]] + void throw_runtime_error(std::string const& msg); + } // namespace Catch; -#define CATCH_PREPARE_EXCEPTION( type, msg ) \ - type( ( Catch::ReusableStringStream() << msg ).str() ) -#define CATCH_INTERNAL_ERROR( msg ) \ - Catch::throw_exception(CATCH_PREPARE_EXCEPTION( std::logic_error, CATCH_INTERNAL_LINEINFO << ": Internal Catch error: " << msg)) -#define CATCH_ERROR( msg ) \ - Catch::throw_exception(CATCH_PREPARE_EXCEPTION( std::domain_error, msg )) -#define CATCH_RUNTIME_ERROR( msg ) \ - Catch::throw_exception(CATCH_PREPARE_EXCEPTION( std::runtime_error, msg )) -#define CATCH_ENFORCE( condition, msg ) \ - do{ if( !(condition) ) CATCH_ERROR( msg ); } while(false) +#define CATCH_MAKE_MSG(...) \ + (Catch::ReusableStringStream() << __VA_ARGS__).str() + +#define CATCH_INTERNAL_ERROR(...) \ + Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__)); + +#define CATCH_ERROR(...) \ + Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ )); + +#define CATCH_RUNTIME_ERROR(...) \ + Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ )); + +#define CATCH_ENFORCE( condition, ... ) \ + do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false) #endif // TWOBLUECUBES_CATCH_ENFORCE_H_INCLUDED