diff --git a/include/mtl/exception.hpp b/include/mtl/exception.hpp new file mode 100644 index 0000000..d0d9379 --- /dev/null +++ b/include/mtl/exception.hpp @@ -0,0 +1,114 @@ +#pragma once + +#include + +namespace mtl { + +/** + * \brief Generic exception interface + * + * Unlike the std::exception, this implementation does not use a what() method + * that returns a string. Instead, each derived exception provides an exception + * ID that can be queried through id(). IDs 0-100 are reserved. + * + * Corresponding exception IDs: + * + * invalid_argument: 10 + * domain_error: 11 + * length_error: 12 + * out_of_range: 13 + * + * range_error: 20 + * overflow_error: 21 + * underflow_error: 22 + * system_error: 23 + */ +class exception { + uint32_t m_id; + +public: + exception(uint32_t id) noexcept : m_id(id) {} + uint32_t id() const noexcept { return m_id; } +}; + +/** + * \brief Thrown when an invalid argument is passed + * + * Exception ID: 10 + */ +class invalid_argument : public exception { +public: + invalid_argument() noexcept : exception(10) {} +}; + +/** + * \brief Thrown when an input is outside the domain of an operation + * + * Exception ID: 11 + */ +class domain_error : public exception { +public: + domain_error() noexcept : exception(11) {} +}; + +/** + * \brief Thrown when an internal length limit is exceeded + * + * Exception ID: 12 + */ +class length_error : public exception { +public: + length_error() noexcept : exception(12) {} +}; + +/** + * \brief Thrown when an index is supplied that is outside a valid range + * + * Exception ID: 13 + */ +class out_of_range : public exception { +public: + out_of_range() noexcept : exception(13) {} +}; + +/** + * \brief Thrown when a value cannot be represented by the destination type + * + * Exception ID: 20 + */ +class range_error : public exception { +public: + range_error() noexcept : exception(20) {} +}; + +/** + * \brief Thrown when an arithmetic overflow occurs + * + * Exception ID: 21 + */ +class overflow_error : public exception { +public: + overflow_error() noexcept : exception(21) {} +}; + +/** + * \brief Thrown when an arithmetic underflow occurs + * + * Exception ID: 22 + */ +class underflow_error : public exception { +public: + underflow_error() noexcept : exception(22) {} +}; + +/** + * \brief Thrown when a system error occurs + * + * Exception ID: 23 + */ +class system_error : public exception { +public: + system_error() noexcept : exception(23) {} +}; + +}; // namespace mtl