diff options
Diffstat (limited to 'src/base/Base.cpp')
| -rw-r--r-- | src/base/Base.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/base/Base.cpp b/src/base/Base.cpp index c6d9ac07..49b0c462 100644 --- a/src/base/Base.cpp +++ b/src/base/Base.cpp @@ -1,8 +1,46 @@ #include "cru/base/Base.h" +#include <cerrno> #include <exception> +#include <format> +#include <string_view> namespace cru { void UnreachableCode() { std::terminate(); } void NotImplemented() { std::terminate(); } + +static constexpr auto NO_MESSAGE = "No message."; + +Exception::Exception(std::string message, std::shared_ptr<std::exception> inner) + : message_(std::move(message)), inner_(std::move(inner)) {} + +Exception::~Exception() {} + +const char* Exception::what() const noexcept { return message_.c_str(); } + +void Exception::AppendMessage(const std::string& additional_message) { + AppendMessage(std::string_view(additional_message)); +} + +void Exception::AppendMessage(std::string_view additional_message) { + message_ += ' '; + message_ += additional_message; +} + +void Exception::AppendMessage( + std::optional<std::string_view> additional_message) { + if (additional_message) AppendMessage(*additional_message); +} + +ErrnoException::ErrnoException() : ErrnoException(NO_MESSAGE) {} + +ErrnoException::ErrnoException(int errno_code) + : ErrnoException(NO_MESSAGE, errno_code) {} + +ErrnoException::ErrnoException(std::string_view message) + : ErrnoException(message, errno) {} + +ErrnoException::ErrnoException(std::string_view message, int errno_code) + : Exception(std::format("{} Errno is {}.", message, errno_code)), + errno_code_(errno_code) {} } // namespace cru |
