mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-15 03:45:30 +07:00
goodbye system_error, rename meta exception
This commit is contained in:
@@ -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 >
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -231,6 +231,6 @@ namespace meta_hpp::detail
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw_generic_exception(generic_error::bad_instance_cast);
|
throw_exception(error_code::bad_instance_cast);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 >
|
||||||
|
|||||||
Reference in New Issue
Block a user