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 // UNSUPPORTED: c++03, c++11, c++14, c++17
10 // UNSUPPORTED: libcpp-no-concepts
11 
12 // template<class I2, class S2>
13 //   requires convertible_to<const I2&, I> && convertible_to<const S2&, S> &&
14 //            assignable_from<I&, const I2&> && assignable_from<S&, const S2&>
15 //     common_iterator& operator=(const common_iterator<I2, S2>& x);
16 
17 #include <iterator>
18 #include <ranges>
19 #include <cassert>
20 
21 #include "test_macros.h"
22 #include "types.h"
23 
24 void test() {
25   int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
26 
27   {
28     auto iter1 = cpp17_input_iterator<int*>(buffer);
29     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
30     auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(cpp17_input_iterator<int*>(buffer + 1));
31 
32     assert(*commonIter1 == 1);
33     assert(*commonIter2 == 2);
34     assert(commonIter1 != commonIter2);
35 
36     commonIter1 = commonIter2;
37 
38     assert(*commonIter1 == 2);
39     assert(*commonIter2 == 2);
40     assert(commonIter1 == commonIter2);
41   }
42   {
43     auto iter1 = forward_iterator<int*>(buffer);
44     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
45     auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(forward_iterator<int*>(buffer + 1));
46 
47     assert(*commonIter1 == 1);
48     assert(*commonIter2 == 2);
49     assert(commonIter1 != commonIter2);
50 
51     commonIter1 = commonIter2;
52 
53     assert(*commonIter1 == 2);
54     assert(*commonIter2 == 2);
55     assert(commonIter1 == commonIter2);
56   }
57   {
58     auto iter1 = random_access_iterator<int*>(buffer);
59     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
60     auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8});
61 
62     auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1 + 1);
63     auto commonSent2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 7});
64 
65     assert(*commonIter1 == 1);
66     assert(*commonIter2 == 2);
67     assert(commonIter1 != commonIter2);
68 
69     commonIter1 = commonIter2;
70 
71     assert(*commonIter1 == 2);
72     assert(*commonIter2 == 2);
73     assert(commonIter1 == commonIter2);
74 
75     assert(std::next(commonIter1, 6) != commonSent1);
76     assert(std::next(commonIter1, 6) == commonSent2);
77 
78     commonSent1 = commonSent2;
79 
80     assert(std::next(commonIter1, 6) == commonSent1);
81     assert(std::next(commonIter1, 6) == commonSent2);
82   }
83   {
84     auto iter1 = assignable_iterator<int*>(buffer);
85     auto iter2 = forward_iterator<int*>(buffer + 1);
86     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
87     auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8});
88 
89     auto commonIter2 = std::common_iterator<decltype(iter2), sentinel_type<int*>>(iter2);
90     auto commonSent2 = std::common_iterator<decltype(iter2), sentinel_type<int*>>(sentinel_type<int*>{buffer + 7});
91 
92     assert(*commonIter1 == 1);
93     assert(*commonIter2 == 2);
94 
95     commonIter1 = commonIter2;
96 
97     assert(*commonIter1 == 2);
98     assert(*commonIter2 == 2);
99     assert(commonIter1 == commonIter2);
100 
101     assert(std::next(commonIter1, 6) != commonSent1);
102     assert(std::next(commonIter1, 6) == commonSent2);
103 
104     commonSent1 = commonSent2;
105 
106     assert(std::next(commonIter1, 6) == commonSent1);
107     assert(std::next(commonIter1, 6) == commonSent2);
108 
109     commonIter1 = commonSent1;
110 
111     assert(commonIter1 == commonSent2);
112 
113     commonIter1 = commonSent2;
114 
115     assert(commonIter1 == commonSent2);
116   }
117 #ifndef TEST_HAS_NO_EXCEPTIONS
118   {
119     auto iter1 = maybe_valueless_iterator<int*>(buffer);
120     auto iter2 = forward_iterator<int*>(buffer);
121     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
122     auto commonSent2 = std::common_iterator<decltype(iter1),
123       sentinel_throws_on_convert<int*>>(sentinel_throws_on_convert<int*>{buffer + 8});
124     auto commonIter2 = std::common_iterator<decltype(iter2), sentinel_type<int*>>(iter2);
125 
126     try {
127       commonIter1 = commonSent2;
128       assert(false);
129     } catch (int x) {
130       assert(x == 42);
131       commonIter1 = commonIter2;
132     }
133 
134     assert(*commonIter1 == 1);
135   }
136 #endif // TEST_HAS_NO_EXCEPTIONS
137 }
138 
139 int main(int, char**) {
140   test();
141 
142   return 0;
143 }
144