1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <iterator>
10 
11 // template <InputIterator Iter>
12 //   Iter next(Iter x, Iter::difference_type n = 1);
13 
14 // LWG #2353 relaxed the requirement on next from ForwardIterator to InputIterator
15 
16 #include <iterator>
17 #include <cassert>
18 
19 #include "test_iterators.h"
20 
21 template <class It>
22 void
23 test(It i, typename std::iterator_traits<It>::difference_type n, It x)
24 {
25     assert(std::next(i, n) == x);
26 
27     It (*next)(It, typename std::iterator_traits<It>::difference_type) = std::next;
28     assert(next(i, n) == x);
29 }
30 
31 template <class It>
32 void
33 test(It i, It x)
34 {
35     assert(std::next(i) == x);
36 }
37 
38 #if TEST_STD_VER > 14
39 template <class It>
40 constexpr bool
41 constexpr_test(It i, typename std::iterator_traits<It>::difference_type n, It x)
42 {
43     return std::next(i, n) == x;
44 }
45 
46 template <class It>
47 constexpr bool
48 constexpr_test(It i, It x)
49 {
50     return std::next(i) == x;
51 }
52 #endif
53 
54 int main(int, char**)
55 {
56     {
57     const char* s = "1234567890";
58     test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10));
59     test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
60     test(bidirectional_iterator<const char*>(s), 10, bidirectional_iterator<const char*>(s+10));
61     test(random_access_iterator<const char*>(s), 10, random_access_iterator<const char*>(s+10));
62     test(s, 10, s+10);
63 
64     test(input_iterator<const char*>(s), input_iterator<const char*>(s+1));
65     test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1));
66     test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1));
67     test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1));
68     test(s, s+1);
69     }
70 #if TEST_STD_VER > 14
71     {
72     constexpr const char* s = "1234567890";
73     static_assert( constexpr_test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10)), "" );
74     static_assert( constexpr_test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)), "" );
75     static_assert( constexpr_test(bidirectional_iterator<const char*>(s), 10, bidirectional_iterator<const char*>(s+10)), "" );
76     static_assert( constexpr_test(random_access_iterator<const char*>(s), 10, random_access_iterator<const char*>(s+10)), "" );
77     static_assert( constexpr_test(s, 10, s+10), "" );
78 
79     static_assert( constexpr_test(input_iterator<const char*>(s), input_iterator<const char*>(s+1)), "" );
80     static_assert( constexpr_test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1)), "" );
81     static_assert( constexpr_test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1)), "" );
82     static_assert( constexpr_test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1)), "" );
83     static_assert( constexpr_test(s, s+1), "" );
84     }
85 #endif
86 
87   return 0;
88 }
89