mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-15 11:52:08 +07:00
allow to disable exceptions and RTTI manually
This commit is contained in:
@@ -3,7 +3,11 @@ cmake_minimum_required(VERSION 3.21 FATAL_ERROR)
|
|||||||
project(meta.hpp
|
project(meta.hpp
|
||||||
VERSION "0.0.1"
|
VERSION "0.0.1"
|
||||||
DESCRIPTION "C++20 tiny dynamic reflection library"
|
DESCRIPTION "C++20 tiny dynamic reflection library"
|
||||||
HOMEPAGE_URL "https://github.com/blackmatov/meta.hpp")
|
HOMEPAGE_URL "https://github.com/blackmatov/meta.hpp"
|
||||||
|
LANGUAGES CXX)
|
||||||
|
|
||||||
|
option(META_HPP_NO_EXCEPTIONS "Don't use exceptions" OFF)
|
||||||
|
option(META_HPP_NO_RTTI "Don't use RTTI" OFF)
|
||||||
|
|
||||||
#
|
#
|
||||||
# library
|
# library
|
||||||
@@ -22,6 +26,10 @@ target_include_directories(${PROJECT_NAME} INTERFACE
|
|||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/headers>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/headers>
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||||
|
|
||||||
|
target_compile_definitions(${PROJECT_NAME} INTERFACE
|
||||||
|
$<$<BOOL:${META_HPP_NO_EXCEPTIONS}>:META_HPP_NO_EXCEPTIONS>
|
||||||
|
$<$<BOOL:${META_HPP_NO_RTTI}>:META_HPP_NO_RTTI>)
|
||||||
|
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
target_link_libraries(${PROJECT_NAME} INTERFACE Threads::Threads)
|
target_link_libraries(${PROJECT_NAME} INTERFACE Threads::Threads)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
option(BUILD_WITH_COVERAGE "Build with coverage" OFF)
|
option(BUILD_WITH_COVERAGE "Build with coverage" OFF)
|
||||||
option(BUILD_WITH_SANITIZERS "Build with sanitizers" OFF)
|
option(BUILD_WITH_SANITIZERS "Build with sanitizers" OFF)
|
||||||
option(BUILD_WITH_NO_EXCEPTIONS "Build with no exceptions" OFF)
|
option(BUILD_WITH_NO_EXCEPTIONS "Build with no exceptions" ${META_HPP_NO_EXCEPTIONS})
|
||||||
option(BUILD_WITH_NO_RTTI "Build with no RTTI" OFF)
|
option(BUILD_WITH_NO_RTTI "Build with no RTTI" ${META_HPP_NO_RTTI})
|
||||||
|
|
||||||
enable_testing()
|
enable_testing()
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
|||||||
@@ -30,22 +30,18 @@
|
|||||||
#include <variant>
|
#include <variant>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if !defined(__cpp_exceptions)
|
#if !defined(META_HPP_NO_EXCEPTIONS) && !defined(__cpp_exceptions)
|
||||||
# define META_HPP_NO_EXCEPTIONS
|
# define META_HPP_NO_EXCEPTIONS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(__cpp_rtti)
|
#if !defined(META_HPP_NO_RTTI) && !defined(__cpp_rtti)
|
||||||
# define META_HPP_NO_RTTI
|
# define META_HPP_NO_RTTI
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(META_HPP_NO_EXCEPTIONS)
|
#if !defined(META_HPP_NO_EXCEPTIONS)
|
||||||
# define META_HPP_TRY if ( true )
|
#endif
|
||||||
# define META_HPP_CATCH(e) if ( false )
|
|
||||||
# define META_HPP_RETHROW() std::abort()
|
#if !defined(META_HPP_NO_RTTI)
|
||||||
#else
|
|
||||||
# define META_HPP_TRY try
|
|
||||||
# define META_HPP_CATCH(e) catch(e)
|
|
||||||
# define META_HPP_RETHROW() throw
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace meta_hpp::detail
|
namespace meta_hpp::detail
|
||||||
@@ -287,6 +283,33 @@ namespace meta_hpp::detail
|
|||||||
using copy_cvref_t = typename copy_cvref<From, To>::type;
|
using copy_cvref_t = typename copy_cvref<From, To>::type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(META_HPP_NO_EXCEPTIONS)
|
||||||
|
# define META_HPP_TRY try
|
||||||
|
# define META_HPP_CATCH(e) catch(e)
|
||||||
|
# define META_HPP_RETHROW() throw
|
||||||
|
# define META_HPP_THROW_AS(e, m) throw e{m}
|
||||||
|
#else
|
||||||
|
# define META_HPP_TRY if ( true )
|
||||||
|
# define META_HPP_CATCH(e) if ( false )
|
||||||
|
# define META_HPP_RETHROW() std::abort()
|
||||||
|
# define META_HPP_THROW_AS(e, m) std::terminate()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace meta_hpp::detail
|
||||||
|
{
|
||||||
|
#if !defined(META_HPP_NO_EXCEPTIONS)
|
||||||
|
class exception final : public std::runtime_error {
|
||||||
|
public:
|
||||||
|
explicit exception(const char* what)
|
||||||
|
: std::runtime_error(what) {}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
inline void throw_exception_with [[noreturn]] ([[maybe_unused]] const char* what) {
|
||||||
|
META_HPP_THROW_AS(exception, what);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace meta_hpp::detail
|
namespace meta_hpp::detail
|
||||||
{
|
{
|
||||||
template < typename Function >
|
template < typename Function >
|
||||||
@@ -954,6 +977,10 @@ namespace meta_hpp::detail
|
|||||||
|
|
||||||
namespace meta_hpp
|
namespace meta_hpp
|
||||||
{
|
{
|
||||||
|
#if !defined(META_HPP_NO_EXCEPTIONS)
|
||||||
|
using detail::exception;
|
||||||
|
#endif
|
||||||
|
|
||||||
using detail::hashed_string;
|
using detail::hashed_string;
|
||||||
using detail::memory_buffer;
|
using detail::memory_buffer;
|
||||||
|
|
||||||
@@ -966,27 +993,6 @@ namespace meta_hpp
|
|||||||
using detail::type_list;
|
using detail::type_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace meta_hpp
|
|
||||||
{
|
|
||||||
class exception final : public std::runtime_error {
|
|
||||||
public:
|
|
||||||
explicit exception(const char* what)
|
|
||||||
: std::runtime_error(what) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace detail
|
|
||||||
{
|
|
||||||
inline void throw_exception_with [[noreturn]] (const char* what) {
|
|
||||||
#if !defined(META_HPP_NO_EXCEPTIONS)
|
|
||||||
throw ::meta_hpp::exception(what);
|
|
||||||
#else
|
|
||||||
(void)what;
|
|
||||||
std::abort();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace meta_hpp
|
namespace meta_hpp
|
||||||
{
|
{
|
||||||
class uvalue;
|
class uvalue;
|
||||||
@@ -3294,7 +3300,7 @@ namespace meta_hpp::detail
|
|||||||
|
|
||||||
return any_type{};
|
return any_type{};
|
||||||
}
|
}
|
||||||
|
#if !defined(META_HPP_NO_RTTI)
|
||||||
[[nodiscard]] any_type get_type_by_rtti(const std::type_index& index) const noexcept {
|
[[nodiscard]] any_type get_type_by_rtti(const std::type_index& index) const noexcept {
|
||||||
const locker lock;
|
const locker lock;
|
||||||
|
|
||||||
@@ -3304,6 +3310,7 @@ namespace meta_hpp::detail
|
|||||||
|
|
||||||
return any_type{};
|
return any_type{};
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
public:
|
public:
|
||||||
template < array_kind Array >
|
template < array_kind Array >
|
||||||
[[nodiscard]] array_type resolve_type() { return resolve_array_type<Array>(); }
|
[[nodiscard]] array_type resolve_type() { return resolve_array_type<Array>(); }
|
||||||
@@ -3487,7 +3494,9 @@ namespace meta_hpp::detail
|
|||||||
private:
|
private:
|
||||||
std::recursive_mutex mutex_;
|
std::recursive_mutex mutex_;
|
||||||
std::map<type_id, any_type, std::less<>> type_by_id_;
|
std::map<type_id, any_type, std::less<>> type_by_id_;
|
||||||
|
#if !defined(META_HPP_NO_RTTI)
|
||||||
std::map<std::type_index, any_type, std::less<>> type_by_rtti_;
|
std::map<std::type_index, any_type, std::less<>> type_by_rtti_;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "meta_base/bitflags.hpp"
|
#include "meta_base/bitflags.hpp"
|
||||||
#include "meta_base/cv_traits.hpp"
|
#include "meta_base/cv_traits.hpp"
|
||||||
#include "meta_base/cvref_traits.hpp"
|
#include "meta_base/cvref_traits.hpp"
|
||||||
|
#include "meta_base/exceptions.hpp"
|
||||||
#include "meta_base/fixed_function.hpp"
|
#include "meta_base/fixed_function.hpp"
|
||||||
#include "meta_base/hash_combiner.hpp"
|
#include "meta_base/hash_combiner.hpp"
|
||||||
#include "meta_base/hashed_string.hpp"
|
#include "meta_base/hashed_string.hpp"
|
||||||
@@ -26,6 +27,10 @@
|
|||||||
|
|
||||||
namespace meta_hpp
|
namespace meta_hpp
|
||||||
{
|
{
|
||||||
|
#if !defined(META_HPP_NO_EXCEPTIONS)
|
||||||
|
using detail::exception;
|
||||||
|
#endif
|
||||||
|
|
||||||
using detail::hashed_string;
|
using detail::hashed_string;
|
||||||
using detail::memory_buffer;
|
using detail::memory_buffer;
|
||||||
|
|
||||||
@@ -38,27 +43,6 @@ namespace meta_hpp
|
|||||||
using detail::type_list;
|
using detail::type_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace meta_hpp
|
|
||||||
{
|
|
||||||
class exception final : public std::runtime_error {
|
|
||||||
public:
|
|
||||||
explicit exception(const char* what)
|
|
||||||
: std::runtime_error(what) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace detail
|
|
||||||
{
|
|
||||||
inline void throw_exception_with [[noreturn]] (const char* what) {
|
|
||||||
#if !defined(META_HPP_NO_EXCEPTIONS)
|
|
||||||
throw ::meta_hpp::exception(what);
|
|
||||||
#else
|
|
||||||
(void)what;
|
|
||||||
std::abort();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace meta_hpp
|
namespace meta_hpp
|
||||||
{
|
{
|
||||||
class uvalue;
|
class uvalue;
|
||||||
|
|||||||
@@ -6,6 +6,14 @@
|
|||||||
|
|
||||||
#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 <cassert>
|
#include <cassert>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@@ -22,31 +30,19 @@
|
|||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <stdexcept>
|
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <typeindex>
|
|
||||||
#include <typeinfo>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if !defined(__cpp_exceptions)
|
#if !defined(META_HPP_NO_EXCEPTIONS)
|
||||||
# define META_HPP_NO_EXCEPTIONS
|
# include <stdexcept>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(__cpp_rtti)
|
#if !defined(META_HPP_NO_RTTI)
|
||||||
# define META_HPP_NO_RTTI
|
# include <typeindex>
|
||||||
#endif
|
# include <typeinfo>
|
||||||
|
|
||||||
#if defined(META_HPP_NO_EXCEPTIONS)
|
|
||||||
# define META_HPP_TRY if ( true )
|
|
||||||
# define META_HPP_CATCH(e) if ( false )
|
|
||||||
# define META_HPP_RETHROW() std::abort()
|
|
||||||
#else
|
|
||||||
# define META_HPP_TRY try
|
|
||||||
# define META_HPP_CATCH(e) catch(e)
|
|
||||||
# define META_HPP_RETHROW() throw
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
36
headers/meta.hpp/meta_base/exceptions.hpp
Normal file
36
headers/meta.hpp/meta_base/exceptions.hpp
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* This file is part of the "https://github.com/blackmatov/meta.hpp"
|
||||||
|
* For conditions of distribution and use, see copyright notice in LICENSE.md
|
||||||
|
* Copyright (C) 2021-2023, by Matvey Cherevko (blackmatov@gmail.com)
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "base.hpp"
|
||||||
|
|
||||||
|
#if !defined(META_HPP_NO_EXCEPTIONS)
|
||||||
|
# define META_HPP_TRY try
|
||||||
|
# define META_HPP_CATCH(e) catch(e)
|
||||||
|
# define META_HPP_RETHROW() throw
|
||||||
|
# define META_HPP_THROW_AS(e, m) throw e{m}
|
||||||
|
#else
|
||||||
|
# define META_HPP_TRY if ( true )
|
||||||
|
# define META_HPP_CATCH(e) if ( false )
|
||||||
|
# define META_HPP_RETHROW() std::abort()
|
||||||
|
# define META_HPP_THROW_AS(e, m) std::terminate()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace meta_hpp::detail
|
||||||
|
{
|
||||||
|
#if !defined(META_HPP_NO_EXCEPTIONS)
|
||||||
|
class exception final : public std::runtime_error {
|
||||||
|
public:
|
||||||
|
explicit exception(const char* what)
|
||||||
|
: std::runtime_error(what) {}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
inline void throw_exception_with [[noreturn]] ([[maybe_unused]] const char* what) {
|
||||||
|
META_HPP_THROW_AS(exception, what);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -41,7 +41,7 @@ namespace meta_hpp::detail
|
|||||||
|
|
||||||
return any_type{};
|
return any_type{};
|
||||||
}
|
}
|
||||||
|
#if !defined(META_HPP_NO_RTTI)
|
||||||
[[nodiscard]] any_type get_type_by_rtti(const std::type_index& index) const noexcept {
|
[[nodiscard]] any_type get_type_by_rtti(const std::type_index& index) const noexcept {
|
||||||
const locker lock;
|
const locker lock;
|
||||||
|
|
||||||
@@ -51,6 +51,7 @@ namespace meta_hpp::detail
|
|||||||
|
|
||||||
return any_type{};
|
return any_type{};
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
public:
|
public:
|
||||||
template < array_kind Array >
|
template < array_kind Array >
|
||||||
[[nodiscard]] array_type resolve_type() { return resolve_array_type<Array>(); }
|
[[nodiscard]] array_type resolve_type() { return resolve_array_type<Array>(); }
|
||||||
@@ -234,6 +235,8 @@ namespace meta_hpp::detail
|
|||||||
private:
|
private:
|
||||||
std::recursive_mutex mutex_;
|
std::recursive_mutex mutex_;
|
||||||
std::map<type_id, any_type, std::less<>> type_by_id_;
|
std::map<type_id, any_type, std::less<>> type_by_id_;
|
||||||
|
#if !defined(META_HPP_NO_RTTI)
|
||||||
std::map<std::type_index, any_type, std::less<>> type_by_rtti_;
|
std::map<std::type_index, any_type, std::less<>> type_by_rtti_;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user