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