From 4ddaf7970fd18d688719277dec405cbf9445680b Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Fri, 9 Aug 2024 21:02:04 +0700 Subject: [PATCH] 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;