fix deep is_base_of and is_derived_from

This commit is contained in:
BlackMATov
2021-11-25 18:57:53 +07:00
parent e17c8a4206
commit 78e45607dd
3 changed files with 72 additions and 4 deletions

View File

@@ -23,6 +23,7 @@ namespace meta_hpp
template < class_kind Class >
template < typename... Args >
class_bind<Class>& class_bind<Class>::ctor_() {
static_assert(std::is_constructible_v<Class, Args...>);
auto ctor_state = detail::ctor_state::make<Class, Args...>();
data_->ctors.emplace(ctor_state->index, std::move(ctor_state));
return *this;
@@ -31,6 +32,7 @@ namespace meta_hpp
template < class_kind Class >
template < class_kind Base >
class_bind<Class>& class_bind<Class>::base_() {
static_assert(std::is_base_of_v<Base, Class>);
auto base_data = detail::class_type_data::get<Base>();
data_->bases.emplace(base_data);
return *this;
@@ -47,6 +49,7 @@ namespace meta_hpp
template < class_kind Class >
template < member_kind Member >
class_bind<Class>& class_bind<Class>::member_(std::string name, Member member) {
static_assert(std::same_as<Class, typename detail::member_traits<Member>::class_type>);
auto member_state = detail::member_state::make<Member>(std::move(name), std::move(member));
data_->members.emplace(member_state->index, std::move(member_state));
return *this;
@@ -55,6 +58,7 @@ namespace meta_hpp
template < class_kind Class >
template < method_kind Method >
class_bind<Class>& class_bind<Class>::method_(std::string name, Method method) {
static_assert(std::same_as<Class, typename detail::method_traits<Method>::class_type>);
auto method_state = detail::method_state::make<Method>(std::move(name), std::move(method));
data_->methods.emplace(method_state->index, std::move(method_state));
return *this;

View File

@@ -97,7 +97,21 @@ namespace meta_hpp
}
inline bool class_type::is_base_of(const class_type& derived) const noexcept {
return derived.data_ && derived.data_->bases.contains(*this);
if ( !is_valid() || !derived.is_valid() ) {
return false;
}
if ( derived.data_->bases.contains(*this) ) {
return true;
}
for ( auto&& derived_base : derived.data_->bases ) {
if ( is_base_of(derived_base) ) {
return true;
}
}
return false;
}
template < class_kind Base >
@@ -106,7 +120,21 @@ namespace meta_hpp
}
inline bool class_type::is_derived_from(const class_type& base) const noexcept {
return data_ && data_->bases.contains(base);
if ( !is_valid() || !base.is_valid() ) {
return false;
}
if ( data_->bases.contains(base) ) {
return true;
}
for ( auto&& self_base : data_->bases ) {
if ( self_base.is_derived_from(base) ) {
return true;
}
}
return false;
}
inline function class_type::get_function(std::string_view name) const noexcept {