Explorar el Código

meta: re-added meta_type::remove_pointer (close #878)

Michele Caini hace 3 años
padre
commit
379a4bdda6
Se han modificado 3 ficheros con 18 adiciones y 0 borrados
  1. 9 0
      src/entt/meta/meta.hpp
  2. 2 0
      src/entt/meta/node.hpp
  3. 7 0
      test/entt/meta/meta_type.cpp

+ 9 - 0
src/entt/meta/meta.hpp

@@ -1056,6 +1056,15 @@ public:
         return !!(node->traits & internal::meta_traits::is_pointer);
     }
 
+    /**
+     * @brief Provides the type for which the pointer is defined.
+     * @return The type for which the pointer is defined or this type if it
+     * doesn't refer to a pointer type.
+     */
+    [[nodiscard]] meta_type remove_pointer() const ENTT_NOEXCEPT {
+        return node->remove_pointer();
+    }
+
     /**
      * @brief Checks whether a type is a pointer-like type or not.
      * @return True if the underlying type is a pointer-like one, false

+ 2 - 0
src/entt/meta/node.hpp

@@ -108,6 +108,7 @@ struct meta_type_node {
     meta_type_node *next;
     meta_prop_node *prop;
     const size_type size_of;
+    meta_type_node *(*const remove_pointer)() ENTT_NOEXCEPT;
     meta_any (*const default_constructor)();
     double (*const conversion_helper)(void *, const void *);
     const meta_template_node *const templ;
@@ -180,6 +181,7 @@ public:
             nullptr,
             nullptr,
             size_of_v<Type>,
+            &meta_node<std::remove_cv_t<std::remove_reference_t<std::remove_pointer_t<Type>>>>::resolve,
             meta_default_constructor(),
             meta_conversion_helper(),
             meta_template_info()

+ 7 - 0
test/entt/meta/meta_type.cpp

@@ -261,6 +261,13 @@ TEST_F(MetaType, Traits) {
     ASSERT_FALSE(entt::resolve<std::vector<int>>().is_associative_container());
 }
 
+TEST_F(MetaType, RemovePointer) {
+    ASSERT_EQ(entt::resolve<void *>().remove_pointer(), entt::resolve<void>());
+    ASSERT_EQ(entt::resolve<char **>().remove_pointer(), entt::resolve<char *>());
+    ASSERT_EQ(entt::resolve<int (*)(char, double)>().remove_pointer(), entt::resolve<int(char, double)>());
+    ASSERT_EQ(entt::resolve<derived_t>().remove_pointer(), entt::resolve<derived_t>());
+}
+
 TEST_F(MetaType, TemplateInfo) {
     ASSERT_FALSE(entt::resolve<int>().is_template_specialization());
     ASSERT_EQ(entt::resolve<int>().template_arity(), 0u);