rename get_type_family_id to get_family_id

This commit is contained in:
BlackMATov
2021-07-07 00:39:13 +07:00
parent 7f29d73e55
commit 788ce044dc
6 changed files with 34 additions and 40 deletions

View File

@@ -128,7 +128,7 @@ namespace meta_hpp
template < typename Class > template < typename Class >
class_info(detail::typename_arg_t<Class>, std::string id) class_info(detail::typename_arg_t<Class>, std::string id)
: fid_{get_type_family_id<Class>()} : fid_{get_family_id<Class>()}
, id_{std::move(id)} {} , id_{std::move(id)} {}
private: private:
family_id fid_; family_id fid_;

View File

@@ -57,32 +57,26 @@ namespace meta_hpp
namespace family_id_detail namespace family_id_detail
{ {
template < typename Void = void > struct family_id_sequence {
class family_base { static family_id next() noexcept {
static_assert( static std::atomic<family_id::underlying_type> id{};
std::is_void_v<Void>, return { ++id };
"unexpected internal error"); }
protected:
static std::atomic<family_id::underlying_type> last_id_;
}; };
template < typename Void >
std::atomic<family_id::underlying_type> family_base<Void>::last_id_{};
template < typename T > template < typename T >
class type_family final : public family_base<> { struct type_to_family_id {
public:
static family_id id() noexcept { static family_id id() noexcept {
static family_id self_id{++last_id_}; static const family_id type_family_id = family_id_sequence::next();
assert(self_id.id > 0u && "family_id overflow"); assert(type_family_id.id > 0u && "family_id overflow");
return self_id; return type_family_id;
} }
}; };
} }
template < typename T > template < typename T >
family_id get_type_family_id() noexcept { family_id get_family_id() noexcept {
return family_id_detail::type_family<T>::id(); return family_id_detail::type_to_family_id<T>::id();
} }
} }

View File

@@ -34,7 +34,7 @@ namespace meta_hpp
, typename = std::enable_if_t<!std::is_same_v<T, cinstance>> > , typename = std::enable_if_t<!std::is_same_v<T, cinstance>> >
instance(T& v) instance(T& v)
: data_{std::addressof(v)} : data_{std::addressof(v)}
, fid_{get_type_family_id<T>()} {} , fid_{get_family_id<T>()} {}
instance(value& v) instance(value& v)
: data_{v.data()} : data_{v.data()}
@@ -56,7 +56,7 @@ namespace meta_hpp
std::add_pointer_t<T> std::add_pointer_t<T>
try_cast() noexcept { try_cast() noexcept {
static_assert(!std::is_reference_v<T>); static_assert(!std::is_reference_v<T>);
return fid() == get_type_family_id<T>() return fid() == get_family_id<T>()
? static_cast<std::add_pointer_t<T>>(data_) ? static_cast<std::add_pointer_t<T>>(data_)
: nullptr; : nullptr;
} }
@@ -65,7 +65,7 @@ namespace meta_hpp
std::add_pointer_t<std::add_const_t<T>> std::add_pointer_t<std::add_const_t<T>>
try_cast() const noexcept { try_cast() const noexcept {
static_assert(!std::is_reference_v<T>); static_assert(!std::is_reference_v<T>);
return fid() == get_type_family_id<T>() return fid() == get_family_id<T>()
? static_cast<std::add_pointer_t<std::add_const_t<T>>>(data_) ? static_cast<std::add_pointer_t<std::add_const_t<T>>>(data_)
: nullptr; : nullptr;
} }
@@ -93,7 +93,7 @@ namespace meta_hpp
, typename = std::enable_if_t<!std::is_same_v<T, cinstance>> > , typename = std::enable_if_t<!std::is_same_v<T, cinstance>> >
cinstance(const T& data) cinstance(const T& data)
: data_{std::addressof(data)} : data_{std::addressof(data)}
, fid_{get_type_family_id<T>()} {} , fid_{get_family_id<T>()} {}
cinstance(const value& v) cinstance(const value& v)
: data_{v.data()} : data_{v.data()}
@@ -115,7 +115,7 @@ namespace meta_hpp
std::add_pointer_t<std::add_const_t<T>> std::add_pointer_t<std::add_const_t<T>>
try_cast() const noexcept { try_cast() const noexcept {
static_assert(!std::is_reference_v<T>); static_assert(!std::is_reference_v<T>);
return fid() == get_type_family_id<T>() return fid() == get_family_id<T>()
? static_cast<std::add_pointer_t<std::add_const_t<T>>>(data_) ? static_cast<std::add_pointer_t<std::add_const_t<T>>>(data_)
: nullptr; : nullptr;
} }

