mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-14 11:40:35 +07:00
internal classes and enums for class_type
This commit is contained in:
@@ -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_
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ) {
|
||||
|
||||
Reference in New Issue
Block a user