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 
tests()25 TEST_CONSTEXPR_CXX20 bool tests()
26 {
27     using IterRefT = std::iterator_traits<std::vector<bool>::iterator>::reference;
28     ASSERT_SAME_TYPE(IterRefT, std::vector<bool>::reference);
29 
30     using ConstIterRefT = std::iterator_traits<std::vector<bool>::const_iterator>::reference;
31 #if !defined(_LIBCPP_VERSION) || defined(_LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL)
32     ASSERT_SAME_TYPE(ConstIterRefT, bool);
33 #else
34     ASSERT_SAME_TYPE(ConstIterRefT, std::__bit_const_reference<std::vector<bool> >);
35 #endif
36     {
37         typedef bool T;
38         typedef std::vector<T> C;
39         C c;
40         C::iterator i = c.begin();
41         C::iterator j = c.end();
42         assert(std::distance(i, j) == 0);
43         assert(i == j);
44     }
45     {
46         typedef bool T;
47         typedef std::vector<T> C;
48         const C c;
49         C::const_iterator i = c.begin();
50         C::const_iterator j = c.end();
51         assert(std::distance(i, j) == 0);
52         assert(i == j);
53     }
54     {
55         typedef bool T;
56         typedef std::vector<T> C;
57         C c;
58         C::const_iterator i = c.cbegin();
59         C::const_iterator j = c.cend();
60         assert(std::distance(i, j) == 0);
61         assert(i == j);
62         assert(i == c.end());
63     }
64     {
65         typedef bool T;
66         typedef std::vector<T> C;
67         C::iterator i;
68         C::const_iterator j;
69         (void) i;
70         (void) j;
71     }
72 #if TEST_STD_VER >= 11
73     {
74         typedef bool T;
75         typedef std::vector<T, min_allocator<T>> C;
76         C c;
77         C::iterator i = c.begin();
78         C::iterator j = c.end();
79         assert(std::distance(i, j) == 0);
80         assert(i == j);
81     }
82     {
83         typedef bool T;
84         typedef std::vector<T, min_allocator<T>> C;
85         const C c;
86         C::const_iterator i = c.begin();
87         C::const_iterator j = c.end();
88         assert(std::distance(i, j) == 0);
89         assert(i == j);
90     }
91     {
92         typedef bool T;
93         typedef std::vector<T, min_allocator<T>> C;
94         C c;
95         C::const_iterator i = c.cbegin();
96         C::const_iterator j = c.cend();
97         assert(std::distance(i, j) == 0);
98         assert(i == j);
99         assert(i == c.end());
100     }
101     {
102         typedef bool T;
103         typedef std::vector<T, min_allocator<T>> C;
104         C::iterator i;
105         C::const_iterator j;
106         (void) i;
107         (void) j;
108     }
109 #endif
110 #if TEST_STD_VER > 11
111     { // N3644 testing
112         std::vector<bool>::iterator ii1{}, ii2{};
113         std::vector<bool>::iterator ii4 = ii1;
114         std::vector<bool>::const_iterator cii{};
115         assert ( ii1 == ii2 );
116         assert ( ii1 == ii4 );
117 
118         assert (!(ii1 != ii2 ));
119 
120         assert ( (ii1 == cii ));
121         assert ( (cii == ii1 ));
122         assert (!(ii1 != cii ));
123         assert (!(cii != ii1 ));
124         assert (!(ii1 <  cii ));
125         assert (!(cii <  ii1 ));
126         assert ( (ii1 <= cii ));
127         assert ( (cii <= ii1 ));
128         assert (!(ii1 >  cii ));
129         assert (!(cii >  ii1 ));
130         assert ( (ii1 >= cii ));
131         assert ( (cii >= ii1 ));
132         assert (cii - ii1 == 0);
133         assert (ii1 - cii == 0);
134     }
135 #endif
136 
137     return true;
138 }
139 
main(int,char **)140 int main(int, char**)
141 {
142     tests();
143 #if TEST_STD_VER > 17
144     static_assert(tests());
145 #endif
146     return 0;
147 }
148