[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