diff --git a/develop/singles/headers/meta.hpp/meta_all.hpp b/develop/singles/headers/meta.hpp/meta_all.hpp index b214559..29ca84f 100644 --- a/develop/singles/headers/meta.hpp/meta_all.hpp +++ b/develop/singles/headers/meta.hpp/meta_all.hpp @@ -2812,7 +2812,7 @@ namespace meta_hpp struct alignas(std::max_align_t) internal_storage_t final { // NOLINTNEXTLINE(*-avoid-c-arrays) - std::byte data[sizeof(void*) * 2]; + std::byte data[sizeof(void*) * 3]; }; struct external_storage_t final { @@ -4176,6 +4176,8 @@ namespace meta_hpp [[nodiscard]] function_type get_type() const noexcept; [[nodiscard]] const std::string& get_name() const noexcept; + [[nodiscard]] const uvalue& get_pointer() const noexcept; + [[nodiscard]] std::size_t get_arity() const noexcept; [[nodiscard]] argument get_argument(std::size_t position) const noexcept; [[nodiscard]] const argument_list& get_arguments() const noexcept; @@ -4225,6 +4227,8 @@ namespace meta_hpp [[nodiscard]] member_type get_type() const noexcept; [[nodiscard]] const std::string& get_name() const noexcept; + [[nodiscard]] const uvalue& get_pointer() const noexcept; + template < typename Instance > [[nodiscard]] uvalue get(Instance&& instance) const; @@ -4275,6 +4279,8 @@ namespace meta_hpp [[nodiscard]] method_type get_type() const noexcept; [[nodiscard]] const std::string& get_name() const noexcept; + [[nodiscard]] const uvalue& get_pointer() const noexcept; + [[nodiscard]] std::size_t get_arity() const noexcept; [[nodiscard]] argument get_argument(std::size_t position) const noexcept; [[nodiscard]] const argument_list& get_arguments() const noexcept; @@ -4361,6 +4367,8 @@ namespace meta_hpp [[nodiscard]] pointer_type get_type() const noexcept; [[nodiscard]] const std::string& get_name() const noexcept; + [[nodiscard]] const uvalue& get_pointer() const noexcept; + [[nodiscard]] uvalue get() const; [[nodiscard]] uresult try_get() const; @@ -4495,6 +4503,7 @@ namespace meta_hpp::detail function_index index; metadata_map metadata; + uvalue pointer; invoke_impl invoke{}; invoke_error_impl invoke_error{}; argument_list arguments{}; @@ -4514,6 +4523,7 @@ namespace meta_hpp::detail member_index index; metadata_map metadata; + uvalue pointer; getter_impl getter{}; setter_impl setter{}; getter_error_impl getter_error{}; @@ -4531,6 +4541,7 @@ namespace meta_hpp::detail method_index index; metadata_map metadata; + uvalue pointer; invoke_impl invoke{}; invoke_error_impl invoke_error{}; argument_list arguments{}; @@ -4560,6 +4571,7 @@ namespace meta_hpp::detail variable_index index; metadata_map metadata; + uvalue pointer; getter_impl getter{}; setter_impl setter{}; setter_error_impl setter_error{}; @@ -7120,6 +7132,8 @@ namespace meta_hpp::detail std::move(metadata), }; + state.pointer = function_ptr; + state.invoke = make_function_invoke(registry, function_ptr); state.invoke_error = make_function_invoke_error(registry); state.arguments = make_function_arguments(); @@ -7138,6 +7152,10 @@ namespace meta_hpp return state_->index.get_name(); } + inline const uvalue& function::get_pointer() const noexcept { + return state_->pointer; + } + inline std::size_t function::get_arity() const noexcept { return state_->arguments.size(); } @@ -7712,6 +7730,8 @@ namespace meta_hpp::detail std::move(metadata), }; + state.pointer = member_ptr; + state.getter = make_member_getter(registry, member_ptr); state.setter = make_member_setter(registry, member_ptr); state.getter_error = make_member_getter_error(registry); @@ -7731,6 +7751,10 @@ namespace meta_hpp return state_->index.get_name(); } + inline const uvalue& member::get_pointer() const noexcept { + return state_->pointer; + } + template < typename Instance > uvalue member::get(Instance&& instance) const { using namespace detail; @@ -8016,6 +8040,8 @@ namespace meta_hpp::detail std::move(metadata), }; + state.pointer = method_ptr; + state.invoke = make_method_invoke(registry, method_ptr); state.invoke_error = make_method_invoke_error(registry); state.arguments = make_method_arguments(); @@ -8034,6 +8060,10 @@ namespace meta_hpp return state_->index.get_name(); } + inline const uvalue& method::get_pointer() const noexcept { + return state_->pointer; + } + inline std::size_t method::get_arity() const noexcept { return state_->arguments.size(); } @@ -9358,6 +9388,8 @@ namespace meta_hpp::detail std::move(metadata), }; + state.pointer = variable_ptr; + state.getter = make_variable_getter(registry, variable_ptr); state.setter = make_variable_setter(registry, variable_ptr); state.setter_error = make_variable_setter_error(registry); @@ -9376,6 +9408,10 @@ namespace meta_hpp return state_->index.get_name(); } + inline const uvalue& variable::get_pointer() const noexcept { + return state_->pointer; + } + inline uvalue variable::get() const { return state_->getter(); } diff --git a/develop/untests/meta_states/function_tests.cpp b/develop/untests/meta_states/function_tests.cpp index d7037ae..3b9e6fc 100644 --- a/develop/untests/meta_states/function_tests.cpp +++ b/develop/untests/meta_states/function_tests.cpp @@ -28,6 +28,7 @@ namespace static int arg_unbounded_const_arr(const ivec2 vs[]) { return vs[0].x + vs[0].y + vs[1].x + vs[1].y; } }; + [[maybe_unused]] bool operator==(const ivec2& l, const ivec2& r) noexcept { return l.x == r.x && l.y == r.y; } @@ -63,6 +64,11 @@ TEST_CASE("meta/meta_states/function") { CHECK((iadd_f < ilength2_f || ilength2_f < iadd_f)); } + SUBCASE("pointers") { + CHECK(ivec2_type.get_function("iadd").get_pointer().as() == &ivec2::iadd); + CHECK(ivec2_type.get_function("ilength2").get_pointer().as() == &ivec2::ilength2); + } + SUBCASE("iadd") { const meta::function func = ivec2_type.get_function("iadd"); REQUIRE(func); diff --git a/develop/untests/meta_states/member_tests.cpp b/develop/untests/meta_states/member_tests.cpp index 591fa12..23e679d 100644 --- a/develop/untests/meta_states/member_tests.cpp +++ b/develop/untests/meta_states/member_tests.cpp @@ -50,6 +50,11 @@ TEST_CASE("meta/meta_states/member") { CHECK((int_member_m < const_int_member_m || const_int_member_m < int_member_m)); } + SUBCASE("pointers") { + CHECK(clazz_1_type.get_member("int_member").get_pointer().as() == &clazz_1::int_member); + CHECK(clazz_1_type.get_member("const_int_member").get_pointer().as() == &clazz_1::const_int_member); + } + SUBCASE("int") { meta::member vm = clazz_1_type.get_member("int_member"); REQUIRE(vm); diff --git a/develop/untests/meta_states/method_tests.cpp b/develop/untests/meta_states/method_tests.cpp index 33b429d..58cf396 100644 --- a/develop/untests/meta_states/method_tests.cpp +++ b/develop/untests/meta_states/method_tests.cpp @@ -114,6 +114,11 @@ TEST_CASE("meta/meta_states/method") { CHECK((non_const_method_m < non_const_method_rref_m || non_const_method_rref_m < non_const_method_m)); } + SUBCASE("pointers") { + CHECK(ct.get_method("non_const_method").get_pointer().as() == &clazz::non_const_method); + CHECK(ct.get_method("const_method").get_pointer().as() == &clazz::const_method); + } + SUBCASE("non_const_method") { const meta::method mi = ct.get_method("non_const_method"); REQUIRE(mi); diff --git a/develop/untests/meta_states/variable_tests.cpp b/develop/untests/meta_states/variable_tests.cpp index 3ce3b2d..2f7d257 100644 --- a/develop/untests/meta_states/variable_tests.cpp +++ b/develop/untests/meta_states/variable_tests.cpp @@ -80,6 +80,11 @@ TEST_CASE("meta/meta_states/variable") { CHECK((int_variable_v < const_int_variable_v || const_int_variable_v < int_variable_v)); } + SUBCASE("pointers") { + CHECK(clazz_1_type.get_variable("int_variable").get_pointer().as() == &clazz_1::int_variable); + CHECK(clazz_1_type.get_variable("const_int_variable").get_pointer().as() == &clazz_1::const_int_variable); + } + SUBCASE("int") { meta::variable vm = clazz_1_type.get_variable("int_variable"); REQUIRE(vm); diff --git a/develop/untests/meta_utilities/value_tests.cpp b/develop/untests/meta_utilities/value_tests.cpp index 7debd65..50ce7bc 100644 --- a/develop/untests/meta_utilities/value_tests.cpp +++ b/develop/untests/meta_utilities/value_tests.cpp @@ -376,13 +376,13 @@ TEST_CASE("meta/meta_utilities/value") { CHECK(ivec2::move_constructor_counter == 1); CHECK(ivec2::copy_constructor_counter == 0); - val1.swap(val2); + val2.swap(val1); CHECK(val1.as() == ivec2{1,2}); CHECK(val2.as() == "world"s); CHECK(ivec2::move_constructor_counter == 2); CHECK(ivec2::copy_constructor_counter == 0); - swap(val1, val2); + swap(val2, val1); CHECK(val1.as() == "world"s); CHECK(val2.as() == ivec2{1,2}); } diff --git a/headers/meta.hpp/meta_states.hpp b/headers/meta.hpp/meta_states.hpp index 9ae9c48..b36a819 100644 --- a/headers/meta.hpp/meta_states.hpp +++ b/headers/meta.hpp/meta_states.hpp @@ -165,6 +165,8 @@ namespace meta_hpp [[nodiscard]] function_type get_type() const noexcept; [[nodiscard]] const std::string& get_name() const noexcept; + [[nodiscard]] const uvalue& get_pointer() const noexcept; + [[nodiscard]] std::size_t get_arity() const noexcept; [[nodiscard]] argument get_argument(std::size_t position) const noexcept; [[nodiscard]] const argument_list& get_arguments() const noexcept; @@ -214,6 +216,8 @@ namespace meta_hpp [[nodiscard]] member_type get_type() const noexcept; [[nodiscard]] const std::string& get_name() const noexcept; + [[nodiscard]] const uvalue& get_pointer() const noexcept; + template < typename Instance > [[nodiscard]] uvalue get(Instance&& instance) const; @@ -264,6 +268,8 @@ namespace meta_hpp [[nodiscard]] method_type get_type() const noexcept; [[nodiscard]] const std::string& get_name() const noexcept; + [[nodiscard]] const uvalue& get_pointer() const noexcept; + [[nodiscard]] std::size_t get_arity() const noexcept; [[nodiscard]] argument get_argument(std::size_t position) const noexcept; [[nodiscard]] const argument_list& get_arguments() const noexcept; @@ -350,6 +356,8 @@ namespace meta_hpp [[nodiscard]] pointer_type get_type() const noexcept; [[nodiscard]] const std::string& get_name() const noexcept; + [[nodiscard]] const uvalue& get_pointer() const noexcept; + [[nodiscard]] uvalue get() const; [[nodiscard]] uresult try_get() const; @@ -484,6 +492,7 @@ namespace meta_hpp::detail function_index index; metadata_map metadata; + uvalue pointer; invoke_impl invoke{}; invoke_error_impl invoke_error{}; argument_list arguments{}; @@ -503,6 +512,7 @@ namespace meta_hpp::detail member_index index; metadata_map metadata; + uvalue pointer; getter_impl getter{}; setter_impl setter{}; getter_error_impl getter_error{}; @@ -520,6 +530,7 @@ namespace meta_hpp::detail method_index index; metadata_map metadata; + uvalue pointer; invoke_impl invoke{}; invoke_error_impl invoke_error{}; argument_list arguments{}; @@ -549,6 +560,7 @@ namespace meta_hpp::detail variable_index index; metadata_map metadata; + uvalue pointer; getter_impl getter{}; setter_impl setter{}; setter_error_impl setter_error{}; diff --git a/headers/meta.hpp/meta_states/function.hpp b/headers/meta.hpp/meta_states/function.hpp index 04fd41f..0500a05 100644 --- a/headers/meta.hpp/meta_states/function.hpp +++ b/headers/meta.hpp/meta_states/function.hpp @@ -127,6 +127,8 @@ namespace meta_hpp::detail std::move(metadata), }; + state.pointer = function_ptr; + state.invoke = make_function_invoke(registry, function_ptr); state.invoke_error = make_function_invoke_error(registry); state.arguments = make_function_arguments(); @@ -145,6 +147,10 @@ namespace meta_hpp return state_->index.get_name(); } + inline const uvalue& function::get_pointer() const noexcept { + return state_->pointer; + } + inline std::size_t function::get_arity() const noexcept { return state_->arguments.size(); } diff --git a/headers/meta.hpp/meta_states/member.hpp b/headers/meta.hpp/meta_states/member.hpp index fd25de3..26b80b0 100644 --- a/headers/meta.hpp/meta_states/member.hpp +++ b/headers/meta.hpp/meta_states/member.hpp @@ -203,6 +203,8 @@ namespace meta_hpp::detail std::move(metadata), }; + state.pointer = member_ptr; + state.getter = make_member_getter(registry, member_ptr); state.setter = make_member_setter(registry, member_ptr); state.getter_error = make_member_getter_error(registry); @@ -222,6 +224,10 @@ namespace meta_hpp return state_->index.get_name(); } + inline const uvalue& member::get_pointer() const noexcept { + return state_->pointer; + } + template < typename Instance > uvalue member::get(Instance&& instance) const { using namespace detail; diff --git a/headers/meta.hpp/meta_states/method.hpp b/headers/meta.hpp/meta_states/method.hpp index 7d94700..dbf33f5 100644 --- a/headers/meta.hpp/meta_states/method.hpp +++ b/headers/meta.hpp/meta_states/method.hpp @@ -139,6 +139,8 @@ namespace meta_hpp::detail std::move(metadata), }; + state.pointer = method_ptr; + state.invoke = make_method_invoke(registry, method_ptr); state.invoke_error = make_method_invoke_error(registry); state.arguments = make_method_arguments(); @@ -157,6 +159,10 @@ namespace meta_hpp return state_->index.get_name(); } + inline const uvalue& method::get_pointer() const noexcept { + return state_->pointer; + } + inline std::size_t method::get_arity() const noexcept { return state_->arguments.size(); } diff --git a/headers/meta.hpp/meta_states/variable.hpp b/headers/meta.hpp/meta_states/variable.hpp index a422fc2..4a590b9 100644 --- a/headers/meta.hpp/meta_states/variable.hpp +++ b/headers/meta.hpp/meta_states/variable.hpp @@ -124,6 +124,8 @@ namespace meta_hpp::detail std::move(metadata), }; + state.pointer = variable_ptr; + state.getter = make_variable_getter(registry, variable_ptr); state.setter = make_variable_setter(registry, variable_ptr); state.setter_error = make_variable_setter_error(registry); @@ -142,6 +144,10 @@ namespace meta_hpp return state_->index.get_name(); } + inline const uvalue& variable::get_pointer() const noexcept { + return state_->pointer; + } + inline uvalue variable::get() const { return state_->getter(); } diff --git a/headers/meta.hpp/meta_uvalue.hpp b/headers/meta.hpp/meta_uvalue.hpp index e1e7eff..4f2a396 100644 --- a/headers/meta.hpp/meta_uvalue.hpp +++ b/headers/meta.hpp/meta_uvalue.hpp @@ -119,7 +119,7 @@ namespace meta_hpp struct alignas(std::max_align_t) internal_storage_t final { // NOLINTNEXTLINE(*-avoid-c-arrays) - std::byte data[sizeof(void*) * 2]; + std::byte data[sizeof(void*) * 3]; }; struct external_storage_t final { diff --git a/manuals/api/states.md b/manuals/api/states.md index bd01a4c..d8fa42e 100644 --- a/manuals/api/states.md +++ b/manuals/api/states.md @@ -174,6 +174,8 @@ public: function_type get_type() const noexcept; const std::string& get_name() const noexcept; + const uvalue& get_pointer() const noexcept; + std::size_t get_arity() const noexcept; argument get_argument(std::size_t position) const noexcept; const argument_list& get_arguments() const noexcept; @@ -227,6 +229,8 @@ public: member_type get_type() const noexcept; const std::string& get_name() const noexcept; + const uvalue& get_pointer() const noexcept; + template < typename Instance > uvalue get(Instance&& instance) const; @@ -281,6 +285,8 @@ public: method_type get_type() const noexcept; const std::string& get_name() const noexcept; + const uvalue& get_pointer() const noexcept; + std::size_t get_arity() const noexcept; argument get_argument(std::size_t position) const noexcept; const argument_list& get_arguments() const noexcept; @@ -375,6 +381,8 @@ public: pointer_type get_type() const noexcept; const std::string& get_name() const noexcept; + const uvalue& get_pointer() const noexcept; + uvalue get() const; uresult try_get() const;