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
25TEST_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
140int main(int, char**)
141{
142 tests();
143#if TEST_STD_VER > 17
144 static_assert(tests());
145#endif
146 return 0;
147}
148

source code of libcxx/test/std/containers/sequences/vector.bool/iterators.pass.cpp