From 788ce044dcd3c79a669ae022354ab1ac2ebbaef9 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Wed, 7 Jul 2021 00:39:13 +0700 Subject: [PATCH] rename get_type_family_id to get_family_id --- headers/meta.hpp/meta_class_info.hpp | 2 +- headers/meta.hpp/meta_fwd.hpp | 28 +++++++++++----------------- headers/meta.hpp/meta_instance.hpp | 10 +++++----- headers/meta.hpp/meta_registry.hpp | 4 ++-- headers/meta.hpp/meta_value.hpp | 14 +++++++------- untests/meta_value_tests.cpp | 16 ++++++++-------- 6 files changed, 34 insertions(+), 40 deletions(-) diff --git a/headers/meta.hpp/meta_class_info.hpp b/headers/meta.hpp/meta_class_info.hpp index 0ca403a..488346d 100644 --- a/headers/meta.hpp/meta_class_info.hpp +++ b/headers/meta.hpp/meta_class_info.hpp @@ -128,7 +128,7 @@ namespace meta_hpp template < typename Class > class_info(detail::typename_arg_t, std::string id) - : fid_{get_type_family_id()} + : fid_{get_family_id()} , id_{std::move(id)} {} private: family_id fid_; diff --git a/headers/meta.hpp/meta_fwd.hpp b/headers/meta.hpp/meta_fwd.hpp index 607eefd..4f98e7f 100644 --- a/headers/meta.hpp/meta_fwd.hpp +++ b/headers/meta.hpp/meta_fwd.hpp @@ -57,32 +57,26 @@ namespace meta_hpp namespace family_id_detail { - template < typename Void = void > - class family_base { - static_assert( - std::is_void_v, - "unexpected internal error"); - protected: - static std::atomic last_id_; + struct family_id_sequence { + static family_id next() noexcept { + static std::atomic id{}; + return { ++id }; + } }; - template < typename Void > - std::atomic family_base::last_id_{}; - template < typename T > - class type_family final : public family_base<> { - public: + struct type_to_family_id { static family_id id() noexcept { - static family_id self_id{++last_id_}; - assert(self_id.id > 0u && "family_id overflow"); - return self_id; + static const family_id type_family_id = family_id_sequence::next(); + assert(type_family_id.id > 0u && "family_id overflow"); + return type_family_id; } }; } template < typename T > - family_id get_type_family_id() noexcept { - return family_id_detail::type_family::id(); + family_id get_family_id() noexcept { + return family_id_detail::type_to_family_id::id(); } } diff --git a/headers/meta.hpp/meta_instance.hpp b/headers/meta.hpp/meta_instance.hpp index 05ce486..94b48b3 100644 --- a/headers/meta.hpp/meta_instance.hpp +++ b/headers/meta.hpp/meta_instance.hpp @@ -34,7 +34,7 @@ namespace meta_hpp , typename = std::enable_if_t> > instance(T& v) : data_{std::addressof(v)} - , fid_{get_type_family_id()} {} + , fid_{get_family_id()} {} instance(value& v) : data_{v.data()} @@ -56,7 +56,7 @@ namespace meta_hpp std::add_pointer_t try_cast() noexcept { static_assert(!std::is_reference_v); - return fid() == get_type_family_id() + return fid() == get_family_id() ? static_cast>(data_) : nullptr; } @@ -65,7 +65,7 @@ namespace meta_hpp std::add_pointer_t> try_cast() const noexcept { static_assert(!std::is_reference_v); - return fid() == get_type_family_id() + return fid() == get_family_id() ? static_cast>>(data_) : nullptr; } @@ -93,7 +93,7 @@ namespace meta_hpp , typename = std::enable_if_t> > cinstance(const T& data) : data_{std::addressof(data)} - , fid_{get_type_family_id()} {} + , fid_{get_family_id()} {} cinstance(const value& v) : data_{v.data()} @@ -115,7 +115,7 @@ namespace meta_hpp std::add_pointer_t> try_cast() const noexcept { static_assert(!std::is_reference_v); - return fid() == get_type_family_id() + return fid() == get_family_id() ? static_cast>>(data_) : nullptr; } diff --git a/headers/meta.hpp/meta_registry.hpp b/headers/meta.hpp/meta_registry.hpp index 72a1e15..d37dd13 100644 --- a/headers/meta.hpp/meta_registry.hpp +++ b/headers/meta.hpp/meta_registry.hpp @@ -23,13 +23,13 @@ namespace meta_hpp public: template < typename T > std::optional resolve() const { - const family_id fid = get_type_family_id(); + const family_id fid = get_family_id(); return detail::find_opt(types_, fid); } template < typename T > std::optional resolve(T&&) const { - const family_id fid = get_type_family_id>(); + const family_id fid = get_family_id>(); return detail::find_opt(types_, fid); } diff --git a/headers/meta.hpp/meta_value.hpp b/headers/meta.hpp/meta_value.hpp index a2a8a7f..f353e71 100644 --- a/headers/meta.hpp/meta_value.hpp +++ b/headers/meta.hpp/meta_value.hpp @@ -63,7 +63,7 @@ namespace meta_hpp , typename = std::enable_if_t> > value(T&& val) : raw_{std::forward(val)} - , fid_{get_type_family_id()} + , fid_{get_family_id()} , traits_{value_detail::get_traits()} {} template < typename T @@ -77,13 +77,13 @@ namespace meta_hpp template < typename T, typename... Args > explicit value(std::in_place_type_t, Args&&... args) : raw_{std::in_place_type, std::forward(args)...} - , fid_{get_type_family_id()} + , fid_{get_family_id()} , traits_{value_detail::get_traits()} {} template < typename T, typename U, typename... Args > explicit value(std::in_place_type_t, std::initializer_list ilist, Args&&... args) : raw_{std::in_place_type, ilist, std::forward(args)...} - , fid_{get_type_family_id()} + , fid_{get_family_id()} , traits_{value_detail::get_traits()} {} template < typename T > @@ -139,7 +139,7 @@ namespace meta_hpp , typename = std::enable_if_t> , typename = std::enable_if_t, U, U>> > friend bool operator==(const value& l, T&& r) { - return l.fid() == get_type_family_id() + return l.fid() == get_family_id() && std::equal_to<>{}(*l.try_cast(), std::forward(r)); } @@ -148,7 +148,7 @@ namespace meta_hpp , typename = std::enable_if_t> , typename = std::enable_if_t, U, U>> > friend bool operator==(T&& l, const value& r) { - return get_type_family_id() == r.fid() + return get_family_id() == r.fid() && std::equal_to<>{}(std::forward(l), *r.try_cast()); } @@ -157,7 +157,7 @@ namespace meta_hpp , typename = std::enable_if_t> , typename = std::enable_if_t, U, U>> > friend bool operator!=(const value& l, T&& r) { - return l.fid() != get_type_family_id() + return l.fid() != get_family_id() || std::not_equal_to<>{}(*l.try_cast(), std::forward(r)); } @@ -166,7 +166,7 @@ namespace meta_hpp , typename = std::enable_if_t> , typename = std::enable_if_t, U, U>> > friend bool operator!=(T&& l, const value& r) { - return get_type_family_id() != r.fid() + return get_family_id() != r.fid() || std::not_equal_to<>{}(std::forward(l), *r.try_cast()); } diff --git a/untests/meta_value_tests.cpp b/untests/meta_value_tests.cpp index f54c276..e866ea7 100644 --- a/untests/meta_value_tests.cpp +++ b/untests/meta_value_tests.cpp @@ -75,19 +75,19 @@ TEST_CASE("meta/value/fid") { namespace meta = meta_hpp; using namespace std::string_literals; - CHECK(meta::value{clazz{}}.fid() == meta::get_type_family_id()); - CHECK(meta::value{clazz2{}}.fid() == meta::get_type_family_id()); + CHECK(meta::value{clazz{}}.fid() == meta::get_family_id()); + CHECK(meta::value{clazz2{}}.fid() == meta::get_family_id()); CHECK(meta::value{clazz{}}.fid() != meta::value{clazz2{}}.fid()); { meta::value v = clazz{}; - CHECK(v.fid() == meta::get_type_family_id()); + CHECK(v.fid() == meta::get_family_id()); v = clazz2{}; - CHECK(v.fid() == meta::get_type_family_id()); + CHECK(v.fid() == meta::get_family_id()); } - CHECK(meta::value{std::in_place_type, 1}.fid() == meta::get_type_family_id()); - CHECK(meta::value{std::in_place_type>, {1,2,3,4}}.fid() == meta::get_type_family_id>()); + CHECK(meta::value{std::in_place_type, 1}.fid() == meta::get_family_id()); + CHECK(meta::value{std::in_place_type>, {1,2,3,4}}.fid() == meta::get_family_id>()); } TEST_CASE("meta/value/data") { @@ -213,9 +213,9 @@ TEST_CASE("meta/value/swap") { meta::value v2{42}; meta::swap(v1, v2); - CHECK(v1.fid() == meta::get_type_family_id()); + CHECK(v1.fid() == meta::get_family_id()); CHECK(v1.to_int() == 42); - CHECK(v2.fid() == meta::get_type_family_id()); + CHECK(v2.fid() == meta::get_family_id()); CHECK(v2.to_string() == "hello"); }