From 4aea1567db5252d88d7960bd4e5a48a9e637ab0e Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Fri, 15 Jan 2021 09:48:48 +0100 Subject: [PATCH] type_traits: make is_equality_comparable work with all major compilers --- src/entt/core/type_traits.hpp | 51 ++++++++++++++-------------------- test/entt/core/type_traits.cpp | 4 +++ 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/entt/core/type_traits.hpp b/src/entt/core/type_traits.hpp index 6bd94e92f..9936d2e8f 100644 --- a/src/entt/core/type_traits.hpp +++ b/src/entt/core/type_traits.hpp @@ -430,36 +430,27 @@ using value_list_cat_t = typename value_list_cat::type; namespace internal { -template -constexpr auto is_equality_comparable() --> decltype(is_equality_comparable(choice<2>)); - - -template -constexpr auto is_equality_comparable(choice_t<2>) --> decltype( - std::declval(), - std::declval() == std::declval(), - std::conjunction()), decltype(is_equality_comparable())>{} -); - - -template -constexpr auto is_equality_comparable(choice_t<1>) --> decltype( - std::declval(), - std::declval() == std::declval(), - is_equality_comparable() -); - - -template -constexpr auto is_equality_comparable(choice_t<0>) --> decltype(std::declval() == std::declval(), std::true_type{}); - - template -constexpr std::false_type is_equality_comparable(...); +[[nodiscard]] constexpr bool is_equality_comparable(...) { return false; } + + +template +[[nodiscard]] constexpr auto is_equality_comparable(choice_t<0>) +-> decltype(std::declval() == std::declval()) { return true; } + + +template +[[nodiscard]] constexpr auto is_equality_comparable(choice_t<1>) +-> decltype(std::declval(), std::declval() == std::declval()) { + return is_equality_comparable(choice<2>); +} + + +template +[[nodiscard]] constexpr auto is_equality_comparable(choice_t<2>) +-> decltype(std::declval(), std::declval() == std::declval()) { + return is_equality_comparable(choice<2>) && is_equality_comparable(choice<2>); +} } @@ -477,7 +468,7 @@ constexpr std::false_type is_equality_comparable(...); * @tparam Type Potentially equality comparable type. */ template -struct is_equality_comparable: decltype(internal::is_equality_comparable()) {}; +struct is_equality_comparable: std::bool_constant(choice<2>)> {}; /** diff --git a/test/entt/core/type_traits.cpp b/test/entt/core/type_traits.cpp index 0f34d8827..b06bdf882 100644 --- a/test/entt/core/type_traits.cpp +++ b/test/entt/core/type_traits.cpp @@ -92,11 +92,15 @@ TEST(TypeTraits, ValueList) { TEST(TypeTraits, IsEqualityComparable) { static_assert(entt::is_equality_comparable_v); static_assert(entt::is_equality_comparable_v>); + static_assert(entt::is_equality_comparable_v>>); static_assert(entt::is_equality_comparable_v>); + static_assert(entt::is_equality_comparable_v>>); static_assert(!entt::is_equality_comparable_v); static_assert(!entt::is_equality_comparable_v>); + static_assert(!entt::is_equality_comparable_v>>); static_assert(!entt::is_equality_comparable_v>); + static_assert(!entt::is_equality_comparable_v>>); static_assert(!entt::is_equality_comparable_v); }