class_bind.base_ for multiple bases

This commit is contained in:
BlackMATov
2023-01-10 19:27:39 +07:00
parent d44cf16090
commit 09f99b005d
4 changed files with 42 additions and 38 deletions

View File

@@ -3340,9 +3340,9 @@ namespace meta_hpp
// base_
template < detail::class_kind Base >
template < detail::class_kind... Bases >
class_bind& base_()
requires detail::class_bind_base_kind<Class, Base>;
requires (... && detail::class_bind_base_kind<Class, Bases>);
// constructor_
@@ -3824,26 +3824,28 @@ namespace meta_hpp
//
template < detail::class_kind Class >
template < detail::class_kind Base >
template < detail::class_kind... Bases >
class_bind<Class>& class_bind<Class>::base_()
requires detail::class_bind_base_kind<Class, Base>
requires (... && detail::class_bind_base_kind<Class, Bases>)
{
const class_type base_type = resolve_type<Base>();
([this]<detail::class_kind Base>(std::in_place_type_t<Base>) {
const class_type base_type = resolve_type<Base>();
if ( auto&& [_, success] = data_->bases.emplace(base_type); !success ) {
return *this;
}
if ( auto&& [_, success] = data_->bases.emplace(base_type); !success ) {
return;
}
META_HPP_TRY {
data_->bases_info.emplace(base_type, detail::class_type_data::base_info{
.upcast = +[](void* derived) -> void* {
return static_cast<Base*>(static_cast<Class*>(derived));
}
});
} META_HPP_CATCH(...) {
data_->bases.erase(base_type);
META_HPP_RETHROW();
}
META_HPP_TRY {
data_->bases_info.emplace(base_type, detail::class_type_data::base_info{
.upcast = +[](void* derived) -> void* {
return static_cast<Base*>(static_cast<Class*>(derived));
}
});
} META_HPP_CATCH(...) {
data_->bases.erase(base_type);
META_HPP_RETHROW();
}
}(std::in_place_type<Bases>), ...);
return *this;
}

View File

@@ -63,6 +63,7 @@ TEST_CASE("meta/meta_types/class_type") {
meta::class_<base_clazz_1>()
.constructor_<int>()
.base_<>()
.member_("base_member_1", &base_clazz_1::base_member_1)
.method_("base_method_1", &base_clazz_1::base_method_1)
.function_("base_function_1", &base_clazz_1::base_function_1)
@@ -81,8 +82,7 @@ TEST_CASE("meta/meta_types/class_type") {
meta::class_<derived_clazz>()
.constructor_<int, float>()
.base_<base_clazz_1>()
.base_<base_clazz_2>()
.base_<base_clazz_1, base_clazz_2>()
.member_("derived_member", &derived_clazz::derived_member)
.method_("derived_method", &derived_clazz::derived_method)
.function_("derived_function", &derived_clazz::derived_function)