Просмотр исходного кода

meta: use enum-as-bitmask support to get rid of old fashioned enum for meta traits

Michele Caini 4 лет назад
Родитель
Сommit
7b35bcb68a
2 измененных файлов с 27 добавлено и 25 удалено
  1. 16 16
      src/entt/meta/meta.hpp
  2. 11 9
      src/entt/meta/node.hpp

+ 16 - 16
src/entt/meta/meta.hpp

@@ -819,7 +819,7 @@ struct meta_data {
      * @return True if the data member is constant, false otherwise.
      */
     [[nodiscard]] bool is_const() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_CONST);
+        return !!(node->traits & internal::meta_traits::IS_CONST);
     }
 
     /**
@@ -827,7 +827,7 @@ struct meta_data {
      * @return True if the data member is static, false otherwise.
      */
     [[nodiscard]] bool is_static() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_STATIC);
+        return !!(node->traits & internal::meta_traits::IS_STATIC);
     }
 
     /*! @copydoc meta_any::type */
@@ -928,7 +928,7 @@ struct meta_func {
      * @return True if the member function is constant, false otherwise.
      */
     [[nodiscard]] bool is_const() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_CONST);
+        return !!(node->traits & internal::meta_traits::IS_CONST);
     }
 
     /**
@@ -936,7 +936,7 @@ struct meta_func {
      * @return True if the member function is static, false otherwise.
      */
     [[nodiscard]] bool is_static() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_STATIC);
+        return !!(node->traits & internal::meta_traits::IS_STATIC);
     }
 
     /**
@@ -1103,7 +1103,7 @@ public:
      * @return True if the underlying type is an integral type, false otherwise.
      */
     [[nodiscard]] bool is_integral() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_INTEGRAL);
+        return !!(node->traits & internal::meta_traits::IS_INTEGRAL);
     }
 
     /**
@@ -1112,7 +1112,7 @@ public:
      * otherwise.
      */
     [[nodiscard]] bool is_floating_point() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_FLOATING_POINT);
+        return !!(node->traits & internal::meta_traits::IS_FLOATING_POINT);
     }
 
     /**
@@ -1120,7 +1120,7 @@ public:
      * @return True if the underlying type is an array type, false otherwise.
      */
     [[nodiscard]] bool is_array() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_ARRAY);
+        return !!(node->traits & internal::meta_traits::IS_ARRAY);
     }
 
     /**
@@ -1128,7 +1128,7 @@ public:
      * @return True if the underlying type is an enum, false otherwise.
      */
     [[nodiscard]] bool is_enum() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_ENUM);
+        return !!(node->traits & internal::meta_traits::IS_ENUM);
     }
 
     /**
@@ -1136,7 +1136,7 @@ public:
      * @return True if the underlying type is an union, false otherwise.
      */
     [[nodiscard]] bool is_union() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_UNION);
+        return !!(node->traits & internal::meta_traits::IS_UNION);
     }
 
     /**
@@ -1144,7 +1144,7 @@ public:
      * @return True if the underlying type is a class, false otherwise.
      */
     [[nodiscard]] bool is_class() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_CLASS);
+        return !!(node->traits & internal::meta_traits::IS_CLASS);
     }
 
     /**
@@ -1152,7 +1152,7 @@ public:
      * @return True if the underlying type is a pointer, false otherwise.
      */
     [[nodiscard]] bool is_pointer() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_POINTER);
+        return !!(node->traits & internal::meta_traits::IS_POINTER);
     }
 
     /**
@@ -1161,7 +1161,7 @@ public:
      * otherwise.
      */
     [[nodiscard]] bool is_member_object_pointer() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_MEMBER_OBJECT_POINTER);
+        return !!(node->traits & internal::meta_traits::IS_MEMBER_OBJECT_POINTER);
     }
 
     /**
@@ -1171,7 +1171,7 @@ public:
      * false otherwise.
      */
     [[nodiscard]] bool is_member_function_pointer() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_MEMBER_FUNCTION_POINTER);
