[libcxx-commits] [libcxx] 60cde7b - [libc++] Improve tests for iterators.operations

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jun 8 11:59:43 PDT 2020


Author: Louis Dionne
Date: 2020-06-08T14:59:35-04:00
New Revision: 60cde7bbb719a0dc110c8390555dbd9c814aabf1

URL: https://github.com/llvm/llvm-project/commit/60cde7bbb719a0dc110c8390555dbd9c814aabf1
DIFF: https://github.com/llvm/llvm-project/commit/60cde7bbb719a0dc110c8390555dbd9c814aabf1.diff

LOG: [libc++] Improve tests for iterators.operations

Reduce duplication between the constexpr and the non-constexpr test cases,
and add tests for the return type of the various operations.

Added: 
    

Modified: 
    libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
    libcxx/test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp
    libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp
    libcxx/test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
index eea2bff77bf1..c0dd85c783f1 100644
--- a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
+++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
@@ -21,54 +21,40 @@
 
 #include <iterator>
 #include <cassert>
+#include <type_traits>
 
 #include "test_macros.h"
 #include "test_iterators.h"
 
 template <class It>
-void
-test(It i, typename std::iterator_traits<It>::
diff erence_type n, It x)
+TEST_CONSTEXPR_CXX17
+void check_advance(It it, typename std::iterator_traits<It>::
diff erence_type n, It result)
 {
-    std::advance(i, n);
-    assert(i == x);
+    static_assert(std::is_same<decltype(std::advance(it, n)), void>::value, "");
+    std::advance(it, n);
+    assert(it == result);
 }
 
-#if TEST_STD_VER > 14
-template <class It>
-constexpr bool
-constepxr_test(It i, typename std::iterator_traits<It>::
diff erence_type n, It x)
+TEST_CONSTEXPR_CXX17 bool tests()
 {
-    std::advance(i, n);
-    return i == x;
+    const char* s = "1234567890";
+    check_advance(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10));
+    check_advance(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
+    check_advance(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10));
+    check_advance(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s));
+    check_advance(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
+    check_advance(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s));
+    check_advance(s+5, 5, s+10);
+    check_advance(s+5, -5, s);
+
+    return true;
 }
-#endif
 
 int main(int, char**)
 {
-    {
-    const char* s = "1234567890";
-    test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10));
-    test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
-    test(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10));
-    test(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s));
-    test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
-    test(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s));
-    test(s+5, 5, s+10);
-    test(s+5, -5, s);
-    }
-#if TEST_STD_VER > 14
-    {
-    constexpr const char* s = "1234567890";
-    static_assert( constepxr_test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10)), "" );
-    static_assert( constepxr_test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)), "" );
-    static_assert( constepxr_test(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10)), "" );
-    static_assert( constepxr_test(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s)), "" );
-    static_assert( constepxr_test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)), "" );
-    static_assert( constepxr_test(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s)), "" );
-    static_assert( constepxr_test(s+5, 5, s+10), "" );
-    static_assert( constepxr_test(s+5, -5, s), "" );
-    }
+    tests();
+#if TEST_STD_VER >= 17
+    static_assert(tests(), "");
 #endif
-
-  return 0;
+    return 0;
 }

diff  --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp
index 1968aa80b66c..a86c787eecd8 100644
--- a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp
+++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp
@@ -10,54 +10,44 @@
 
 // template <InputIterator Iter>
 //   Iter::
diff erence_type
-//   distance(Iter first, Iter last);
+//   distance(Iter first, Iter last); // constexpr in C++17
 //
 // template <RandomAccessIterator Iter>
 //   Iter::
diff erence_type
-//   distance(Iter first, Iter last);
+//   distance(Iter first, Iter last); // constexpr in C++17
 
 #include <iterator>
 #include <cassert>
+#include <type_traits>
 
 #include "test_macros.h"
 #include "test_iterators.h"
 
 template <class It>
