From 6fc476f1f020eb10f78f13966cff9bccb5bea049 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 26 Jan 2025 14:45:43 +0300 Subject: [PATCH] Support building without Boost.Stacktrace --- 3rdparty/CMakeLists.txt | 45 ++++++++++--------- CMakeLists.txt | 6 +++ libs/async/include/psemek/async/future.hpp | 8 ++-- libs/bt/include/psemek/bt/assert.hpp | 2 +- .../psemek/ecs/detail/component_registry.hpp | 2 +- libs/ecs/include/psemek/ecs/exceptions.hpp | 4 +- libs/io/include/psemek/io/error.hpp | 8 ++-- libs/io/source/error.cpp | 8 ++-- libs/log/source/log.cpp | 2 +- .../math/include/psemek/math/detail/array.hpp | 2 +- .../ml/include/psemek/ml/neural_net/error.hpp | 8 ++-- libs/ml/source/neural_net/error.cpp | 8 ++-- libs/parser/include/psemek/parser/parser.hpp | 2 +- libs/rs/include/psemek/rs/registry.hpp | 4 +- libs/rs/source/registry.cpp | 4 +- libs/util/CMakeLists.txt | 8 +++- libs/util/include/psemek/util/assert.hpp | 2 +- libs/util/include/psemek/util/at.hpp | 2 +- libs/util/include/psemek/util/enum.hpp | 2 +- libs/util/include/psemek/util/exception.hpp | 24 ++++++++-- libs/util/include/psemek/util/function.hpp | 3 +- .../include/psemek/util/not_implemented.hpp | 2 +- .../util/include/psemek/util/system_error.hpp | 2 +- libs/util/include/psemek/util/unicode.hpp | 2 +- libs/util/source/not_implemented.cpp | 4 +- 25 files changed, 95 insertions(+), 69 deletions(-) diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index 8d94770d..cf8a7a4d 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -2,28 +2,31 @@ file(GLOB_RECURSE RAPIDJSON_SOURCES "${CMAKE_CURRENT_LIST_DIR}/rapidjson/include add_library(rapidjson INTERFACE EXCLUDE_FROM_ALL "${RAPIDJSON_SOURCES}") target_include_directories(rapidjson INTERFACE "${CMAKE_CURRENT_LIST_DIR}/rapidjson/include") -set(LIBBACKTRACE_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/libbacktrace") -set(LIBBACKTRACE_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace") -set(LIBBACKTRACE_INCLUDE_DIR "${LIBBACKTRACE_BUILD_DIR}/include") -set(LIBBACKTRACE_LIBRARY "${LIBBACKTRACE_BUILD_DIR}/.libs/libbacktrace.a") +if(PSEMEK_STACKTRACE) + set(LIBBACKTRACE_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/libbacktrace") + set(LIBBACKTRACE_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace") + set(LIBBACKTRACE_INCLUDE_DIR "${LIBBACKTRACE_BUILD_DIR}/include") + set(LIBBACKTRACE_LIBRARY "${LIBBACKTRACE_BUILD_DIR}/.libs/libbacktrace.a") -if(NOT EXISTS "${LIBBACKTRACE_BUILD_DIR}") - file(COPY "${LIBBACKTRACE_SOURCE_DIR}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") - make_directory("${LIBBACKTRACE_INCLUDE_DIR}") - file(COPY "${LIBBACKTRACE_SOURCE_DIR}/backtrace.h" DESTINATION "${LIBBACKTRACE_INCLUDE_DIR}") - if(PSEMEK_PACKAGE_TARGET AND WIN32) - execute_process(COMMAND "./configure" "--host=x86_64-w64-mingw32" "CC=${CMAKE_C_COMPILER}" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) - elseif(PSEMEK_PACKAGE_TARGET AND ANDROID) - execute_process(COMMAND "./configure" "--host=aarch64-none-linux-android34" "CC=${CMAKE_C_COMPILER}" "CFLAGS=--target=aarch64-none-linux-android34" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) - else() - execute_process(COMMAND "./configure" "CC=${CMAKE_C_COMPILER}" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) - endif() - execute_process(COMMAND "make" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" RESULT_VARIABLE LIBBACKTRACE_BUILD_RESULT COMMAND_ECHO STDOUT) - if(NOT (${LIBBACKTRACE_BUILD_RESULT} EQUAL 0)) - message(FATAL_ERROR "libbacktrace build failed") + if(NOT EXISTS "${LIBBACKTRACE_BUILD_DIR}") + file(COPY "${LIBBACKTRACE_SOURCE_DIR}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") + make_directory("${LIBBACKTRACE_INCLUDE_DIR}") + file(COPY "${LIBBACKTRACE_SOURCE_DIR}/backtrace.h" DESTINATION "${LIBBACKTRACE_INCLUDE_DIR}") + if(PSEMEK_PACKAGE_TARGET AND WIN32) + execute_process(COMMAND "./configure" "--host=x86_64-w64-mingw32" "CC=${CMAKE_C_COMPILER}" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) + elseif(PSEMEK_PACKAGE_TARGET AND ANDROID) + execute_process(COMMAND "./configure" "--host=aarch64-none-linux-android34" "CC=${CMAKE_C_COMPILER}" "CFLAGS=--target=aarch64-none-linux-android34" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) + else() + execute_process(COMMAND "./configure" "CC=${CMAKE_C_COMPILER}" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" COMMAND_ECHO STDOUT) + endif() + execute_process(COMMAND "make" WORKING_DIRECTORY "${LIBBACKTRACE_BUILD_DIR}" RESULT_VARIABLE LIBBACKTRACE_BUILD_RESULT COMMAND_ECHO STDOUT) + if(NOT (${LIBBACKTRACE_BUILD_RESULT} EQUAL 0)) + message(FATAL_ERROR "libbacktrace build failed") + endif() endif() + + add_library(libbacktrace INTERFACE) + target_include_directories(libbacktrace INTERFACE "${LIBBACKTRACE_INCLUDE_DIR}") + target_link_libraries(libbacktrace INTERFACE "${LIBBACKTRACE_LIBRARY}") endif() -add_library(libbacktrace INTERFACE) -target_include_directories(libbacktrace INTERFACE "${LIBBACKTRACE_INCLUDE_DIR}") -target_link_libraries(libbacktrace INTERFACE "${LIBBACKTRACE_LIBRARY}") diff --git a/CMakeLists.txt b/CMakeLists.txt index 08c4854f..2d921795 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,6 +72,12 @@ endif() message(STATUS "Using graphics API ${PSEMEK_GRAPHICS_API}") list(APPEND PSEMEK_DEFINITIONS "-DPSEMEK_GRAPHICS_API_${PSEMEK_GRAPHICS_API}=1") +option(PSEMEK_STACKTRACE "Use Boost.Stacktrace for stacktraces in exceptions" ON) + +if(PSEMEK_STACKTRACE) + list(APPEND PSEMEK_DEFINITIONS "-DPSEMEK_STACKTRACE=1") +endif() + add_subdirectory(3rdparty) get_directory_property(PSEMEK_PARENT_DIRECTORY PARENT_DIRECTORY) diff --git a/libs/async/include/psemek/async/future.hpp b/libs/async/include/psemek/async/future.hpp index d3b588c9..e6863889 100644 --- a/libs/async/include/psemek/async/future.hpp +++ b/libs/async/include/psemek/async/future.hpp @@ -63,7 +63,7 @@ namespace psemek::async struct empty_future_error : util::exception { - empty_future_error(boost::stacktrace::stacktrace stacktrace = {}) + empty_future_error(util::stacktrace stacktrace = {}) : util::exception("Future is empty", std::move(stacktrace)) {} }; @@ -71,7 +71,7 @@ namespace psemek::async struct canceled_task_error : util::exception { - canceled_task_error(boost::stacktrace::stacktrace stacktrace = {}) + canceled_task_error(util::stacktrace stacktrace = {}) : util::exception("Task canceled", std::move(stacktrace)) {} }; @@ -184,7 +184,7 @@ namespace psemek::async struct empty_promise_error : util::exception { - empty_promise_error(boost::stacktrace::stacktrace stacktrace = {}) + empty_promise_error(util::stacktrace stacktrace = {}) : util::exception("Promise is empty", std::move(stacktrace)) {} }; @@ -192,7 +192,7 @@ namespace psemek::async struct satisfied_promise_error : util::exception { - satisfied_promise_error(boost::stacktrace::stacktrace stacktrace = {}) + satisfied_promise_error(util::stacktrace stacktrace = {}) : util::exception("Promise already contains a value or exception", std::move(stacktrace)) {} }; diff --git a/libs/bt/include/psemek/bt/assert.hpp b/libs/bt/include/psemek/bt/assert.hpp index a4cf5fc5..afea46a1 100644 --- a/libs/bt/include/psemek/bt/assert.hpp +++ b/libs/bt/include/psemek/bt/assert.hpp @@ -11,7 +11,7 @@ namespace psemek::bt struct assertion_failed_exception : util::exception { - assertion_failed_exception(std::string message, boost::stacktrace::stacktrace stacktrace = {}) + assertion_failed_exception(std::string message, util::stacktrace stacktrace = {}) : util::exception(std::move(message), std::move(stacktrace)) {} }; diff --git a/libs/ecs/include/psemek/ecs/detail/component_registry.hpp b/libs/ecs/include/psemek/ecs/detail/component_registry.hpp index 00d6d649..3b24b384 100644 --- a/libs/ecs/include/psemek/ecs/detail/component_registry.hpp +++ b/libs/ecs/include/psemek/ecs/detail/component_registry.hpp @@ -13,7 +13,7 @@ namespace psemek::ecs::detail struct duplicate_uuid_exception : util::exception { - duplicate_uuid_exception(util::uuid const & uuid, std::type_info const & type1, std::type_info const & type2, boost::stacktrace::stacktrace stacktrace = {}) + duplicate_uuid_exception(util::uuid const & uuid, std::type_info const & type1, std::type_info const & type2, util::stacktrace stacktrace = {}) : util::exception(util::to_string("Found duplicate UUID ", uuid, " for components ", util::type_name(type1), " and ", util::type_name(type2)), std::move(stacktrace)) , uuid_(uuid) , type1_(type1) diff --git a/libs/ecs/include/psemek/ecs/exceptions.hpp b/libs/ecs/include/psemek/ecs/exceptions.hpp index 3ee59494..7c9aa67f 100644 --- a/libs/ecs/include/psemek/ecs/exceptions.hpp +++ b/libs/ecs/include/psemek/ecs/exceptions.hpp @@ -13,7 +13,7 @@ namespace psemek::ecs struct component_not_found_exception : util::exception { - component_not_found_exception(std::type_info const & type, handle const & handle, std::string const & description, boost::stacktrace::stacktrace stacktrace = {}) + component_not_found_exception(std::type_info const & type, handle const & handle, std::string const & description, util::stacktrace stacktrace = {}) : util::exception(util::to_string("Component ", util::type_name(type), " not found for entity ", handle, " <", description, ">"), std::move(stacktrace)) , type_(type) , handle_(handle) @@ -37,7 +37,7 @@ namespace psemek::ecs struct entity_not_cloneable : util::exception { - entity_not_cloneable(handle const & entity, std::vector non_copyable_components, boost::stacktrace::stacktrace stacktrace = {}) + entity_not_cloneable(handle const & entity, std::vector non_copyable_components, util::stacktrace stacktrace = {}) : util::exception(make_message(entity, non_copyable_components), std::move(stacktrace)) , entity_(entity) , non_copyable_components_(std::move(non_copyable_components)) diff --git a/libs/io/include/psemek/io/error.hpp b/libs/io/include/psemek/io/error.hpp index 780fda8b..225458a7 100644 --- a/libs/io/include/psemek/io/error.hpp +++ b/libs/io/include/psemek/io/error.hpp @@ -14,13 +14,13 @@ namespace psemek::io struct null_istream : null_stream { - null_istream(boost::stacktrace::stacktrace stacktrace = {}); + null_istream(util::stacktrace stacktrace = {}); }; struct null_ostream : null_stream { - null_ostream(boost::stacktrace::stacktrace stacktrace = {}); + null_ostream(util::stacktrace stacktrace = {}); }; struct stream_end @@ -32,13 +32,13 @@ namespace psemek::io struct istream_end : stream_end { - istream_end(boost::stacktrace::stacktrace stacktrace = {}); + istream_end(util::stacktrace stacktrace = {}); }; struct ostream_end : stream_end { - ostream_end(boost::stacktrace::stacktrace stacktrace = {}); + ostream_end(util::stacktrace stacktrace = {}); }; } diff --git a/libs/io/source/error.cpp b/libs/io/source/error.cpp index 681fcce6..76f60357 100644 --- a/libs/io/source/error.cpp +++ b/libs/io/source/error.cpp @@ -3,19 +3,19 @@ namespace psemek::io { - null_istream::null_istream(boost::stacktrace::stacktrace stacktrace) + null_istream::null_istream(util::stacktrace stacktrace) : null_stream("Attempt to read from null input stream", std::move(stacktrace)) {} - null_ostream::null_ostream(boost::stacktrace::stacktrace stacktrace) + null_ostream::null_ostream(util::stacktrace stacktrace) : null_stream("Attempt to write to null output stream", std::move(stacktrace)) {} - istream_end::istream_end(boost::stacktrace::stacktrace stacktrace) + istream_end::istream_end(util::stacktrace stacktrace) : stream_end("Unexpected input stream end", std::move(stacktrace)) {} - ostream_end::ostream_end(boost::stacktrace::stacktrace stacktrace) + ostream_end::ostream_end(util::stacktrace stacktrace) : stream_end("Unexpected output stream end", std::move(stacktrace)) {} diff --git a/libs/log/source/log.cpp b/libs/log/source/log.cpp index c5177a5f..a452eca2 100644 --- a/libs/log/source/log.cpp +++ b/libs/log/source/log.cpp @@ -61,7 +61,7 @@ namespace psemek::log if (p.signal == signal) { log::error() << p.message; - log::error() << boost::stacktrace::stacktrace(); + log::error() << util::stacktrace(); break; } } diff --git a/libs/math/include/psemek/math/detail/array.hpp b/libs/math/include/psemek/math/detail/array.hpp index 2847d8cb..db36bbcb 100644 --- a/libs/math/include/psemek/math/detail/array.hpp +++ b/libs/math/include/psemek/math/detail/array.hpp @@ -8,7 +8,7 @@ namespace psemek::math::detail struct empty_array_exception : util::exception { - empty_array_exception(boost::stacktrace::stacktrace stacktrace = {}) + empty_array_exception(util::stacktrace stacktrace = {}) : util::exception("Indexing an empty array", std::move(stacktrace)) {} }; diff --git a/libs/ml/include/psemek/ml/neural_net/error.hpp b/libs/ml/include/psemek/ml/neural_net/error.hpp index b1731822..ff26a8a1 100644 --- a/libs/ml/include/psemek/ml/neural_net/error.hpp +++ b/libs/ml/include/psemek/ml/neural_net/error.hpp @@ -14,25 +14,25 @@ namespace psemek::ml struct empty_neural_net_error : neural_net_error { - empty_neural_net_error(boost::stacktrace::stacktrace stacktrace = {}); + empty_neural_net_error(util::stacktrace stacktrace = {}); }; struct wrong_activation_types_count_error : neural_net_error { - wrong_activation_types_count_error(std::size_t expected, std::size_t actual, boost::stacktrace::stacktrace stacktrace = {}); + wrong_activation_types_count_error(std::size_t expected, std::size_t actual, util::stacktrace stacktrace = {}); }; struct wrong_neural_net_input_size : neural_net_error { - wrong_neural_net_input_size(std::size_t expected, std::size_t actual, boost::stacktrace::stacktrace stacktrace = {}); + wrong_neural_net_input_size(std::size_t expected, std::size_t actual, util::stacktrace stacktrace = {}); }; struct wrong_neural_net_output_size : neural_net_error { - wrong_neural_net_output_size(std::size_t expected, std::size_t actual, boost::stacktrace::stacktrace stacktrace = {}); + wrong_neural_net_output_size(std::size_t expected, std::size_t actual, util::stacktrace stacktrace = {}); }; } diff --git a/libs/ml/source/neural_net/error.cpp b/libs/ml/source/neural_net/error.cpp index b338de66..66e292e1 100644 --- a/libs/ml/source/neural_net/error.cpp +++ b/libs/ml/source/neural_net/error.cpp @@ -5,19 +5,19 @@ namespace psemek::ml { - empty_neural_net_error::empty_neural_net_error(boost::stacktrace::stacktrace stacktrace) + empty_neural_net_error::empty_neural_net_error(util::stacktrace stacktrace) : neural_net_error("Neural net must have at least a single layer", std::move(stacktrace)) {} - wrong_activation_types_count_error::wrong_activation_types_count_error(std::size_t expected, std::size_t actual, boost::stacktrace::stacktrace stacktrace) + wrong_activation_types_count_error::wrong_activation_types_count_error(std::size_t expected, std::size_t actual, util::stacktrace stacktrace) : neural_net_error(util::to_string("Wrong number of activation types: expected ", expected, ", got ", actual), std::move(stacktrace)) {} - wrong_neural_net_input_size::wrong_neural_net_input_size(std::size_t expected, std::size_t actual, boost::stacktrace::stacktrace stacktrace) + wrong_neural_net_input_size::wrong_neural_net_input_size(std::size_t expected, std::size_t actual, util::stacktrace stacktrace) : neural_net_error(util::to_string("Wrong neural net input size: expected ", expected, ", got ", actual), std::move(stacktrace)) {} - wrong_neural_net_output_size::wrong_neural_net_output_size(std::size_t expected, std::size_t actual, boost::stacktrace::stacktrace stacktrace) + wrong_neural_net_output_size::wrong_neural_net_output_size(std::size_t expected, std::size_t actual, util::stacktrace stacktrace) : neural_net_error(util::to_string("Wrong neural net output size: expected ", expected, ", got ", actual), std::move(stacktrace)) {} diff --git a/libs/parser/include/psemek/parser/parser.hpp b/libs/parser/include/psemek/parser/parser.hpp index 441af71f..2f550591 100644 --- a/libs/parser/include/psemek/parser/parser.hpp +++ b/libs/parser/include/psemek/parser/parser.hpp @@ -16,7 +16,7 @@ namespace psemek::parser struct parse_error : util::exception { - parse_error(std::string message, std::size_t line, std::size_t character, boost::stacktrace::stacktrace stacktrace = {}) + parse_error(std::string message, std::size_t line, std::size_t character, util::stacktrace stacktrace = {}) : util::exception(util::to_string(message, " at ", line, "#", character), std::move(stacktrace)) , message_{std::move(message)} , line_{line} diff --git a/libs/rs/include/psemek/rs/registry.hpp b/libs/rs/include/psemek/rs/registry.hpp index 53360246..a70e429c 100644 --- a/libs/rs/include/psemek/rs/registry.hpp +++ b/libs/rs/include/psemek/rs/registry.hpp @@ -11,7 +11,7 @@ namespace psemek::rs struct unknown_id_error : util::exception { - unknown_id_error(rs::id id, boost::stacktrace::stacktrace stacktrace = {}); + unknown_id_error(rs::id id, util::stacktrace stacktrace = {}); rs::id id() const { return id_; } @@ -22,7 +22,7 @@ namespace psemek::rs struct unknown_name_error : util::exception { - unknown_name_error(std::string_view name, boost::stacktrace::stacktrace stacktrace = {}); + unknown_name_error(std::string_view name, util::stacktrace stacktrace = {}); std::string_view name() const { return name_; } diff --git a/libs/rs/source/registry.cpp b/libs/rs/source/registry.cpp index 82fe67b2..b9ef57f6 100644 --- a/libs/rs/source/registry.cpp +++ b/libs/rs/source/registry.cpp @@ -41,12 +41,12 @@ namespace psemek::rs } - unknown_id_error::unknown_id_error(rs::id id, boost::stacktrace::stacktrace stacktrace) + unknown_id_error::unknown_id_error(rs::id id, util::stacktrace stacktrace) : util::exception(util::to_string("unknown resource id: ", id), std::move(stacktrace)) , id_(id) {} - unknown_name_error::unknown_name_error(std::string_view name, boost::stacktrace::stacktrace stacktrace) + unknown_name_error::unknown_name_error(std::string_view name, util::stacktrace stacktrace) : util::exception(util::to_string("unknown resource name: ", name), std::move(stacktrace)) {} diff --git a/libs/util/CMakeLists.txt b/libs/util/CMakeLists.txt index 48e2868d..71235109 100644 --- a/libs/util/CMakeLists.txt +++ b/libs/util/CMakeLists.txt @@ -5,8 +5,12 @@ file(GLOB_RECURSE PSEMEK_UTIL_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "so psemek_add_library(psemek-util ${PSEMEK_UTIL_HEADERS} ${PSEMEK_UTIL_SOURCES}) target_include_directories(psemek-util PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") -target_link_libraries(psemek-util PUBLIC ${CMAKE_THREAD_LIBS_INIT} Boost::boost libbacktrace) -target_compile_definitions(psemek-util PUBLIC "-DBOOST_STACKTRACE_USE_BACKTRACE") +target_link_libraries(psemek-util PUBLIC ${CMAKE_THREAD_LIBS_INIT} Boost::boost) + +if(PSEMEK_STACKTRACE) + target_link_libraries(psemek-util PUBLIC libbacktrace) + target_compile_definitions(psemek-util PUBLIC "-DBOOST_STACKTRACE_USE_BACKTRACE") +endif() psemek_glob_tests(psemek-util tests) diff --git a/libs/util/include/psemek/util/assert.hpp b/libs/util/include/psemek/util/assert.hpp index e42723cc..daa54cad 100644 --- a/libs/util/include/psemek/util/assert.hpp +++ b/libs/util/include/psemek/util/assert.hpp @@ -12,7 +12,7 @@ namespace psemek::util { - [[noreturn]] inline bool assertion_handler(char const * assertion, boost::stacktrace::stacktrace stacktrace = {}) + [[noreturn]] inline bool assertion_handler(char const * assertion, stacktrace stacktrace = {}) { throw ::psemek::util::exception(assertion, std::move(stacktrace)); } diff --git a/libs/util/include/psemek/util/at.hpp b/libs/util/include/psemek/util/at.hpp index a69f7b89..0339f117 100644 --- a/libs/util/include/psemek/util/at.hpp +++ b/libs/util/include/psemek/util/at.hpp @@ -36,7 +36,7 @@ namespace psemek::util struct key_error : key_error_base { - key_error(Key const & key, boost::stacktrace::stacktrace stacktrace = {}) + key_error(Key const & key, util::stacktrace stacktrace = {}) : key_error_base(detail::key_error_to_string(key), std::move(stacktrace)) , key_(key) {} diff --git a/libs/util/include/psemek/util/enum.hpp b/libs/util/include/psemek/util/enum.hpp index 44ed9047..9134c756 100644 --- a/libs/util/include/psemek/util/enum.hpp +++ b/libs/util/include/psemek/util/enum.hpp @@ -26,7 +26,7 @@ namespace psemek::util struct unknown_enum_value_exception : unknown_enum_value_exception_base { - unknown_enum_value_exception(Enum value, boost::stacktrace::stacktrace stacktrace = {}) + unknown_enum_value_exception(Enum value, util::stacktrace stacktrace = {}) : unknown_enum_value_exception_base(to_string("unknown ", type_name(), " value: ", static_cast>(value)), std::move(stacktrace)) , value_(value) {} diff --git a/libs/util/include/psemek/util/exception.hpp b/libs/util/include/psemek/util/exception.hpp index 16d1940d..48ada36c 100644 --- a/libs/util/include/psemek/util/exception.hpp +++ b/libs/util/include/psemek/util/exception.hpp @@ -1,6 +1,8 @@ #pragma once -#include +#ifdef PSEMEK_STACKTRACE + #include +#endif #include #include @@ -9,10 +11,24 @@ namespace psemek::util { +#ifdef PSEMEK_STACKTRACE + using stacktrace = boost::stacktrace::stacktrace; +#else + struct stacktrace + { + template + friend Stream & operator << (Stream & stream, stacktrace) + { + stream << "(stacktrace disabled)\n"; + return stream; + } + }; +#endif + struct exception : std::exception { - exception(std::string message, boost::stacktrace::stacktrace stacktrace = {}) + exception(std::string message, stacktrace stacktrace = {}) : message_(std::move(message)) , stacktrace_(std::move(stacktrace)) {} @@ -27,14 +43,14 @@ namespace psemek::util return message_; } - boost::stacktrace::stacktrace const & stacktrace() const noexcept + auto const & stacktrace() const noexcept { return stacktrace_; } private: std::string message_; - boost::stacktrace::stacktrace stacktrace_; + util::stacktrace stacktrace_; }; inline std::ostream & operator << (std::ostream & os, exception const & e) diff --git a/libs/util/include/psemek/util/function.hpp b/libs/util/include/psemek/util/function.hpp index 4da1b449..f9cbea95 100644 --- a/libs/util/include/psemek/util/function.hpp +++ b/libs/util/include/psemek/util/function.hpp @@ -3,7 +3,6 @@ #include #include -#include #include namespace psemek::util @@ -12,7 +11,7 @@ namespace psemek::util struct empty_function_error : exception { - empty_function_error(boost::stacktrace::stacktrace stacktrace = {}) + empty_function_error(util::stacktrace stacktrace = {}) : exception("Trying to call an empty function", std::move(stacktrace)) {} }; diff --git a/libs/util/include/psemek/util/not_implemented.hpp b/libs/util/include/psemek/util/not_implemented.hpp index 420e035d..e7150086 100644 --- a/libs/util/include/psemek/util/not_implemented.hpp +++ b/libs/util/include/psemek/util/not_implemented.hpp @@ -8,7 +8,7 @@ namespace psemek::util struct not_implemented_error : exception { - not_implemented_error(boost::stacktrace::stacktrace stacktrace = {}); + not_implemented_error(util::stacktrace stacktrace = {}); }; [[noreturn]] void not_implemented(); diff --git a/libs/util/include/psemek/util/system_error.hpp b/libs/util/include/psemek/util/system_error.hpp index 17f0f28a..946c1de1 100644 --- a/libs/util/include/psemek/util/system_error.hpp +++ b/libs/util/include/psemek/util/system_error.hpp @@ -8,7 +8,7 @@ namespace psemek::util struct system_error : exception { - system_error(std::error_code error_code, std::string message, boost::stacktrace::stacktrace stacktrace = {}) + system_error(std::error_code error_code, std::string message, util::stacktrace stacktrace = {}) : exception(message + ": " + error_code.message(), std::move(stacktrace)) , error_code_(error_code) {} diff --git a/libs/util/include/psemek/util/unicode.hpp b/libs/util/include/psemek/util/unicode.hpp index be388b55..31a2dc94 100644 --- a/libs/util/include/psemek/util/unicode.hpp +++ b/libs/util/include/psemek/util/unicode.hpp @@ -73,7 +73,7 @@ namespace psemek::util struct invalid_utf8 : exception { - invalid_utf8(char const * data, boost::stacktrace::stacktrace stacktrace = {}) + invalid_utf8(char const * data, util::stacktrace stacktrace = {}) : exception("Invalid UTF-8 string", std::move(stacktrace)) , data_{data} {} diff --git a/libs/util/source/not_implemented.cpp b/libs/util/source/not_implemented.cpp index 5c3e6d83..eccfe752 100644 --- a/libs/util/source/not_implemented.cpp +++ b/libs/util/source/not_implemented.cpp @@ -1,11 +1,9 @@ #include -#include - namespace psemek::util { - not_implemented_error::not_implemented_error(boost::stacktrace::stacktrace stacktrace) + not_implemented_error::not_implemented_error(util::stacktrace stacktrace) : exception("Not implemented", std::move(stacktrace)) {}