Procházet zdrojové kódy

type_info: small review

Michele Caini před 5 roky
rodič
revize
d491e504cc
1 změnil soubory, kde provedl 20 přidání a 25 odebrání
  1. 20 25
      src/entt/core/type_info.hpp

+ 20 - 25
src/entt/core/type_info.hpp

@@ -81,12 +81,13 @@ struct type_hash final {
      */
 #if defined ENTT_PRETTY_FUNCTION_CONSTEXPR
     [[nodiscard]] static constexpr id_type value() ENTT_NOEXCEPT {
-        constexpr auto value = hashed_string::value(ENTT_PRETTY_FUNCTION);
+        constexpr auto stripped = internal::type_name<Type>();
+        constexpr auto value = hashed_string::value(stripped.data(), stripped.size());
         return value;
     }
 #elif defined ENTT_PRETTY_FUNCTION
     [[nodiscard]] static id_type value() ENTT_NOEXCEPT {
-        static const auto value = hashed_string::value(ENTT_PRETTY_FUNCTION);
+        static const auto value = [](const auto stripped) { return hashed_string::value(stripped.data(), stripped.size()); }(internal::type_name<Type>());
         return value;
     }
 #else
@@ -127,24 +128,18 @@ struct type_name final {
 
 /*! @brief Implementation specific information about a type. */
 class type_info final {
-    using seq_fn = id_type() ENTT_NOEXCEPT;
-    using hash_fn = id_type() ENTT_NOEXCEPT;
-    using name_fn = std::string_view() ENTT_NOEXCEPT;
-
     template<typename>
     friend type_info type_id() ENTT_NOEXCEPT;
 
-    type_info(seq_fn *seq_ptr, hash_fn *hash_ptr, name_fn *name_ptr) ENTT_NOEXCEPT
-        : seq_func{seq_ptr},
-          hash_func{hash_ptr},
-          name_func{name_ptr}
+    type_info(id_type seq_v, id_type hash_v, std::string_view name_v) ENTT_NOEXCEPT
+        : seq_value{seq_v},
+          hash_value{hash_v},
+          name_value{name_v}
     {}
 
 public:
     /*! @brief Default constructor. */
-    type_info() ENTT_NOEXCEPT
-        : type_info{nullptr, nullptr, nullptr}
-    {}
+    type_info() ENTT_NOEXCEPT = default;
 
     /*! @brief Default copy constructor. */
     type_info(const type_info &) ENTT_NOEXCEPT = default;
@@ -168,7 +163,7 @@ public:
      * @return True if the object is properly initialized, false otherwise.
      */
     [[nodiscard]] explicit operator bool() const ENTT_NOEXCEPT {
-        return !(seq_func == nullptr);
+        return !name_value.empty();
     }
 
     /**
@@ -176,7 +171,7 @@ public:
      * @return Type sequential identifier.
      */
     [[nodiscard]] id_type seq() const ENTT_NOEXCEPT {
-        return seq_func();
+        return seq_value;
     }
 
     /**
@@ -184,7 +179,7 @@ public:
      * @return Type hash.
      */
     [[nodiscard]] id_type hash() const ENTT_NOEXCEPT {
-        return hash_func();
+        return hash_value;
     }
 
     /**
@@ -192,7 +187,7 @@ public:
      * @return Type name.
      */
     [[nodiscard]] std::string_view name() const ENTT_NOEXCEPT {
-        return name_func();
+        return name_value;
     }
 
     /**
@@ -201,13 +196,13 @@ public:
      * @return False if the two contents differ, true otherwise.
      */
     [[nodiscard]] bool operator==(const type_info &other) const ENTT_NOEXCEPT {
-        return (!hash_func && !other.hash_func) || (hash_func && other.hash_func && hash_func() == other.hash_func());
+        return hash_value == other.hash_value;
     }
 
 private:
-    seq_fn *seq_func;
-    hash_fn *hash_func;
-    name_fn *name_func;
+    id_type seq_value;
+    id_type hash_value;
+    std::string_view name_value;
 };
 
 
@@ -230,9 +225,9 @@ private:
 template<typename Type>
 type_info type_id() ENTT_NOEXCEPT {
     return type_info{
-        &type_seq<std::remove_reference_t<std::remove_const_t<Type>>>::value,
-        &type_hash<std::remove_reference_t<std::remove_const_t<Type>>>::value,
-        &type_name<std::remove_reference_t<std::remove_const_t<Type>>>::value,
+        type_seq<std::remove_reference_t<std::remove_const_t<Type>>>::value(),
+        type_hash<std::remove_reference_t<std::remove_const_t<Type>>>::value(),
+        type_name<std::remove_reference_t<std::remove_const_t<Type>>>::value()
     };
 }
 
@@ -240,7 +235,7 @@ type_info type_id() ENTT_NOEXCEPT {
 /*! @copydoc type_id */
 template<typename Type>
 type_info type_id(Type &&) ENTT_NOEXCEPT {
-    return type_id<std::remove_reference_t<Type>>();
+    return type_id<Type>();
 }