internal classes and enums for class_type

This commit is contained in:
BlackMATov
2022-02-13 04:52:29 +07:00
parent ac6ee9d7cb
commit 53776b30eb
7 changed files with 131 additions and 22 deletions

View File

@@ -100,6 +100,17 @@ namespace meta_hpp
explicit class_bind(metadata_map metadata);
operator class_type() const noexcept;
// class_
template < detail::class_kind InternalClass >
class_bind& class_(std::string name);
// base_
template < detail::class_kind Base >
class_bind& base_()
requires detail::class_bind_base_kind<Class, Base>;
// constructor_
template < typename... Args
@@ -120,11 +131,10 @@ namespace meta_hpp
class_bind& destructor_(destructor_opts opts)
requires detail::class_bind_destructor_kind<Class>;
// base_
// enum_
template < detail::class_kind Base >
class_bind& base_()
requires detail::class_bind_base_kind<Class, Base>;
template < detail::enum_kind InternalEnum >
class_bind& enum_(std::string name);
// function_

View File

@@ -25,6 +25,39 @@ namespace meta_hpp
return class_type{data_};
}
// class_
template < detail::class_kind Class >
template < detail::class_kind InternalClass >
class_bind<Class>& class_bind<Class>::class_(std::string name) {
data_->classes.insert_or_assign(std::move(name), detail::resolve_type<InternalClass>());
return *this;
}
//
// base_
//
template < detail::class_kind Class >
template < detail::class_kind Base >
class_bind<Class>& class_bind<Class>::base_()
requires detail::class_bind_base_kind<Class, Base>
{
const class_type base_type = detail::resolve_type<Base>();
if ( data_->bases.contains(base_type) ) {
return *this;
}
data_->bases.emplace(base_type);
data_->bases_info.emplace(base_type, detail::class_type_data::base_info{
.upcast = +[](void* derived) -> void* {
return static_cast<Base*>(static_cast<Class*>(derived));
}
});
return *this;
}
//
// constructor_
//
@@ -81,20 +114,13 @@ namespace meta_hpp
}
//
// base_
// enum_
//
template < detail::class_kind Class >
template < detail::class_kind Base >
class_bind<Class>& class_bind<Class>::base_()
requires detail::class_bind_base_kind<Class, Base>
{
data_->bases.emplace(detail::resolve_type<Base>());
data_->bases_info.emplace(detail::resolve_type<Base>(), detail::class_type_data::base_info{
.upcast = +[](void* derived) -> void* {
return static_cast<Base*>(static_cast<Class*>(derived));
}
});
template < detail::enum_kind InternalEnum >
class_bind<Class>& class_bind<Class>::enum_(std::string name) {
data_->enums.insert_or_assign(std::move(name), detail::resolve_type<InternalEnum>());
return *this;
}

View File

@@ -29,15 +29,23 @@ namespace meta_hpp
return scope{state_};
}
//
// class_
//
template < detail::class_kind Class >
scope_bind& scope_bind::class_(std::string name) {
state_->classes.emplace(std::move(name), detail::resolve_type<Class>());
state_->classes.insert_or_assign(std::move(name), detail::resolve_type<Class>());
return *this;
}
//
// enum_
//
template < detail::enum_kind Enum >
scope_bind& scope_bind::enum_(std::string name) {
state_->enums.emplace(std::move(name), detail::resolve_type<Enum>());
state_->enums.insert_or_assign(std::move(name), detail::resolve_type<Enum>());
return *this;
}

View File

@@ -36,7 +36,7 @@ namespace meta_hpp::detail
}
auto state = scope_state::make(std::string{name}, metadata_map{});
return scopes_.emplace(std::string{name}, std::move(state)).first->second;
return scopes_.insert_or_assign(std::string{name}, std::move(state)).first->second;
}
public:
class locker : noncopyable {

View File

@@ -155,9 +155,11 @@ namespace meta_hpp
[[nodiscard]] any_type get_argument_type(std::size_t position) const noexcept;
[[nodiscard]] const std::vector<any_type>& get_argument_types() const noexcept;
[[nodiscard]] const class_map& get_classes() const noexcept;
[[nodiscard]] const class_set& get_bases() const noexcept;
[[nodiscard]] const constructor_map& get_ctors() const noexcept;
[[nodiscard]] const destructor_map& get_dtors() const noexcept;
[[nodiscard]] const class_set& get_bases() const noexcept;
[[nodiscard]] const enum_map& get_enums() const noexcept;
[[nodiscard]] const function_map& get_functions() const noexcept;
[[nodiscard]] const member_map& get_members() const noexcept;
[[nodiscard]] const method_map& get_methods() const noexcept;
@@ -180,6 +182,8 @@ namespace meta_hpp
[[nodiscard]] bool is_derived_from() const noexcept;
[[nodiscard]] bool is_derived_from(const class_type& base) const noexcept;
[[nodiscard]] class_type get_class(std::string_view name) const noexcept;
[[nodiscard]] enum_type get_enum(std::string_view name) const noexcept;
[[nodiscard]] function get_function(std::string_view name) const noexcept;
[[nodiscard]] member get_member(std::string_view name) const noexcept;
[[nodiscard]] method get_method(std::string_view name) const noexcept;
@@ -483,9 +487,11 @@ namespace meta_hpp::detail
const std::size_t size;
const std::vector<any_type> argument_types;
class_map classes;
class_set bases;
constructor_map constructors;
destructor_map destructors;
class_set bases;
enum_map enums;
function_map functions;
member_map members;
method_map methods;

View File

@@ -73,6 +73,14 @@ namespace meta_hpp
return data_->argument_types;
}
inline const class_map& class_type::get_classes() const noexcept {
return data_->classes;
}
inline const class_set& class_type::get_bases() const noexcept {
return data_->bases;
}
inline const constructor_map& class_type::get_ctors() const noexcept {
return data_->constructors;
}
@@ -81,8 +89,8 @@ namespace meta_hpp
return data_->destructors;
}
inline const class_set& class_type::get_bases() const noexcept {
return data_->bases;
inline const enum_map& class_type::get_enums() const noexcept {
return data_->enums;
}
inline const function_map& class_type::get_functions() const noexcept {
@@ -173,6 +181,20 @@ namespace meta_hpp
return false;
}
inline class_type class_type::get_class(std::string_view name) const noexcept {
if ( auto iter = data_->classes.find(name); iter != data_->classes.end() ) {
return iter->second;
}
return class_type{};
}
inline enum_type class_type::get_enum(std::string_view name) const noexcept {
if ( auto iter = data_->enums.find(name); iter != data_->enums.end() ) {
return iter->second;
}
return enum_type{};
}
inline function class_type::get_function(std::string_view name) const noexcept {
for ( auto&& [index, function] : data_->functions ) {
if ( index.get_name() == name ) {