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