1#ifndef NEFORCE_CORE_EXCEPTION_ERROR_CODE_HPP__
2#define NEFORCE_CORE_EXCEPTION_ERROR_CODE_HPP__
3#include "NeForce/core/exception/error_condition.hpp"
4NEFORCE_BEGIN_NAMESPACE__
6class error_code :
public icommon<error_code> {
9 const error_category* category_;
12 error_code() noexcept :
14 category_(&system_category()) {}
16 error_code(
int val,
const error_category& cat) noexcept :
20 error_code(
errc e)
noexcept { *
this = make_error_code(e); }
22 void assign(
int val,
const error_category& cat)
noexcept {
27 void clear() noexcept {
29 category_ = &system_category();
32 NEFORCE_NODISCARD
int value() const noexcept {
return value_; }
33 NEFORCE_NODISCARD
errc error() const noexcept {
return static_cast<errc>(value_); }
34 NEFORCE_NODISCARD
const error_category& category() const noexcept {
return *category_; }
36 NEFORCE_NODISCARD error_condition default_error_condition() const noexcept {
37 return category_->default_error_condition(value_);
40 NEFORCE_NODISCARD
string message()
const {
return category_->message(value_); }
42 explicit operator bool() const noexcept {
return value_ != 0; }
44 NEFORCE_NODISCARD
bool equal_to(
const error_code& rhs)
const noexcept {
45 return category_ == rhs.category_ && value_ == rhs.value_;
47 NEFORCE_NODISCARD
bool less_than(
const error_code& rhs)
const noexcept {
48 if (*category_ < *rhs.category_) {
51 if (*rhs.category_ < *category_) {
54 return value_ < rhs.value_;
57 NEFORCE_NODISCARD
bool operator==(
const error_condition& cond)
const noexcept {
58 return category_->equivalent(value_, cond) || cond.category().equivalent(*
this, cond.value());
60 NEFORCE_NODISCARD
bool operator!=(
const error_condition& cond)
const noexcept {
return !(*
this == cond); }
62 NEFORCE_NODISCARD
size_t to_hash() const noexcept {
63 const size_t h1 = hash<const error_category*>{}(category_);
64 const size_t h2 = hash<int>{}(value_);
65#ifdef NEFORCE_ARCH_BITS_64
66 return h1 ^ (h2 << 32 | h2 >> 32);
73inline error_code make_error_code(
errc e)
noexcept {
return {
static_cast<int>(e), generic_category()}; }
75error_code NEFORCE_API last_error() noexcept;
77NEFORCE_END_NAMESPACE__