family id for infos

This commit is contained in:
BlackMATov
2021-07-01 05:20:31 +07:00
parent 1c8b962f5a
commit 0e65288a9c
11 changed files with 88 additions and 15 deletions

View File

@@ -22,7 +22,7 @@ namespace meta_hpp
class class_ { class class_ {
public: public:
explicit class_(std::string id) explicit class_(std::string id)
: info_(std::move(id)) {} : info_{get_family_id<Class>(), std::move(id)} {}
const class_info& info() const noexcept { const class_info& info() const noexcept {
return info_; return info_;

View File

@@ -27,9 +27,14 @@ namespace meta_hpp
class_info& operator=(class_info&&) = default; class_info& operator=(class_info&&) = default;
class_info& operator=(const class_info&) = default; class_info& operator=(const class_info&) = default;
class_info(std::string id) class_info(family_id fid, std::string id)
: id_(std::move(id)) {} : fid_(std::move(fid))
, id_(std::move(id)) {}
public: public:
const family_id& fid() const noexcept {
return fid_;
}
const std::string& id() const noexcept { const std::string& id() const noexcept {
return id_; return id_;
} }
@@ -114,6 +119,7 @@ namespace meta_hpp
detail::merge_with(variables_, other.variables_, &variable_info::merge_with_); detail::merge_with(variables_, other.variables_, &variable_info::merge_with_);
} }
private: private:
family_id fid_;
std::string id_; std::string id_;
std::map<std::string, class_info, std::less<>> classes_; std::map<std::string, class_info, std::less<>> classes_;
std::map<std::string, data_info, std::less<>> datas_; std::map<std::string, data_info, std::less<>> datas_;

View File

@@ -20,7 +20,7 @@ namespace meta_hpp
static_assert(std::is_member_object_pointer_v<decltype(Field)>); static_assert(std::is_member_object_pointer_v<decltype(Field)>);
explicit field_(std::string id) explicit field_(std::string id)
: info_(std::move(id)) { : info_{get_family_id<decltype(Field)>(), std::move(id)} {
info_.getter_ = &field_detail::getter<Field>; info_.getter_ = &field_detail::getter<Field>;
info_.setter_ = &field_detail::setter<Field>; info_.setter_ = &field_detail::setter<Field>;
} }

View File

@@ -68,9 +68,14 @@ namespace meta_hpp
field_info& operator=(field_info&&) = default; field_info& operator=(field_info&&) = default;
field_info& operator=(const field_info&) = default; field_info& operator=(const field_info&) = default;
field_info(std::string id) field_info(family_id fid, std::string id)
: id_(std::move(id)) {} : fid_(std::move(fid))
, id_(std::move(id)) {}
public: public:
const family_id& fid() const noexcept {
return fid_;
}
const std::string& id() const noexcept { const std::string& id() const noexcept {
return id_; return id_;
} }
@@ -105,6 +110,7 @@ namespace meta_hpp
detail::merge_with(datas_, other.datas_, &data_info::merge_with_); detail::merge_with(datas_, other.datas_, &data_info::merge_with_);
} }
private: private:
family_id fid_;
std::string id_; std::string id_;
value(*getter_)(const void*); value(*getter_)(const void*);
void(*setter_)(void*, value); void(*setter_)(void*, value);

View File

@@ -20,7 +20,7 @@ namespace meta_hpp
static_assert(std::is_function_v<std::remove_pointer_t<decltype(Function)>>); static_assert(std::is_function_v<std::remove_pointer_t<decltype(Function)>>);
explicit function_(std::string id) explicit function_(std::string id)
: info_(std::move(id)) { : info_{get_family_id<decltype(Function)>(), std::move(id)} {
info_.invoke_ = &function_detail::invoke<Function>; info_.invoke_ = &function_detail::invoke<Function>;
} }

View File

@@ -75,9 +75,14 @@ namespace meta_hpp
function_info& operator=(function_info&&) = default; function_info& operator=(function_info&&) = default;
function_info& operator=(const function_info&) = default; function_info& operator=(const function_info&) = default;
function_info(std::string id) function_info(family_id fid, std::string id)
: id_(std::move(id)) {} : fid_(std::move(fid))
, id_(std::move(id)) {}
public: public:
const family_id& fid() const noexcept {
return fid_;
}
const std::string& id() const noexcept { const std::string& id() const noexcept {
return id_; return id_;
} }
@@ -112,6 +117,7 @@ namespace meta_hpp
detail::merge_with(datas_, other.datas_, &data_info::merge_with_); detail::merge_with(datas_, other.datas_, &data_info::merge_with_);
} }
private: private:
family_id fid_;
std::string id_; std::string id_;
value(*invoke_)(value*, std::size_t); value(*invoke_)(value*, std::size_t);
std::map<std::string, data_info, std::less<>> datas_; std::map<std::string, data_info, std::less<>> datas_;

