summaryrefslogtreecommitdiff
path: root/libcxx
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2019-01-15 00:05:05 +0000
committerMarshall Clow <mclow.lists@gmail.com>2019-01-15 00:05:05 +0000
commitf56c613db27a8a354108e385d4e29cb120101762 (patch)
tree70b809bbffd08e56096ff4d61d6932386e4e8e2b /libcxx
parenta4ddea5d260f3ce41b39856923e52b38e68b7310 (diff)
Generalize the comparison test structure to support cross-type comparisons. NFC to the library
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/test/support/test_comparisons.h72
1 files changed, 36 insertions, 36 deletions
diff --git a/libcxx/test/support/test_comparisons.h b/libcxx/test/support/test_comparisons.h
index f67a84fa2b8..cf094eb65b8 100644
--- a/libcxx/test/support/test_comparisons.h
+++ b/libcxx/test/support/test_comparisons.h
@@ -23,8 +23,8 @@
#include "test_macros.h"
// Test all six comparison operations for sanity
-template <class T>
-TEST_CONSTEXPR_CXX14 bool testComparisons6(const T& t1, const T& t2, bool isEqual, bool isLess)
+template <class T, class U = T>
+TEST_CONSTEXPR_CXX14 bool testComparisons6(const T& t1, const U& t2, bool isEqual, bool isLess)
{
if (isEqual)
{
@@ -85,43 +85,43 @@ TEST_CONSTEXPR_CXX14 bool testComparisons6Values(Param val1, Param val2)
return testComparisons6(T(val1), T(val2), isEqual, isLess);
}
-template <class T>
+template <class T, class U = T>
void AssertComparisons6AreNoexcept()
{
- ASSERT_NOEXCEPT(std::declval<const T&>() == std::declval<const T&>());
- ASSERT_NOEXCEPT(std::declval<const T&>() != std::declval<const T&>());
- ASSERT_NOEXCEPT(std::declval<const T&>() < std::declval<const T&>());
- ASSERT_NOEXCEPT(std::declval<const T&>() <= std::declval<const T&>());
- ASSERT_NOEXCEPT(std::declval<const T&>() > std::declval<const T&>());
- ASSERT_NOEXCEPT(std::declval<const T&>() >= std::declval<const T&>());
+ ASSERT_NOEXCEPT(std::declval<const T&>() == std::declval<const U&>());
+ ASSERT_NOEXCEPT(std::declval<const T&>() != std::declval<const U&>());
+ ASSERT_NOEXCEPT(std::declval<const T&>() < std::declval<const U&>());
+ ASSERT_NOEXCEPT(std::declval<const T&>() <= std::declval<const U&>());
+ ASSERT_NOEXCEPT(std::declval<const T&>() > std::declval<const U&>());
+ ASSERT_NOEXCEPT(std::declval<const T&>() >= std::declval<const U&>());
}
-template <class T>
+template <class T, class U = T>
void AssertComparisons6ReturnBool()
{
- ASSERT_SAME_TYPE(decltype(std::declval<const T&>() == std::declval<const T&>()), bool);
- ASSERT_SAME_TYPE(decltype(std::declval<const T&>() != std::declval<const T&>()), bool);
- ASSERT_SAME_TYPE(decltype(std::declval<const T&>() < std::declval<const T&>()), bool);
- ASSERT_SAME_TYPE(decltype(std::declval<const T&>() <= std::declval<const T&>()), bool);
- ASSERT_SAME_TYPE(decltype(std::declval<const T&>() > std::declval<const T&>()), bool);
- ASSERT_SAME_TYPE(decltype(std::declval<const T&>() >= std::declval<const T&>()), bool);
+ ASSERT_SAME_TYPE(decltype(std::declval<const T&>() == std::declval<const U&>()), bool);
+ ASSERT_SAME_TYPE(decltype(std::declval<const T&>() != std::declval<const U&>()), bool);
+ ASSERT_SAME_TYPE(decltype(std::declval<const T&>() < std::declval<const U&>()), bool);
+ ASSERT_SAME_TYPE(decltype(std::declval<const T&>() <= std::declval<const U&>()), bool);
+ ASSERT_SAME_TYPE(decltype(std::declval<const T&>() > std::declval<const U&>()), bool);
+ ASSERT_SAME_TYPE(decltype(std::declval<const T&>() >= std::declval<const U&>()), bool);
}
-template <class T>
+template <class T, class U = T>
void AssertComparisons6ConvertibleToBool()
{
- static_assert((std::is_convertible<decltype(std::declval<const T&>() == std::declval<const T&>()), bool>::value), "");
- static_assert((std::is_convertible<decltype(std::declval<const T&>() != std::declval<const T&>()), bool>::value), "");
- static_assert((std::is_convertible<decltype(std::declval<const T&>() < std::declval<const T&>()), bool>::value), "");
- static_assert((std::is_convertible<decltype(std::declval<const T&>() <= std::declval<const T&>()), bool>::value), "");
- static_assert((std::is_convertible<decltype(std::declval<const T&>() > std::declval<const T&>()), bool>::value), "");
- static_assert((std::is_convertible<decltype(std::declval<const T&>() >= std::declval<const T&>()), bool>::value), "");
+ static_assert((std::is_convertible<decltype(std::declval<const T&>() == std::declval<const U&>()), bool>::value), "");
+ static_assert((std::is_convertible<decltype(std::declval<const T&>() != std::declval<const U&>()), bool>::value), "");
+ static_assert((std::is_convertible<decltype(std::declval<const T&>() < std::declval<const U&>()), bool>::value), "");
+ static_assert((std::is_convertible<decltype(std::declval<const T&>() <= std::declval<const U&>()), bool>::value), "");
+ static_assert((std::is_convertible<decltype(std::declval<const T&>() > std::declval<const U&>()), bool>::value), "");
+ static_assert((std::is_convertible<decltype(std::declval<const T&>() >= std::declval<const U&>()), bool>::value), "");
}
-// Test all six comparison operations for sanity
-template <class T>
-TEST_CONSTEXPR_CXX14 bool testComparisons2(const T& t1, const T& t2, bool isEqual)
+// Test all two comparison operations for sanity
+template <class T, class U = T>
+TEST_CONSTEXPR_CXX14 bool testComparisons2(const T& t1, const U& t2, bool isEqual)
{
if (isEqual)
{
@@ -130,7 +130,7 @@ TEST_CONSTEXPR_CXX14 bool testComparisons2(const T& t1, const T& t2, bool isEqua
if ( (t1 != t2)) return false;
if ( (t2 != t1)) return false;
}
- else /* greater */
+ else /* not equal */
{
if ( (t1 == t2)) return false;
if ( (t2 == t1)) return false;
@@ -150,26 +150,26 @@ TEST_CONSTEXPR_CXX14 bool testComparisons2Values(Param val1, Param val2)
return testComparisons2(T(val1), T(val2), isEqual);
}
-template <class T>
+template <class T, class U = T>
void AssertComparisons2AreNoexcept()
{
- ASSERT_NOEXCEPT(std::declval<const T&>() == std::declval<const T&>());
- ASSERT_NOEXCEPT(std::declval<const T&>() != std::declval<const T&>());
+ ASSERT_NOEXCEPT(std::declval<const T&>() == std::declval<const U&>());
+ ASSERT_NOEXCEPT(std::declval<const T&>() != std::declval<const U&>());
}
-template <class T>
+template <class T, class U = T>
void AssertComparisons2ReturnBool()
{
- ASSERT_SAME_TYPE(decltype(std::declval<const T&>() == std::declval<const T&>()), bool);
- ASSERT_SAME_TYPE(decltype(std::declval<const T&>() != std::declval<const T&>()), bool);
+ ASSERT_SAME_TYPE(decltype(std::declval<const T&>() == std::declval<const U&>()), bool);
+ ASSERT_SAME_TYPE(decltype(std::declval<const T&>() != std::declval<const U&>()), bool);
}
-template <class T>
+template <class T, class U = T>
void AssertComparisons2ConvertibleToBool()
{
- static_assert((std::is_convertible<decltype(std::declval<const T&>() == std::declval<const T&>()), bool>::value), "");
- static_assert((std::is_convertible<decltype(std::declval<const T&>() != std::declval<const T&>()), bool>::value), "");
+ static_assert((std::is_convertible<decltype(std::declval<const T&>() == std::declval<const U&>()), bool>::value), "");
+ static_assert((std::is_convertible<decltype(std::declval<const T&>() != std::declval<const U&>()), bool>::value), "");
}
#endif // TEST_COMPARISONS_H