Răsfoiți Sursa

type_traits: is_std_hashable[_v]

Michele Caini 4 ani în urmă
părinte
comite
1816206dfc
2 a modificat fișierele cu 53 adăugiri și 23 ștergeri
  1. 21 0
      src/entt/core/type_traits.hpp
  2. 32 23
      test/entt/core/type_traits.cpp

+ 21 - 0
src/entt/core/type_traits.hpp

@@ -2,6 +2,7 @@
 #define ENTT_CORE_TYPE_TRAITS_HPP
 
 #include <cstddef>
+#include <functional>
 #include <iterator>
 #include <type_traits>
 #include <utility>
@@ -591,6 +592,26 @@ struct is_equality_comparable<Type, std::void_t<decltype(std::declval<Type>() ==
 template<typename Type>
 inline constexpr bool is_equality_comparable_v = is_equality_comparable<Type>::value;
 
+/**
+ * @brief Provides the member constant `value` to true if a given type is
+ * _hashable_, false otherwise.
+ * @tparam Type The type to test.
+ */
+template<typename Type, typename = void>
+struct is_std_hashable: std::false_type {};
+
+/*! @copydoc is_std_hashable */
+template<typename Type>
+struct is_std_hashable<Type, std::enable_if_t<std::is_same_v<decltype(std::declval<const std::hash<Type> &>()(*std::declval<Type *>())), std::size_t>>>
+    : std::true_type {};
+
+/**
+ * @brief Helper variable template.
+ * @tparam Type The type to test.
+ */
+template<typename Type>
+inline constexpr auto is_std_hashable_v = is_std_hashable<Type>::value;
+
 /**
  * @brief Transcribes the constness of a type to another type.
  * @tparam To The type to which to transcribe the constness.

+ 32 - 23
test/entt/core/type_traits.cpp

@@ -102,29 +102,6 @@ TEST(TypeTraits, ValueList) {
     static_assert(entt::value_list_element_v<0u, other> == 1);
 }
 
-TEST(TypeTraits, IsEqualityComparable) {
-    static_assert(entt::is_equality_comparable_v<int>);
-    static_assert(entt::is_equality_comparable_v<const int>);
-    static_assert(entt::is_equality_comparable_v<std::vector<int>>);
-    static_assert(entt::is_equality_comparable_v<std::vector<std::vector<int>>>);
-    static_assert(entt::is_equality_comparable_v<std::unordered_map<int, int>>);
-    static_assert(entt::is_equality_comparable_v<std::unordered_map<int, std::unordered_map<int, char>>>);
-    static_assert(entt::is_equality_comparable_v<std::pair<const int, int>>);
-    static_assert(entt::is_equality_comparable_v<std::pair<const int, std::unordered_map<int, char>>>);
-    static_assert(entt::is_equality_comparable_v<std::vector<not_comparable>::iterator>);
-    static_assert(entt::is_equality_comparable_v<nlohmann_json_like>);
-
-    static_assert(!entt::is_equality_comparable_v<not_comparable>);
-    static_assert(!entt::is_equality_comparable_v<const not_comparable>);
-    static_assert(!entt::is_equality_comparable_v<std::vector<not_comparable>>);
-    static_assert(!entt::is_equality_comparable_v<std::vector<std::vector<not_comparable>>>);
-    static_assert(!entt::is_equality_comparable_v<std::unordered_map<int, not_comparable>>);
-    static_assert(!entt::is_equality_comparable_v<std::unordered_map<int, std::unordered_map<int, not_comparable>>>);
-    static_assert(!entt::is_equality_comparable_v<std::pair<const int, not_comparable>>);
-    static_assert(!entt::is_equality_comparable_v<std::pair<const int, std::unordered_map<int, not_comparable>>>);
-    static_assert(!entt::is_equality_comparable_v<void>);
-}
-
 TEST(TypeTraits, IsApplicable) {
     static_assert(entt::is_applicable_v<void(int, char), std::tuple<double, char>>);
     static_assert(!entt::is_applicable_v<void(int, char), std::tuple<int>>);
@@ -165,6 +142,38 @@ TEST(TypeTraits, IsTransparent) {
     static_assert(entt::is_transparent_v<std::logical_not<void>>);
 }
 
+TEST(TypeTraits, IsEqualityComparable) {
+    static_assert(entt::is_equality_comparable_v<int>);
+    static_assert(entt::is_equality_comparable_v<const int>);
+    static_assert(entt::is_equality_comparable_v<std::vector<int>>);
+    static_assert(entt::is_equality_comparable_v<std::vector<std::vector<int>>>);
+    static_assert(entt::is_equality_comparable_v<std::unordered_map<int, int>>);
+    static_assert(entt::is_equality_comparable_v<std::unordered_map<int, std::unordered_map<int, char>>>);
+    static_assert(entt::is_equality_comparable_v<std::pair<const int, int>>);
+    static_assert(entt::is_equality_comparable_v<std::pair<const int, std::unordered_map<int, char>>>);
+    static_assert(entt::is_equality_comparable_v<std::vector<not_comparable>::iterator>);
+    static_assert(entt::is_equality_comparable_v<nlohmann_json_like>);
+
+    static_assert(!entt::is_equality_comparable_v<not_comparable>);
+    static_assert(!entt::is_equality_comparable_v<const not_comparable>);
+    static_assert(!entt::is_equality_comparable_v<std::vector<not_comparable>>);
+    static_assert(!entt::is_equality_comparable_v<std::vector<std::vector<not_comparable>>>);
+    static_assert(!entt::is_equality_comparable_v<std::unordered_map<int, not_comparable>>);
+    static_assert(!entt::is_equality_comparable_v<std::unordered_map<int, std::unordered_map<int, not_comparable>>>);
+    static_assert(!entt::is_equality_comparable_v<std::pair<const int, not_comparable>>);
+    static_assert(!entt::is_equality_comparable_v<std::pair<const int, std::unordered_map<int, not_comparable>>>);
+    static_assert(!entt::is_equality_comparable_v<void>);
+}
+
+TEST(TypeTraits, IsStdHashable) {
+    static_assert(entt::is_std_hashable_v<int>);
+    static_assert(entt::is_std_hashable_v<char>);
+    static_assert(entt::is_std_hashable_v<double>);
+    static_assert(!entt::is_std_hashable_v<nlohmann_json_like>);
+    static_assert(!entt::is_std_hashable_v<not_comparable>);
+    static_assert(!entt::is_std_hashable_v<void>);
+}
+
 TEST(TypeTraits, ConstnessAs) {
     static_assert(std::is_same_v<entt::constness_as_t<int, char>, int>);
     static_assert(std::is_same_v<entt::constness_as_t<const int, char>, int>);