goodbye system_error, rename meta exception

This commit is contained in:
BlackMATov
2023-02-17 00:17:44 +07:00
parent b38cb9057c
commit 17b1edee18
7 changed files with 102 additions and 170 deletions

View File

@@ -27,11 +27,11 @@
#include <span> #include <span>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <system_error>
#include <tuple> #include <tuple>
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <version>
#if !defined(META_HPP_NO_EXCEPTIONS) && !defined(__cpp_exceptions) #if !defined(META_HPP_NO_EXCEPTIONS) && !defined(__cpp_exceptions)
# define META_HPP_NO_EXCEPTIONS # define META_HPP_NO_EXCEPTIONS
@@ -42,7 +42,7 @@
#endif #endif
#if !defined(META_HPP_NO_EXCEPTIONS) #if !defined(META_HPP_NO_EXCEPTIONS)
# include <stdexcept> # include <exception>
#endif #endif
#if !defined(META_HPP_NO_RTTI) #if !defined(META_HPP_NO_RTTI)
@@ -311,12 +311,12 @@ namespace meta_hpp::detail
#else #else
# define META_HPP_TRY if ( true ) # define META_HPP_TRY if ( true )
# define META_HPP_CATCH(...) if ( false ) # define META_HPP_CATCH(...) if ( false )
# define META_HPP_RETHROW() std::abort() # define META_HPP_RETHROW() (void)0
#endif #endif
namespace meta_hpp::detail namespace meta_hpp::detail
{ {
enum class generic_error { enum class error_code {
no_error, no_error,
bad_uvalue_access, bad_uvalue_access,
@@ -331,90 +331,55 @@ namespace meta_hpp::detail
argument_types_mismatch, argument_types_mismatch,
}; };
class generic_error_category final : public std::error_category { inline const char* get_error_code_message(error_code error) noexcept {
public: switch ( error ) {
~generic_error_category() override = default; case error_code::no_error:
return "no error";
generic_error_category(generic_error_category&&) = delete; case error_code::bad_uvalue_access:
generic_error_category(const generic_error_category&) = delete; return "bad uvalue access";
case error_code::bad_uresult_access:
generic_error_category& operator=(generic_error_category&&) = delete; return "bad uresult access";
generic_error_category& operator=(const generic_error_category&) = delete; case error_code::bad_uvalue_cast:
return "bad uvalue cast";
[[nodiscard]] const char* name() const noexcept override { case error_code::bad_argument_cast:
return "generic"; return "bad argument cast";
case error_code::bad_instance_cast:
return "bad instance cast";
case error_code::arity_mismatch:
return "arity mismatch";
case error_code::instance_type_mismatch:
return "instance type mismatch";
case error_code::argument_types_mismatch:
return "argument types mismatch";
} }
[[nodiscard]] std::string message(int ev) const override { META_HPP_ASSERT(false);
switch ( static_cast<generic_error>(ev) ) { return "unexpected error code";
case generic_error::no_error:
return "no error";
case generic_error::bad_uvalue_access:
return "bad uvalue access";
case generic_error::bad_uresult_access:
return "bad uresult access";
case generic_error::bad_uvalue_cast:
return "bad uvalue cast";
case generic_error::bad_argument_cast:
return "bad argument cast";
case generic_error::bad_instance_cast:
return "bad instance cast";
case generic_error::arity_mismatch:
return "arity mismatch";
case generic_error::instance_type_mismatch:
return "instance type mismatch";
case generic_error::argument_types_mismatch:
return "argument types mismatch";
}
return "unexpected error code";
}
static const std::error_category& instance() noexcept {
static const generic_error_category instance;
return instance;
}
private:
generic_error_category() = default;
};
}
namespace std
{
template <>
struct is_error_code_enum<meta_hpp::detail::generic_error> : true_type {};
}
namespace meta_hpp::detail
{
inline std::error_code make_error_code(generic_error err) noexcept {
static_assert(std::is_same_v<int, std::underlying_type_t<generic_error>>);
return std::error_code{static_cast<int>(err), generic_error_category::instance()};
} }
} }
namespace meta_hpp::detail namespace meta_hpp::detail
{ {
class generic_exception final : public std::logic_error { class exception final : public std::exception {
public: public:
explicit generic_exception(generic_error err) explicit exception(error_code error)
: generic_exception{make_error_code(err)} {} : error_{error} {}
explicit generic_exception(std::error_code ec) [[nodiscard]] error_code get_error() const noexcept {
: std::logic_error(ec.message()) return error_;
, error_code_{ec} {} }
[[nodiscard]] const std::error_code& get_code() const noexcept { [[nodiscard]] const char* what() const noexcept override {
return error_code_; return get_error_code_message(error_);
} }
private: private:
std::error_code error_code_{}; error_code error_{};
}; };
[[noreturn]] inline void throw_generic_exception(generic_error err) { [[noreturn]] inline void throw_exception(error_code err) {
#if !defined(META_HPP_NO_EXCEPTIONS) #if !defined(META_HPP_NO_EXCEPTIONS)
throw generic_exception{err}; throw exception{err};
#else #else
(void)err; (void)err;
std::abort(); std::abort();
@@ -1447,8 +1412,9 @@ namespace meta_hpp::detail
namespace meta_hpp namespace meta_hpp
{ {
using detail::generic_error; using detail::error_code;
using detail::generic_exception; using detail::exception;
using detail::get_error_code_message;
using detail::hashed_string; using detail::hashed_string;
using detail::memory_buffer; using detail::memory_buffer;
@@ -5674,7 +5640,7 @@ namespace meta_hpp::detail
} }
} }
throw_generic_exception(generic_error::bad_argument_cast); throw_exception(error_code::bad_argument_cast);
} }
template < typename To > template < typename To >
@@ -5730,7 +5696,7 @@ namespace meta_hpp::detail
} }
} }
throw_generic_exception(generic_error::bad_argument_cast); throw_exception(error_code::bad_argument_cast);
} }
} }
@@ -6184,7 +6150,7 @@ namespace meta_hpp::detail
} }
} }
throw_generic_exception(generic_error::bad_instance_cast); throw_exception(error_code::bad_instance_cast);
} }
} }
@@ -8790,7 +8756,7 @@ namespace meta_hpp
} }
} }
throw_generic_exception(generic_error::bad_uvalue_cast); throw_exception(error_code::bad_uvalue_cast);
} }
template < typename T > template < typename T >
@@ -8807,7 +8773,7 @@ namespace meta_hpp
} }
} }
throw_generic_exception(generic_error::bad_uvalue_cast); throw_exception(error_code::bad_uvalue_cast);
} }
template < typename T > template < typename T >
@@ -8824,7 +8790,7 @@ namespace meta_hpp
} }
} }
throw_generic_exception(generic_error::bad_uvalue_cast); throw_exception(error_code::bad_uvalue_cast);
} }
template < typename T > template < typename T >
@@ -8841,7 +8807,7 @@ namespace meta_hpp
} }
} }
throw_generic_exception(generic_error::bad_uvalue_cast); throw_exception(error_code::bad_uvalue_cast);
} }
template < typename T > template < typename T >