View File

@@ -8,6 +8,7 @@
#include <any> #include <any>
#include <array> #include <array>
#include <cassert>
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include <functional> #include <functional>
@@ -44,6 +45,48 @@ namespace meta_hpp
template < auto Variable > class variable_; template < auto Variable > class variable_;
} }
namespace meta_hpp
{
struct family_id {
using underlying_type = std::size_t;
underlying_type id{};
friend bool operator<(family_id l, family_id r) noexcept {
return l.id < r.id;
}
};
namespace family_id_detail
{
template < typename Void = void >
class type_family_base {
static_assert(
std::is_void_v<Void>,
"unexpected internal error");
protected:
static family_id::underlying_type last_id_;
};
template < typename T >
class type_family final : public type_family_base<> {
public:
static family_id id() noexcept {
static family_id self_id{++last_id_};
assert(self_id.id > 0u && "family_id overflow");
return self_id;
}
};
template < typename Void >
family_id::underlying_type type_family_base<Void>::last_id_{};
}
template < typename T >
family_id get_family_id() noexcept {
return family_id_detail::type_family<T>::id();
}
}
namespace meta_hpp namespace meta_hpp
{ {
template < typename Signature > template < typename Signature >

View File

@@ -20,7 +20,7 @@ namespace meta_hpp
static_assert(std::is_member_function_pointer_v<decltype(Method)>); static_assert(std::is_member_function_pointer_v<decltype(Method)>);
explicit method_(std::string id) explicit method_(std::string id)
: info_(std::move(id)) { : info_{get_family_id<decltype(Method)>(), std::move(id)} {
info_.invoke_ = &method_detail::invoke<Method>; info_.invoke_ = &method_detail::invoke<Method>;
info_.cinvoke_ = &method_detail::cinvoke<Method>; info_.cinvoke_ = &method_detail::cinvoke<Method>;
} }

View File

@@ -132,9 +132,14 @@ namespace meta_hpp
method_info& operator=(method_info&&) = default; method_info& operator=(method_info&&) = default;
method_info& operator=(const method_info&) = default; method_info& operator=(const method_info&) = default;
method_info(std::string id) method_info(family_id fid, std::string id)
: id_(std::move(id)) {} : fid_(std::move(fid))
, id_(std::move(id)) {}
public: public:
const family_id& fid() const noexcept {
return fid_;
}
const std::string& id() const noexcept { const std::string& id() const noexcept {
return id_; return id_;
} }
@@ -171,6 +176,7 @@ namespace meta_hpp
detail::merge_with(datas_, other.datas_, &data_info::merge_with_); detail::merge_with(datas_, other.datas_, &data_info::merge_with_);
} }
private: private:
family_id fid_;
std::string id_; std::string id_;
value(*invoke_)(void*, value*, std::size_t); value(*invoke_)(void*, value*, std::size_t);
value(*cinvoke_)(const void*, value*, std::size_t); value(*cinvoke_)(const void*, value*, std::size_t);

View File

@@ -18,7 +18,7 @@ namespace meta_hpp
class variable_ { class variable_ {
public: public:
explicit variable_(std::string id) explicit variable_(std::string id)
: info_(std::move(id)) { : info_{get_family_id<decltype(Variable)>(), std::move(id)} {
info_.getter_ = &variable_detail::getter<Variable>; info_.getter_ = &variable_detail::getter<Variable>;
info_.setter_ = &variable_detail::setter<Variable>; info_.setter_ = &variable_detail::setter<Variable>;
} }

View File

@@ -63,9 +63,14 @@ namespace meta_hpp
variable_info& operator=(variable_info&&) = default; variable_info& operator=(variable_info&&) = default;
variable_info& operator=(const variable_info&) = default; variable_info& operator=(const variable_info&) = default;
variable_info(std::string id) variable_info(family_id fid, std::string id)
: id_(std::move(id)) {} : fid_(std::move(fid))
, id_(std::move(id)) {}
public: public:
const family_id& fid() const noexcept {
return fid_;
}
const std::string& id() const noexcept { const std::string& id() const noexcept {
return id_; return id_;
} }
@@ -103,6 +108,7 @@ namespace meta_hpp
detail::merge_with(datas_, other.datas_, &data_info::merge_with_); detail::merge_with(datas_, other.datas_, &data_info::merge_with_);
} }
private: private:
family_id fid_;
std::string id_; std::string id_;
value(*getter_)(); value(*getter_)();
void(*setter_)(value); void(*setter_)(value);