mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-16 22:17:02 +07:00
rename get_type_family_id to get_family_id
This commit is contained in:
@@ -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_;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user