View File

@@ -23,13 +23,13 @@ namespace meta_hpp
public: public:
template < typename T > template < typename T >
std::optional<class_info> resolve() const { std::optional<class_info> resolve() const {
const family_id fid = get_type_family_id<T>(); const family_id fid = get_family_id<T>();
return detail::find_opt(types_, fid); return detail::find_opt(types_, fid);
} }
template < typename T > template < typename T >
std::optional<class_info> resolve(T&&) const { std::optional<class_info> resolve(T&&) const {
const family_id fid = get_type_family_id<std::decay_t<T>>(); const family_id fid = get_family_id<std::decay_t<T>>();
return detail::find_opt(types_, fid); return detail::find_opt(types_, fid);
} }

View File

@@ -63,7 +63,7 @@ namespace meta_hpp
, typename = std::enable_if_t<!std::is_same_v<U, value>> > , typename = std::enable_if_t<!std::is_same_v<U, value>> >
value(T&& val) value(T&& val)
: raw_{std::forward<T>(val)} : raw_{std::forward<T>(val)}
, fid_{get_type_family_id<U>()} , fid_{get_family_id<U>()}
, traits_{value_detail::get_traits<U>()} {} , traits_{value_detail::get_traits<U>()} {}
template < typename T template < typename T
@@ -77,13 +77,13 @@ namespace meta_hpp
template < typename T, typename... Args > template < typename T, typename... Args >
explicit value(std::in_place_type_t<T>, Args&&... args) explicit value(std::in_place_type_t<T>, Args&&... args)
: raw_{std::in_place_type<T>, std::forward<Args>(args)...} : raw_{std::in_place_type<T>, std::forward<Args>(args)...}
, fid_{get_type_family_id<T>()} , fid_{get_family_id<T>()}
, traits_{value_detail::get_traits<T>()} {} , traits_{value_detail::get_traits<T>()} {}
template < typename T, typename U, typename... Args > template < typename T, typename U, typename... Args >
explicit value(std::in_place_type_t<T>, std::initializer_list<U> ilist, Args&&... args) explicit value(std::in_place_type_t<T>, std::initializer_list<U> ilist, Args&&... args)
: raw_{std::in_place_type<T>, ilist, std::forward<Args>(args)...} : raw_{std::in_place_type<T>, ilist, std::forward<Args>(args)...}
, fid_{get_type_family_id<T>()} , fid_{get_family_id<T>()}
, traits_{value_detail::get_traits<T>()} {} , traits_{value_detail::get_traits<T>()} {}
template < typename T > template < typename T >
@@ -139,7 +139,7 @@ namespace meta_hpp
, typename = std::enable_if_t<!std::is_same_v<U, value>> , typename = std::enable_if_t<!std::is_same_v<U, value>>
, typename = std::enable_if_t<std::is_invocable_v<std::equal_to<>, U, U>> > , typename = std::enable_if_t<std::is_invocable_v<std::equal_to<>, U, U>> >
friend bool operator==(const value& l, T&& r) { friend bool operator==(const value& l, T&& r) {
return l.fid() == get_type_family_id<U>() return l.fid() == get_family_id<U>()
&& std::equal_to<>{}(*l.try_cast<U>(), std::forward<T>(r)); && std::equal_to<>{}(*l.try_cast<U>(), std::forward<T>(r));
} }
@@ -148,7 +148,7 @@ namespace meta_hpp
, typename = std::enable_if_t<!std::is_same_v<U, value>> , typename = std::enable_if_t<!std::is_same_v<U, value>>
, typename = std::enable_if_t<std::is_invocable_v<std::equal_to<>, U, U>> > , typename = std::enable_if_t<std::is_invocable_v<std::equal_to<>, U, U>> >
friend bool operator==(T&& l, const value& r) { friend bool operator==(T&& l, const value& r) {
return get_type_family_id<U>() == r.fid() return get_family_id<U>() == r.fid()
&& std::equal_to<>{}(std::forward<T>(l), *r.try_cast<U>()); && std::equal_to<>{}(std::forward<T>(l), *r.try_cast<U>());
} }
@@ -157,7 +157,7 @@ namespace meta_hpp
, typename = std::enable_if_t<!std::is_same_v<U, value>> , typename = std::enable_if_t<!std::is_same_v<U, value>>
, typename = std::enable_if_t<std::is_invocable_v<std::equal_to<>, U, U>> > , typename = std::enable_if_t<std::is_invocable_v<std::equal_to<>, U, U>> >
friend bool operator!=(const value& l, T&& r) { friend bool operator!=(const value& l, T&& r) {
return l.fid() != get_type_family_id<U>() return l.fid() != get_family_id<U>()
|| std::not_equal_to<>{}(*l.try_cast<U>(), std::forward<T>(r)); || std::not_equal_to<>{}(*l.try_cast<U>(), std::forward<T>(r));
} }
@@ -166,7 +166,7 @@ namespace meta_hpp
, typename = std::enable_if_t<!std::is_same_v<U, value>> , typename = std::enable_if_t<!std::is_same_v<U, value>>
, typename = std::enable_if_t<std::is_invocable_v<std::equal_to<>, U, U>> > , typename = std::enable_if_t<std::is_invocable_v<std::equal_to<>, U, U>> >
friend bool operator!=(T&& l, const value& r) { friend bool operator!=(T&& l, const value& r) {
return get_type_family_id<U>() != r.fid() return get_family_id<U>() != r.fid()
|| std::not_equal_to<>{}(std::forward<T>(l), *r.try_cast<U>()); || std::not_equal_to<>{}(std::forward<T>(l), *r.try_cast<U>());
} }

