Skip to content

Commit 379a4bd

Browse files
committed
meta: re-added meta_type::remove_pointer (close #878)
1 parent 2ce106c commit 379a4bd

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

src/entt/meta/meta.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,15 @@ class meta_type {
10561056
return !!(node->traits & internal::meta_traits::is_pointer);
10571057
}
10581058

1059+
/**
1060+
* @brief Provides the type for which the pointer is defined.
1061+
* @return The type for which the pointer is defined or this type if it
1062+
* doesn't refer to a pointer type.
1063+
*/
1064+
[[nodiscard]] meta_type remove_pointer() const ENTT_NOEXCEPT {
1065+
return node->remove_pointer();
1066+
}
1067+
10591068
/**
10601069
* @brief Checks whether a type is a pointer-like type or not.
10611070
* @return True if the underlying type is a pointer-like one, false

src/entt/meta/node.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ struct meta_type_node {
108108
meta_type_node *next;
109109
meta_prop_node *prop;
110110
const size_type size_of;
111+
meta_type_node *(*const remove_pointer)() ENTT_NOEXCEPT;
111112
meta_any (*const default_constructor)();
112113
double (*const conversion_helper)(void *, const void *);
113114
const meta_template_node *const templ;
@@ -180,6 +181,7 @@ class ENTT_API meta_node {
180181
nullptr,
181182
nullptr,
182183
size_of_v<Type>,
184+
&meta_node<std::remove_cv_t<std::remove_reference_t<std::remove_pointer_t<Type>>>>::resolve,
183185
meta_default_constructor(),
184186
meta_conversion_helper(),
185187
meta_template_info()

test/entt/meta/meta_type.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,13 @@ TEST_F(MetaType, Traits) {
261261
ASSERT_FALSE(entt::resolve<std::vector<int>>().is_associative_container());
262262
}
263263

264+
TEST_F(MetaType, RemovePointer) {
265+
ASSERT_EQ(entt::resolve<void *>().remove_pointer(), entt::resolve<void>());
266+
ASSERT_EQ(entt::resolve<char **>().remove_pointer(), entt::resolve<char *>());
267+
ASSERT_EQ(entt::resolve<int (*)(char, double)>().remove_pointer(), entt::resolve<int(char, double)>());
268+
ASSERT_EQ(entt::resolve<derived_t>().remove_pointer(), entt::resolve<derived_t>());
269+
}
270+
264271
TEST_F(MetaType, TemplateInfo) {
265272
ASSERT_FALSE(entt::resolve<int>().is_template_specialization());
266273
ASSERT_EQ(entt::resolve<int>().template_arity(), 0u);

0 commit comments

Comments
 (0)