diff --git a/ROADMAP.md b/ROADMAP.md index 94c1dba..1c106e8 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -4,7 +4,6 @@ - type conversions - non-linear search of methods/functions/... -- register base types by `META_HPP_ENABLE_POLY_INFO` - fix all includes to work with the library more flexible - test and support shared libraries - remove `resolve_poly_type`, use `resolve_type(T&&)` instead diff --git a/develop/manuals/meta_manuals/class_manual.cpp b/develop/manuals/meta_manuals/class_manual.cpp index 897ab77..85e38c1 100644 --- a/develop/manuals/meta_manuals/class_manual.cpp +++ b/develop/manuals/meta_manuals/class_manual.cpp @@ -12,6 +12,7 @@ namespace { class shape { + META_HPP_ENABLE_POLY_INFO() public: shape() = default; shape(const shape&) = default; diff --git a/develop/manuals/meta_manuals/uvalue_manual.cpp b/develop/manuals/meta_manuals/uvalue_manual.cpp index 0abf6c4..f4f3963 100644 --- a/develop/manuals/meta_manuals/uvalue_manual.cpp +++ b/develop/manuals/meta_manuals/uvalue_manual.cpp @@ -12,6 +12,7 @@ namespace { class shape { + META_HPP_ENABLE_POLY_INFO() public: shape() = default; shape(const shape&) = default; diff --git a/develop/singles/headers/meta.hpp/meta_all.hpp b/develop/singles/headers/meta.hpp/meta_all.hpp index ecc6ae5..185589c 100644 --- a/develop/singles/headers/meta.hpp/meta_all.hpp +++ b/develop/singles/headers/meta.hpp/meta_all.hpp @@ -2561,10 +2561,6 @@ namespace meta_hpp return id_type{data_}; } - [[nodiscard]] explicit operator id_type() const noexcept { - return get_id(); - } - [[nodiscard]] type_kind get_kind() const noexcept { return data_->kind; } @@ -8307,19 +8303,19 @@ namespace meta_hpp::detail , size{class_traits::size} , align{class_traits::align} , argument_types{resolve_types(typename class_traits::argument_types{})} { - struct { - class_list base_classes; - deep_upcasts_t deep_upcasts; - } new_base_data; + class_list new_base_classes; + deep_upcasts_t new_deep_upcasts; - const auto add_new_base = [&new_base_data](auto&& recur) { + const auto add_new_base = [&](auto&& recur) { const class_type& base_class = resolve_type(); - new_base_data.deep_upcasts.push_back(upcast_func_t{ - .target{base_class}, + new_deep_upcasts.push_back(upcast_func_t{ + .target{base_class.get_id()}, .upcast{[]() { if constexpr ( requires { static_cast(std::declval()); } ) { - return +[](void* from) -> void* { return static_cast(static_cast(from)); }; + return +[](void* from) -> void* { // + return static_cast(static_cast(from)); + }; } else { return nullptr; } @@ -8327,16 +8323,16 @@ namespace meta_hpp::detail }); if constexpr ( std::is_same_v ) { - new_base_data.base_classes.push_back(base_class); + new_base_classes.push_back(base_class); } recur.template operator()(recur); }; - const auto add_new_bases = [&add_new_base](auto&& recur) { + const auto add_new_bases = [&](auto&& recur) { if constexpr ( check_base_info_enabled ) { using meta_base_info = typename Derived::meta_base_info; - meta_base_info::for_each([&add_new_base, &recur]() { + meta_base_info::for_each([&]() { // add_new_base.template operator()(recur); }); } else { @@ -8346,8 +8342,8 @@ namespace meta_hpp::detail add_new_bases.template operator()(add_new_bases); - base_classes.swap(new_base_data.base_classes); - deep_upcasts.swap(new_base_data.deep_upcasts); + base_classes.swap(new_base_classes); + deep_upcasts.swap(new_deep_upcasts); } } diff --git a/headers/meta.hpp/meta_types.hpp b/headers/meta.hpp/meta_types.hpp index 2ca2f45..a86ddae 100644 --- a/headers/meta.hpp/meta_types.hpp +++ b/headers/meta.hpp/meta_types.hpp @@ -126,10 +126,6 @@ namespace meta_hpp return id_type{data_}; } - [[nodiscard]] explicit operator id_type() const noexcept { - return get_id(); - } - [[nodiscard]] type_kind get_kind() const noexcept { return data_->kind; } diff --git a/headers/meta.hpp/meta_types/class_type.hpp b/headers/meta.hpp/meta_types/class_type.hpp index 8c6710a..9bdbab9 100644 --- a/headers/meta.hpp/meta_types/class_type.hpp +++ b/headers/meta.hpp/meta_types/class_type.hpp @@ -27,19 +27,19 @@ namespace meta_hpp::detail , size{class_traits::size} , align{class_traits::align} , argument_types{resolve_types(typename class_traits::argument_types{})} { - struct { - class_list base_classes; - deep_upcasts_t deep_upcasts; - } new_base_data; + class_list new_base_classes; + deep_upcasts_t new_deep_upcasts; - const auto add_new_base = [&new_base_data](auto&& recur) { + const auto add_new_base = [&](auto&& recur) { const class_type& base_class = resolve_type(); - new_base_data.deep_upcasts.push_back(upcast_func_t{ - .target{base_class}, + new_deep_upcasts.push_back(upcast_func_t{ + .target{base_class.get_id()}, .upcast{[]() { if constexpr ( requires { static_cast(std::declval()); } ) { - return +[](void* from) -> void* { return static_cast(static_cast(from)); }; + return +[](void* from) -> void* { // + return static_cast(static_cast(from)); + }; } else { return nullptr; } @@ -47,16 +47,16 @@ namespace meta_hpp::detail }); if constexpr ( std::is_same_v ) { - new_base_data.base_classes.push_back(base_class); + new_base_classes.push_back(base_class); } recur.template operator()(recur); }; - const auto add_new_bases = [&add_new_base](auto&& recur) { + const auto add_new_bases = [&](auto&& recur) { if constexpr ( check_base_info_enabled ) { using meta_base_info = typename Derived::meta_base_info; - meta_base_info::for_each([&add_new_base, &recur]() { + meta_base_info::for_each([&]() { // add_new_base.template operator()(recur); }); } else { @@ -66,8 +66,8 @@ namespace meta_hpp::detail add_new_bases.template operator()(add_new_bases); - base_classes.swap(new_base_data.base_classes); - deep_upcasts.swap(new_base_data.deep_upcasts); + base_classes.swap(new_base_classes); + deep_upcasts.swap(new_deep_upcasts); } }