@@ -67,13 +67,13 @@ constexpr void test_iterators() {
6767 {
6868 // simple test
6969 {
70- int a[] = {1 , 2 , 3 , 4 };
70+ int a[] = {1 , 2 , 3 , 4 };
7171 std::same_as<std::ptrdiff_t > auto ret = std::ranges::count (It (a), Sent (It (a + 4 )), 3 );
7272 assert (ret == 1 );
7373 }
7474 {
75- int a[] = {1 , 2 , 3 , 4 };
76- auto range = std::ranges::subrange (It (a), Sent (It (a + 4 )));
75+ int a[] = {1 , 2 , 3 , 4 };
76+ auto range = std::ranges::subrange (It (a), Sent (It (a + 4 )));
7777 std::same_as<std::ptrdiff_t > auto ret = std::ranges::count (range, 3 );
7878 assert (ret == 1 );
7979 }
@@ -83,13 +83,13 @@ constexpr void test_iterators() {
8383 // check that an empty range works
8484 {
8585 std::array<int , 0 > a = {};
86- auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 1 );
86+ auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 1 );
8787 assert (ret == 0 );
8888 }
8989 {
9090 std::array<int , 0 > a = {};
91- auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
92- auto ret = std::ranges::count (range, 1 );
91+ auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
92+ auto ret = std::ranges::count (range, 1 );
9393 assert (ret == 0 );
9494 }
9595 }
@@ -98,13 +98,13 @@ constexpr void test_iterators() {
9898 // check that a range with a single element works
9999 {
100100 std::array a = {2 };
101- auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 2 );
101+ auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 2 );
102102 assert (ret == 1 );
103103 }
104104 {
105105 std::array a = {2 };
106- auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
107- auto ret = std::ranges::count (range, 2 );
106+ auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
107+ auto ret = std::ranges::count (range, 2 );
108108 assert (ret == 1 );
109109 }
110110 }
@@ -113,13 +113,13 @@ constexpr void test_iterators() {
113113 // check that 0 is returned with no match
114114 {
115115 std::array a = {1 , 1 , 1 };
116- auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 0 );
116+ auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 0 );
117117 assert (ret == 0 );
118118 }
119119 {
120120 std::array a = {1 , 1 , 1 };
121- auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
122- auto ret = std::ranges::count (range, 0 );
121+ auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
122+ auto ret = std::ranges::count (range, 0 );
123123 assert (ret == 0 );
124124 }
125125 }
@@ -128,13 +128,13 @@ constexpr void test_iterators() {
128128 // check that more than one element is counted
129129 {
130130 std::array a = {3 , 3 , 4 , 3 , 3 };
131- auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 3 );
131+ auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 3 );
132132 assert (ret == 4 );
133133 }
134134 {
135135 std::array a = {3 , 3 , 4 , 3 , 3 };
136- auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
137- auto ret = std::ranges::count (range, 3 );
136+ auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
137+ auto ret = std::ranges::count (range, 3 );
138138 assert (ret == 4 );
139139 }
140140 }
@@ -143,13 +143,13 @@ constexpr void test_iterators() {
143143 // check that all elements are counted
144144 {
145145 std::array a = {5 , 5 , 5 , 5 };
146- auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 5 );
146+ auto ret = std::ranges::count (It (a.data ()), Sent (It (a.data () + a.size ())), 5 );
147147 assert (ret == 4 );
148148 }
149149 {
150150 std::array a = {5 , 5 , 5 , 5 };
151- auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
152- auto ret = std::ranges::count (range, 5 );
151+ auto range = std::ranges::subrange (It (a.data ()), Sent (It (a.data () + a.size ())));
152+ auto ret = std::ranges::count (range, 5 );
153153 assert (ret == 4 );
154154 }
155155 }
@@ -167,38 +167,46 @@ constexpr bool test() {
167167 {
168168 // check that projections are used properly and that they are called with the iterator directly
169169 {
170- int a[] = {1 , 2 , 3 , 4 };
170+ int a[] = {1 , 2 , 3 , 4 };
171171 auto ret = std::ranges::count (a, a + 4 , a + 3 , [](int & i) { return &i; });
172172 assert (ret == 1 );
173173 }
174174 {
175- int a[] = {1 , 2 , 3 , 4 };
175+ int a[] = {1 , 2 , 3 , 4 };
176176 auto ret = std::ranges::count (a, a + 3 , [](int & i) { return &i; });
177177 assert (ret == 1 );
178178 }
179179 }
180180
181181 {
182182 // check that std::invoke is used
183- struct S { int i; };
184- S a[] = { S{1 }, S{3 }, S{2 } };
183+ struct S {
184+ int i;
185+ };
186+ S a[] = {S{1 }, S{3 }, S{2 }};
185187 std::same_as<std::ptrdiff_t > auto ret = std::ranges::count (a, 4 , &S::i);
186188 assert (ret == 0 );
187189 }
188190
189191 {
190192 // count invocations of the projection
191193 {
192- int a[] = {1 , 2 , 3 , 4 };
194+ int a[] = {1 , 2 , 3 , 4 };
193195 int projection_count = 0 ;
194- auto ret = std::ranges::count (a, a + 4 , 2 , [&](int i) { ++projection_count; return i; });
196+ auto ret = std::ranges::count (a, a + 4 , 2 , [&](int i) {
197+ ++projection_count;
198+ return i;
199+ });
195200 assert (ret == 1 );
196201 assert (projection_count == 4 );
197202 }
198203 {
199- int a[] = {1 , 2 , 3 , 4 };
204+ int a[] = {1 , 2 , 3 , 4 };
200205 int projection_count = 0 ;
201- auto ret = std::ranges::count (a, 2 , [&](int i) { ++projection_count; return i; });
206+ auto ret = std::ranges::count (a, 2 , [&](int i) {
207+ ++projection_count;
208+ return i;
209+ });
202210 assert (ret == 1 );
203211 assert (projection_count == 4 );
204212 }
@@ -208,20 +216,20 @@ constexpr bool test() {
208216 // check that an immobile type works
209217 struct NonMovable {
210218 NonMovable (const NonMovable&) = delete ;
211- NonMovable (NonMovable&&) = delete ;
219+ NonMovable (NonMovable&&) = delete ;
212220 constexpr NonMovable (int i_) : i(i_) {}
213221 int i;
214222
215223 bool operator ==(const NonMovable&) const = default ;
216224 };
217225 {
218226 NonMovable a[] = {9 , 8 , 4 , 3 };
219- auto ret = std::ranges::count (a, a + 4 , NonMovable (8 ));
227+ auto ret = std::ranges::count (a, a + 4 , NonMovable (8 ));
220228 assert (ret == 1 );
221229 }
222230 {
223231 NonMovable a[] = {9 , 8 , 4 , 3 };
224- auto ret = std::ranges::count (a, NonMovable (8 ));
232+ auto ret = std::ranges::count (a, NonMovable (8 ));
225233 assert (ret == 1 );
226234 }
227235 }
@@ -230,15 +238,18 @@ constexpr bool test() {
230238 // check that difference_type is used
231239 struct DiffTypeIterator {
232240 using difference_type = signed char ;
233- using value_type = int ;
241+ using value_type = int ;
234242
235243 int * it = nullptr ;
236244
237245 constexpr DiffTypeIterator () = default;
238246 constexpr DiffTypeIterator (int * i) : it(i) {}
239247
240248 constexpr int & operator *() const { return *it; }
241- constexpr DiffTypeIterator& operator ++() { ++it; return *this ; }
249+ constexpr DiffTypeIterator& operator ++() {
250+ ++it;
251+ return *this ;
252+ }
242253 constexpr void operator ++(int ) { ++it; }
243254
244255 bool operator ==(const DiffTypeIterator&) const = default ;
@@ -251,7 +262,7 @@ constexpr bool test() {
251262 assert (ret == 1 );
252263 }
253264 {
254- int a[] = {5 , 5 , 4 , 3 , 2 , 1 };
265+ int a[] = {5 , 5 , 4 , 3 , 2 , 1 };
255266 auto range = std::ranges::subrange (DiffTypeIterator (a), DiffTypeIterator (a + 6 ));
256267 std::same_as<signed char > decltype (auto ) ret = std::ranges::count (range, 4 );
257268 assert (ret == 1 );
@@ -264,7 +275,9 @@ constexpr bool test() {
264275 for (size_t offset = 0 ; offset != 64 ; ++offset) {
265276 std::fill (vec.begin (), vec.end (), false );
266277 std::fill (vec.begin () + offset, vec.begin () + i + offset, true );
267- assert (std::ranges::count (vec.begin () + offset, vec.begin () + offset + 256 , true ) == i);
278+
279+ // check both (range) and (iterator, sentinel) overloads
280+ assert (std::ranges::count (vec, true ) == i);
268281 assert (std::ranges::count (vec.begin () + offset, vec.begin () + offset + 256 , false ) == 256 - i);
269282 }
270283 }
0 commit comments