summaryrefslogtreecommitdiff
path: root/forstio/core/error.cpp
diff options
context:
space:
mode:
authorClaudius Holeksa <mail@keldu.de>2023-05-02 17:21:28 +0200
committerClaudius Holeksa <mail@keldu.de>2023-05-02 17:21:28 +0200
commit3b14232d439428e1536e1fbe06e9d64a61a275a4 (patch)
treefd1f329e23170ce1a9dce30fc990f042bddeac1e /forstio/core/error.cpp
parent2410f902180b41cf5056f6d230d1b534d1741fd1 (diff)
c++: Changed core for new error features
Diffstat (limited to 'forstio/core/error.cpp')
-rw-r--r--forstio/core/error.cpp90
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