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