raw pointer getter for function/member/method/variable

This commit is contained in:
BlackMATov
2024-08-09 21:02:04 +07:00
parent ead26278fa
commit 4ddaf7970f
10 changed files with 61 additions and 0 deletions

View File

@@ -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<decltype(&ivec2::iadd)>() == &ivec2::iadd);
CHECK(ivec2_type.get_function("ilength2").get_pointer().as<decltype(&ivec2::ilength2)>() == &ivec2::ilength2);
}
SUBCASE("iadd") {
const meta::function func = ivec2_type.get_function("iadd");
REQUIRE(func);

View File

@@ -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<decltype(&clazz_1::int_member)>() == &clazz_1::int_member);
CHECK(clazz_1_type.get_member("const_int_member").get_pointer().as<decltype(&clazz_1::const_int_member)>() == &clazz_1::const_int_member);
}
SUBCASE("int") {
meta::member vm = clazz_1_type.get_member("int_member");
REQUIRE(vm);

View File

@@ -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<decltype(&clazz::non_const_method)>() == &clazz::non_const_method);
CHECK(ct.get_method("const_method").get_pointer().as<decltype(&clazz::const_method)>() == &clazz::const_method);
}
SUBCASE("non_const_method") {
const meta::method mi = ct.get_method("non_const_method");
REQUIRE(mi);

View File

@@ -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<decltype(&clazz_1::int_variable)>() == &clazz_1::int_variable);
CHECK(clazz_1_type.get_variable("const_int_variable").get_pointer().as<decltype(&clazz_1::const_int_variable)>() == &clazz_1::const_int_variable);
}
SUBCASE("int") {
meta::variable vm = clazz_1_type.get_variable("int_variable");
REQUIRE(vm);

View File

@@ -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{};

View File

@@ -127,6 +127,7 @@ namespace meta_hpp::detail
std::move(metadata),
};
state.pointer = function_ptr;
state.invoke = make_function_invoke<Policy>(registry, function_ptr);
state.invoke_error = make_function_invoke_error<Function>(registry);
state.arguments = make_function_arguments<Function>();
@@ -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();
}

View File

@@ -203,6 +203,7 @@ namespace meta_hpp::detail
std::move(metadata),
};
state.pointer = member_ptr;
state.getter = make_member_getter<Policy>(registry, member_ptr);
state.setter = make_member_setter(registry, member_ptr);
state.getter_error = make_member_getter_error<Member>(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;

View File

@@ -139,6 +139,7 @@ namespace meta_hpp::detail
std::move(metadata),
};
state.pointer = method_ptr;
state.invoke = make_method_invoke<Policy>(registry, method_ptr);
state.invoke_error = make_method_invoke_error<Method>(registry);
state.arguments = make_method_arguments<Method>();
@@ -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();
}

View File

@@ -124,6 +124,7 @@ namespace meta_hpp::detail
std::move(metadata),
};
state.pointer = variable_ptr;
state.getter = make_variable_getter<Policy>(registry, variable_ptr);
state.setter = make_variable_setter(registry, variable_ptr);
state.setter_error = make_variable_setter_error<Pointer>(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();
}

View File

@@ -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;