-void
-test(It first, It last, typename std::iterator_traits<It>::
diff erence_type x)
+TEST_CONSTEXPR_CXX17
+void check_distance(It first, It last, typename std::iterator_traits<It>::
diff erence_type dist)
 {
-    assert(std::distance(first, last) == x);
+    typedef typename std::iterator_traits<It>::
diff erence_type Difference;
+    static_assert(std::is_same<decltype(std::distance(first, last)), Difference>::value, "");
+    assert(std::distance(first, last) == dist);
 }
 
-#if TEST_STD_VER > 14
-template <class It>
-constexpr bool
-constexpr_test(It first, It last, typename std::iterator_traits<It>::
diff erence_type x)
+TEST_CONSTEXPR_CXX17 bool tests()
 {
-    return std::distance(first, last) == x;
+    const char* s = "1234567890";
+    check_distance(input_iterator<const char*>(s), input_iterator<const char*>(s+10), 10);
+    check_distance(forward_iterator<const char*>(s), forward_iterator<const char*>(s+10), 10);
+    check_distance(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+10), 10);
+    check_distance(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+10), 10);
+    check_distance(s, s+10, 10);
+    return true;
 }
-#endif
 
 int main(int, char**)
 {
-    {
-    const char* s = "1234567890";
-    test(input_iterator<const char*>(s), input_iterator<const char*>(s+10), 10);
-    test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+10), 10);
-    test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+10), 10);
-    test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+10), 10);
-    test(s, s+10, 10);
-    }
-#if TEST_STD_VER > 14
-    {
-    constexpr const char* s = "1234567890";
-    static_assert( constexpr_test(input_iterator<const char*>(s), input_iterator<const char*>(s+10), 10), "");
-    static_assert( constexpr_test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+10), 10), "");
-    static_assert( constexpr_test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+10), 10), "");
-    static_assert( constexpr_test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+10), 10), "");
-    static_assert( constexpr_test(s, s+10, 10), "");
-    }
+    tests();
+#if TEST_STD_VER >= 17
+    static_assert(tests(), "");
 #endif
-
-  return 0;
+    return 0;
 }

diff  --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp
index e79b8ffc520f..a0898d48ad0e 100644
--- a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp
+++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp
@@ -9,85 +9,61 @@
 // <iterator>
 
 // template <InputIterator Iter>
-//   Iter next(Iter x, Iter::
diff erence_type n = 1);
+//   Iter next(Iter x, Iter::
diff erence_type n = 1); // constexpr in C++17
 
 // LWG #2353 relaxed the requirement on next from ForwardIterator to InputIterator
 
 #include <iterator>
 #include <cassert>
+#include <type_traits>
 
 #include "test_macros.h"
 #include "test_iterators.h"
 
 template <class It>
-void
-test(It i, typename std::iterator_traits<It>::
diff erence_type n, It x)
+TEST_CONSTEXPR_CXX17 void
+check_next_n(It it, typename std::iterator_traits<It>::
diff erence_type n, It result)
 {
-    assert(std::next(i, n) == x);
+    static_assert(std::is_same<decltype(std::next(it, n)), It>::value, "");
+    assert(std::next(it, n) == result);
 
-    It (*next)(It, typename std::iterator_traits<It>::
diff erence_type) = std::next;
-    assert(next(i, n) == x);
+    It (*next_ptr)(It, typename std::iterator_traits<It>::
diff erence_type) = std::next;
+    assert(next_ptr(it, n) == result);
 }
 
 template <class It>
-void
-test(It i, It x)
+TEST_CONSTEXPR_CXX17 void
+check_next_1(It it, It result)
 {
-    assert(std::next(i) == x);
+    static_assert(std::is_same<decltype(std::next(it)), It>::value, "");
+    assert(std::next(it) == result);
 }
 
