diff --git a/rx/CMakeLists.txt b/rx/CMakeLists.txt index 6cbfb26fb..6517f1c0d 100644 --- a/rx/CMakeLists.txt +++ b/rx/CMakeLists.txt @@ -4,6 +4,7 @@ find_package(Git) add_library(${PROJECT_NAME} OBJECT + src/die.cpp src/hexdump.cpp src/mem.cpp src/Version.cpp diff --git a/rx/include/rx/atScopeExit.hpp b/rx/include/rx/atScopeExit.hpp new file mode 100644 index 000000000..09feb5887 --- /dev/null +++ b/rx/include/rx/atScopeExit.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace rx { +template class atScopeExit { + T _object; + +public: + atScopeExit(T &&object) : _object(std::forward(object)) {} + ~atScopeExit() { _object(); } +}; +} // namespace rx diff --git a/rx/include/rx/die.hpp b/rx/include/rx/die.hpp new file mode 100644 index 000000000..2bc17ac54 --- /dev/null +++ b/rx/include/rx/die.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace rx { +[[noreturn, gnu::format(printf, 1, 2)]] void die(const char *message, ...); +[[gnu::format(printf, 2, 3)]] void dieIf(bool condition, const char *message, + ...); +} // namespace rx diff --git a/rx/src/die.cpp b/rx/src/die.cpp new file mode 100644 index 000000000..5c562b207 --- /dev/null +++ b/rx/src/die.cpp @@ -0,0 +1,26 @@ +#pragma once +#include "die.hpp" + +#include +#include +#include + +void rx::die(const char *message, ...) { + va_list args; + va_start(args, message); + std::vfprintf(stderr, message, args); + std::fprintf(stderr, "\n"); + va_end(args); + std::abort(); +} + +void rx::dieIf(bool condition, const char *message, ...) { + if (condition) { + va_list args; + va_start(args, message); + std::vfprintf(stderr, message, args); + std::fprintf(stderr, "\n"); + va_end(args); + std::abort(); + } +}