View File

@@ -30,8 +30,9 @@
namespace meta_hpp namespace meta_hpp
{ {
using detail::generic_error; using detail::error_code;
using detail::generic_exception; using detail::exception;
using detail::get_error_code_message;
using detail::hashed_string; using detail::hashed_string;
using detail::memory_buffer; using detail::memory_buffer;

View File

@@ -6,14 +6,6 @@
#pragma once #pragma once
#if !defined(META_HPP_NO_EXCEPTIONS) && !defined(__cpp_exceptions)
# define META_HPP_NO_EXCEPTIONS
#endif
#if !defined(META_HPP_NO_RTTI) && !defined(__cpp_rtti)
# define META_HPP_NO_RTTI
#endif
#include <climits> #include <climits>
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
@@ -36,14 +28,22 @@
#include <span> #include <span>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <system_error>
#include <tuple> #include <tuple>
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <version>
#if !defined(META_HPP_NO_EXCEPTIONS) && !defined(__cpp_exceptions)
# define META_HPP_NO_EXCEPTIONS
#endif
#if !defined(META_HPP_NO_RTTI) && !defined(__cpp_rtti)
# define META_HPP_NO_RTTI
#endif
#if !defined(META_HPP_NO_EXCEPTIONS) #if !defined(META_HPP_NO_EXCEPTIONS)
# include <stdexcept> # include <exception>
#endif #endif
#if !defined(META_HPP_NO_RTTI) #if !defined(META_HPP_NO_RTTI)

View File

@@ -15,12 +15,12 @@
#else #else
# define META_HPP_TRY if ( true ) # define META_HPP_TRY if ( true )
# define META_HPP_CATCH(...) if ( false ) # define META_HPP_CATCH(...) if ( false )
# define META_HPP_RETHROW() std::abort() # define META_HPP_RETHROW() (void)0
#endif #endif
namespace meta_hpp::detail namespace meta_hpp::detail
{ {
enum class generic_error { enum class error_code {
no_error, no_error,
bad_uvalue_access, bad_uvalue_access,
@@ -35,90 +35,55 @@ namespace meta_hpp::detail
argument_types_mismatch, argument_types_mismatch,
}; };
class generic_error_category final : public std::error_category { inline const char* get_error_code_message(error_code error) noexcept {
public: switch ( error ) {
~generic_error_category() override = default; case error_code::no_error:
return "no error";
generic_error_category(generic_error_category&&) = delete; case error_code::bad_uvalue_access:
generic_error_category(const generic_error_category&) = delete; return "bad uvalue access";
case error_code::bad_uresult_access:
generic_error_category& operator=(generic_error_category&&) = delete; return "bad uresult access";
generic_error_category& operator=(const generic_error_category&) = delete; case error_code::bad_uvalue_cast:
return "bad uvalue cast";
[[nodiscard]] const char* name() const noexcept override { case error_code::bad_argument_cast:
return "generic"; return "bad argument cast";
case error_code::bad_instance_cast:
return "bad instance cast";
case error_code::arity_mismatch:
return "arity mismatch";
case error_code::instance_type_mismatch:
return "instance type mismatch";
case error_code::argument_types_mismatch:
return "argument types mismatch";
} }
[[nodiscard]] std::string message(int ev) const override { META_HPP_ASSERT(false);
switch ( static_cast<generic_error>(ev) ) { return "unexpected error code";
case generic_error::no_error:
return "no error";
case generic_error::bad_uvalue_access:
return "bad uvalue access";
case generic_error::bad_uresult_access:
return "bad uresult access";
case generic_error::bad_uvalue_cast:
return "bad uvalue cast";
case generic_error::bad_argument_cast:
return "bad argument cast";
case generic_error::bad_instance_cast:
return "bad instance cast";
case generic_error::arity_mismatch:
return "arity mismatch";
case generic_error::instance_type_mismatch:
return "instance type mismatch";
case generic_error::argument_types_mismatch:
return "argument types mismatch";
}
return "unexpected error code";
}
static const std::error_category& instance() noexcept {
static const generic_error_category instance;
return instance;
}
private:
generic_error_category() = default;
};
}
namespace std
{
template <>
struct is_error_code_enum<meta_hpp::detail::generic_error> : true_type {};
}
namespace meta_hpp::detail
{
inline std::error_code make_error_code(generic_error err) noexcept {
static_assert(std::is_same_v<int, std::underlying_type_t<generic_error>>);
return std::error_code{static_cast<int>(err), generic_error_category::instance()};
} }
} }
namespace meta_hpp::detail namespace meta_hpp::detail
{ {
class generic_exception final : public std::logic_error { class exception final : public std::exception {
public: public:
explicit generic_exception(generic_error err) explicit exception(error_code error)
: generic_exception{make_error_code(err)} {} : error_{error} {}
explicit generic_exception(std::error_code ec) [[nodiscard]] error_code get_error() const noexcept {
: std::logic_error(ec.message()) return error_;
, error_code_{ec} {} }
[[nodiscard]] const std::error_code& get_code() const noexcept { [[nodiscard]] const char* what() const noexcept override {
return error_code_; return get_error_code_message(error_);
} }
private: private:
std::error_code error_code_{}; error_code error_{};
}; };
[[noreturn]] inline void throw_generic_exception(generic_error err) { [[noreturn]] inline void throw_exception(error_code err) {
#if !defined(META_HPP_NO_EXCEPTIONS) #if !defined(META_HPP_NO_EXCEPTIONS)
throw generic_exception{err}; throw exception{err};
#else #else
(void)err; (void)err;
std::abort(); std::abort();

View File

@@ -313,7 +313,7 @@ namespace meta_hpp::detail
} }
} }
throw_generic_exception(generic_error::bad_argument_cast); throw_exception(error_code::bad_argument_cast);
} }
template < typename To > template < typename To >
@@ -369,7 +369,7 @@ namespace meta_hpp::detail
} }
} }
throw_generic_exception(generic_error::bad_argument_cast); throw_exception(error_code::bad_argument_cast);
} }
} }

View File

@@ -231,6 +231,6 @@ namespace meta_hpp::detail
} }
} }
throw_generic_exception(generic_error::bad_instance_cast); throw_exception(error_code::bad_instance_cast);
} }
} }

View File

@@ -452,7 +452,7 @@ namespace meta_hpp
} }
} }
throw_generic_exception(generic_error::bad_uvalue_cast); throw_exception(error_code::bad_uvalue_cast);
} }
template < typename T > template < typename T >
@@ -469,7 +469,7 @@ namespace meta_hpp
} }
} }
throw_generic_exception(generic_error::bad_uvalue_cast); throw_exception(error_code::bad_uvalue_cast);
} }
template < typename T > template < typename T >
@@ -486,7 +486,7 @@ namespace meta_hpp
} }
} }
throw_generic_exception(generic_error::bad_uvalue_cast); throw_exception(error_code::bad_uvalue_cast);
} }
template < typename T > template < typename T >
@@ -503,7 +503,7 @@ namespace meta_hpp
} }
} }
throw_generic_exception(generic_error::bad_uvalue_cast); throw_exception(error_code::bad_uvalue_cast);
} }
template < typename T > template < typename T >