-#if TEST_STD_VER > 14
-template <class It>
-constexpr bool
-constexpr_test(It i, typename std::iterator_traits<It>::
diff erence_type n, It x)
+TEST_CONSTEXPR_CXX17 bool tests()
 {
-    return std::next(i, n) == x;
-}
+    const char* s = "1234567890";
+    check_next_n(input_iterator<const char*>(s),             10, input_iterator<const char*>(s+10));
+    check_next_n(forward_iterator<const char*>(s),           10, forward_iterator<const char*>(s+10));
+    check_next_n(bidirectional_iterator<const char*>(s),     10, bidirectional_iterator<const char*>(s+10));
+    check_next_n(bidirectional_iterator<const char*>(s+10), -10, bidirectional_iterator<const char*>(s));
+    check_next_n(random_access_iterator<const char*>(s),     10, random_access_iterator<const char*>(s+10));
+    check_next_n(random_access_iterator<const char*>(s+10), -10, random_access_iterator<const char*>(s));
+    check_next_n(s, 10, s+10);
 
-template <class It>
-constexpr bool
-constexpr_test(It i, It x)
-{
-    return std::next(i) == x;
+    check_next_1(input_iterator<const char*>(s), input_iterator<const char*>(s+1));
+    check_next_1(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1));
+    check_next_1(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1));
+    check_next_1(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1));
+    check_next_1(s, s+1);
+
+    return true;
 }
-#endif
 
 int main(int, char**)
 {
-    {
-    const char* s = "1234567890";
-    test(input_iterator<const char*>(s),             10, input_iterator<const char*>(s+10));
-    test(forward_iterator<const char*>(s),           10, forward_iterator<const char*>(s+10));
-    test(bidirectional_iterator<const char*>(s),     10, bidirectional_iterator<const char*>(s+10));
-    test(bidirectional_iterator<const char*>(s+10), -10, bidirectional_iterator<const char*>(s));
-    test(random_access_iterator<const char*>(s),     10, random_access_iterator<const char*>(s+10));
-    test(random_access_iterator<const char*>(s+10), -10, random_access_iterator<const char*>(s));
-    test(s, 10, s+10);
-
-    test(input_iterator<const char*>(s), input_iterator<const char*>(s+1));
-    test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1));
-    test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1));
-    test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1));
-    test(s, s+1);
-    }
-#if TEST_STD_VER > 14
-    {
-    constexpr const char* s = "1234567890";
-    static_assert( constexpr_test(input_iterator<const char*>(s),             10, input_iterator<const char*>(s+10)), "" );
-    static_assert( constexpr_test(forward_iterator<const char*>(s),           10, forward_iterator<const char*>(s+10)), "" );
-    static_assert( constexpr_test(bidirectional_iterator<const char*>(s),     10, bidirectional_iterator<const char*>(s+10)), "" );
-    static_assert( constexpr_test(bidirectional_iterator<const char*>(s+10), -10, bidirectional_iterator<const char*>(s)), "" );
-    static_assert( constexpr_test(random_access_iterator<const char*>(s),     10, random_access_iterator<const char*>(s+10)), "" );
-    static_assert( constexpr_test(random_access_iterator<const char*>(s+10), -10, random_access_iterator<const char*>(s)), "" );
-    static_assert( constexpr_test(s, 10, s+10), "" );
-
-    static_assert( constexpr_test(input_iterator<const char*>(s), input_iterator<const char*>(s+1)), "" );
-    static_assert( constexpr_test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1)), "" );
-    static_assert( constexpr_test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1)), "" );
-    static_assert( constexpr_test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1)), "" );
-    static_assert( constexpr_test(s, s+1), "" );
-    }
+    tests();
+#if TEST_STD_VER >= 17
+    static_assert(tests(), "");
 #endif
-
-  return 0;
+    return 0;
 }

diff  --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp
index eba18a7c9e3d..784c1b93b7ca 100644
--- a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp
+++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp
@@ -9,78 +9,56 @@
 // <iterator>
 
 // template <InputIterator Iter>
-//   Iter prev(Iter x, Iter::
diff erence_type n = 1);
+//   Iter prev(Iter x, Iter::
diff erence_type n = 1); // constexpr in C++17
 
 #include <iterator>
 #include <cassert>
+#include <type_traits>
 
 #include "test_macros.h"
 #include "test_iterators.h"
 
 template <class It>
