From ead26278fa08293859d46c49c832f7e719e482e0 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Fri, 9 Aug 2024 07:18:28 +0700 Subject: [PATCH 1/3] increase uvalue internal sbo buffer to 3 pointers --- develop/untests/meta_utilities/value_tests.cpp | 4 ++-- headers/meta.hpp/meta_uvalue.hpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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_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 { From 4ddaf7970fd18d688719277dec405cbf9445680b Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Fri, 9 Aug 2024 21:02:04 +0700 Subject: [PATCH 2/3] raw pointer getter for function/member/method/variable --- develop/untests/meta_states/function_tests.cpp | 6 ++++++ develop/untests/meta_states/member_tests.cpp | 5 +++++ develop/untests/meta_states/method_tests.cpp | 5 +++++ develop/untests/meta_states/variable_tests.cpp | 5 +++++ headers/meta.hpp/meta_states.hpp | 12 ++++++++++++ headers/meta.hpp/meta_states/function.hpp | 5 +++++ headers/meta.hpp/meta_states/member.hpp | 5 +++++ headers/meta.hpp/meta_states/method.hpp | 5 +++++ headers/meta.hpp/meta_states/variable.hpp | 5 +++++ manuals/api/states.md | 8 ++++++++ 10 files changed, 61 insertions(+) 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/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..9539803 100644 --- a/headers/meta.hpp/meta_states/function.hpp +++ b/headers/meta.hpp/meta_states/function.hpp @@ -127,6 +127,7 @@ 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 +146,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..ee1e070 100644 --- a/headers/meta.hpp/meta_states/member.hpp +++ b/headers/meta.hpp/meta_states/member.hpp @@ -203,6 +203,7 @@ 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 +223,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..da6f8a3 100644 --- a/headers/meta.hpp/meta_states/method.hpp +++ b/headers/meta.hpp/meta_states/method.hpp @@ -139,6 +139,7 @@ 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 +158,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..232b20d 100644 --- a/headers/meta.hpp/meta_states/variable.hpp +++ b/headers/meta.hpp/meta_states/variable.hpp @@ -124,6 +124,7 @@ 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 +143,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/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; From 71e0ea73bb1fe5638b7e2f48ed92d6a68582c222 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Fri, 9 Aug 2024 21:08:41 +0700 Subject: [PATCH 3/3] update single-header version --- develop/singles/headers/meta.hpp/meta_all.hpp | 38 ++++++++++++++++++- headers/meta.hpp/meta_states/function.hpp | 1 + headers/meta.hpp/meta_states/member.hpp | 1 + headers/meta.hpp/meta_states/method.hpp | 1 + headers/meta.hpp/meta_states/variable.hpp | 1 + 5 files changed, 41 insertions(+), 1 deletion(-) 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/headers/meta.hpp/meta_states/function.hpp b/headers/meta.hpp/meta_states/function.hpp index 9539803..0500a05 100644 --- a/headers/meta.hpp/meta_states/function.hpp +++ b/headers/meta.hpp/meta_states/function.hpp @@ -128,6 +128,7 @@ namespace meta_hpp::detail }; 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(); diff --git a/headers/meta.hpp/meta_states/member.hpp b/headers/meta.hpp/meta_states/member.hpp index ee1e070..26b80b0 100644 --- a/headers/meta.hpp/meta_states/member.hpp +++ b/headers/meta.hpp/meta_states/member.hpp @@ -204,6 +204,7 @@ namespace meta_hpp::detail }; 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); diff --git a/headers/meta.hpp/meta_states/method.hpp b/headers/meta.hpp/meta_states/method.hpp index da6f8a3..dbf33f5 100644 --- a/headers/meta.hpp/meta_states/method.hpp +++ b/headers/meta.hpp/meta_states/method.hpp @@ -140,6 +140,7 @@ namespace meta_hpp::detail }; 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(); diff --git a/headers/meta.hpp/meta_states/variable.hpp b/headers/meta.hpp/meta_states/variable.hpp index 232b20d..4a590b9 100644 --- a/headers/meta.hpp/meta_states/variable.hpp +++ b/headers/meta.hpp/meta_states/variable.hpp @@ -125,6 +125,7 @@ namespace meta_hpp::detail }; 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);