View File

@@ -75,19 +75,19 @@ TEST_CASE("meta/value/fid") {
namespace meta = meta_hpp; namespace meta = meta_hpp;
using namespace std::string_literals; using namespace std::string_literals;
CHECK(meta::value{clazz{}}.fid() == meta::get_type_family_id<clazz>()); CHECK(meta::value{clazz{}}.fid() == meta::get_family_id<clazz>());
CHECK(meta::value{clazz2{}}.fid() == meta::get_type_family_id<clazz2>()); CHECK(meta::value{clazz2{}}.fid() == meta::get_family_id<clazz2>());
CHECK(meta::value{clazz{}}.fid() != meta::value{clazz2{}}.fid()); CHECK(meta::value{clazz{}}.fid() != meta::value{clazz2{}}.fid());
{ {
meta::value v = clazz{}; meta::value v = clazz{};
CHECK(v.fid() == meta::get_type_family_id<clazz>()); CHECK(v.fid() == meta::get_family_id<clazz>());
v = clazz2{}; v = clazz2{};
CHECK(v.fid() == meta::get_type_family_id<clazz2>()); CHECK(v.fid() == meta::get_family_id<clazz2>());
} }
CHECK(meta::value{std::in_place_type<int>, 1}.fid() == meta::get_type_family_id<int>()); CHECK(meta::value{std::in_place_type<int>, 1}.fid() == meta::get_family_id<int>());
CHECK(meta::value{std::in_place_type<std::vector<int>>, {1,2,3,4}}.fid() == meta::get_type_family_id<std::vector<int>>()); CHECK(meta::value{std::in_place_type<std::vector<int>>, {1,2,3,4}}.fid() == meta::get_family_id<std::vector<int>>());
} }
TEST_CASE("meta/value/data") { TEST_CASE("meta/value/data") {
@@ -213,9 +213,9 @@ TEST_CASE("meta/value/swap") {
meta::value v2{42}; meta::value v2{42};
meta::swap(v1, v2); meta::swap(v1, v2);
CHECK(v1.fid() == meta::get_type_family_id<int>()); CHECK(v1.fid() == meta::get_family_id<int>());
CHECK(v1.to_int() == 42); CHECK(v1.to_int() == 42);
CHECK(v2.fid() == meta::get_type_family_id<std::string>()); CHECK(v2.fid() == meta::get_family_id<std::string>());
CHECK(v2.to_string() == "hello"); CHECK(v2.to_string() == "hello");
} }