-void
-test(It i, typename std::iterator_traits<It>::
diff erence_type n, It x)
+TEST_CONSTEXPR_CXX17 void
+check_prev_n(It it, typename std::iterator_traits<It>::
diff erence_type n, It result)
 {
-    assert(std::prev(i, n) == x);
+    static_assert(std::is_same<decltype(std::prev(it, n)), It>::value, "");
+    assert(std::prev(it, n) == result);
 
-    It (*prev)(It, typename std::iterator_traits<It>::
diff erence_type) = std::prev;
-    assert(prev(i, n) == x);
+    It (*prev_ptr)(It, typename std::iterator_traits<It>::
diff erence_type) = std::prev;
+    assert(prev_ptr(it, n) == result);
 }
 
 template <class It>
-void
-test(It i, It x)
+TEST_CONSTEXPR_CXX17 void
+check_prev_1(It it, It result)
 {
-    assert(std::prev(i) == x);
+    static_assert(std::is_same<decltype(std::prev(it)), It>::value, "");
+    assert(std::prev(it) == result);
 }
 
-#if TEST_STD_VER > 14
-template <class It>
-constexpr bool
-constexpr_test(It i, typename std::iterator_traits<It>::
diff erence_type n, It x)
+TEST_CONSTEXPR_CXX17 bool tests()
 {
-    return std::prev(i, n) == x;
-}
+    const char* s = "1234567890";
+    check_prev_n(forward_iterator      <const char*>(s),    -10, forward_iterator      <const char*>(s+10));
+    check_prev_n(bidirectional_iterator<const char*>(s+10),  10, bidirectional_iterator<const char*>(s));
+    check_prev_n(bidirectional_iterator<const char*>(s),    -10, bidirectional_iterator<const char*>(s+10));
+    check_prev_n(random_access_iterator<const char*>(s+10),  10, random_access_iterator<const char*>(s));
+    check_prev_n(random_access_iterator<const char*>(s),    -10, random_access_iterator<const char*>(s+10));
+    check_prev_n(s+10, 10, s);
 
-template <class It>
-constexpr bool
-constexpr_test(It i, It x)
-{
-    return std::prev(i) == x;
+    check_prev_1(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s));
+    check_prev_1(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s));
+    check_prev_1(s+1, s);
+
+    return true;
 }
-#endif
 
 int main(int, char**)
 {
-    {
-    const char* s = "1234567890";
-    test(forward_iterator      <const char*>(s),    -10, forward_iterator      <const char*>(s+10));
-    test(bidirectional_iterator<const char*>(s+10),  10, bidirectional_iterator<const char*>(s));
-    test(bidirectional_iterator<const char*>(s),    -10, bidirectional_iterator<const char*>(s+10));
-    test(random_access_iterator<const char*>(s+10),  10, random_access_iterator<const char*>(s));
-    test(random_access_iterator<const char*>(s),    -10, random_access_iterator<const char*>(s+10));
-    test(s+10, 10, s);
-
-    test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s));
-    test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s));
-    test(s+1, s);
-    }
-#if TEST_STD_VER > 14
-    {
-    constexpr const char* s = "1234567890";
-    static_assert( constexpr_test(forward_iterator      <const char*>(s),    -10, forward_iterator      <const char*>(s+10)), "" );
-    static_assert( constexpr_test(bidirectional_iterator<const char*>(s+10),  10, bidirectional_iterator<const char*>(s)), "" );
-    static_assert( constexpr_test(forward_iterator      <const char*>(s),    -10, forward_iterator      <const char*>(s+10)), "" );
-    static_assert( constexpr_test(random_access_iterator<const char*>(s+10),  10, random_access_iterator<const char*>(s)), "" );
-    static_assert( constexpr_test(forward_iterator      <const char*>(s),    -10, forward_iterator      <const char*>(s+10)), "" );
-    static_assert( constexpr_test(s+10, 10, s), "" );
-
-    static_assert( constexpr_test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s)), "" );
-    static_assert( constexpr_test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s)), "" );
-    static_assert( constexpr_test(s+1, s), "" );
-    }
+    tests();
+#if TEST_STD_VER >= 17
+    static_assert(tests(), "");
 #endif
-
-
-  return 0;
+    return 0;
 }


        


More information about the libcxx-commits mailing list