From 3b14232d439428e1536e1fbe06e9d64a61a275a4 Mon Sep 17 00:00:00 2001 From: Claudius Holeksa Date: Tue, 2 May 2023 17:21:28 +0200 Subject: c++: Changed core for new error features --- forstio/core/error.cpp | 90 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 21 deletions(-) (limited to 'forstio/core/error.cpp') 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(0)} {} +error::error(error::code code_, bool is_critical__) + : error_code_{static_cast(code_)}, is_critical_{is_critical__} {} -error::error(const std::string_view &msg, error::code code) - : error_message_{msg}, error_{static_cast(code)} {} - -error::error(std::string &&msg, error::code code) - : error_message_{std::move(msg)}, error_{static_cast(code)} {} +error::error(error::code code_, bool is_critical__, const std::string_view &msg) + : + error_code_{static_cast(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>(error_) != 0; + return this->is_error(); } bool error::is_critical() const { - return static_cast>(error_) < 0; + return is_critical_; } bool error::is_recoverable() const { - return static_cast>(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_); } +error::code error::get_id() const { return error_code_; } + +namespace impl { +error_registry& get_error_registry() { + static own reg = nullptr; + if(!reg){ + reg = heap(); + } -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(); } -error recoverable_error(const std::string_view &generic, error::code c) { - return make_error(generic, c); +namespace impl { +error_or 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(infos.size(), std::numeric_limits::max()); + for(i = 0; i < info_max_size; ++i){ + if(infos.at(i).description == desc){ + break; + } + } + + if(i == info_max_size){ + return make_error(); + } + + return static_cast(i); } -error no_error() { return error{}; } +error_or 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()){ + size_t new_index = infos.size(); + if(new_index == std::numeric_limits::max()){ + return make_error("Error registry ids are exhausted"); + } + infos.emplace_back(error_info{desc, is_critical}); + return static_cast(new_index); + } + + return std::move(err); +} +} } // namespace saw -- cgit v1.2.3