diff options
author | Claudius Holeksa <mail@keldu.de> | 2023-05-02 17:21:28 +0200 |
---|---|---|
committer | Claudius Holeksa <mail@keldu.de> | 2023-05-02 17:21:28 +0200 |
commit | 3b14232d439428e1536e1fbe06e9d64a61a275a4 (patch) | |
tree | fd1f329e23170ce1a9dce30fc990f042bddeac1e /forstio/core/error.cpp | |
parent | 2410f902180b41cf5056f6d230d1b534d1741fd1 (diff) |
c++: Changed core for new error features
Diffstat (limited to 'forstio/core/error.cpp')
-rw-r--r-- | forstio/core/error.cpp | 90 |
1 files changed, 69 insertions, 21 deletions
diff --git a/forstio/core/error.cpp b/forstio/core/error.cpp index 757e6a8..727ca95 100644 --- a/forstio/core/error.cpp +++ b/forstio/core/error.cpp @@ -1,17 +1,19 @@ #include "error.h" namespace saw { -error::error() : error_{static_cast<error::code>(0)} {} +error::error(error::code code_, bool is_critical__) + : error_code_{static_cast<error::code>(code_)}, is_critical_{is_critical__} {} -error::error(const std::string_view &msg, error::code code) - : error_message_{msg}, error_{static_cast<error::code>(code)} {} - -error::error(std::string &&msg, error::code code) - : error_message_{std::move(msg)}, error_{static_cast<error::code>(code)} {} +error::error(error::code code_, bool is_critical__, const std::string_view &msg) + : + error_code_{static_cast<error::code>(code_)} + , is_critical_{is_critical__}, error_message_{msg}{} error::error(error &&error) - : error_message_{std::move(error.error_message_)}, error_{std::move( - error.error_)} {} + : + error_code_{std::move(error.error_code_)} + , is_critical_{std::move(error.is_critical_)} + , error_message_{std::move(error.error_message_)}{} const std::string_view error::message() const { @@ -31,43 +33,89 @@ const std::string_view error::message() const { } bool error::failed() const { - return static_cast<std::underlying_type_t<error::code>>(error_) != 0; + return this->is_error<err::no_error>(); } bool error::is_critical() const { - return static_cast<std::underlying_type_t<error::code>>(error_) < 0; + return is_critical_; } bool error::is_recoverable() const { - return static_cast<std::underlying_type_t<error::code>>(error_) > 0; + return !is_critical_; } error error::copy_error() const { - error error; - error.error_ = error_; + auto copy_error_code = error_code_; + error error{copy_error_code, is_critical_}; + try { error.error_message_ = error_message_; } catch (const std::bad_alloc &) { error.error_message_ = std::string_view{"Error while copying Error string. Out of memory"}; } + return error; } -error::code error::id() const { return static_cast<error::code>(error_); } +error::code error::get_id() const { return error_code_; } + +namespace impl { +error_registry& get_error_registry() { + static own<error_registry> reg = nullptr; + if(!reg){ + reg = heap<error_registry>(); + } -error make_error(const std::string_view &generic, error::code code) { - return error{generic, code}; + assert(reg); + return *reg; +} } -error critical_error(const std::string_view &generic, error::code c) { - return make_error(generic, c); +error no_error(){ + return make_error<err::no_error>(); } -error recoverable_error(const std::string_view &generic, error::code c) { - return make_error(generic, c); +namespace impl { +error_or<error::code> error_registry::search_id(const std::string_view& desc)const{ + /** + * Search the index in the vector + */ + size_t i{}; + size_t info_max_size = std::min<std::size_t>(infos.size(), std::numeric_limits<error::code>::max()); + for(i = 0; i < info_max_size; ++i){ + if(infos.at(i).description == desc){ + break; + } + } + + if(i == info_max_size){ + return make_error<err::not_found>(); + } + + return static_cast<error::code>(i); } -error no_error() { return error{}; } +error_or<error::code> error_registry::search_or_register_id(const std::string_view& desc, bool is_critical){ + auto err_or_id = search_id(desc); + + if(err_or_id.is_value()){ + return err_or_id.get_value(); + } + + auto& err = err_or_id.get_error(); + + if(err.is_error<err::not_found>()){ + size_t new_index = infos.size(); + if(new_index == std::numeric_limits<error::code>::max()){ + return make_error<err::out_of_memory>("Error registry ids are exhausted"); + } + infos.emplace_back(error_info{desc, is_critical}); + return static_cast<error::code>(new_index); + } + + return std::move(err); +} +} } // namespace saw |