From 7efbc83ae0393500692851525b89cfa890f3cee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Sun, 10 May 2020 10:20:48 +0200 Subject: [PATCH] Introduce combined TUs for compiling small TUs This should improve the compilation times by decreasing the number of TUs compiled, without making overly big TUs that would cause problems with heavy-tailed compilation times. There is one "combined TU" for the top level part, and each subpart, except for Reporters, which currently do not have any trivial TUs. --- src/CMakeLists.txt | 29 +-- src/catch2/benchmark/catch_chronometer.cpp | 14 -- .../detail/catch_benchmark_function.cpp | 14 -- .../detail/catch_complete_invoke.cpp | 17 -- .../detail/catch_run_for_at_least.cpp | 29 --- .../internal/catch_benchmark_combined_tu.cpp | 88 +++++++++ src/catch2/catch_tag_alias_autoregistrar.cpp | 16 -- .../generators/catch_generator_exception.cpp | 14 -- src/catch2/generators/catch_generators.cpp | 37 ---- src/catch2/generators/catch_generators.hpp | 1 - .../internal/catch_generators_combined_tu.cpp | 58 ++++++ .../interfaces/catch_interfaces_capture.cpp | 5 - .../catch_interfaces_combined_tu.cpp | 79 ++++++++ .../interfaces/catch_interfaces_config.cpp | 5 - .../interfaces/catch_interfaces_exception.cpp | 6 - .../catch_interfaces_registry_hub.cpp | 6 - .../interfaces/catch_interfaces_runner.cpp | 5 - .../interfaces/catch_interfaces_testcase.cpp | 6 - src/catch2/internal/catch_combined_tu.cpp | 173 ++++++++++++++++++ src/catch2/internal/catch_decomposer.cpp | 24 --- src/catch2/internal/catch_errno_guard.cpp | 15 -- src/catch2/internal/catch_leak_detector.cpp | 37 ---- src/catch2/internal/catch_polyfills.cpp | 31 ---- .../catch_startup_exception_registry.cpp | 26 --- .../internal/catch_uncaught_exceptions.cpp | 21 --- src/catch2/matchers/catch_matchers.cpp | 22 --- .../catch_matchers_container_properties.cpp | 30 --- .../matchers/catch_matchers_exception.cpp | 27 --- .../matchers/catch_matchers_predicate.cpp | 9 - .../internal/catch_matchers_combined_tu.cpp | 127 +++++++++++++ .../matchers/internal/catch_matchers_impl.cpp | 20 -- 31 files changed, 530 insertions(+), 461 deletions(-) delete mode 100644 src/catch2/benchmark/catch_chronometer.cpp delete mode 100644 src/catch2/benchmark/detail/catch_benchmark_function.cpp delete mode 100644 src/catch2/benchmark/detail/catch_complete_invoke.cpp delete mode 100644 src/catch2/benchmark/detail/catch_run_for_at_least.cpp create mode 100644 src/catch2/benchmark/internal/catch_benchmark_combined_tu.cpp delete mode 100644 src/catch2/catch_tag_alias_autoregistrar.cpp delete mode 100644 src/catch2/generators/catch_generator_exception.cpp delete mode 100644 src/catch2/generators/catch_generators.cpp create mode 100644 src/catch2/generators/internal/catch_generators_combined_tu.cpp delete mode 100644 src/catch2/interfaces/catch_interfaces_capture.cpp create mode 100644 src/catch2/interfaces/catch_interfaces_combined_tu.cpp delete mode 100644 src/catch2/interfaces/catch_interfaces_config.cpp delete mode 100644 src/catch2/interfaces/catch_interfaces_exception.cpp delete mode 100644 src/catch2/interfaces/catch_interfaces_registry_hub.cpp delete mode 100644 src/catch2/interfaces/catch_interfaces_runner.cpp delete mode 100644 src/catch2/interfaces/catch_interfaces_testcase.cpp create mode 100644 src/catch2/internal/catch_combined_tu.cpp delete mode 100644 src/catch2/internal/catch_decomposer.cpp delete mode 100644 src/catch2/internal/catch_errno_guard.cpp delete mode 100644 src/catch2/internal/catch_leak_detector.cpp delete mode 100644 src/catch2/internal/catch_polyfills.cpp delete mode 100644 src/catch2/internal/catch_startup_exception_registry.cpp delete mode 100644 src/catch2/internal/catch_uncaught_exceptions.cpp delete mode 100644 src/catch2/matchers/catch_matchers.cpp delete mode 100644 src/catch2/matchers/catch_matchers_container_properties.cpp delete mode 100644 src/catch2/matchers/catch_matchers_exception.cpp delete mode 100644 src/catch2/matchers/catch_matchers_predicate.cpp create mode 100644 src/catch2/matchers/internal/catch_matchers_combined_tu.cpp delete mode 100644 src/catch2/matchers/internal/catch_matchers_impl.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9c92cb89..b6578f8b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,10 +24,7 @@ set(BENCHMARK_HEADERS ${SOURCES_DIR}/benchmark/detail/catch_timing.hpp ) set(BENCHMARK_SOURCES - ${SOURCES_DIR}/benchmark/catch_chronometer.cpp - ${SOURCES_DIR}/benchmark/detail/catch_benchmark_function.cpp - ${SOURCES_DIR}/benchmark/detail/catch_complete_invoke.cpp - ${SOURCES_DIR}/benchmark/detail/catch_run_for_at_least.cpp + ${SOURCES_DIR}/benchmark/internal/catch_benchmark_combined_tu.cpp ${SOURCES_DIR}/benchmark/detail/catch_stats.cpp ) @@ -134,7 +131,7 @@ set(IMPL_SOURCES ${SOURCES_DIR}/catch_approx.cpp ${SOURCES_DIR}/internal/catch_assertionhandler.cpp ${SOURCES_DIR}/catch_assertion_result.cpp - ${SOURCES_DIR}/matchers/internal/catch_matchers_impl.cpp + ${SOURCES_DIR}/matchers/internal/catch_matchers_combined_tu.cpp ${SOURCES_DIR}/internal/catch_commandline.cpp ${SOURCES_DIR}/internal/catch_common.cpp ${SOURCES_DIR}/catch_config.cpp @@ -142,34 +139,21 @@ set(IMPL_SOURCES ${SOURCES_DIR}/internal/catch_context.cpp ${SOURCES_DIR}/internal/catch_debug_console.cpp ${SOURCES_DIR}/internal/catch_debugger.cpp - ${SOURCES_DIR}/internal/catch_decomposer.cpp ${SOURCES_DIR}/internal/catch_enforce.cpp ${SOURCES_DIR}/internal/catch_enum_values_registry.cpp - ${SOURCES_DIR}/internal/catch_errno_guard.cpp ${SOURCES_DIR}/internal/catch_exception_translator_registry.cpp ${SOURCES_DIR}/internal/catch_fatal_condition_handler.cpp - ${SOURCES_DIR}/generators/catch_generator_exception.cpp - ${SOURCES_DIR}/generators/catch_generators.cpp - ${SOURCES_DIR}/interfaces/catch_interfaces_capture.cpp - ${SOURCES_DIR}/interfaces/catch_interfaces_config.cpp - ${SOURCES_DIR}/interfaces/catch_interfaces_exception.cpp - ${SOURCES_DIR}/interfaces/catch_interfaces_registry_hub.cpp + ${SOURCES_DIR}/generators/internal/catch_generators_combined_tu.cpp + ${SOURCES_DIR}/interfaces/catch_interfaces_combined_tu.cpp ${SOURCES_DIR}/interfaces/catch_interfaces_reporter.cpp - ${SOURCES_DIR}/interfaces/catch_interfaces_runner.cpp - ${SOURCES_DIR}/interfaces/catch_interfaces_testcase.cpp ${SOURCES_DIR}/internal/catch_list.cpp - ${SOURCES_DIR}/internal/catch_leak_detector.cpp - ${SOURCES_DIR}/matchers/catch_matchers.cpp - ${SOURCES_DIR}/matchers/catch_matchers_container_properties.cpp - ${SOURCES_DIR}/matchers/catch_matchers_exception.cpp ${SOURCES_DIR}/matchers/catch_matchers_floating.cpp - ${SOURCES_DIR}/matchers/catch_matchers_predicate.cpp ${SOURCES_DIR}/matchers/catch_matchers_string.cpp ${SOURCES_DIR}/matchers/catch_matchers_templated.cpp ${SOURCES_DIR}/catch_message.cpp ${SOURCES_DIR}/internal/catch_output_redirect.cpp ${SOURCES_DIR}/catch_registry_hub.cpp - ${SOURCES_DIR}/internal/catch_polyfills.cpp + ${SOURCES_DIR}/internal/catch_combined_tu.cpp ${SOURCES_DIR}/internal/catch_random_number_generator.cpp ${SOURCES_DIR}/internal/catch_reporter_registry.cpp ${SOURCES_DIR}/internal/catch_result_type.cpp @@ -177,11 +161,9 @@ set(IMPL_SOURCES ${SOURCES_DIR}/internal/catch_section.cpp ${SOURCES_DIR}/catch_session.cpp ${SOURCES_DIR}/internal/catch_singletons.cpp - ${SOURCES_DIR}/internal/catch_startup_exception_registry.cpp ${SOURCES_DIR}/internal/catch_stream.cpp ${SOURCES_DIR}/internal/catch_stringref.cpp ${SOURCES_DIR}/internal/catch_string_manip.cpp - ${SOURCES_DIR}/catch_tag_alias_autoregistrar.cpp ${SOURCES_DIR}/internal/catch_tag_alias_registry.cpp ${SOURCES_DIR}/catch_test_case_info.cpp ${SOURCES_DIR}/internal/catch_test_case_registry_impl.cpp @@ -192,7 +174,6 @@ set(IMPL_SOURCES ${SOURCES_DIR}/catch_timer.cpp ${SOURCES_DIR}/catch_tostring.cpp ${SOURCES_DIR}/catch_totals.cpp - ${SOURCES_DIR}/internal/catch_uncaught_exceptions.cpp ${SOURCES_DIR}/catch_version.cpp ${SOURCES_DIR}/internal/catch_wildcard_pattern.cpp ${SOURCES_DIR}/internal/catch_xmlwriter.cpp diff --git a/src/catch2/benchmark/catch_chronometer.cpp b/src/catch2/benchmark/catch_chronometer.cpp deleted file mode 100644 index 737c3e13..00000000 --- a/src/catch2/benchmark/catch_chronometer.cpp +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include - -namespace Catch { - namespace Benchmark { - namespace Detail { - ChronometerConcept::~ChronometerConcept() = default; - } // namespace Detail - } // namespace Benchmark -} // namespace Catch diff --git a/src/catch2/benchmark/detail/catch_benchmark_function.cpp b/src/catch2/benchmark/detail/catch_benchmark_function.cpp deleted file mode 100644 index a2f3029e..00000000 --- a/src/catch2/benchmark/detail/catch_benchmark_function.cpp +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include - -namespace Catch { - namespace Benchmark { - namespace Detail { - BenchmarkFunction::callable::~callable() = default; - } // namespace Detail - } // namespace Benchmark -} // namespace Catch diff --git a/src/catch2/benchmark/detail/catch_complete_invoke.cpp b/src/catch2/benchmark/detail/catch_complete_invoke.cpp deleted file mode 100644 index 8fd43d12..00000000 --- a/src/catch2/benchmark/detail/catch_complete_invoke.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include - -namespace Catch { - namespace Benchmark { - namespace Detail { - CATCH_INTERNAL_START_WARNINGS_SUPPRESSION - CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS - const std::string benchmarkErrorMsg = "a benchmark failed to run successfully"; - CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION - } // namespace Detail - } // namespace Benchmark -} // namespace Catch diff --git a/src/catch2/benchmark/detail/catch_run_for_at_least.cpp b/src/catch2/benchmark/detail/catch_run_for_at_least.cpp deleted file mode 100644 index f1dcbaba..00000000 --- a/src/catch2/benchmark/detail/catch_run_for_at_least.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -// Run a function for a minimum amount of time -#include - -#include -#include - -namespace Catch { - namespace Benchmark { - namespace Detail { - struct optimized_away_error : std::exception { - const char* what() const noexcept override; - }; - - const char* optimized_away_error::what() const noexcept { - return "could not measure benchmark, maybe it was optimized away"; - } - - void throw_optimized_away_error() { - Catch::throw_exception(optimized_away_error{}); - } - - } // namespace Detail - } // namespace Benchmark -} // namespace Catch diff --git a/src/catch2/benchmark/internal/catch_benchmark_combined_tu.cpp b/src/catch2/benchmark/internal/catch_benchmark_combined_tu.cpp new file mode 100644 index 00000000..02a2855b --- /dev/null +++ b/src/catch2/benchmark/internal/catch_benchmark_combined_tu.cpp @@ -0,0 +1,88 @@ +/** \file + * This is a special TU that combines what would otherwise be a very + * small benchmarking-related TUs into one bigger TU. + * + * The reason for this is compilation performance improvements by + * avoiding reparsing headers for many small TUs, instead having this + * one TU include bit more, but having it all parsed only once. + * + * To avoid heavy-tail problem with compilation times, each "subpart" + * of Catch2 has its own combined TU like this. + */ + +//////////////////////////////////////////// +// vvv formerly catch_chronometer.cpp vvv // +//////////////////////////////////////////// + +#include + +namespace Catch { + namespace Benchmark { + namespace Detail { + ChronometerConcept::~ChronometerConcept() = default; + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + + +/////////////////////////////////////////////////// +// vvv formerly catch_benchmark_function.cpp vvv // +/////////////////////////////////////////////////// + +#include + +namespace Catch { + namespace Benchmark { + namespace Detail { + BenchmarkFunction::callable::~callable() = default; + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + + +//////////////////////////////////////////////// +// vvv formerly catch_complete_invoke.cpp vvv // +//////////////////////////////////////////////// + +#include + +namespace Catch { + namespace Benchmark { + namespace Detail { + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS + const std::string benchmarkErrorMsg = "a benchmark failed to run successfully"; + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + + + + +///////////////////////////////////////////////// +// vvv formerly catch_run_for_at_least.cpp vvv // +///////////////////////////////////////////////// + +#include +#include +#include + +namespace Catch { + namespace Benchmark { + namespace Detail { + struct optimized_away_error : std::exception { + const char* what() const noexcept override; + }; + + const char* optimized_away_error::what() const noexcept { + return "could not measure benchmark, maybe it was optimized away"; + } + + void throw_optimized_away_error() { + Catch::throw_exception(optimized_away_error{}); + } + + } // namespace Detail + } // namespace Benchmark +} // namespace Catch diff --git a/src/catch2/catch_tag_alias_autoregistrar.cpp b/src/catch2/catch_tag_alias_autoregistrar.cpp deleted file mode 100644 index ea0e27b0..00000000 --- a/src/catch2/catch_tag_alias_autoregistrar.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include -#include - -namespace Catch { - - RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo) { - CATCH_TRY { - getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo); - } CATCH_CATCH_ALL { - // Do not throw when constructing global objects, instead register the exception to be processed later - getMutableRegistryHub().registerStartupException(); - } - } - -} diff --git a/src/catch2/generators/catch_generator_exception.cpp b/src/catch2/generators/catch_generator_exception.cpp deleted file mode 100644 index 446c732a..00000000 --- a/src/catch2/generators/catch_generator_exception.cpp +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include - -namespace Catch { - - const char* GeneratorException::what() const noexcept { - return m_msg; - } - -} // end namespace Catch diff --git a/src/catch2/generators/catch_generators.cpp b/src/catch2/generators/catch_generators.cpp deleted file mode 100644 index d0c759c4..00000000 --- a/src/catch2/generators/catch_generators.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Created by Phil Nash on 15/6/2018. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include -#include -#include -#include - -#include -#include - -namespace Catch { - -IGeneratorTracker::~IGeneratorTracker() {} - -namespace Generators { - -namespace Detail { - - [[noreturn]] - void throw_generator_exception(char const* msg) { - Catch::throw_exception(GeneratorException{ msg }); - } -} // end namespace Detail - - GeneratorUntypedBase::~GeneratorUntypedBase() {} - - auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { - return getResultCapture().acquireGeneratorTracker( lineInfo ); - } - -} // namespace Generators -} // namespace Catch diff --git a/src/catch2/generators/catch_generators.hpp b/src/catch2/generators/catch_generators.hpp index 60ab4b4f..b1eacd50 100644 --- a/src/catch2/generators/catch_generators.hpp +++ b/src/catch2/generators/catch_generators.hpp @@ -12,7 +12,6 @@ #include #include -#include #include #include diff --git a/src/catch2/generators/internal/catch_generators_combined_tu.cpp b/src/catch2/generators/internal/catch_generators_combined_tu.cpp new file mode 100644 index 00000000..84cf3707 --- /dev/null +++ b/src/catch2/generators/internal/catch_generators_combined_tu.cpp @@ -0,0 +1,58 @@ +/** \file + * This is a special TU that combines what would otherwise be a very + * small generator-related TUs into one bigger TU. + * + * The reason for this is compilation performance improvements by + * avoiding reparsing headers for many small TUs, instead having this + * one TU include bit more, but having it all parsed only once. + * + * To avoid heavy-tail problem with compilation times, each "subpart" + * of Catch2 has its own combined TU like this. + */ + +//////////////////////////////////////////////////// +// vvv formerly catch_generator_exception.cpp vvv // +//////////////////////////////////////////////////// + +#include + +namespace Catch { + + const char* GeneratorException::what() const noexcept { + return m_msg; + } + +} // end namespace Catch + + +/////////////////////////////////////////// +// vvv formerly catch_generators.cpp vvv // +/////////////////////////////////////////// + +#include +#include +#include +#include + +namespace Catch { + +IGeneratorTracker::~IGeneratorTracker() {} + +namespace Generators { + +namespace Detail { + + [[noreturn]] + void throw_generator_exception(char const* msg) { + Catch::throw_exception(GeneratorException{ msg }); + } +} // end namespace Detail + + GeneratorUntypedBase::~GeneratorUntypedBase() {} + + auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + return getResultCapture().acquireGeneratorTracker( lineInfo ); + } + +} // namespace Generators +} // namespace Catch diff --git a/src/catch2/interfaces/catch_interfaces_capture.cpp b/src/catch2/interfaces/catch_interfaces_capture.cpp deleted file mode 100644 index f49626e0..00000000 --- a/src/catch2/interfaces/catch_interfaces_capture.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include - -namespace Catch { - IResultCapture::~IResultCapture() = default; -} diff --git a/src/catch2/interfaces/catch_interfaces_combined_tu.cpp b/src/catch2/interfaces/catch_interfaces_combined_tu.cpp new file mode 100644 index 00000000..e35b865e --- /dev/null +++ b/src/catch2/interfaces/catch_interfaces_combined_tu.cpp @@ -0,0 +1,79 @@ +/** \file + * This is a special TU that combines what would otherwise be a very + * small interfaces-related TUs into one bigger TU. + * + * The reason for this is compilation performance improvements by + * avoiding reparsing headers for many small TUs, instead having this + * one TU include bit more, but having it all parsed only once. + * + * To avoid heavy-tail problem with compilation times, each "subpart" + * of Catch2 has its own combined TU like this. + */ + +/////////////////////////////////////////////////// +// vvv formerly catch_interfaces_capture.cpp vvv // +/////////////////////////////////////////////////// + +#include + +namespace Catch { + IResultCapture::~IResultCapture() = default; +} + + +////////////////////////////////////////////////// +// vvv formerly catch_interfaces_config.cpp vvv // +////////////////////////////////////////////////// + +#include + +namespace Catch { + IConfig::~IConfig() = default; +} + + +///////////////////////////////////////////////////// +// vvv formerly catch_interfaces_exception.cpp vvv // +///////////////////////////////////////////////////// + +#include + +namespace Catch { + IExceptionTranslator::~IExceptionTranslator() = default; + IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default; +} + + +//////////////////////////////////////////////////////// +// vvv formerly catch_interfaces_registry_hub.cpp vvv // +//////////////////////////////////////////////////////// + +#include + +namespace Catch { + IRegistryHub::~IRegistryHub() = default; + IMutableRegistryHub::~IMutableRegistryHub() = default; +} + + +////////////////////////////////////////////////// +// vvv formerly catch_interfaces_runner.cpp vvv // +////////////////////////////////////////////////// + +#include + +namespace Catch { + IRunner::~IRunner() = default; +} + + +//////////////////////////////////////////////////// +// vvv formerly catch_interfaces_testcase.cpp vvv // +//////////////////////////////////////////////////// + +#include + +namespace Catch { + ITestInvoker::~ITestInvoker() = default; + ITestCaseRegistry::~ITestCaseRegistry() = default; +} diff --git a/src/catch2/interfaces/catch_interfaces_config.cpp b/src/catch2/interfaces/catch_interfaces_config.cpp deleted file mode 100644 index b451278c..00000000 --- a/src/catch2/interfaces/catch_interfaces_config.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include - -namespace Catch { - IConfig::~IConfig() = default; -} diff --git a/src/catch2/interfaces/catch_interfaces_exception.cpp b/src/catch2/interfaces/catch_interfaces_exception.cpp deleted file mode 100644 index 6d6db336..00000000 --- a/src/catch2/interfaces/catch_interfaces_exception.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include - -namespace Catch { - IExceptionTranslator::~IExceptionTranslator() = default; - IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default; -} diff --git a/src/catch2/interfaces/catch_interfaces_registry_hub.cpp b/src/catch2/interfaces/catch_interfaces_registry_hub.cpp deleted file mode 100644 index 1dfd0f6f..00000000 --- a/src/catch2/interfaces/catch_interfaces_registry_hub.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include - -namespace Catch { - IRegistryHub::~IRegistryHub() = default; - IMutableRegistryHub::~IMutableRegistryHub() = default; -} diff --git a/src/catch2/interfaces/catch_interfaces_runner.cpp b/src/catch2/interfaces/catch_interfaces_runner.cpp deleted file mode 100644 index a624b639..00000000 --- a/src/catch2/interfaces/catch_interfaces_runner.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include - -namespace Catch { - IRunner::~IRunner() = default; -} diff --git a/src/catch2/interfaces/catch_interfaces_testcase.cpp b/src/catch2/interfaces/catch_interfaces_testcase.cpp deleted file mode 100644 index b43d05c9..00000000 --- a/src/catch2/interfaces/catch_interfaces_testcase.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include - -namespace Catch { - ITestInvoker::~ITestInvoker() = default; - ITestCaseRegistry::~ITestCaseRegistry() = default; -} diff --git a/src/catch2/internal/catch_combined_tu.cpp b/src/catch2/internal/catch_combined_tu.cpp new file mode 100644 index 00000000..c6819362 --- /dev/null +++ b/src/catch2/internal/catch_combined_tu.cpp @@ -0,0 +1,173 @@ +/** \file + * This is a special TU that combines what would otherwise be a very + * small top-level TUs into one bigger TU. + * + * The reason for this is compilation performance improvements by + * avoiding reparsing headers for many small TUs, instead having this + * one TU include bit more, but having it all parsed only once. + * + * To avoid heavy-tail problem with compilation times, each "subpart" + * of Catch2 has its own combined TU like this. + */ + + +//////////////////////////////////////////////////////// +// vvv formerly catch_tag_alias_autoregistrar.cpp vvv // +//////////////////////////////////////////////////////// + +#include +#include +#include + +namespace Catch { + + RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo) { + CATCH_TRY { + getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo); + } CATCH_CATCH_ALL { + // Do not throw when constructing global objects, instead register the exception to be processed later + getMutableRegistryHub().registerStartupException(); + } + } + +} + + +////////////////////////////////////////// +// vvv formerly catch_polyfills.cpp vvv // +////////////////////////////////////////// + +#include +#include +#include + +namespace Catch { + +#if !defined(CATCH_CONFIG_POLYFILL_ISNAN) + bool isnan(float f) { + return std::isnan(f); + } + bool isnan(double d) { + return std::isnan(d); + } +#else + // For now we only use this for embarcadero + bool isnan(float f) { + return std::_isnan(f); + } + bool isnan(double d) { + return std::_isnan(d); + } +#endif + +} // end namespace Catch + + +//////////////////////////////////////////////////// +// vvv formerly catch_uncaught_exceptions.cpp vvv // +//////////////////////////////////////////////////// + +#include +#include +#include + +namespace Catch { + bool uncaught_exceptions() { +#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) || (defined(__cpp_lib_uncaught_exceptions) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS)) + return std::uncaught_exceptions() > 0; +#else + return std::uncaught_exception(); +#endif + } +} // end namespace Catch + + +//////////////////////////////////////////// +// vvv formerly catch_errno_guard.cpp vvv // +//////////////////////////////////////////// +#include + +#include + +namespace Catch { + ErrnoGuard::ErrnoGuard():m_oldErrno(errno){} + ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; } +} + + +/////////////////////////////////////////// +// vvv formerly catch_decomposer.cpp vvv // +/////////////////////////////////////////// +#include + +namespace Catch { + + ITransientExpression::~ITransientExpression() = default; + + void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ) { + if( lhs.size() + rhs.size() < 40 && + lhs.find('\n') == std::string::npos && + rhs.find('\n') == std::string::npos ) + os << lhs << ' ' << op << ' ' << rhs; + else + os << lhs << '\n' << op << '\n' << rhs; + } +} + + +/////////////////////////////////////////////////////////// +// vvv formerly catch_startup_exception_registry.cpp vvv // +/////////////////////////////////////////////////////////// +#include +#include + +namespace Catch { +void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { + CATCH_TRY { + m_exceptions.push_back(exception); + } CATCH_CATCH_ALL { + // If we run out of memory during start-up there's really not a lot more we can do about it + std::terminate(); + } + } + + std::vector const& StartupExceptionRegistry::getExceptions() const noexcept { + return m_exceptions; + } + +} // end namespace Catch + + +////////////////////////////////////////////// +// vvv formerly catch_leak_detector.cpp vvv // +////////////////////////////////////////////// + #include + #include + + +#ifdef CATCH_CONFIG_WINDOWS_CRTDBG +#include + +namespace Catch { + + LeakDetector::LeakDetector() { + int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); + flag |= _CRTDBG_LEAK_CHECK_DF; + flag |= _CRTDBG_ALLOC_MEM_DF; + _CrtSetDbgFlag(flag); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); + // Change this to leaking allocation's number to break there + _CrtSetBreakAlloc(-1); + } +} + +#else // ^^ Windows crt debug heap enabled // Windows crt debug heap disabled vv + + Catch::LeakDetector::LeakDetector() {} + +#endif // CATCH_CONFIG_WINDOWS_CRTDBG + +Catch::LeakDetector::~LeakDetector() { + Catch::cleanUp(); +} diff --git a/src/catch2/internal/catch_decomposer.cpp b/src/catch2/internal/catch_decomposer.cpp deleted file mode 100644 index e1018cd6..00000000 --- a/src/catch2/internal/catch_decomposer.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Created by Phil Nash on 8/8/2017. - * Copyright 2017 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include -#include - -namespace Catch { - - ITransientExpression::~ITransientExpression() = default; - - void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ) { - if( lhs.size() + rhs.size() < 40 && - lhs.find('\n') == std::string::npos && - rhs.find('\n') == std::string::npos ) - os << lhs << ' ' << op << ' ' << rhs; - else - os << lhs << '\n' << op << '\n' << rhs; - } -} diff --git a/src/catch2/internal/catch_errno_guard.cpp b/src/catch2/internal/catch_errno_guard.cpp deleted file mode 100644 index 3cc3697c..00000000 --- a/src/catch2/internal/catch_errno_guard.cpp +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Created by Martin on 06/03/2017. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include - -#include - -namespace Catch { - ErrnoGuard::ErrnoGuard():m_oldErrno(errno){} - ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; } -} diff --git a/src/catch2/internal/catch_leak_detector.cpp b/src/catch2/internal/catch_leak_detector.cpp deleted file mode 100644 index 0f3ad29d..00000000 --- a/src/catch2/internal/catch_leak_detector.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Created by Martin on 12/07/2017. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - - #include - #include - - -#ifdef CATCH_CONFIG_WINDOWS_CRTDBG -#include - -namespace Catch { - - LeakDetector::LeakDetector() { - int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); - flag |= _CRTDBG_LEAK_CHECK_DF; - flag |= _CRTDBG_ALLOC_MEM_DF; - _CrtSetDbgFlag(flag); - _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); - _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); - // Change this to leaking allocation's number to break there - _CrtSetBreakAlloc(-1); - } -} - -#else - - Catch::LeakDetector::LeakDetector() {} - -#endif - -Catch::LeakDetector::~LeakDetector() { - Catch::cleanUp(); -} diff --git a/src/catch2/internal/catch_polyfills.cpp b/src/catch2/internal/catch_polyfills.cpp deleted file mode 100644 index a4d54ea8..00000000 --- a/src/catch2/internal/catch_polyfills.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Created by Martin on 17/11/2017. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include - -#include - -namespace Catch { - -#if !defined(CATCH_CONFIG_POLYFILL_ISNAN) - bool isnan(float f) { - return std::isnan(f); - } - bool isnan(double d) { - return std::isnan(d); - } -#else - // For now we only use this for embarcadero - bool isnan(float f) { - return std::_isnan(f); - } - bool isnan(double d) { - return std::_isnan(d); - } -#endif - -} // end namespace Catch diff --git a/src/catch2/internal/catch_startup_exception_registry.cpp b/src/catch2/internal/catch_startup_exception_registry.cpp deleted file mode 100644 index 8fd7034b..00000000 --- a/src/catch2/internal/catch_startup_exception_registry.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Created by Martin on 04/06/2017. - * Copyright 2017 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include -#include - -namespace Catch { -void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { - CATCH_TRY { - m_exceptions.push_back(exception); - } CATCH_CATCH_ALL { - // If we run out of memory during start-up there's really not a lot more we can do about it - std::terminate(); - } - } - - std::vector const& StartupExceptionRegistry::getExceptions() const noexcept { - return m_exceptions; - } - -} // end namespace Catch diff --git a/src/catch2/internal/catch_uncaught_exceptions.cpp b/src/catch2/internal/catch_uncaught_exceptions.cpp deleted file mode 100644 index 1aa863ad..00000000 --- a/src/catch2/internal/catch_uncaught_exceptions.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Created by Josh on 1/2/2018. - * Copyright 2018 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include -#include -#include - -namespace Catch { - bool uncaught_exceptions() { -#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) || (defined(__cpp_lib_uncaught_exceptions) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS)) - return std::uncaught_exceptions() > 0; -#else - return std::uncaught_exception(); -#endif - } -} // end namespace Catch diff --git a/src/catch2/matchers/catch_matchers.cpp b/src/catch2/matchers/catch_matchers.cpp deleted file mode 100644 index 20d1ef92..00000000 --- a/src/catch2/matchers/catch_matchers.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include - -namespace Catch { - - namespace Matchers { - - std::string MatcherUntypedBase::toString() const { - if (m_cachedToString.empty()) - m_cachedToString = describe(); - return m_cachedToString; - } - - MatcherUntypedBase::~MatcherUntypedBase() = default; - - } // namespace Matchers - -} // namespace Catch diff --git a/src/catch2/matchers/catch_matchers_container_properties.cpp b/src/catch2/matchers/catch_matchers_container_properties.cpp deleted file mode 100644 index 72b7b3df..00000000 --- a/src/catch2/matchers/catch_matchers_container_properties.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -#include - -#include - -namespace Catch { -namespace Matchers { - - std::string IsEmptyMatcher::describe() const { - return "is empty"; - } - - std::string HasSizeMatcher::describe() const { - ReusableStringStream sstr; - sstr << "has size == " << m_target_size; - return sstr.str(); - } - - IsEmptyMatcher IsEmpty() { - return {}; - } - - HasSizeMatcher SizeIs(std::size_t sz) { - return HasSizeMatcher{ sz }; - } - -} // end namespace Matchers -} // end namespace Catch diff --git a/src/catch2/matchers/catch_matchers_exception.cpp b/src/catch2/matchers/catch_matchers_exception.cpp deleted file mode 100644 index c8e8110d..00000000 --- a/src/catch2/matchers/catch_matchers_exception.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Created by Martin Hořeňovský on 13/10/2019. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -#include - - -namespace Catch { -namespace Matchers { - -bool ExceptionMessageMatcher::match(std::exception const& ex) const { - return ex.what() == m_message; -} - -std::string ExceptionMessageMatcher::describe() const { - return "exception message matches \"" + m_message + "\""; -} - -ExceptionMessageMatcher Message(std::string const& message) { - return ExceptionMessageMatcher(message); -} - -} // namespace Matchers -} // namespace Catch diff --git a/src/catch2/matchers/catch_matchers_predicate.cpp b/src/catch2/matchers/catch_matchers_predicate.cpp deleted file mode 100644 index fce37373..00000000 --- a/src/catch2/matchers/catch_matchers_predicate.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include - -std::string Catch::Matchers::Detail::finalizeDescription(const std::string& desc) { - if (desc.empty()) { - return "matches undescribed predicate"; - } else { - return "matches predicate: \"" + desc + '"'; - } -} diff --git a/src/catch2/matchers/internal/catch_matchers_combined_tu.cpp b/src/catch2/matchers/internal/catch_matchers_combined_tu.cpp new file mode 100644 index 00000000..7a406a6d --- /dev/null +++ b/src/catch2/matchers/internal/catch_matchers_combined_tu.cpp @@ -0,0 +1,127 @@ +/** \file + * This is a special TU that combines what would otherwise be a very + * small matcher-related TUs into one bigger TU. + * + * The reason for this is compilation performance improvements by + * avoiding reparsing headers for many small TUs, instead having this + * one TU include bit more, but having it all parsed only once. + * + * To avoid heavy-tail problem with compilation times, each "subpart" + * of Catch2 has its own combined TU like this. + */ + +////////////////////////////////////////////// +// vvv formerly catch_matchers_impl.cpp vvv // +////////////////////////////////////////////// +#include +#include +#include + +namespace Catch { + + // This is the general overload that takes a any string matcher + // There is another overload, in catch_assertionhandler.h/.cpp, that only takes a string and infers + // the Equals matcher (so the header does not mention matchers) + void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString ) { + std::string exceptionMessage = Catch::translateActiveException(); + MatchExpr expr( std::move(exceptionMessage), matcher, matcherString ); + handler.handleExpr( expr ); + } + +} // namespace Catch + + +////////////////////////////////////////////////////////////// +// vvv formerly catch_matchers_container_properties.cpp vvv // +////////////////////////////////////////////////////////////// +#include +#include + +namespace Catch { +namespace Matchers { + + std::string IsEmptyMatcher::describe() const { + return "is empty"; + } + + std::string HasSizeMatcher::describe() const { + ReusableStringStream sstr; + sstr << "has size == " << m_target_size; + return sstr.str(); + } + + IsEmptyMatcher IsEmpty() { + return {}; + } + + HasSizeMatcher SizeIs(std::size_t sz) { + return HasSizeMatcher{ sz }; + } + +} // end namespace Matchers +} // end namespace Catch + + + +///////////////////////////////////////// +// vvv formerly catch_matchers.cpp vvv // +///////////////////////////////////////// + +#include + +namespace Catch { +namespace Matchers { + + std::string MatcherUntypedBase::toString() const { + if (m_cachedToString.empty()) { + m_cachedToString = describe(); + } + return m_cachedToString; + } + + MatcherUntypedBase::~MatcherUntypedBase() = default; + +} // namespace Matchers +} // namespace Catch + + + +/////////////////////////////////////////////////// +// vvv formerly catch_matchers_predicate.cpp vvv // +/////////////////////////////////////////////////// +#include + +std::string Catch::Matchers::Detail::finalizeDescription(const std::string& desc) { + if (desc.empty()) { + return "matches undescribed predicate"; + } else { + return "matches predicate: \"" + desc + '"'; + } +} + + + + + +/////////////////////////////////////////////////// +// vvv formerly catch_matchers_exception.cpp vvv // +/////////////////////////////////////////////////// +#include + +namespace Catch { +namespace Matchers { + +bool ExceptionMessageMatcher::match(std::exception const& ex) const { + return ex.what() == m_message; +} + +std::string ExceptionMessageMatcher::describe() const { + return "exception message matches \"" + m_message + "\""; +} + +ExceptionMessageMatcher Message(std::string const& message) { + return ExceptionMessageMatcher(message); +} + +} // namespace Matchers +} // namespace Catch diff --git a/src/catch2/matchers/internal/catch_matchers_impl.cpp b/src/catch2/matchers/internal/catch_matchers_impl.cpp deleted file mode 100644 index 6ebab591..00000000 --- a/src/catch2/matchers/internal/catch_matchers_impl.cpp +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ -#include -#include -#include - -namespace Catch { - - // This is the general overload that takes a any string matcher - // There is another overload, in catch_assertionhandler.h/.cpp, that only takes a string and infers - // the Equals matcher (so the header does not mention matchers) - void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString ) { - std::string exceptionMessage = Catch::translateActiveException(); - MatchExpr expr( std::move(exceptionMessage), matcher, matcherString ); - handler.handleExpr( expr ); - } - -} // namespace Catch