+        return !!(node->traits & internal::meta_traits::IS_MEMBER_FUNCTION_POINTER);
     }
 
     /**
@@ -1180,7 +1180,7 @@ public:
      * otherwise.
      */
     [[nodiscard]] bool is_pointer_like() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_META_POINTER_LIKE);
+        return !!(node->traits & internal::meta_traits::IS_META_POINTER_LIKE);
     }
 
     /**
@@ -1188,7 +1188,7 @@ public:
      * @return True if the type is a sequence container, false otherwise.
      */
     [[nodiscard]] bool is_sequence_container() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_META_SEQUENCE_CONTAINER);
+        return !!(node->traits & internal::meta_traits::IS_META_SEQUENCE_CONTAINER);
     }
 
     /**
@@ -1196,7 +1196,7 @@ public:
      * @return True if the type is an associative container, false otherwise.
      */
     [[nodiscard]] bool is_associative_container() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_traits::IS_META_ASSOCIATIVE_CONTAINER);
+        return !!(node->traits & internal::meta_traits::IS_META_ASSOCIATIVE_CONTAINER);
     }
 
     /**

+ 11 - 9
src/entt/meta/node.hpp

@@ -7,6 +7,7 @@
 #include <utility>
 #include "../config/config.h"
 #include "../core/attribute.h"
+#include "../core/enum.hpp"
 #include "../core/fwd.hpp"
 #include "../core/type_info.hpp"
 #include "../core/type_traits.hpp"
@@ -30,7 +31,7 @@ struct meta_handle;
 namespace internal {
 
 
-enum meta_traits: std::uint32_t {
+enum class meta_traits: std::uint32_t {
     IS_NONE = 0x0000,
     IS_CONST = 0x0001,
     IS_STATIC = 0x0002,
@@ -41,11 +42,12 @@ enum meta_traits: std::uint32_t {
     IS_UNION = 0x0040,
     IS_CLASS = 0x0080,
     IS_POINTER = 0x0100,
-    IS_MEMBER_OBJECT_POINTER = 0x0400,
-    IS_MEMBER_FUNCTION_POINTER = 0x0800,
-    IS_META_POINTER_LIKE = 0x1000,
-    IS_META_SEQUENCE_CONTAINER = 0x2000,
-    IS_META_ASSOCIATIVE_CONTAINER = 0x4000
+    IS_MEMBER_OBJECT_POINTER = 0x0200,
+    IS_MEMBER_FUNCTION_POINTER = 0x0400,
+    IS_META_POINTER_LIKE = 0x0800,
+    IS_META_SEQUENCE_CONTAINER = 0x1000,
+    IS_META_ASSOCIATIVE_CONTAINER = 0x2000,
+    _entt_enum_as_bitmask
 };
 
 
@@ -87,7 +89,7 @@ struct meta_data_node {
     id_type id;
     meta_data_node * next;
     meta_prop_node * prop;
-    std::underlying_type_t<meta_traits> traits;
+    meta_traits traits;
     meta_type_node * const type;
     bool(* const set)(meta_handle, meta_any);
     meta_any(* const get)(meta_handle);
@@ -100,7 +102,7 @@ struct meta_func_node {
     meta_func_node * next;
     meta_prop_node * prop;
     const size_type arity;
-    std::underlying_type_t<meta_traits> traits;
+    meta_traits traits;
     meta_type_node * const ret;
     meta_type(* const arg)(const size_type) ENTT_NOEXCEPT;
     meta_any(* const invoke)(meta_handle, meta_any * const);
@@ -122,7 +124,7 @@ struct meta_type_node {
     meta_type_node * next;
     meta_prop_node * prop;
     const size_type size_of;
-    std::underlying_type_t<meta_traits> traits;
+    meta_traits traits;
     const meta_template_node *const templ;
     meta_ctor_node * const def_ctor;
     meta_ctor_node *ctor{nullptr};