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 // <vector>
10 
11 // iterator       begin();
12 // iterator       end();
13 // const_iterator begin()  const;
14 // const_iterator end()    const;
15 // const_iterator cbegin() const;
16 // const_iterator cend()   const;
17 
18 #include <vector>
19 #include <cassert>
20 #include <iterator>
21 
22 #include "test_macros.h"
23 #include "min_allocator.h"
24 
25 struct A
26 {
27     int first;
28     int second;
29 };
30 
tests()31 TEST_CONSTEXPR_CXX20 bool tests()
32 {
33     {
34         typedef int T;
35         typedef std::vector<T> C;
36         C c;
37         C::iterator i = c.begin();
38         C::iterator j = c.end();
39         assert(std::distance(i, j) == 0);
40         assert(i == j);
41     }
42     {
43         typedef int T;
44         typedef std::vector<T> C;
45         const C c;
46         C::const_iterator i = c.begin();
47         C::const_iterator j = c.end();
48         assert(std::distance(i, j) == 0);
49         assert(i == j);
50     }
51     {
52         typedef int T;
53         typedef std::vector<T> C;
54         C c;
55         C::const_iterator i = c.cbegin();
56         C::const_iterator j = c.cend();
57         assert(std::distance(i, j) == 0);
58         assert(i == j);
59         assert(i == c.end());
60     }
61     {
62         typedef int T;
63         typedef std::vector<T> C;
64         const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
65         C c(std::begin(t), std::end(t));
66         C::iterator i = c.begin();
67         assert(*i == 0);
68         ++i;
69         assert(*i == 1);
70         *i = 10;
71         assert(*i == 10);
72         assert(std::distance(c.begin(), c.end()) == 10);
73     }
74     {
75         typedef int T;
76         typedef std::vector<T> C;
77         C::iterator i;
78         C::const_iterator j;
79         (void) i;
80         (void) j;
81     }
82 #if TEST_STD_VER >= 11
83     {
84         typedef int T;
85         typedef std::vector<T, min_allocator<T>> C;
86         C c;
87         C::iterator i = c.begin();
88         C::iterator j = c.end();
89         assert(std::distance(i, j) == 0);
90         assert(i == j);
91     }
92     {
93         typedef int T;
94         typedef std::vector<T, min_allocator<T>> C;
95         const C c;
96         C::const_iterator i = c.begin();
97         C::const_iterator j = c.end();
98         assert(std::distance(i, j) == 0);
99         assert(i == j);
100     }
101     {
102         typedef int T;
103         typedef std::vector<T, min_allocator<T>> C;
104         C c;
105         C::const_iterator i = c.cbegin();
106         C::const_iterator j = c.cend();
107         assert(std::distance(i, j) == 0);
108         assert(i == j);
109         assert(i == c.end());
110     }
111     {
112         typedef int T;
113         typedef std::vector<T, min_allocator<T>> C;
114         const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
115         C c(std::begin(t), std::end(t));
116         C::iterator i = c.begin();
117         assert(*i == 0);
118         ++i;
119         assert(*i == 1);
120         *i = 10;
121         assert(*i == 10);
122         assert(std::distance(c.begin(), c.end()) == 10);
123     }
124     {
125         typedef int T;
126         typedef std::vector<T, min_allocator<T>> C;
127         C::iterator i;
128         C::const_iterator j;
129         (void) i;
130         (void) j;
131     }
132     {
133         typedef A T;
134         typedef std::vector<T, min_allocator<T>> C;
135         C c = {A{1, 2}};
136         C::iterator i = c.begin();
137         i->first = 3;
138         C::const_iterator j = i;
139         assert(j->first == 3);
140     }
141 #endif
142 #if TEST_STD_VER > 11
143     { // N3644 testing
144         typedef std::vector<int> C;
145         C::iterator ii1{}, ii2{};
146         C::iterator ii4 = ii1;
147         C::const_iterator cii{};
148         assert ( ii1 == ii2 );
149         assert ( ii1 == ii4 );
150 
151         assert (!(ii1 != ii2 ));
152 
153         assert ( (ii1 == cii ));
154         assert ( (cii == ii1 ));
155         assert (!(ii1 != cii ));
156         assert (!(cii != ii1 ));
157         assert (!(ii1 <  cii ));
158         assert (!(cii <  ii1 ));
159         assert ( (ii1 <= cii ));
160         assert ( (cii <= ii1 ));
161         assert (!(ii1 >  cii ));
162         assert (!(cii >  ii1 ));
163         assert ( (ii1 >= cii ));
164         assert ( (cii >= ii1 ));
165         assert (cii - ii1 == 0);
166         assert (ii1 - cii == 0);
167     }
168 #endif
169 
170     return true;
171 }
172 
main(int,char **)173 int main(int, char**)
174 {
175     tests();
176 #if TEST_STD_VER > 17
177     static_assert(tests());
178 #endif
179     return 0;
180 }
181