Line data Source code
1 : // Iterators -*- C++ -*-
2 :
3 : // Copyright (C) 2001-2024 Free Software Foundation, Inc.
4 : //
5 : // This file is part of the GNU ISO C++ Library. This library is free
6 : // software; you can redistribute it and/or modify it under the
7 : // terms of the GNU General Public License as published by the
8 : // Free Software Foundation; either version 3, or (at your option)
9 : // any later version.
10 :
11 : // This library is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 :
16 : // Under Section 7 of GPL version 3, you are granted additional
17 : // permissions described in the GCC Runtime Library Exception, version
18 : // 3.1, as published by the Free Software Foundation.
19 :
20 : // You should have received a copy of the GNU General Public License and
21 : // a copy of the GCC Runtime Library Exception along with this program;
22 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 : // <http://www.gnu.org/licenses/>.
24 :
25 : /*
26 : *
27 : * Copyright (c) 1994
28 : * Hewlett-Packard Company
29 : *
30 : * Permission to use, copy, modify, distribute and sell this software
31 : * and its documentation for any purpose is hereby granted without fee,
32 : * provided that the above copyright notice appear in all copies and
33 : * that both that copyright notice and this permission notice appear
34 : * in supporting documentation. Hewlett-Packard Company makes no
35 : * representations about the suitability of this software for any
36 : * purpose. It is provided "as is" without express or implied warranty.
37 : *
38 : *
39 : * Copyright (c) 1996-1998
40 : * Silicon Graphics Computer Systems, Inc.
41 : *
42 : * Permission to use, copy, modify, distribute and sell this software
43 : * and its documentation for any purpose is hereby granted without fee,
44 : * provided that the above copyright notice appear in all copies and
45 : * that both that copyright notice and this permission notice appear
46 : * in supporting documentation. Silicon Graphics makes no
47 : * representations about the suitability of this software for any
48 : * purpose. It is provided "as is" without express or implied warranty.
49 : */
50 :
51 : /** @file bits/stl_iterator.h
52 : * This is an internal header file, included by other library headers.
53 : * Do not attempt to use it directly. @headername{iterator}
54 : *
55 : * This file implements reverse_iterator, back_insert_iterator,
56 : * front_insert_iterator, insert_iterator, __normal_iterator, and their
57 : * supporting functions and overloaded operators.
58 : */
59 :
60 : #ifndef _STL_ITERATOR_H
61 : #define _STL_ITERATOR_H 1
62 :
63 : #include <bits/cpp_type_traits.h>
64 : #include <bits/stl_iterator_base_types.h>
65 : #include <ext/type_traits.h>
66 : #include <bits/move.h>
67 : #include <bits/ptr_traits.h>
68 :
69 : #if __cplusplus >= 201103L
70 : # include <type_traits>
71 : #endif
72 :
73 : #if __cplusplus >= 202002L
74 : # include <compare>
75 : # include <new>
76 : # include <bits/exception_defines.h>
77 : # include <bits/iterator_concepts.h>
78 : # include <bits/stl_construct.h>
79 : #endif
80 :
81 : #if __glibcxx_tuple_like // >= C++23
82 : # include <bits/utility.h> // for tuple_element_t
83 : #endif
84 :
85 : namespace std _GLIBCXX_VISIBILITY(default)
86 : {
87 : _GLIBCXX_BEGIN_NAMESPACE_VERSION
88 :
89 : /**
90 : * @addtogroup iterators
91 : * @{
92 : */
93 :
94 : #if __glibcxx_concepts
95 : namespace __detail
96 : {
97 : // Weaken iterator_category _Cat to _Limit if it is derived from that,
98 : // otherwise use _Otherwise.
99 : template<typename _Cat, typename _Limit, typename _Otherwise = _Cat>
100 : using __clamp_iter_cat
101 : = __conditional_t<derived_from<_Cat, _Limit>, _Limit, _Otherwise>;
102 : }
103 : #endif
104 :
105 : // Ignore warnings about std::iterator.
106 : #pragma GCC diagnostic push
107 : #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
108 :
109 : // 24.4.1 Reverse iterators
110 : /**
111 : * Bidirectional and random access iterators have corresponding reverse
112 : * %iterator adaptors that iterate through the data structure in the
113 : * opposite direction. They have the same signatures as the corresponding
114 : * iterators. The fundamental relation between a reverse %iterator and its
115 : * corresponding %iterator @c i is established by the identity:
116 : * @code
117 : * &*(reverse_iterator(i)) == &*(i - 1)
118 : * @endcode
119 : *
120 : * <em>This mapping is dictated by the fact that while there is always a
121 : * pointer past the end of an array, there might not be a valid pointer
122 : * before the beginning of an array.</em> [24.4.1]/1,2
123 : *
124 : * Reverse iterators can be tricky and surprising at first. Their
125 : * semantics make sense, however, and the trickiness is a side effect of
126 : * the requirement that the iterators must be safe.
127 : */
128 : template<typename _Iterator>
129 : class reverse_iterator
130 : : public iterator<typename iterator_traits<_Iterator>::iterator_category,
131 : typename iterator_traits<_Iterator>::value_type,
132 : typename iterator_traits<_Iterator>::difference_type,
133 : typename iterator_traits<_Iterator>::pointer,
134 : typename iterator_traits<_Iterator>::reference>
135 : {
136 : template<typename _Iter>
137 : friend class reverse_iterator;
138 :
139 : #if __glibcxx_concepts
140 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
141 : // 3435. three_way_comparable_with<reverse_iterator<int*>, [...]>
142 : template<typename _Iter>
143 : static constexpr bool __convertible = !is_same_v<_Iter, _Iterator>
144 : && convertible_to<const _Iter&, _Iterator>;
145 : #endif
146 :
147 : protected:
148 : _Iterator current;
149 :
150 : typedef iterator_traits<_Iterator> __traits_type;
151 :
152 : public:
153 : typedef _Iterator iterator_type;
154 : typedef typename __traits_type::pointer pointer;
155 : #if ! __glibcxx_concepts
156 : typedef typename __traits_type::difference_type difference_type;
157 : typedef typename __traits_type::reference reference;
158 : #else
159 : using iterator_concept
160 : = __conditional_t<random_access_iterator<_Iterator>,
161 : random_access_iterator_tag,
162 : bidirectional_iterator_tag>;
163 : using iterator_category
164 : = __detail::__clamp_iter_cat<typename __traits_type::iterator_category,
165 : random_access_iterator_tag>;
166 : using value_type = iter_value_t<_Iterator>;
167 : using difference_type = iter_difference_t<_Iterator>;
168 : using reference = iter_reference_t<_Iterator>;
169 : #endif
170 :
171 : /**
172 : * The default constructor value-initializes member @p current.
173 : * If it is a pointer, that means it is zero-initialized.
174 : */
175 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
176 : // 235 No specification of default ctor for reverse_iterator
177 : // 1012. reverse_iterator default ctor should value initialize
178 : _GLIBCXX17_CONSTEXPR
179 : reverse_iterator()
180 : _GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator()))
181 : : current()
182 : { }
183 :
184 : /**
185 : * This %iterator will move in the opposite direction that @p x does.
186 : */
187 : explicit _GLIBCXX17_CONSTEXPR
188 : reverse_iterator(iterator_type __x)
189 : _GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator(__x)))
190 : : current(__x)
191 : { }
192 :
193 : /**
194 : * The copy constructor is normal.
195 : */
196 : _GLIBCXX17_CONSTEXPR
197 : reverse_iterator(const reverse_iterator& __x)
198 : _GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator(__x.current)))
199 : : current(__x.current)
200 : { }
201 :
202 : #if __cplusplus >= 201103L
203 : reverse_iterator& operator=(const reverse_iterator&) = default;
204 : #endif
205 :
206 : /**
207 : * A %reverse_iterator across other types can be copied if the
208 : * underlying %iterator can be converted to the type of @c current.
209 : */
210 : template<typename _Iter>
211 : #if __glibcxx_concepts
212 : requires __convertible<_Iter>
213 : #endif
214 : _GLIBCXX17_CONSTEXPR
215 : reverse_iterator(const reverse_iterator<_Iter>& __x)
216 : _GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator(__x.current)))
217 : : current(__x.current)
218 : { }
219 :
220 : #if __cplusplus >= 201103L
221 : template<typename _Iter>
222 : #if __glibcxx_concepts
223 : requires __convertible<_Iter>
224 : && assignable_from<_Iterator&, const _Iter&>
225 : #endif
226 : _GLIBCXX17_CONSTEXPR
227 : reverse_iterator&
228 : operator=(const reverse_iterator<_Iter>& __x)
229 : _GLIBCXX_NOEXCEPT_IF(noexcept(current = __x.current))
230 : {
231 : current = __x.current;
232 : return *this;
233 : }
234 : #endif
235 :
236 : /**
237 : * @return @c current, the %iterator used for underlying work.
238 : */
239 : _GLIBCXX_NODISCARD
240 : _GLIBCXX17_CONSTEXPR iterator_type
241 : base() const
242 : _GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator(current)))
243 : { return current; }
244 :
245 : /**
246 : * @return A reference to the value at @c --current
247 : *
248 : * This requires that @c --current is dereferenceable.
249 : *
250 : * @warning This implementation requires that for an iterator of the
251 : * underlying iterator type, @c x, a reference obtained by
252 : * @c *x remains valid after @c x has been modified or
253 : * destroyed. This is a bug: http://gcc.gnu.org/PR51823
254 : */
255 : _GLIBCXX_NODISCARD
256 : _GLIBCXX17_CONSTEXPR reference
257 : operator*() const
258 : {
259 : _Iterator __tmp = current;
260 : return *--__tmp;
261 : }
262 :
263 : /**
264 : * @return A pointer to the value at @c --current
265 : *
266 : * This requires that @c --current is dereferenceable.
267 : */
268 : _GLIBCXX_NODISCARD
269 : _GLIBCXX17_CONSTEXPR pointer
270 : operator->() const
271 : #if __cplusplus > 201703L && __cpp_concepts >= 201907L
272 : requires is_pointer_v<_Iterator>
273 : || requires(const _Iterator __i) { __i.operator->(); }
274 : #endif
275 : {
276 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
277 : // 1052. operator-> should also support smart pointers
278 : _Iterator __tmp = current;
279 : --__tmp;
280 : return _S_to_pointer(__tmp);
281 : }
282 :
283 : /**
284 : * @return @c *this
285 : *
286 : * Decrements the underlying iterator.
287 : */
288 : _GLIBCXX17_CONSTEXPR reverse_iterator&
289 : operator++()
290 : {
291 : --current;
292 : return *this;
293 : }
294 :
295 : /**
296 : * @return The original value of @c *this
297 : *
298 : * Decrements the underlying iterator.
299 : */
300 : _GLIBCXX17_CONSTEXPR reverse_iterator
301 : operator++(int)
302 : {
303 : reverse_iterator __tmp = *this;
304 : --current;
305 : return __tmp;
306 : }
307 :
308 : /**
309 : * @return @c *this
310 : *
311 : * Increments the underlying iterator.
312 : */
313 : _GLIBCXX17_CONSTEXPR reverse_iterator&
314 : operator--()
315 : {
316 : ++current;
317 : return *this;
318 : }
319 :
320 : /**
321 : * @return A reverse_iterator with the previous value of @c *this
322 : *
323 : * Increments the underlying iterator.
324 : */
325 : _GLIBCXX17_CONSTEXPR reverse_iterator
326 : operator--(int)
327 : {
328 : reverse_iterator __tmp = *this;
329 : ++current;
330 : return __tmp;
331 : }
332 :
333 : /**
334 : * @return A reverse_iterator that refers to @c current - @a __n
335 : *
336 : * The underlying iterator must be a Random Access Iterator.
337 : */
338 : _GLIBCXX_NODISCARD
339 : _GLIBCXX17_CONSTEXPR reverse_iterator
340 : operator+(difference_type __n) const
341 : { return reverse_iterator(current - __n); }
342 :
343 : /**
344 : * @return *this
345 : *
346 : * Moves the underlying iterator backwards @a __n steps.
347 : * The underlying iterator must be a Random Access Iterator.
348 : */
349 : _GLIBCXX17_CONSTEXPR reverse_iterator&
350 : operator+=(difference_type __n)
351 : {
352 : current -= __n;
353 : return *this;
354 : }
355 :
356 : /**
357 : * @return A reverse_iterator that refers to @c current - @a __n
358 : *
359 : * The underlying iterator must be a Random Access Iterator.
360 : */
361 : _GLIBCXX_NODISCARD
362 : _GLIBCXX17_CONSTEXPR reverse_iterator
363 : operator-(difference_type __n) const
364 : { return reverse_iterator(current + __n); }
365 :
366 : /**
367 : * @return *this
368 : *
369 : * Moves the underlying iterator forwards @a __n steps.
370 : * The underlying iterator must be a Random Access Iterator.
371 : */
372 : _GLIBCXX17_CONSTEXPR reverse_iterator&
373 : operator-=(difference_type __n)
374 : {
375 : current += __n;
376 : return *this;
377 : }
378 :
379 : /**
380 : * @return The value at @c current - @a __n - 1
381 : *
382 : * The underlying iterator must be a Random Access Iterator.
383 : */
384 : _GLIBCXX_NODISCARD
385 : _GLIBCXX17_CONSTEXPR reference
386 : operator[](difference_type __n) const
387 : { return *(*this + __n); }
388 :
389 : #if __cplusplus > 201703L && __glibcxx_concepts
390 : [[nodiscard]]
391 : friend constexpr iter_rvalue_reference_t<_Iterator>
392 : iter_move(const reverse_iterator& __i)
393 : noexcept(is_nothrow_copy_constructible_v<_Iterator>
394 : && noexcept(ranges::iter_move(--std::declval<_Iterator&>())))
395 : {
396 : auto __tmp = __i.base();
397 : return ranges::iter_move(--__tmp);
398 : }
399 :
400 : template<indirectly_swappable<_Iterator> _Iter2>
401 : friend constexpr void
402 : iter_swap(const reverse_iterator& __x,
403 : const reverse_iterator<_Iter2>& __y)
404 : noexcept(is_nothrow_copy_constructible_v<_Iterator>
405 : && is_nothrow_copy_constructible_v<_Iter2>
406 : && noexcept(ranges::iter_swap(--std::declval<_Iterator&>(),
407 : --std::declval<_Iter2&>())))
408 : {
409 : auto __xtmp = __x.base();
410 : auto __ytmp = __y.base();
411 : ranges::iter_swap(--__xtmp, --__ytmp);
412 : }
413 : #endif
414 :
415 : private:
416 : template<typename _Tp>
417 : static _GLIBCXX17_CONSTEXPR _Tp*
418 : _S_to_pointer(_Tp* __p)
419 : { return __p; }
420 :
421 : template<typename _Tp>
422 : static _GLIBCXX17_CONSTEXPR pointer
423 : _S_to_pointer(_Tp __t)
424 : { return __t.operator->(); }
425 : };
426 :
427 : ///@{
428 : /**
429 : * @param __x A %reverse_iterator.
430 : * @param __y A %reverse_iterator.
431 : * @return A simple bool.
432 : *
433 : * Reverse iterators forward comparisons to their underlying base()
434 : * iterators.
435 : *
436 : */
437 : #if __cplusplus <= 201703L || ! defined __glibcxx_concepts
438 : template<typename _Iterator>
439 : _GLIBCXX_NODISCARD
440 : inline _GLIBCXX17_CONSTEXPR bool
441 : operator==(const reverse_iterator<_Iterator>& __x,
442 : const reverse_iterator<_Iterator>& __y)
443 : { return __x.base() == __y.base(); }
444 :
445 : template<typename _Iterator>
446 : _GLIBCXX_NODISCARD
447 : inline _GLIBCXX17_CONSTEXPR bool
448 : operator<(const reverse_iterator<_Iterator>& __x,
449 : const reverse_iterator<_Iterator>& __y)
450 : { return __y.base() < __x.base(); }
451 :
452 : template<typename _Iterator>
453 : _GLIBCXX_NODISCARD
454 : inline _GLIBCXX17_CONSTEXPR bool
455 : operator!=(const reverse_iterator<_Iterator>& __x,
456 : const reverse_iterator<_Iterator>& __y)
457 : { return !(__x == __y); }
458 :
459 : template<typename _Iterator>
460 : _GLIBCXX_NODISCARD
461 : inline _GLIBCXX17_CONSTEXPR bool
462 : operator>(const reverse_iterator<_Iterator>& __x,
463 : const reverse_iterator<_Iterator>& __y)
464 : { return __y < __x; }
465 :
466 : template<typename _Iterator>
467 : _GLIBCXX_NODISCARD
468 : inline _GLIBCXX17_CONSTEXPR bool
469 : operator<=(const reverse_iterator<_Iterator>& __x,
470 : const reverse_iterator<_Iterator>& __y)
471 : { return !(__y < __x); }
472 :
473 : template<typename _Iterator>
474 : _GLIBCXX_NODISCARD
475 : inline _GLIBCXX17_CONSTEXPR bool
476 : operator>=(const reverse_iterator<_Iterator>& __x,
477 : const reverse_iterator<_Iterator>& __y)
478 : { return !(__x < __y); }
479 :
480 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
481 : // DR 280. Comparison of reverse_iterator to const reverse_iterator.
482 :
483 : template<typename _IteratorL, typename _IteratorR>
484 : _GLIBCXX_NODISCARD
485 : inline _GLIBCXX17_CONSTEXPR bool
486 : operator==(const reverse_iterator<_IteratorL>& __x,
487 : const reverse_iterator<_IteratorR>& __y)
488 : { return __x.base() == __y.base(); }
489 :
490 : template<typename _IteratorL, typename _IteratorR>
491 : _GLIBCXX_NODISCARD
492 : inline _GLIBCXX17_CONSTEXPR bool
493 : operator<(const reverse_iterator<_IteratorL>& __x,
494 : const reverse_iterator<_IteratorR>& __y)
495 : { return __x.base() > __y.base(); }
496 :
497 : template<typename _IteratorL, typename _IteratorR>
498 : _GLIBCXX_NODISCARD
499 : inline _GLIBCXX17_CONSTEXPR bool
500 : operator!=(const reverse_iterator<_IteratorL>& __x,
501 : const reverse_iterator<_IteratorR>& __y)
502 : { return __x.base() != __y.base(); }
503 :
504 : template<typename _IteratorL, typename _IteratorR>
505 : _GLIBCXX_NODISCARD
506 : inline _GLIBCXX17_CONSTEXPR bool
507 : operator>(const reverse_iterator<_IteratorL>& __x,
508 : const reverse_iterator<_IteratorR>& __y)
509 : { return __x.base() < __y.base(); }
510 :
511 : template<typename _IteratorL, typename _IteratorR>
512 : inline _GLIBCXX17_CONSTEXPR bool
513 : operator<=(const reverse_iterator<_IteratorL>& __x,
514 : const reverse_iterator<_IteratorR>& __y)
515 : { return __x.base() >= __y.base(); }
516 :
517 : template<typename _IteratorL, typename _IteratorR>
518 : _GLIBCXX_NODISCARD
519 : inline _GLIBCXX17_CONSTEXPR bool
520 : operator>=(const reverse_iterator<_IteratorL>& __x,
521 : const reverse_iterator<_IteratorR>& __y)
522 : { return __x.base() <= __y.base(); }
523 : #else // C++20
524 : template<typename _IteratorL, typename _IteratorR>
525 : [[nodiscard]]
526 : constexpr bool
527 : operator==(const reverse_iterator<_IteratorL>& __x,
528 : const reverse_iterator<_IteratorR>& __y)
529 : requires requires { { __x.base() == __y.base() } -> convertible_to<bool>; }
530 : { return __x.base() == __y.base(); }
531 :
532 : template<typename _IteratorL, typename _IteratorR>
533 : [[nodiscard]]
534 : constexpr bool
535 : operator!=(const reverse_iterator<_IteratorL>& __x,
536 : const reverse_iterator<_IteratorR>& __y)
537 : requires requires { { __x.base() != __y.base() } -> convertible_to<bool>; }
538 : { return __x.base() != __y.base(); }
539 :
540 : template<typename _IteratorL, typename _IteratorR>
541 : [[nodiscard]]
542 : constexpr bool
543 : operator<(const reverse_iterator<_IteratorL>& __x,
544 : const reverse_iterator<_IteratorR>& __y)
545 : requires requires { { __x.base() > __y.base() } -> convertible_to<bool>; }
546 : { return __x.base() > __y.base(); }
547 :
548 : template<typename _IteratorL, typename _IteratorR>
549 : [[nodiscard]]
550 : constexpr bool
551 : operator>(const reverse_iterator<_IteratorL>& __x,
552 : const reverse_iterator<_IteratorR>& __y)
553 : requires requires { { __x.base() < __y.base() } -> convertible_to<bool>; }
554 : { return __x.base() < __y.base(); }
555 :
556 : template<typename _IteratorL, typename _IteratorR>
557 : [[nodiscard]]
558 : constexpr bool
559 : operator<=(const reverse_iterator<_IteratorL>& __x,
560 : const reverse_iterator<_IteratorR>& __y)
561 : requires requires { { __x.base() >= __y.base() } -> convertible_to<bool>; }
562 : { return __x.base() >= __y.base(); }
563 :
564 : template<typename _IteratorL, typename _IteratorR>
565 : [[nodiscard]]
566 : constexpr bool
567 : operator>=(const reverse_iterator<_IteratorL>& __x,
568 : const reverse_iterator<_IteratorR>& __y)
569 : requires requires { { __x.base() <= __y.base() } -> convertible_to<bool>; }
570 : { return __x.base() <= __y.base(); }
571 :
572 : template<typename _IteratorL,
573 : three_way_comparable_with<_IteratorL> _IteratorR>
574 : [[nodiscard]]
575 : constexpr compare_three_way_result_t<_IteratorL, _IteratorR>
576 : operator<=>(const reverse_iterator<_IteratorL>& __x,
577 : const reverse_iterator<_IteratorR>& __y)
578 : { return __y.base() <=> __x.base(); }
579 :
580 : // Additional, non-standard overloads to avoid ambiguities with greedy,
581 : // unconstrained overloads in associated namespaces.
582 :
583 : template<typename _Iterator>
584 : [[nodiscard]]
585 : constexpr bool
586 : operator==(const reverse_iterator<_Iterator>& __x,
587 : const reverse_iterator<_Iterator>& __y)
588 : requires requires { { __x.base() == __y.base() } -> convertible_to<bool>; }
589 : { return __x.base() == __y.base(); }
590 :
591 : template<three_way_comparable _Iterator>
592 : [[nodiscard]]
593 : constexpr compare_three_way_result_t<_Iterator, _Iterator>
594 : operator<=>(const reverse_iterator<_Iterator>& __x,
595 : const reverse_iterator<_Iterator>& __y)
596 : { return __y.base() <=> __x.base(); }
597 : #endif // C++20
598 : ///@}
599 :
600 : #if __cplusplus < 201103L
601 : template<typename _Iterator>
602 : inline typename reverse_iterator<_Iterator>::difference_type
603 : operator-(const reverse_iterator<_Iterator>& __x,
604 : const reverse_iterator<_Iterator>& __y)
605 : { return __y.base() - __x.base(); }
606 :
607 : template<typename _IteratorL, typename _IteratorR>
608 : inline typename reverse_iterator<_IteratorL>::difference_type
609 : operator-(const reverse_iterator<_IteratorL>& __x,
610 : const reverse_iterator<_IteratorR>& __y)
611 : { return __y.base() - __x.base(); }
612 : #else
613 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
614 : // DR 685. reverse_iterator/move_iterator difference has invalid signatures
615 : template<typename _IteratorL, typename _IteratorR>
616 : [[__nodiscard__]]
617 : inline _GLIBCXX17_CONSTEXPR auto
618 : operator-(const reverse_iterator<_IteratorL>& __x,
619 : const reverse_iterator<_IteratorR>& __y)
620 : -> decltype(__y.base() - __x.base())
621 : { return __y.base() - __x.base(); }
622 : #endif
623 :
624 : template<typename _Iterator>
625 : _GLIBCXX_NODISCARD
626 : inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
627 : operator+(typename reverse_iterator<_Iterator>::difference_type __n,
628 : const reverse_iterator<_Iterator>& __x)
629 : { return reverse_iterator<_Iterator>(__x.base() - __n); }
630 :
631 : #if __cplusplus >= 201103L
632 : // Same as C++14 make_reverse_iterator but used in C++11 mode too.
633 : template<typename _Iterator>
634 : inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
635 : __make_reverse_iterator(_Iterator __i)
636 : { return reverse_iterator<_Iterator>(__i); }
637 :
638 : # ifdef __glibcxx_make_reverse_iterator // C++ >= 14
639 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
640 : // DR 2285. make_reverse_iterator
641 : /// Generator function for reverse_iterator.
642 : template<typename _Iterator>
643 : [[__nodiscard__]]
644 : inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
645 : make_reverse_iterator(_Iterator __i)
646 : { return reverse_iterator<_Iterator>(__i); }
647 :
648 : # if __cplusplus > 201703L && defined __glibcxx_concepts
649 : template<typename _Iterator1, typename _Iterator2>
650 : requires (!sized_sentinel_for<_Iterator1, _Iterator2>)
651 : inline constexpr bool
652 : disable_sized_sentinel_for<reverse_iterator<_Iterator1>,
653 : reverse_iterator<_Iterator2>> = true;
654 : # endif // C++20
655 : # endif // __glibcxx_make_reverse_iterator
656 :
657 : template<typename _Iterator>
658 : _GLIBCXX20_CONSTEXPR
659 : auto
660 : __niter_base(reverse_iterator<_Iterator> __it)
661 : -> decltype(__make_reverse_iterator(__niter_base(__it.base())))
662 : { return __make_reverse_iterator(__niter_base(__it.base())); }
663 :
664 : template<typename _Iterator>
665 : struct __is_move_iterator<reverse_iterator<_Iterator> >
666 : : __is_move_iterator<_Iterator>
667 : { };
668 :
669 : template<typename _Iterator>
670 : _GLIBCXX20_CONSTEXPR
671 : auto
672 : __miter_base(reverse_iterator<_Iterator> __it)
673 : -> decltype(__make_reverse_iterator(__miter_base(__it.base())))
674 : { return __make_reverse_iterator(__miter_base(__it.base())); }
675 : #endif // C++11
676 :
677 : // 24.4.2.2.1 back_insert_iterator
678 : /**
679 : * @brief Turns assignment into insertion.
680 : *
681 : * These are output iterators, constructed from a container-of-T.
682 : * Assigning a T to the iterator appends it to the container using
683 : * push_back.
684 : *
685 : * Tip: Using the back_inserter function to create these iterators can
686 : * save typing.
687 : */
688 : template<typename _Container>
689 : class back_insert_iterator
690 : : public iterator<output_iterator_tag, void, void, void, void>
691 : {
692 : protected:
693 : _Container* container;
694 :
695 : public:
696 : /// A nested typedef for the type of whatever container you used.
697 : typedef _Container container_type;
698 : #if __cplusplus > 201703L
699 : using difference_type = ptrdiff_t;
700 : #endif
701 :
702 : /// The only way to create this %iterator is with a container.
703 : explicit _GLIBCXX20_CONSTEXPR
704 : back_insert_iterator(_Container& __x)
705 : : container(std::__addressof(__x)) { }
706 :
707 : /**
708 : * @param __value An instance of whatever type
709 : * container_type::const_reference is; presumably a
710 : * reference-to-const T for container<T>.
711 : * @return This %iterator, for chained operations.
712 : *
713 : * This kind of %iterator doesn't really have a @a position in the
714 : * container (you can think of the position as being permanently at
715 : * the end, if you like). Assigning a value to the %iterator will
716 : * always append the value to the end of the container.
717 : */
718 : #if __cplusplus < 201103L
719 : back_insert_iterator&
720 : operator=(typename _Container::const_reference __value)
721 : {
722 : container->push_back(__value);
723 : return *this;
724 : }
725 : #else
726 : _GLIBCXX20_CONSTEXPR
727 : back_insert_iterator&
728 : operator=(const typename _Container::value_type& __value)
729 : {
730 : container->push_back(__value);
731 : return *this;
732 : }
733 :
734 : _GLIBCXX20_CONSTEXPR
735 : back_insert_iterator&
736 : operator=(typename _Container::value_type&& __value)
737 : {
738 : container->push_back(std::move(__value));
739 : return *this;
740 : }
741 : #endif
742 :
743 : /// Simply returns *this.
744 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
745 : back_insert_iterator&
746 : operator*()
747 : { return *this; }
748 :
749 : /// Simply returns *this. (This %iterator does not @a move.)
750 : _GLIBCXX20_CONSTEXPR
751 : back_insert_iterator&
752 : operator++()
753 : { return *this; }
754 :
755 : /// Simply returns *this. (This %iterator does not @a move.)
756 : _GLIBCXX20_CONSTEXPR
757 : back_insert_iterator
758 : operator++(int)
759 : { return *this; }
760 : };
761 :
762 : /**
763 : * @param __x A container of arbitrary type.
764 : * @return An instance of back_insert_iterator working on @p __x.
765 : *
766 : * This wrapper function helps in creating back_insert_iterator instances.
767 : * Typing the name of the %iterator requires knowing the precise full
768 : * type of the container, which can be tedious and impedes generic
769 : * programming. Using this function lets you take advantage of automatic
770 : * template parameter deduction, making the compiler match the correct
771 : * types for you.
772 : */
773 : template<typename _Container>
774 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
775 : inline back_insert_iterator<_Container>
776 : back_inserter(_Container& __x)
777 : { return back_insert_iterator<_Container>(__x); }
778 :
779 : /**
780 : * @brief Turns assignment into insertion.
781 : *
782 : * These are output iterators, constructed from a container-of-T.
783 : * Assigning a T to the iterator prepends it to the container using
784 : * push_front.
785 : *
786 : * Tip: Using the front_inserter function to create these iterators can
787 : * save typing.
788 : */
789 : template<typename _Container>
790 : class front_insert_iterator
791 : : public iterator<output_iterator_tag, void, void, void, void>
792 : {
793 : protected:
794 : _Container* container;
795 :
796 : public:
797 : /// A nested typedef for the type of whatever container you used.
798 : typedef _Container container_type;
799 : #if __cplusplus > 201703L
800 : using difference_type = ptrdiff_t;
801 : #endif
802 :
803 : /// The only way to create this %iterator is with a container.
804 : explicit _GLIBCXX20_CONSTEXPR
805 : front_insert_iterator(_Container& __x)
806 : : container(std::__addressof(__x)) { }
807 :
808 : /**
809 : * @param __value An instance of whatever type
810 : * container_type::const_reference is; presumably a
811 : * reference-to-const T for container<T>.
812 : * @return This %iterator, for chained operations.
813 : *
814 : * This kind of %iterator doesn't really have a @a position in the
815 : * container (you can think of the position as being permanently at
816 : * the front, if you like). Assigning a value to the %iterator will
817 : * always prepend the value to the front of the container.
818 : */
819 : #if __cplusplus < 201103L
820 : front_insert_iterator&
821 : operator=(typename _Container::const_reference __value)
822 : {
823 : container->push_front(__value);
824 : return *this;
825 : }
826 : #else
827 : _GLIBCXX20_CONSTEXPR
828 : front_insert_iterator&
829 : operator=(const typename _Container::value_type& __value)
830 : {
831 : container->push_front(__value);
832 : return *this;
833 : }
834 :
835 : _GLIBCXX20_CONSTEXPR
836 : front_insert_iterator&
837 : operator=(typename _Container::value_type&& __value)
838 : {
839 : container->push_front(std::move(__value));
840 : return *this;
841 : }
842 : #endif
843 :
844 : /// Simply returns *this.
845 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
846 : front_insert_iterator&
847 : operator*()
848 : { return *this; }
849 :
850 : /// Simply returns *this. (This %iterator does not @a move.)
851 : _GLIBCXX20_CONSTEXPR
852 : front_insert_iterator&
853 : operator++()
854 : { return *this; }
855 :
856 : /// Simply returns *this. (This %iterator does not @a move.)
857 : _GLIBCXX20_CONSTEXPR
858 : front_insert_iterator
859 : operator++(int)
860 : { return *this; }
861 : };
862 :
863 : /**
864 : * @param __x A container of arbitrary type.
865 : * @return An instance of front_insert_iterator working on @p x.
866 : *
867 : * This wrapper function helps in creating front_insert_iterator instances.
868 : * Typing the name of the %iterator requires knowing the precise full
869 : * type of the container, which can be tedious and impedes generic
870 : * programming. Using this function lets you take advantage of automatic
871 : * template parameter deduction, making the compiler match the correct
872 : * types for you.
873 : */
874 : template<typename _Container>
875 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
876 : inline front_insert_iterator<_Container>
877 : front_inserter(_Container& __x)
878 : { return front_insert_iterator<_Container>(__x); }
879 :
880 : /**
881 : * @brief Turns assignment into insertion.
882 : *
883 : * These are output iterators, constructed from a container-of-T.
884 : * Assigning a T to the iterator inserts it in the container at the
885 : * %iterator's position, rather than overwriting the value at that
886 : * position.
887 : *
888 : * (Sequences will actually insert a @e copy of the value before the
889 : * %iterator's position.)
890 : *
891 : * Tip: Using the inserter function to create these iterators can
892 : * save typing.
893 : */
894 : template<typename _Container>
895 : class insert_iterator
896 : : public iterator<output_iterator_tag, void, void, void, void>
897 : {
898 : #if __cplusplus > 201703L && defined __glibcxx_concepts
899 : using _Iter = std::__detail::__range_iter_t<_Container>;
900 : #else
901 : typedef typename _Container::iterator _Iter;
902 : #endif
903 : protected:
904 : _Container* container;
905 : _Iter iter;
906 :
907 : public:
908 : /// A nested typedef for the type of whatever container you used.
909 : typedef _Container container_type;
910 :
911 : #if __cplusplus > 201703L && defined __glibcxx_concepts
912 : using difference_type = ptrdiff_t;
913 : #endif
914 :
915 : /**
916 : * The only way to create this %iterator is with a container and an
917 : * initial position (a normal %iterator into the container).
918 : */
919 : _GLIBCXX20_CONSTEXPR
920 : insert_iterator(_Container& __x, _Iter __i)
921 : : container(std::__addressof(__x)), iter(__i) {}
922 :
923 : /**
924 : * @param __value An instance of whatever type
925 : * container_type::const_reference is; presumably a
926 : * reference-to-const T for container<T>.
927 : * @return This %iterator, for chained operations.
928 : *
929 : * This kind of %iterator maintains its own position in the
930 : * container. Assigning a value to the %iterator will insert the
931 : * value into the container at the place before the %iterator.
932 : *
933 : * The position is maintained such that subsequent assignments will
934 : * insert values immediately after one another. For example,
935 : * @code
936 : * // vector v contains A and Z
937 : *
938 : * insert_iterator i (v, ++v.begin());
939 : * i = 1;
940 : * i = 2;
941 : * i = 3;
942 : *
943 : * // vector v contains A, 1, 2, 3, and Z
944 : * @endcode
945 : */
946 : #if __cplusplus < 201103L
947 : insert_iterator&
948 : operator=(typename _Container::const_reference __value)
949 : {
950 : iter = container->insert(iter, __value);
951 : ++iter;
952 : return *this;
953 : }
954 : #else
955 : _GLIBCXX20_CONSTEXPR
956 : insert_iterator&
957 : operator=(const typename _Container::value_type& __value)
958 : {
959 : iter = container->insert(iter, __value);
960 : ++iter;
961 : return *this;
962 : }
963 :
964 : _GLIBCXX20_CONSTEXPR
965 : insert_iterator&
966 : operator=(typename _Container::value_type&& __value)
967 : {
968 : iter = container->insert(iter, std::move(__value));
969 : ++iter;
970 : return *this;
971 : }
972 : #endif
973 :
974 : /// Simply returns *this.
975 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
976 : insert_iterator&
977 : operator*()
978 : { return *this; }
979 :
980 : /// Simply returns *this. (This %iterator does not @a move.)
981 : _GLIBCXX20_CONSTEXPR
982 : insert_iterator&
983 : operator++()
984 : { return *this; }
985 :
986 : /// Simply returns *this. (This %iterator does not @a move.)
987 : _GLIBCXX20_CONSTEXPR
988 : insert_iterator&
989 : operator++(int)
990 : { return *this; }
991 : };
992 :
993 : #pragma GCC diagnostic pop
994 :
995 : /**
996 : * @param __x A container of arbitrary type.
997 : * @param __i An iterator into the container.
998 : * @return An instance of insert_iterator working on @p __x.
999 : *
1000 : * This wrapper function helps in creating insert_iterator instances.
1001 : * Typing the name of the %iterator requires knowing the precise full
1002 : * type of the container, which can be tedious and impedes generic
1003 : * programming. Using this function lets you take advantage of automatic
1004 : * template parameter deduction, making the compiler match the correct
1005 : * types for you.
1006 : */
1007 : #if __cplusplus > 201703L && defined __glibcxx_concepts
1008 : template<typename _Container>
1009 : [[nodiscard]]
1010 : constexpr insert_iterator<_Container>
1011 : inserter(_Container& __x, std::__detail::__range_iter_t<_Container> __i)
1012 : { return insert_iterator<_Container>(__x, __i); }
1013 : #else
1014 : template<typename _Container>
1015 : _GLIBCXX_NODISCARD
1016 : inline insert_iterator<_Container>
1017 : inserter(_Container& __x, typename _Container::iterator __i)
1018 : { return insert_iterator<_Container>(__x, __i); }
1019 : #endif
1020 :
1021 : /// @} group iterators
1022 :
1023 : _GLIBCXX_END_NAMESPACE_VERSION
1024 : } // namespace
1025 :
1026 : namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
1027 : {
1028 : _GLIBCXX_BEGIN_NAMESPACE_VERSION
1029 :
1030 : // This iterator adapter is @a normal in the sense that it does not
1031 : // change the semantics of any of the operators of its iterator
1032 : // parameter. Its primary purpose is to convert an iterator that is
1033 : // not a class, e.g. a pointer, into an iterator that is a class.
1034 : // The _Container parameter exists solely so that different containers
1035 : // using this template can instantiate different types, even if the
1036 : // _Iterator parameter is the same.
1037 : template<typename _Iterator, typename _Container>
1038 : class __normal_iterator
1039 : {
1040 : protected:
1041 : _Iterator _M_current;
1042 :
1043 : typedef std::iterator_traits<_Iterator> __traits_type;
1044 :
1045 : #if __cplusplus >= 201103L
1046 : template<typename _Iter>
1047 : using __convertible_from
1048 : = std::__enable_if_t<std::is_convertible<_Iter, _Iterator>::value>;
1049 : #endif
1050 :
1051 : public:
1052 : typedef _Iterator iterator_type;
1053 : typedef typename __traits_type::iterator_category iterator_category;
1054 : typedef typename __traits_type::value_type value_type;
1055 : typedef typename __traits_type::difference_type difference_type;
1056 : typedef typename __traits_type::reference reference;
1057 : typedef typename __traits_type::pointer pointer;
1058 :
1059 : #if __cplusplus > 201703L && __glibcxx_concepts
1060 : using iterator_concept = std::__detail::__iter_concept<_Iterator>;
1061 : #endif
1062 :
1063 : _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
1064 : : _M_current(_Iterator()) { }
1065 :
1066 : explicit _GLIBCXX20_CONSTEXPR
1067 : __normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT
1068 : : _M_current(__i) { }
1069 :
1070 : // Allow iterator to const_iterator conversion
1071 : #if __cplusplus >= 201103L
1072 : template<typename _Iter, typename = __convertible_from<_Iter>>
1073 : _GLIBCXX20_CONSTEXPR
1074 : __normal_iterator(const __normal_iterator<_Iter, _Container>& __i)
1075 : noexcept
1076 : #else
1077 : // N.B. _Container::pointer is not actually in container requirements,
1078 : // but is present in std::vector and std::basic_string.
1079 : template<typename _Iter>
1080 : __normal_iterator(const __normal_iterator<_Iter,
1081 : typename __enable_if<
1082 : (std::__are_same<_Iter, typename _Container::pointer>::__value),
1083 : _Container>::__type>& __i)
1084 : #endif
1085 : : _M_current(__i.base()) { }
1086 :
1087 : // Forward iterator requirements
1088 : _GLIBCXX20_CONSTEXPR
1089 : reference
1090 : operator*() const _GLIBCXX_NOEXCEPT
1091 : { return *_M_current; }
1092 :
1093 : _GLIBCXX20_CONSTEXPR
1094 : pointer
1095 : operator->() const _GLIBCXX_NOEXCEPT
1096 : { return _M_current; }
1097 :
1098 : _GLIBCXX20_CONSTEXPR
1099 : __normal_iterator&
1100 : operator++() _GLIBCXX_NOEXCEPT
1101 : {
1102 : ++_M_current;
1103 : return *this;
1104 : }
1105 :
1106 : _GLIBCXX20_CONSTEXPR
1107 : __normal_iterator
1108 : operator++(int) _GLIBCXX_NOEXCEPT
1109 : { return __normal_iterator(_M_current++); }
1110 :
1111 : // Bidirectional iterator requirements
1112 : _GLIBCXX20_CONSTEXPR
1113 : __normal_iterator&
1114 : operator--() _GLIBCXX_NOEXCEPT
1115 : {
1116 : --_M_current;
1117 : return *this;
1118 : }
1119 :
1120 : _GLIBCXX20_CONSTEXPR
1121 : __normal_iterator
1122 : operator--(int) _GLIBCXX_NOEXCEPT
1123 : { return __normal_iterator(_M_current--); }
1124 :
1125 : // Random access iterator requirements
1126 : _GLIBCXX20_CONSTEXPR
1127 : reference
1128 : operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
1129 : { return _M_current[__n]; }
1130 :
1131 : _GLIBCXX20_CONSTEXPR
1132 : __normal_iterator&
1133 : operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
1134 : { _M_current += __n; return *this; }
1135 :
1136 : _GLIBCXX20_CONSTEXPR
1137 : __normal_iterator
1138 : operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
1139 : { return __normal_iterator(_M_current + __n); }
1140 :
1141 : _GLIBCXX20_CONSTEXPR
1142 : __normal_iterator&
1143 : operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
1144 : { _M_current -= __n; return *this; }
1145 :
1146 : _GLIBCXX20_CONSTEXPR
1147 : __normal_iterator
1148 : operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
1149 : { return __normal_iterator(_M_current - __n); }
1150 :
1151 : _GLIBCXX20_CONSTEXPR
1152 : const _Iterator&
1153 : base() const _GLIBCXX_NOEXCEPT
1154 : { return _M_current; }
1155 : };
1156 :
1157 : // Note: In what follows, the left- and right-hand-side iterators are
1158 : // allowed to vary in types (conceptually in cv-qualification) so that
1159 : // comparison between cv-qualified and non-cv-qualified iterators be
1160 : // valid. However, the greedy and unfriendly operators in std::rel_ops
1161 : // will make overload resolution ambiguous (when in scope) if we don't
1162 : // provide overloads whose operands are of the same type. Can someone
1163 : // remind me what generic programming is about? -- Gaby
1164 :
1165 : #if __cpp_lib_three_way_comparison
1166 : template<typename _IteratorL, typename _IteratorR, typename _Container>
1167 : [[nodiscard]]
1168 : constexpr bool
1169 : operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
1170 : const __normal_iterator<_IteratorR, _Container>& __rhs)
1171 : noexcept(noexcept(__lhs.base() == __rhs.base()))
1172 : requires requires {
1173 : { __lhs.base() == __rhs.base() } -> std::convertible_to<bool>;
1174 : }
1175 : { return __lhs.base() == __rhs.base(); }
1176 :
1177 : template<typename _IteratorL, typename _IteratorR, typename _Container>
1178 : [[nodiscard]]
1179 : constexpr std::__detail::__synth3way_t<_IteratorR, _IteratorL>
1180 : operator<=>(const __normal_iterator<_IteratorL, _Container>& __lhs,
1181 : const __normal_iterator<_IteratorR, _Container>& __rhs)
1182 : noexcept(noexcept(std::__detail::__synth3way(__lhs.base(), __rhs.base())))
1183 : { return std::__detail::__synth3way(__lhs.base(), __rhs.base()); }
1184 :
1185 : template<typename _Iterator, typename _Container>
1186 : [[nodiscard]]
1187 : constexpr bool
1188 : operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
1189 : const __normal_iterator<_Iterator, _Container>& __rhs)
1190 : noexcept(noexcept(__lhs.base() == __rhs.base()))
1191 : requires requires {
1192 : { __lhs.base() == __rhs.base() } -> std::convertible_to<bool>;
1193 : }
1194 : { return __lhs.base() == __rhs.base(); }
1195 :
1196 : template<typename _Iterator, typename _Container>
1197 : [[nodiscard]]
1198 : constexpr std::__detail::__synth3way_t<_Iterator>
1199 : operator<=>(const __normal_iterator<_Iterator, _Container>& __lhs,
1200 : const __normal_iterator<_Iterator, _Container>& __rhs)
1201 : noexcept(noexcept(std::__detail::__synth3way(__lhs.base(), __rhs.base())))
1202 : { return std::__detail::__synth3way(__lhs.base(), __rhs.base()); }
1203 : #else
1204 : // Forward iterator requirements
1205 : template<typename _IteratorL, typename _IteratorR, typename _Container>
1206 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1207 : inline bool
1208 : operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
1209 : const __normal_iterator<_IteratorR, _Container>& __rhs)
1210 : _GLIBCXX_NOEXCEPT
1211 : { return __lhs.base() == __rhs.base(); }
1212 :
1213 : template<typename _Iterator, typename _Container>
1214 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1215 : inline bool
1216 : operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
1217 : const __normal_iterator<_Iterator, _Container>& __rhs)
1218 : _GLIBCXX_NOEXCEPT
1219 : { return __lhs.base() == __rhs.base(); }
1220 :
1221 : template<typename _IteratorL, typename _IteratorR, typename _Container>
1222 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1223 : inline bool
1224 : operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
1225 : const __normal_iterator<_IteratorR, _Container>& __rhs)
1226 : _GLIBCXX_NOEXCEPT
1227 : { return __lhs.base() != __rhs.base(); }
1228 :
1229 : template<typename _Iterator, typename _Container>
1230 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1231 : inline bool
1232 : operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
1233 : const __normal_iterator<_Iterator, _Container>& __rhs)
1234 : _GLIBCXX_NOEXCEPT
1235 : { return __lhs.base() != __rhs.base(); }
1236 :
1237 : // Random access iterator requirements
1238 : template<typename _IteratorL, typename _IteratorR, typename _Container>
1239 : _GLIBCXX_NODISCARD
1240 : inline bool
1241 : operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
1242 : const __normal_iterator<_IteratorR, _Container>& __rhs)
1243 : _GLIBCXX_NOEXCEPT
1244 : { return __lhs.base() < __rhs.base(); }
1245 :
1246 : template<typename _Iterator, typename _Container>
1247 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1248 : inline bool
1249 : operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
1250 : const __normal_iterator<_Iterator, _Container>& __rhs)
1251 : _GLIBCXX_NOEXCEPT
1252 : { return __lhs.base() < __rhs.base(); }
1253 :
1254 : template<typename _IteratorL, typename _IteratorR, typename _Container>
1255 : _GLIBCXX_NODISCARD
1256 : inline bool
1257 : operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
1258 : const __normal_iterator<_IteratorR, _Container>& __rhs)
1259 : _GLIBCXX_NOEXCEPT
1260 : { return __lhs.base() > __rhs.base(); }
1261 :
1262 : template<typename _Iterator, typename _Container>
1263 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1264 : inline bool
1265 : operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
1266 : const __normal_iterator<_Iterator, _Container>& __rhs)
1267 : _GLIBCXX_NOEXCEPT
1268 : { return __lhs.base() > __rhs.base(); }
1269 :
1270 : template<typename _IteratorL, typename _IteratorR, typename _Container>
1271 : _GLIBCXX_NODISCARD
1272 : inline bool
1273 : operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
1274 : const __normal_iterator<_IteratorR, _Container>& __rhs)
1275 : _GLIBCXX_NOEXCEPT
1276 : { return __lhs.base() <= __rhs.base(); }
1277 :
1278 : template<typename _Iterator, typename _Container>
1279 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1280 : inline bool
1281 : operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
1282 : const __normal_iterator<_Iterator, _Container>& __rhs)
1283 : _GLIBCXX_NOEXCEPT
1284 : { return __lhs.base() <= __rhs.base(); }
1285 :
1286 : template<typename _IteratorL, typename _IteratorR, typename _Container>
1287 : _GLIBCXX_NODISCARD
1288 : inline bool
1289 : operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
1290 : const __normal_iterator<_IteratorR, _Container>& __rhs)
1291 : _GLIBCXX_NOEXCEPT
1292 : { return __lhs.base() >= __rhs.base(); }
1293 :
1294 : template<typename _Iterator, typename _Container>
1295 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1296 : inline bool
1297 : operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
1298 : const __normal_iterator<_Iterator, _Container>& __rhs)
1299 : _GLIBCXX_NOEXCEPT
1300 : { return __lhs.base() >= __rhs.base(); }
1301 : #endif // three-way comparison
1302 :
1303 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1304 : // According to the resolution of DR179 not only the various comparison
1305 : // operators but also operator- must accept mixed iterator/const_iterator
1306 : // parameters.
1307 : template<typename _IteratorL, typename _IteratorR, typename _Container>
1308 : #if __cplusplus >= 201103L
1309 : // DR 685.
1310 : [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1311 : inline auto
1312 : operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
1313 : const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
1314 : -> decltype(__lhs.base() - __rhs.base())
1315 : #else
1316 : inline typename __normal_iterator<_IteratorL, _Container>::difference_type
1317 : operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
1318 : const __normal_iterator<_IteratorR, _Container>& __rhs)
1319 : #endif
1320 : { return __lhs.base() - __rhs.base(); }
1321 :
1322 : template<typename _Iterator, typename _Container>
1323 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1324 : inline typename __normal_iterator<_Iterator, _Container>::difference_type
1325 : operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
1326 : const __normal_iterator<_Iterator, _Container>& __rhs)
1327 : _GLIBCXX_NOEXCEPT
1328 : { return __lhs.base() - __rhs.base(); }
1329 :
1330 : template<typename _Iterator, typename _Container>
1331 : _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1332 : inline __normal_iterator<_Iterator, _Container>
1333 : operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
1334 : __n, const __normal_iterator<_Iterator, _Container>& __i)
1335 : _GLIBCXX_NOEXCEPT
1336 : { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
1337 :
1338 : _GLIBCXX_END_NAMESPACE_VERSION
1339 : } // namespace
1340 :
1341 : namespace std _GLIBCXX_VISIBILITY(default)
1342 : {
1343 : _GLIBCXX_BEGIN_NAMESPACE_VERSION
1344 :
1345 : template<typename _Iterator, typename _Container>
1346 : _GLIBCXX20_CONSTEXPR
1347 : _Iterator
1348 : __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
1349 : _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value)
1350 : { return __it.base(); }
1351 :
1352 : #if __cplusplus >= 201103L
1353 :
1354 : #if __cplusplus <= 201703L
1355 : // Need to overload __to_address because the pointer_traits primary template
1356 : // will deduce element_type of __normal_iterator<T*, C> as T* rather than T.
1357 : template<typename _Iterator, typename _Container>
1358 : constexpr auto
1359 : __to_address(const __gnu_cxx::__normal_iterator<_Iterator,
1360 : _Container>& __it) noexcept
1361 : -> decltype(std::__to_address(__it.base()))
1362 : { return std::__to_address(__it.base()); }
1363 : #endif
1364 :
1365 : /**
1366 : * @addtogroup iterators
1367 : * @{
1368 : */
1369 :
1370 : #if __cplusplus > 201703L && __glibcxx_concepts
1371 : template<semiregular _Sent>
1372 : class move_sentinel
1373 : {
1374 : public:
1375 : constexpr
1376 : move_sentinel()
1377 : noexcept(is_nothrow_default_constructible_v<_Sent>)
1378 : : _M_last() { }
1379 :
1380 : constexpr explicit
1381 : move_sentinel(_Sent __s)
1382 : noexcept(is_nothrow_move_constructible_v<_Sent>)
1383 : : _M_last(std::move(__s)) { }
1384 :
1385 : template<typename _S2> requires convertible_to<const _S2&, _Sent>
1386 : constexpr
1387 : move_sentinel(const move_sentinel<_S2>& __s)
1388 : noexcept(is_nothrow_constructible_v<_Sent, const _S2&>)
1389 : : _M_last(__s.base())
1390 : { }
1391 :
1392 : template<typename _S2> requires assignable_from<_Sent&, const _S2&>
1393 : constexpr move_sentinel&
1394 : operator=(const move_sentinel<_S2>& __s)
1395 : noexcept(is_nothrow_assignable_v<_Sent, const _S2&>)
1396 : {
1397 : _M_last = __s.base();
1398 : return *this;
1399 : }
1400 :
1401 : [[nodiscard]]
1402 : constexpr _Sent
1403 : base() const
1404 : noexcept(is_nothrow_copy_constructible_v<_Sent>)
1405 : { return _M_last; }
1406 :
1407 : private:
1408 : _Sent _M_last;
1409 : };
1410 : #endif // C++20
1411 :
1412 : namespace __detail
1413 : {
1414 : #if __cplusplus > 201703L && __glibcxx_concepts
1415 : template<typename _Iterator>
1416 : struct __move_iter_cat
1417 : { };
1418 :
1419 : template<typename _Iterator>
1420 : requires requires { typename __iter_category_t<_Iterator>; }
1421 : struct __move_iter_cat<_Iterator>
1422 : {
1423 : using iterator_category
1424 : = __clamp_iter_cat<__iter_category_t<_Iterator>,
1425 : random_access_iterator_tag>;
1426 : };
1427 : #endif
1428 : }
1429 :
1430 : // 24.4.3 Move iterators
1431 : /**
1432 : * Class template move_iterator is an iterator adapter with the same
1433 : * behavior as the underlying iterator except that its dereference
1434 : * operator implicitly converts the value returned by the underlying
1435 : * iterator's dereference operator to an rvalue reference. Some
1436 : * generic algorithms can be called with move iterators to replace
1437 : * copying with moving.
1438 : */
1439 : template<typename _Iterator>
1440 : class move_iterator
1441 : #if __cplusplus > 201703L && __glibcxx_concepts
1442 : : public __detail::__move_iter_cat<_Iterator>
1443 : #endif
1444 : {
1445 : _Iterator _M_current;
1446 :
1447 : using __traits_type = iterator_traits<_Iterator>;
1448 : #if ! (__cplusplus > 201703L && __glibcxx_concepts)
1449 : using __base_ref = typename __traits_type::reference;
1450 : #endif
1451 :
1452 : template<typename _Iter2>
1453 : friend class move_iterator;
1454 :
1455 : #if __glibcxx_concepts // C++20 && concepts
1456 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1457 : // 3435. three_way_comparable_with<reverse_iterator<int*>, [...]>
1458 : template<typename _Iter2>
1459 : static constexpr bool __convertible = !is_same_v<_Iter2, _Iterator>
1460 : && convertible_to<const _Iter2&, _Iterator>;
1461 : #endif
1462 :
1463 : #if __cplusplus > 201703L && __glibcxx_concepts
1464 : static auto
1465 : _S_iter_concept()
1466 : {
1467 : if constexpr (random_access_iterator<_Iterator>)
1468 : return random_access_iterator_tag{};
1469 : else if constexpr (bidirectional_iterator<_Iterator>)
1470 : return bidirectional_iterator_tag{};
1471 : else if constexpr (forward_iterator<_Iterator>)
1472 : return forward_iterator_tag{};
1473 : else
1474 : return input_iterator_tag{};
1475 : }
1476 : #endif
1477 :
1478 : public:
1479 : using iterator_type = _Iterator;
1480 :
1481 : #ifdef __glibcxx_move_iterator_concept // C++ >= 20 && lib_concepts
1482 : using iterator_concept = decltype(_S_iter_concept());
1483 :
1484 : // iterator_category defined in __move_iter_cat
1485 : using value_type = iter_value_t<_Iterator>;
1486 : using difference_type = iter_difference_t<_Iterator>;
1487 : using pointer = _Iterator;
1488 : using reference = iter_rvalue_reference_t<_Iterator>;
1489 : #else
1490 : typedef typename __traits_type::iterator_category iterator_category;
1491 : typedef typename __traits_type::value_type value_type;
1492 : typedef typename __traits_type::difference_type difference_type;
1493 : // NB: DR 680.
1494 : typedef _Iterator pointer;
1495 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1496 : // 2106. move_iterator wrapping iterators returning prvalues
1497 : using reference
1498 : = __conditional_t<is_reference<__base_ref>::value,
1499 : typename remove_reference<__base_ref>::type&&,
1500 : __base_ref>;
1501 : #endif
1502 :
1503 : _GLIBCXX17_CONSTEXPR
1504 : move_iterator()
1505 : : _M_current() { }
1506 :
1507 : explicit _GLIBCXX17_CONSTEXPR
1508 0 : move_iterator(iterator_type __i)
1509 0 : : _M_current(std::move(__i)) { }
1510 :
1511 : template<typename _Iter>
1512 : #if __glibcxx_concepts
1513 : requires __convertible<_Iter>
1514 : #endif
1515 : _GLIBCXX17_CONSTEXPR
1516 : move_iterator(const move_iterator<_Iter>& __i)
1517 : : _M_current(__i._M_current) { }
1518 :
1519 : template<typename _Iter>
1520 : #if __glibcxx_concepts
1521 : requires __convertible<_Iter>
1522 : && assignable_from<_Iterator&, const _Iter&>
1523 : #endif
1524 : _GLIBCXX17_CONSTEXPR
1525 : move_iterator& operator=(const move_iterator<_Iter>& __i)
1526 : {
1527 : _M_current = __i._M_current;
1528 : return *this;
1529 : }
1530 :
1531 : #if __cplusplus <= 201703L
1532 : [[__nodiscard__]]
1533 : _GLIBCXX17_CONSTEXPR iterator_type
1534 0 : base() const
1535 0 : { return _M_current; }
1536 : #else
1537 : [[nodiscard]]
1538 : constexpr const iterator_type&
1539 : base() const & noexcept
1540 : { return _M_current; }
1541 :
1542 : [[nodiscard]]
1543 : constexpr iterator_type
1544 : base() &&
1545 : { return std::move(_M_current); }
1546 : #endif
1547 :
1548 : [[__nodiscard__]]
1549 : _GLIBCXX17_CONSTEXPR reference
1550 0 : operator*() const
1551 : #if __cplusplus > 201703L && __glibcxx_concepts
1552 : { return ranges::iter_move(_M_current); }
1553 : #else
1554 0 : { return static_cast<reference>(*_M_current); }
1555 : #endif
1556 :
1557 : [[__nodiscard__]]
1558 : _GLIBCXX17_CONSTEXPR pointer
1559 : operator->() const
1560 : { return _M_current; }
1561 :
1562 : _GLIBCXX17_CONSTEXPR move_iterator&
1563 0 : operator++()
1564 : {
1565 0 : ++_M_current;
1566 0 : return *this;
1567 : }
1568 :
1569 : _GLIBCXX17_CONSTEXPR move_iterator
1570 : operator++(int)
1571 : {
1572 : move_iterator __tmp = *this;
1573 : ++_M_current;
1574 : return __tmp;
1575 : }
1576 :
1577 : #if __glibcxx_concepts
1578 : constexpr void
1579 : operator++(int) requires (!forward_iterator<_Iterator>)
1580 : { ++_M_current; }
1581 : #endif
1582 :
1583 : _GLIBCXX17_CONSTEXPR move_iterator&
1584 : operator--()
1585 : {
1586 : --_M_current;
1587 : return *this;
1588 : }
1589 :
1590 : _GLIBCXX17_CONSTEXPR move_iterator
1591 : operator--(int)
1592 : {
1593 : move_iterator __tmp = *this;
1594 : --_M_current;
1595 : return __tmp;
1596 : }
1597 :
1598 : [[__nodiscard__]]
1599 : _GLIBCXX17_CONSTEXPR move_iterator
1600 : operator+(difference_type __n) const
1601 : { return move_iterator(_M_current + __n); }
1602 :
1603 : _GLIBCXX17_CONSTEXPR move_iterator&
1604 : operator+=(difference_type __n)
1605 : {
1606 : _M_current += __n;
1607 : return *this;
1608 : }
1609 :
1610 : [[__nodiscard__]]
1611 : _GLIBCXX17_CONSTEXPR move_iterator
1612 : operator-(difference_type __n) const
1613 : { return move_iterator(_M_current - __n); }
1614 :
1615 : _GLIBCXX17_CONSTEXPR move_iterator&
1616 : operator-=(difference_type __n)
1617 : {
1618 : _M_current -= __n;
1619 : return *this;
1620 : }
1621 :
1622 : [[__nodiscard__]]
1623 : _GLIBCXX17_CONSTEXPR reference
1624 : operator[](difference_type __n) const
1625 : #if __cplusplus > 201703L && __glibcxx_concepts
1626 : { return ranges::iter_move(_M_current + __n); }
1627 : #else
1628 : { return std::move(_M_current[__n]); }
1629 : #endif
1630 :
1631 : #if __cplusplus > 201703L && __glibcxx_concepts
1632 : template<sentinel_for<_Iterator> _Sent>
1633 : [[nodiscard]]
1634 : friend constexpr bool
1635 : operator==(const move_iterator& __x, const move_sentinel<_Sent>& __y)
1636 : { return __x.base() == __y.base(); }
1637 :
1638 : template<sized_sentinel_for<_Iterator> _Sent>
1639 : [[nodiscard]]
1640 : friend constexpr iter_difference_t<_Iterator>
1641 : operator-(const move_sentinel<_Sent>& __x, const move_iterator& __y)
1642 : { return __x.base() - __y.base(); }
1643 :
1644 : template<sized_sentinel_for<_Iterator> _Sent>
1645 : [[nodiscard]]
1646 : friend constexpr iter_difference_t<_Iterator>
1647 : operator-(const move_iterator& __x, const move_sentinel<_Sent>& __y)
1648 : { return __x.base() - __y.base(); }
1649 :
1650 : [[nodiscard]]
1651 : friend constexpr iter_rvalue_reference_t<_Iterator>
1652 : iter_move(const move_iterator& __i)
1653 : noexcept(noexcept(ranges::iter_move(__i._M_current)))
1654 : { return ranges::iter_move(__i._M_current); }
1655 :
1656 : template<indirectly_swappable<_Iterator> _Iter2>
1657 : friend constexpr void
1658 : iter_swap(const move_iterator& __x, const move_iterator<_Iter2>& __y)
1659 : noexcept(noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
1660 : { return ranges::iter_swap(__x._M_current, __y._M_current); }
1661 : #endif // C++20
1662 : };
1663 :
1664 : template<typename _IteratorL, typename _IteratorR>
1665 : [[__nodiscard__]]
1666 : inline _GLIBCXX17_CONSTEXPR bool
1667 : operator==(const move_iterator<_IteratorL>& __x,
1668 : const move_iterator<_IteratorR>& __y)
1669 : #if __cplusplus > 201703L && __glibcxx_concepts
1670 : requires requires { { __x.base() == __y.base() } -> convertible_to<bool>; }
1671 : #endif
1672 : { return __x.base() == __y.base(); }
1673 :
1674 : #if __cpp_lib_three_way_comparison
1675 : template<typename _IteratorL,
1676 : three_way_comparable_with<_IteratorL> _IteratorR>
1677 : [[__nodiscard__]]
1678 : constexpr compare_three_way_result_t<_IteratorL, _IteratorR>
1679 : operator<=>(const move_iterator<_IteratorL>& __x,
1680 : const move_iterator<_IteratorR>& __y)
1681 : { return __x.base() <=> __y.base(); }
1682 : #else
1683 : template<typename _IteratorL, typename _IteratorR>
1684 : [[__nodiscard__]]
1685 : inline _GLIBCXX17_CONSTEXPR bool
1686 : operator!=(const move_iterator<_IteratorL>& __x,
1687 : const move_iterator<_IteratorR>& __y)
1688 : { return !(__x == __y); }
1689 : #endif
1690 :
1691 : template<typename _IteratorL, typename _IteratorR>
1692 : [[__nodiscard__]]
1693 : inline _GLIBCXX17_CONSTEXPR bool
1694 : operator<(const move_iterator<_IteratorL>& __x,
1695 : const move_iterator<_IteratorR>& __y)
1696 : #if __cplusplus > 201703L && __glibcxx_concepts
1697 : requires requires { { __x.base() < __y.base() } -> convertible_to<bool>; }
1698 : #endif
1699 : { return __x.base() < __y.base(); }
1700 :
1701 : template<typename _IteratorL, typename _IteratorR>
1702 : [[__nodiscard__]]
1703 : inline _GLIBCXX17_CONSTEXPR bool
1704 : operator<=(const move_iterator<_IteratorL>& __x,
1705 : const move_iterator<_IteratorR>& __y)
1706 : #if __cplusplus > 201703L && __glibcxx_concepts
1707 : requires requires { { __y.base() < __x.base() } -> convertible_to<bool>; }
1708 : #endif
1709 : { return !(__y < __x); }
1710 :
1711 : template<typename _IteratorL, typename _IteratorR>
1712 : [[__nodiscard__]]
1713 : inline _GLIBCXX17_CONSTEXPR bool
1714 : operator>(const move_iterator<_IteratorL>& __x,
1715 : const move_iterator<_IteratorR>& __y)
1716 : #if __cplusplus > 201703L && __glibcxx_concepts
1717 : requires requires { { __y.base() < __x.base() } -> convertible_to<bool>; }
1718 : #endif
1719 : { return __y < __x; }
1720 :
1721 : template<typename _IteratorL, typename _IteratorR>
1722 : [[__nodiscard__]]
1723 : inline _GLIBCXX17_CONSTEXPR bool
1724 : operator>=(const move_iterator<_IteratorL>& __x,
1725 : const move_iterator<_IteratorR>& __y)
1726 : #if __cplusplus > 201703L && __glibcxx_concepts
1727 : requires requires { { __x.base() < __y.base() } -> convertible_to<bool>; }
1728 : #endif
1729 : { return !(__x < __y); }
1730 :
1731 : // Note: See __normal_iterator operators note from Gaby to understand
1732 : // why we have these extra overloads for some move_iterator operators.
1733 :
1734 : template<typename _Iterator>
1735 : [[__nodiscard__]]
1736 : inline _GLIBCXX17_CONSTEXPR bool
1737 0 : operator==(const move_iterator<_Iterator>& __x,
1738 : const move_iterator<_Iterator>& __y)
1739 : // N.B. No contraints, x.base() == y.base() is always well-formed.
1740 0 : { return __x.base() == __y.base(); }
1741 :
1742 : #if __cpp_lib_three_way_comparison
1743 : template<three_way_comparable _Iterator>
1744 : [[__nodiscard__]]
1745 : constexpr compare_three_way_result_t<_Iterator>
1746 : operator<=>(const move_iterator<_Iterator>& __x,
1747 : const move_iterator<_Iterator>& __y)
1748 : { return __x.base() <=> __y.base(); }
1749 : #else
1750 : template<typename _Iterator>
1751 : [[__nodiscard__]]
1752 : inline _GLIBCXX17_CONSTEXPR bool
1753 0 : operator!=(const move_iterator<_Iterator>& __x,
1754 : const move_iterator<_Iterator>& __y)
1755 0 : { return !(__x == __y); }
1756 :
1757 : template<typename _Iterator>
1758 : [[__nodiscard__]]
1759 : inline _GLIBCXX17_CONSTEXPR bool
1760 : operator<(const move_iterator<_Iterator>& __x,
1761 : const move_iterator<_Iterator>& __y)
1762 : { return __x.base() < __y.base(); }
1763 :
1764 : template<typename _Iterator>
1765 : [[__nodiscard__]]
1766 : inline _GLIBCXX17_CONSTEXPR bool
1767 : operator<=(const move_iterator<_Iterator>& __x,
1768 : const move_iterator<_Iterator>& __y)
1769 : { return !(__y < __x); }
1770 :
1771 : template<typename _Iterator>
1772 : [[__nodiscard__]]
1773 : inline _GLIBCXX17_CONSTEXPR bool
1774 : operator>(const move_iterator<_Iterator>& __x,
1775 : const move_iterator<_Iterator>& __y)
1776 : { return __y < __x; }
1777 :
1778 : template<typename _Iterator>
1779 : [[__nodiscard__]]
1780 : inline _GLIBCXX17_CONSTEXPR bool
1781 : operator>=(const move_iterator<_Iterator>& __x,
1782 : const move_iterator<_Iterator>& __y)
1783 : { return !(__x < __y); }
1784 : #endif // ! C++20
1785 :
1786 : // DR 685.
1787 : template<typename _IteratorL, typename _IteratorR>
1788 : [[__nodiscard__]]
1789 : inline _GLIBCXX17_CONSTEXPR auto
1790 : operator-(const move_iterator<_IteratorL>& __x,
1791 : const move_iterator<_IteratorR>& __y)
1792 : -> decltype(__x.base() - __y.base())
1793 : { return __x.base() - __y.base(); }
1794 :
1795 : template<typename _Iterator>
1796 : [[__nodiscard__]]
1797 : inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
1798 : operator+(typename move_iterator<_Iterator>::difference_type __n,
1799 : const move_iterator<_Iterator>& __x)
1800 : #ifdef __glibcxx_concepts
1801 : requires requires { { __x.base() + __n } -> same_as<_Iterator>; }
1802 : #endif
1803 : { return __x + __n; }
1804 :
1805 : template<typename _Iterator>
1806 : [[__nodiscard__]]
1807 : inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
1808 0 : make_move_iterator(_Iterator __i)
1809 0 : { return move_iterator<_Iterator>(std::move(__i)); }
1810 :
1811 : template<typename _Iterator, typename _ReturnType
1812 : = __conditional_t<__move_if_noexcept_cond
1813 : <typename iterator_traits<_Iterator>::value_type>::value,
1814 : _Iterator, move_iterator<_Iterator>>>
1815 : inline _GLIBCXX17_CONSTEXPR _ReturnType
1816 : __make_move_if_noexcept_iterator(_Iterator __i)
1817 : { return _ReturnType(__i); }
1818 :
1819 : // Overload for pointers that matches std::move_if_noexcept more closely,
1820 : // returning a constant iterator when we don't want to move.
1821 : template<typename _Tp, typename _ReturnType
1822 : = __conditional_t<__move_if_noexcept_cond<_Tp>::value,
1823 : const _Tp*, move_iterator<_Tp*>>>
1824 : inline _GLIBCXX17_CONSTEXPR _ReturnType
1825 : __make_move_if_noexcept_iterator(_Tp* __i)
1826 : { return _ReturnType(__i); }
1827 :
1828 : #if __cplusplus > 201703L && __glibcxx_concepts
1829 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1830 : // 3736. move_iterator missing disable_sized_sentinel_for specialization
1831 : template<typename _Iterator1, typename _Iterator2>
1832 : requires (!sized_sentinel_for<_Iterator1, _Iterator2>)
1833 : inline constexpr bool
1834 : disable_sized_sentinel_for<move_iterator<_Iterator1>,
1835 : move_iterator<_Iterator2>> = true;
1836 :
1837 : // [iterators.common] Common iterators
1838 :
1839 : namespace __detail
1840 : {
1841 : template<typename _It>
1842 : concept __common_iter_has_arrow = indirectly_readable<const _It>
1843 : && (requires(const _It& __it) { __it.operator->(); }
1844 : || is_reference_v<iter_reference_t<_It>>
1845 : || constructible_from<iter_value_t<_It>, iter_reference_t<_It>>);
1846 :
1847 : template<typename _It>
1848 : concept __common_iter_use_postfix_proxy
1849 : = (!requires (_It& __i) { { *__i++ } -> __can_reference; })
1850 : && constructible_from<iter_value_t<_It>, iter_reference_t<_It>>
1851 : && move_constructible<iter_value_t<_It>>;
1852 : } // namespace __detail
1853 :
1854 : /// An iterator/sentinel adaptor for representing a non-common range.
1855 : template<input_or_output_iterator _It, sentinel_for<_It> _Sent>
1856 : requires (!same_as<_It, _Sent>) && copyable<_It>
1857 : class common_iterator
1858 : {
1859 : template<typename _Tp, typename _Up>
1860 : static constexpr bool
1861 : _S_noexcept1()
1862 : {
1863 : if constexpr (is_trivially_default_constructible_v<_Tp>)
1864 : return is_nothrow_assignable_v<_Tp&, _Up>;
1865 : else
1866 : return is_nothrow_constructible_v<_Tp, _Up>;
1867 : }
1868 :
1869 : template<typename _It2, typename _Sent2>
1870 : static constexpr bool
1871 : _S_noexcept()
1872 : { return _S_noexcept1<_It, _It2>() && _S_noexcept1<_Sent, _Sent2>(); }
1873 :
1874 : class __arrow_proxy
1875 : {
1876 : iter_value_t<_It> _M_keep;
1877 :
1878 : constexpr
1879 : __arrow_proxy(iter_reference_t<_It>&& __x)
1880 : : _M_keep(std::move(__x)) { }
1881 :
1882 : friend class common_iterator;
1883 :
1884 : public:
1885 : constexpr const iter_value_t<_It>*
1886 : operator->() const noexcept
1887 : { return std::__addressof(_M_keep); }
1888 : };
1889 :
1890 : class __postfix_proxy
1891 : {
1892 : iter_value_t<_It> _M_keep;
1893 :
1894 : constexpr
1895 : __postfix_proxy(iter_reference_t<_It>&& __x)
1896 : : _M_keep(std::forward<iter_reference_t<_It>>(__x)) { }
1897 :
1898 : friend class common_iterator;
1899 :
1900 : public:
1901 : constexpr const iter_value_t<_It>&
1902 : operator*() const noexcept
1903 : { return _M_keep; }
1904 : };
1905 :
1906 : public:
1907 : constexpr
1908 : common_iterator()
1909 : noexcept(is_nothrow_default_constructible_v<_It>)
1910 : requires default_initializable<_It>
1911 : : _M_it(), _M_index(0)
1912 : { }
1913 :
1914 : constexpr
1915 : common_iterator(_It __i)
1916 : noexcept(is_nothrow_move_constructible_v<_It>)
1917 : : _M_it(std::move(__i)), _M_index(0)
1918 : { }
1919 :
1920 : constexpr
1921 : common_iterator(_Sent __s)
1922 : noexcept(is_nothrow_move_constructible_v<_Sent>)
1923 : : _M_sent(std::move(__s)), _M_index(1)
1924 : { }
1925 :
1926 : template<typename _It2, typename _Sent2>
1927 : requires convertible_to<const _It2&, _It>
1928 : && convertible_to<const _Sent2&, _Sent>
1929 : constexpr
1930 : common_iterator(const common_iterator<_It2, _Sent2>& __x)
1931 : noexcept(_S_noexcept<const _It2&, const _Sent2&>())
1932 : : _M_valueless(), _M_index(__x._M_index)
1933 : {
1934 : __glibcxx_assert(__x._M_has_value());
1935 : if (_M_index == 0)
1936 : {
1937 : if constexpr (is_trivially_default_constructible_v<_It>)
1938 : _M_it = std::move(__x._M_it);
1939 : else
1940 : std::construct_at(std::__addressof(_M_it), __x._M_it);
1941 : }
1942 : else if (_M_index == 1)
1943 : {
1944 : if constexpr (is_trivially_default_constructible_v<_Sent>)
1945 : _M_sent = std::move(__x._M_sent);
1946 : else
1947 : std::construct_at(std::__addressof(_M_sent), __x._M_sent);
1948 : }
1949 : }
1950 :
1951 : common_iterator(const common_iterator&) = default;
1952 :
1953 : constexpr
1954 : common_iterator(const common_iterator& __x)
1955 : noexcept(_S_noexcept<const _It&, const _Sent&>())
1956 : requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>)
1957 : : _M_valueless(), _M_index(__x._M_index)
1958 : {
1959 : if (_M_index == 0)
1960 : {
1961 : if constexpr (is_trivially_default_constructible_v<_It>)
1962 : _M_it = __x._M_it;
1963 : else
1964 : std::construct_at(std::__addressof(_M_it), __x._M_it);
1965 : }
1966 : else if (_M_index == 1)
1967 : {
1968 : if constexpr (is_trivially_default_constructible_v<_Sent>)
1969 : _M_sent = __x._M_sent;
1970 : else
1971 : std::construct_at(std::__addressof(_M_sent), __x._M_sent);
1972 : }
1973 : }
1974 :
1975 : common_iterator(common_iterator&&) = default;
1976 :
1977 : constexpr
1978 : common_iterator(common_iterator&& __x)
1979 : noexcept(_S_noexcept<_It, _Sent>())
1980 : requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>)
1981 : : _M_valueless(), _M_index(__x._M_index)
1982 : {
1983 : if (_M_index == 0)
1984 : {
1985 : if constexpr (is_trivially_default_constructible_v<_It>)
1986 : _M_it = std::move(__x._M_it);
1987 : else
1988 : std::construct_at(std::__addressof(_M_it), std::move(__x._M_it));
1989 : }
1990 : else if (_M_index == 1)
1991 : {
1992 : if constexpr (is_trivially_default_constructible_v<_Sent>)
1993 : _M_sent = std::move(__x._M_sent);
1994 : else
1995 : std::construct_at(std::__addressof(_M_sent),
1996 : std::move(__x._M_sent));
1997 : }
1998 : }
1999 :
2000 : constexpr common_iterator&
2001 : operator=(const common_iterator&) = default;
2002 :
2003 : constexpr common_iterator&
2004 : operator=(const common_iterator& __x)
2005 : noexcept(is_nothrow_copy_assignable_v<_It>
2006 : && is_nothrow_copy_assignable_v<_Sent>
2007 : && is_nothrow_copy_constructible_v<_It>
2008 : && is_nothrow_copy_constructible_v<_Sent>)
2009 : requires (!is_trivially_copy_assignable_v<_It>
2010 : || !is_trivially_copy_assignable_v<_Sent>)
2011 : {
2012 : _M_assign(__x);
2013 : return *this;
2014 : }
2015 :
2016 : constexpr common_iterator&
2017 : operator=(common_iterator&&) = default;
2018 :
2019 : constexpr common_iterator&
2020 : operator=(common_iterator&& __x)
2021 : noexcept(is_nothrow_move_assignable_v<_It>
2022 : && is_nothrow_move_assignable_v<_Sent>
2023 : && is_nothrow_move_constructible_v<_It>
2024 : && is_nothrow_move_constructible_v<_Sent>)
2025 : requires (!is_trivially_move_assignable_v<_It>
2026 : || !is_trivially_move_assignable_v<_Sent>)
2027 : {
2028 : _M_assign(std::move(__x));
2029 : return *this;
2030 : }
2031 :
2032 : template<typename _It2, typename _Sent2>
2033 : requires convertible_to<const _It2&, _It>
2034 : && convertible_to<const _Sent2&, _Sent>
2035 : && assignable_from<_It&, const _It2&>
2036 : && assignable_from<_Sent&, const _Sent2&>
2037 : constexpr common_iterator&
2038 : operator=(const common_iterator<_It2, _Sent2>& __x)
2039 : noexcept(is_nothrow_constructible_v<_It, const _It2&>
2040 : && is_nothrow_constructible_v<_Sent, const _Sent2&>
2041 : && is_nothrow_assignable_v<_It&, const _It2&>
2042 : && is_nothrow_assignable_v<_Sent&, const _Sent2&>)
2043 : {
2044 : __glibcxx_assert(__x._M_has_value());
2045 : _M_assign(__x);
2046 : return *this;
2047 : }
2048 :
2049 : #if __cpp_concepts >= 202002L // Constrained special member functions
2050 : ~common_iterator() = default;
2051 :
2052 : constexpr
2053 : ~common_iterator()
2054 : requires (!is_trivially_destructible_v<_It>
2055 : || !is_trivially_destructible_v<_Sent>)
2056 : #else
2057 : constexpr
2058 : ~common_iterator()
2059 : #endif
2060 : {
2061 : if (_M_index == 0)
2062 : _M_it.~_It();
2063 : else if (_M_index == 1)
2064 : _M_sent.~_Sent();
2065 : }
2066 :
2067 : [[nodiscard]]
2068 : constexpr decltype(auto)
2069 : operator*()
2070 : {
2071 : __glibcxx_assert(_M_index == 0);
2072 : return *_M_it;
2073 : }
2074 :
2075 : [[nodiscard]]
2076 : constexpr decltype(auto)
2077 : operator*() const requires __detail::__dereferenceable<const _It>
2078 : {
2079 : __glibcxx_assert(_M_index == 0);
2080 : return *_M_it;
2081 : }
2082 :
2083 : [[nodiscard]]
2084 : constexpr auto
2085 : operator->() const requires __detail::__common_iter_has_arrow<_It>
2086 : {
2087 : __glibcxx_assert(_M_index == 0);
2088 : if constexpr (is_pointer_v<_It> || requires { _M_it.operator->(); })
2089 : return _M_it;
2090 : else if constexpr (is_reference_v<iter_reference_t<_It>>)
2091 : {
2092 : auto&& __tmp = *_M_it;
2093 : return std::__addressof(__tmp);
2094 : }
2095 : else
2096 : return __arrow_proxy{*_M_it};
2097 : }
2098 :
2099 : constexpr common_iterator&
2100 : operator++()
2101 : {
2102 : __glibcxx_assert(_M_index == 0);
2103 : ++_M_it;
2104 : return *this;
2105 : }
2106 :
2107 : constexpr decltype(auto)
2108 : operator++(int)
2109 : {
2110 : __glibcxx_assert(_M_index == 0);
2111 : if constexpr (forward_iterator<_It>)
2112 : {
2113 : common_iterator __tmp = *this;
2114 : ++*this;
2115 : return __tmp;
2116 : }
2117 : else if constexpr (!__detail::__common_iter_use_postfix_proxy<_It>)
2118 : return _M_it++;
2119 : else
2120 : {
2121 : __postfix_proxy __p(**this);
2122 : ++*this;
2123 : return __p;
2124 : }
2125 : }
2126 :
2127 : template<typename _It2, sentinel_for<_It> _Sent2>
2128 : requires sentinel_for<_Sent, _It2>
2129 : friend constexpr bool
2130 : operator== [[nodiscard]] (const common_iterator& __x,
2131 : const common_iterator<_It2, _Sent2>& __y)
2132 : {
2133 : switch(__x._M_index << 2 | __y._M_index)
2134 : {
2135 : case 0b0000:
2136 : case 0b0101:
2137 : return true;
2138 : case 0b0001:
2139 : return __x._M_it == __y._M_sent;
2140 : case 0b0100:
2141 : return __x._M_sent == __y._M_it;
2142 : default:
2143 : __glibcxx_assert(__x._M_has_value());
2144 : __glibcxx_assert(__y._M_has_value());
2145 : __builtin_unreachable();
2146 : }
2147 : }
2148 :
2149 : template<typename _It2, sentinel_for<_It> _Sent2>
2150 : requires sentinel_for<_Sent, _It2> && equality_comparable_with<_It, _It2>
2151 : friend constexpr bool
2152 : operator== [[nodiscard]] (const common_iterator& __x,
2153 : const common_iterator<_It2, _Sent2>& __y)
2154 : {
2155 : switch(__x._M_index << 2 | __y._M_index)
2156 : {
2157 : case 0b0101:
2158 : return true;
2159 : case 0b0000:
2160 : return __x._M_it == __y._M_it;
2161 : case 0b0001:
2162 : return __x._M_it == __y._M_sent;
2163 : case 0b0100:
2164 : return __x._M_sent == __y._M_it;
2165 : default:
2166 : __glibcxx_assert(__x._M_has_value());
2167 : __glibcxx_assert(__y._M_has_value());
2168 : __builtin_unreachable();
2169 : }
2170 : }
2171 :
2172 : template<sized_sentinel_for<_It> _It2, sized_sentinel_for<_It> _Sent2>
2173 : requires sized_sentinel_for<_Sent, _It2>
2174 : friend constexpr iter_difference_t<_It2>
2175 : operator- [[nodiscard]] (const common_iterator& __x,
2176 : const common_iterator<_It2, _Sent2>& __y)
2177 : {
2178 : switch(__x._M_index << 2 | __y._M_index)
2179 : {
2180 : case 0b0101:
2181 : return 0;
2182 : case 0b0000:
2183 : return __x._M_it - __y._M_it;
2184 : case 0b0001:
2185 : return __x._M_it - __y._M_sent;
2186 : case 0b0100:
2187 : return __x._M_sent - __y._M_it;
2188 : default:
2189 : __glibcxx_assert(__x._M_has_value());
2190 : __glibcxx_assert(__y._M_has_value());
2191 : __builtin_unreachable();
2192 : }
2193 : }
2194 :
2195 : [[nodiscard]]
2196 : friend constexpr iter_rvalue_reference_t<_It>
2197 : iter_move(const common_iterator& __i)
2198 : noexcept(noexcept(ranges::iter_move(std::declval<const _It&>())))
2199 : requires input_iterator<_It>
2200 : {
2201 : __glibcxx_assert(__i._M_index == 0);
2202 : return ranges::iter_move(__i._M_it);
2203 : }
2204 :
2205 : template<indirectly_swappable<_It> _It2, typename _Sent2>
2206 : friend constexpr void
2207 : iter_swap(const common_iterator& __x,
2208 : const common_iterator<_It2, _Sent2>& __y)
2209 : noexcept(noexcept(ranges::iter_swap(std::declval<const _It&>(),
2210 : std::declval<const _It2&>())))
2211 : {
2212 : __glibcxx_assert(__x._M_index == 0);
2213 : __glibcxx_assert(__y._M_index == 0);
2214 : return ranges::iter_swap(__x._M_it, __y._M_it);
2215 : }
2216 :
2217 : private:
2218 : template<input_or_output_iterator _It2, sentinel_for<_It2> _Sent2>
2219 : requires (!same_as<_It2, _Sent2>) && copyable<_It2>
2220 : friend class common_iterator;
2221 :
2222 : constexpr bool
2223 : _M_has_value() const noexcept { return _M_index != _S_valueless; }
2224 :
2225 : template<typename _CIt>
2226 : constexpr void
2227 : _M_assign(_CIt&& __x)
2228 : {
2229 : if (_M_index == __x._M_index)
2230 : {
2231 : if (_M_index == 0)
2232 : _M_it = std::forward<_CIt>(__x)._M_it;
2233 : else if (_M_index == 1)
2234 : _M_sent = std::forward<_CIt>(__x)._M_sent;
2235 : }
2236 : else
2237 : {
2238 : if (_M_index == 0)
2239 : _M_it.~_It();
2240 : else if (_M_index == 1)
2241 : _M_sent.~_Sent();
2242 : _M_index = _S_valueless;
2243 :
2244 : if (__x._M_index == 0)
2245 : std::construct_at(std::__addressof(_M_it),
2246 : std::forward<_CIt>(__x)._M_it);
2247 : else if (__x._M_index == 1)
2248 : std::construct_at(std::__addressof(_M_sent),
2249 : std::forward<_CIt>(__x)._M_sent);
2250 : _M_index = __x._M_index;
2251 : }
2252 : }
2253 :
2254 : union
2255 : {
2256 : _It _M_it;
2257 : _Sent _M_sent;
2258 : unsigned char _M_valueless;
2259 : };
2260 : unsigned char _M_index; // 0 == _M_it, 1 == _M_sent, 2 == valueless
2261 :
2262 : static constexpr unsigned char _S_valueless{2};
2263 : };
2264 :
2265 : template<typename _It, typename _Sent>
2266 : struct incrementable_traits<common_iterator<_It, _Sent>>
2267 : {
2268 : using difference_type = iter_difference_t<_It>;
2269 : };
2270 :
2271 : template<input_iterator _It, typename _Sent>
2272 : struct iterator_traits<common_iterator<_It, _Sent>>
2273 : {
2274 : private:
2275 : template<typename _Iter>
2276 : struct __ptr
2277 : {
2278 : using type = void;
2279 : };
2280 :
2281 : template<typename _Iter>
2282 : requires __detail::__common_iter_has_arrow<_Iter>
2283 : struct __ptr<_Iter>
2284 : {
2285 : using _CIter = common_iterator<_Iter, _Sent>;
2286 : using type = decltype(std::declval<const _CIter&>().operator->());
2287 : };
2288 :
2289 : static auto
2290 : _S_iter_cat()
2291 : {
2292 : if constexpr (requires { requires derived_from<__iter_category_t<_It>,
2293 : forward_iterator_tag>; })
2294 : return forward_iterator_tag{};
2295 : else
2296 : return input_iterator_tag{};
2297 : }
2298 :
2299 : public:
2300 : using iterator_concept = __conditional_t<forward_iterator<_It>,
2301 : forward_iterator_tag,
2302 : input_iterator_tag>;
2303 : using iterator_category = decltype(_S_iter_cat());
2304 : using value_type = iter_value_t<_It>;
2305 : using difference_type = iter_difference_t<_It>;
2306 : using pointer = typename __ptr<_It>::type;
2307 : using reference = iter_reference_t<_It>;
2308 : };
2309 :
2310 : // [iterators.counted] Counted iterators
2311 :
2312 : namespace __detail
2313 : {
2314 : template<typename _It>
2315 : struct __counted_iter_value_type
2316 : { };
2317 :
2318 : template<indirectly_readable _It>
2319 : struct __counted_iter_value_type<_It>
2320 : { using value_type = iter_value_t<_It>; };
2321 :
2322 : template<typename _It>
2323 : struct __counted_iter_concept
2324 : { };
2325 :
2326 : template<typename _It>
2327 : requires requires { typename _It::iterator_concept; }
2328 : struct __counted_iter_concept<_It>
2329 : { using iterator_concept = typename _It::iterator_concept; };
2330 :
2331 : template<typename _It>
2332 : struct __counted_iter_cat
2333 : { };
2334 :
2335 : template<typename _It>
2336 : requires requires { typename _It::iterator_category; }
2337 : struct __counted_iter_cat<_It>
2338 : { using iterator_category = typename _It::iterator_category; };
2339 : }
2340 :
2341 : /// An iterator adaptor that keeps track of the distance to the end.
2342 : template<input_or_output_iterator _It>
2343 : class counted_iterator
2344 : : public __detail::__counted_iter_value_type<_It>,
2345 : public __detail::__counted_iter_concept<_It>,
2346 : public __detail::__counted_iter_cat<_It>
2347 : {
2348 : public:
2349 : using iterator_type = _It;
2350 : // value_type defined in __counted_iter_value_type
2351 : using difference_type = iter_difference_t<_It>;
2352 : // iterator_concept defined in __counted_iter_concept
2353 : // iterator_category defined in __counted_iter_cat
2354 :
2355 : constexpr counted_iterator() requires default_initializable<_It> = default;
2356 :
2357 : constexpr
2358 : counted_iterator(_It __i, iter_difference_t<_It> __n)
2359 : : _M_current(std::move(__i)), _M_length(__n)
2360 : { __glibcxx_assert(__n >= 0); }
2361 :
2362 : template<typename _It2>
2363 : requires convertible_to<const _It2&, _It>
2364 : constexpr
2365 : counted_iterator(const counted_iterator<_It2>& __x)
2366 : : _M_current(__x._M_current), _M_length(__x._M_length)
2367 : { }
2368 :
2369 : template<typename _It2>
2370 : requires assignable_from<_It&, const _It2&>
2371 : constexpr counted_iterator&
2372 : operator=(const counted_iterator<_It2>& __x)
2373 : {
2374 : _M_current = __x._M_current;
2375 : _M_length = __x._M_length;
2376 : return *this;
2377 : }
2378 :
2379 : [[nodiscard]]
2380 : constexpr const _It&
2381 : base() const & noexcept
2382 : { return _M_current; }
2383 :
2384 : [[nodiscard]]
2385 : constexpr _It
2386 : base() &&
2387 : noexcept(is_nothrow_move_constructible_v<_It>)
2388 : { return std::move(_M_current); }
2389 :
2390 : [[nodiscard]]
2391 : constexpr iter_difference_t<_It>
2392 : count() const noexcept { return _M_length; }
2393 :
2394 : [[nodiscard]]
2395 : constexpr decltype(auto)
2396 : operator*()
2397 : noexcept(noexcept(*_M_current))
2398 : {
2399 : __glibcxx_assert( _M_length > 0 );
2400 : return *_M_current;
2401 : }
2402 :
2403 : [[nodiscard]]
2404 : constexpr decltype(auto)
2405 : operator*() const
2406 : noexcept(noexcept(*_M_current))
2407 : requires __detail::__dereferenceable<const _It>
2408 : {
2409 : __glibcxx_assert( _M_length > 0 );
2410 : return *_M_current;
2411 : }
2412 :
2413 : [[nodiscard]]
2414 : constexpr auto
2415 : operator->() const noexcept
2416 : requires contiguous_iterator<_It>
2417 : { return std::to_address(_M_current); }
2418 :
2419 : constexpr counted_iterator&
2420 : operator++()
2421 : {
2422 : __glibcxx_assert(_M_length > 0);
2423 : ++_M_current;
2424 : --_M_length;
2425 : return *this;
2426 : }
2427 :
2428 : constexpr decltype(auto)
2429 : operator++(int)
2430 : {
2431 : __glibcxx_assert(_M_length > 0);
2432 : --_M_length;
2433 : __try
2434 : {
2435 : return _M_current++;
2436 : } __catch(...) {
2437 : ++_M_length;
2438 : __throw_exception_again;
2439 : }
2440 : }
2441 :
2442 : constexpr counted_iterator
2443 : operator++(int) requires forward_iterator<_It>
2444 : {
2445 : auto __tmp = *this;
2446 : ++*this;
2447 : return __tmp;
2448 : }
2449 :
2450 : constexpr counted_iterator&
2451 : operator--() requires bidirectional_iterator<_It>
2452 : {
2453 : --_M_current;
2454 : ++_M_length;
2455 : return *this;
2456 : }
2457 :
2458 : constexpr counted_iterator
2459 : operator--(int) requires bidirectional_iterator<_It>
2460 : {
2461 : auto __tmp = *this;
2462 : --*this;
2463 : return __tmp;
2464 : }
2465 :
2466 : [[nodiscard]]
2467 : constexpr counted_iterator
2468 : operator+(iter_difference_t<_It> __n) const
2469 : requires random_access_iterator<_It>
2470 : { return counted_iterator(_M_current + __n, _M_length - __n); }
2471 :
2472 : [[nodiscard]]
2473 : friend constexpr counted_iterator
2474 : operator+(iter_difference_t<_It> __n, const counted_iterator& __x)
2475 : requires random_access_iterator<_It>
2476 : { return __x + __n; }
2477 :
2478 : constexpr counted_iterator&
2479 : operator+=(iter_difference_t<_It> __n)
2480 : requires random_access_iterator<_It>
2481 : {
2482 : __glibcxx_assert(__n <= _M_length);
2483 : _M_current += __n;
2484 : _M_length -= __n;
2485 : return *this;
2486 : }
2487 :
2488 : [[nodiscard]]
2489 : constexpr counted_iterator
2490 : operator-(iter_difference_t<_It> __n) const
2491 : requires random_access_iterator<_It>
2492 : { return counted_iterator(_M_current - __n, _M_length + __n); }
2493 :
2494 : template<common_with<_It> _It2>
2495 : [[nodiscard]]
2496 : friend constexpr iter_difference_t<_It2>
2497 : operator-(const counted_iterator& __x,
2498 : const counted_iterator<_It2>& __y)
2499 : { return __y._M_length - __x._M_length; }
2500 :
2501 : [[nodiscard]]
2502 : friend constexpr iter_difference_t<_It>
2503 : operator-(const counted_iterator& __x, default_sentinel_t)
2504 : { return -__x._M_length; }
2505 :
2506 : [[nodiscard]]
2507 : friend constexpr iter_difference_t<_It>
2508 : operator-(default_sentinel_t, const counted_iterator& __y)
2509 : { return __y._M_length; }
2510 :
2511 : constexpr counted_iterator&
2512 : operator-=(iter_difference_t<_It> __n)
2513 : requires random_access_iterator<_It>
2514 : {
2515 : __glibcxx_assert(-__n <= _M_length);
2516 : _M_current -= __n;
2517 : _M_length += __n;
2518 : return *this;
2519 : }
2520 :
2521 : [[nodiscard]]
2522 : constexpr decltype(auto)
2523 : operator[](iter_difference_t<_It> __n) const
2524 : noexcept(noexcept(_M_current[__n]))
2525 : requires random_access_iterator<_It>
2526 : {
2527 : __glibcxx_assert(__n < _M_length);
2528 : return _M_current[__n];
2529 : }
2530 :
2531 : template<common_with<_It> _It2>
2532 : [[nodiscard]]
2533 : friend constexpr bool
2534 : operator==(const counted_iterator& __x,
2535 : const counted_iterator<_It2>& __y)
2536 : { return __x._M_length == __y._M_length; }
2537 :
2538 : [[nodiscard]]
2539 : friend constexpr bool
2540 : operator==(const counted_iterator& __x, default_sentinel_t)
2541 : { return __x._M_length == 0; }
2542 :
2543 : template<common_with<_It> _It2>
2544 : [[nodiscard]]
2545 : friend constexpr strong_ordering
2546 : operator<=>(const counted_iterator& __x,
2547 : const counted_iterator<_It2>& __y)
2548 : { return __y._M_length <=> __x._M_length; }
2549 :
2550 : [[nodiscard]]
2551 : friend constexpr iter_rvalue_reference_t<_It>
2552 : iter_move(const counted_iterator& __i)
2553 : noexcept(noexcept(ranges::iter_move(__i._M_current)))
2554 : requires input_iterator<_It>
2555 : {
2556 : __glibcxx_assert( __i._M_length > 0 );
2557 : return ranges::iter_move(__i._M_current);
2558 : }
2559 :
2560 : template<indirectly_swappable<_It> _It2>
2561 : friend constexpr void
2562 : iter_swap(const counted_iterator& __x,
2563 : const counted_iterator<_It2>& __y)
2564 : noexcept(noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
2565 : {
2566 : __glibcxx_assert( __x._M_length > 0 && __y._M_length > 0 );
2567 : ranges::iter_swap(__x._M_current, __y._M_current);
2568 : }
2569 :
2570 : private:
2571 : template<input_or_output_iterator _It2> friend class counted_iterator;
2572 :
2573 : _It _M_current = _It();
2574 : iter_difference_t<_It> _M_length = 0;
2575 : };
2576 :
2577 : template<input_iterator _It>
2578 : requires same_as<__detail::__iter_traits<_It>, iterator_traits<_It>>
2579 : struct iterator_traits<counted_iterator<_It>> : iterator_traits<_It>
2580 : {
2581 : using pointer = __conditional_t<contiguous_iterator<_It>,
2582 : add_pointer_t<iter_reference_t<_It>>,
2583 : void>;
2584 : };
2585 :
2586 : #if __glibcxx_ranges_as_const // >= C++23
2587 : template<indirectly_readable _It>
2588 : using iter_const_reference_t
2589 : = common_reference_t<const iter_value_t<_It>&&, iter_reference_t<_It>>;
2590 :
2591 : template<input_iterator _It> class basic_const_iterator;
2592 :
2593 : namespace __detail
2594 : {
2595 : template<typename _It>
2596 : concept __constant_iterator = input_iterator<_It>
2597 : && same_as<iter_const_reference_t<_It>, iter_reference_t<_It>>;
2598 :
2599 : template<typename _Tp>
2600 : inline constexpr bool __is_const_iterator = false;
2601 :
2602 : template<typename _It>
2603 : inline constexpr bool __is_const_iterator<basic_const_iterator<_It>> = true;
2604 :
2605 : template<typename _Tp>
2606 : concept __not_a_const_iterator = !__is_const_iterator<_Tp>;
2607 :
2608 : template<indirectly_readable _It>
2609 : using __iter_const_rvalue_reference_t
2610 : = common_reference_t<const iter_value_t<_It>&&, iter_rvalue_reference_t<_It>>;
2611 :
2612 : template<typename _It>
2613 : struct __basic_const_iterator_iter_cat
2614 : { };
2615 :
2616 : template<forward_iterator _It>
2617 : struct __basic_const_iterator_iter_cat<_It>
2618 : { using iterator_category = __iter_category_t<_It>; };
2619 : } // namespace detail
2620 :
2621 : template<input_iterator _It>
2622 : using const_iterator
2623 : = __conditional_t<__detail::__constant_iterator<_It>, _It, basic_const_iterator<_It>>;
2624 :
2625 : namespace __detail
2626 : {
2627 : template<typename _Sent>
2628 : struct __const_sentinel
2629 : { using type = _Sent; };
2630 :
2631 : template<input_iterator _Sent>
2632 : struct __const_sentinel<_Sent>
2633 : { using type = const_iterator<_Sent>; };
2634 : } // namespace __detail
2635 :
2636 : template<semiregular _Sent>
2637 : using const_sentinel = typename __detail::__const_sentinel<_Sent>::type;
2638 :
2639 : template<input_iterator _It>
2640 : class basic_const_iterator
2641 : : public __detail::__basic_const_iterator_iter_cat<_It>
2642 : {
2643 : _It _M_current = _It();
2644 : using __reference = iter_const_reference_t<_It>;
2645 : using __rvalue_reference = __detail::__iter_const_rvalue_reference_t<_It>;
2646 :
2647 : static auto
2648 : _S_iter_concept()
2649 : {
2650 : if constexpr (contiguous_iterator<_It>)
2651 : return contiguous_iterator_tag{};
2652 : else if constexpr (random_access_iterator<_It>)
2653 : return random_access_iterator_tag{};
2654 : else if constexpr (bidirectional_iterator<_It>)
2655 : return bidirectional_iterator_tag{};
2656 : else if constexpr (forward_iterator<_It>)
2657 : return forward_iterator_tag{};
2658 : else
2659 : return input_iterator_tag{};
2660 : }
2661 :
2662 : template<input_iterator _It2> friend class basic_const_iterator;
2663 :
2664 : public:
2665 : using iterator_concept = decltype(_S_iter_concept());
2666 : using value_type = iter_value_t<_It>;
2667 : using difference_type = iter_difference_t<_It>;
2668 :
2669 : basic_const_iterator() requires default_initializable<_It> = default;
2670 :
2671 : constexpr
2672 : basic_const_iterator(_It __current)
2673 : noexcept(is_nothrow_move_constructible_v<_It>)
2674 : : _M_current(std::move(__current))
2675 : { }
2676 :
2677 : template<convertible_to<_It> _It2>
2678 : constexpr
2679 : basic_const_iterator(basic_const_iterator<_It2> __current)
2680 : noexcept(is_nothrow_constructible_v<_It, _It2>)
2681 : : _M_current(std::move(__current._M_current))
2682 : { }
2683 :
2684 : template<__detail::__different_from<basic_const_iterator> _Tp>
2685 : requires convertible_to<_Tp, _It>
2686 : constexpr
2687 : basic_const_iterator(_Tp&& __current)
2688 : noexcept(is_nothrow_constructible_v<_It, _Tp>)
2689 : : _M_current(std::forward<_Tp>(__current))
2690 : { }
2691 :
2692 : constexpr const _It&
2693 : base() const & noexcept
2694 : { return _M_current; }
2695 :
2696 : constexpr _It
2697 : base() &&
2698 : noexcept(is_nothrow_move_constructible_v<_It>)
2699 : { return std::move(_M_current); }
2700 :
2701 : constexpr __reference
2702 : operator*() const
2703 : noexcept(noexcept(static_cast<__reference>(*_M_current)))
2704 : { return static_cast<__reference>(*_M_current); }
2705 :
2706 : constexpr const auto*
2707 : operator->() const
2708 : noexcept(contiguous_iterator<_It> || noexcept(*_M_current))
2709 : requires is_lvalue_reference_v<iter_reference_t<_It>>
2710 : && same_as<remove_cvref_t<iter_reference_t<_It>>, value_type>
2711 : {
2712 : if constexpr (contiguous_iterator<_It>)
2713 : return std::to_address(_M_current);
2714 : else
2715 : return std::__addressof(*_M_current);
2716 : }
2717 :
2718 : constexpr basic_const_iterator&
2719 : operator++()
2720 : noexcept(noexcept(++_M_current))
2721 : {
2722 : ++_M_current;
2723 : return *this;
2724 : }
2725 :
2726 : constexpr void
2727 : operator++(int)
2728 : noexcept(noexcept(++_M_current))
2729 : { ++_M_current; }
2730 :
2731 : constexpr basic_const_iterator
2732 : operator++(int)
2733 : noexcept(noexcept(++*this) && is_nothrow_copy_constructible_v<basic_const_iterator>)
2734 : requires forward_iterator<_It>
2735 : {
2736 : auto __tmp = *this;
2737 : ++*this;
2738 : return __tmp;
2739 : }
2740 :
2741 : constexpr basic_const_iterator&
2742 : operator--()
2743 : noexcept(noexcept(--_M_current))
2744 : requires bidirectional_iterator<_It>
2745 : {
2746 : --_M_current;
2747 : return *this;
2748 : }
2749 :
2750 : constexpr basic_const_iterator
2751 : operator--(int)
2752 : noexcept(noexcept(--*this) && is_nothrow_copy_constructible_v<basic_const_iterator>)
2753 : requires bidirectional_iterator<_It>
2754 : {
2755 : auto __tmp = *this;
2756 : --*this;
2757 : return __tmp;
2758 : }
2759 :
2760 : constexpr basic_const_iterator&
2761 : operator+=(difference_type __n)
2762 : noexcept(noexcept(_M_current += __n))
2763 : requires random_access_iterator<_It>
2764 : {
2765 : _M_current += __n;
2766 : return *this;
2767 : }
2768 :
2769 : constexpr basic_const_iterator&
2770 : operator-=(difference_type __n)
2771 : noexcept(noexcept(_M_current -= __n))
2772 : requires random_access_iterator<_It>
2773 : {
2774 : _M_current -= __n;
2775 : return *this;
2776 : }
2777 :
2778 : constexpr __reference
2779 : operator[](difference_type __n) const
2780 : noexcept(noexcept(static_cast<__reference>(_M_current[__n])))
2781 : requires random_access_iterator<_It>
2782 : { return static_cast<__reference>(_M_current[__n]); }
2783 :
2784 : template<sentinel_for<_It> _Sent>
2785 : constexpr bool
2786 : operator==(const _Sent& __s) const
2787 : noexcept(noexcept(_M_current == __s))
2788 : { return _M_current == __s; }
2789 :
2790 : template<__detail::__not_a_const_iterator _CIt>
2791 : requires __detail::__constant_iterator<_CIt> && convertible_to<_It, _CIt>
2792 : constexpr
2793 : operator _CIt() const&
2794 : { return _M_current; }
2795 :
2796 : template<__detail::__not_a_const_iterator _CIt>
2797 : requires __detail::__constant_iterator<_CIt> && convertible_to<_It, _CIt>
2798 : constexpr
2799 : operator _CIt() &&
2800 : { return std::move(_M_current); }
2801 :
2802 : constexpr bool
2803 : operator<(const basic_const_iterator& __y) const
2804 : noexcept(noexcept(_M_current < __y._M_current))
2805 : requires random_access_iterator<_It>
2806 : { return _M_current < __y._M_current; }
2807 :
2808 : constexpr bool
2809 : operator>(const basic_const_iterator& __y) const
2810 : noexcept(noexcept(_M_current > __y._M_current))
2811 : requires random_access_iterator<_It>
2812 : { return _M_current > __y._M_current; }
2813 :
2814 : constexpr bool
2815 : operator<=(const basic_const_iterator& __y) const
2816 : noexcept(noexcept(_M_current <= __y._M_current))
2817 : requires random_access_iterator<_It>
2818 : { return _M_current <= __y._M_current; }
2819 :
2820 : constexpr bool
2821 : operator>=(const basic_const_iterator& __y) const
2822 : noexcept(noexcept(_M_current >= __y._M_current))
2823 : requires random_access_iterator<_It>
2824 : { return _M_current >= __y._M_current; }
2825 :
2826 : constexpr auto
2827 : operator<=>(const basic_const_iterator& __y) const
2828 : noexcept(noexcept(_M_current <=> __y._M_current))
2829 : requires random_access_iterator<_It> && three_way_comparable<_It>
2830 : { return _M_current <=> __y._M_current; }
2831 :
2832 : template<__detail::__different_from<basic_const_iterator> _It2>
2833 : constexpr bool
2834 : operator<(const _It2& __y) const
2835 : noexcept(noexcept(_M_current < __y))
2836 : requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2837 : { return _M_current < __y; }
2838 :
2839 : template<__detail::__different_from<basic_const_iterator> _It2>
2840 : constexpr bool
2841 : operator>(const _It2& __y) const
2842 : noexcept(noexcept(_M_current > __y))
2843 : requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2844 : { return _M_current > __y; }
2845 :
2846 : template<__detail::__different_from<basic_const_iterator> _It2>
2847 : constexpr bool
2848 : operator<=(const _It2& __y) const
2849 : noexcept(noexcept(_M_current <= __y))
2850 : requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2851 : { return _M_current <= __y; }
2852 :
2853 : template<__detail::__different_from<basic_const_iterator> _It2>
2854 : constexpr bool
2855 : operator>=(const _It2& __y) const
2856 : noexcept(noexcept(_M_current >= __y))
2857 : requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2858 : { return _M_current >= __y; }
2859 :
2860 : template<__detail::__different_from<basic_const_iterator> _It2>
2861 : constexpr auto
2862 : operator<=>(const _It2& __y) const
2863 : noexcept(noexcept(_M_current <=> __y))
2864 : requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2865 : && three_way_comparable_with<_It, _It2>
2866 : { return _M_current <=> __y; }
2867 :
2868 : template<__detail::__not_a_const_iterator _It2>
2869 : friend constexpr bool
2870 : operator<(const _It2& __x, const basic_const_iterator& __y)
2871 : noexcept(noexcept(__x < __y._M_current))
2872 : requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2873 : { return __x < __y._M_current; }
2874 :
2875 : template<__detail::__not_a_const_iterator _It2>
2876 : friend constexpr bool
2877 : operator>(const _It2& __x, const basic_const_iterator& __y)
2878 : noexcept(noexcept(__x > __y._M_current))
2879 : requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2880 : { return __x > __y._M_current; }
2881 :
2882 : template<__detail::__not_a_const_iterator _It2>
2883 : friend constexpr bool
2884 : operator<=(const _It2& __x, const basic_const_iterator& __y)
2885 : noexcept(noexcept(__x <= __y._M_current))
2886 : requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2887 : { return __x <= __y._M_current; }
2888 :
2889 : template<__detail::__not_a_const_iterator _It2>
2890 : friend constexpr bool
2891 : operator>=(const _It2& __x, const basic_const_iterator& __y)
2892 : noexcept(noexcept(__x >= __y._M_current))
2893 : requires random_access_iterator<_It> && totally_ordered_with<_It, _It2>
2894 : { return __x >= __y._M_current; }
2895 :
2896 : friend constexpr basic_const_iterator
2897 : operator+(const basic_const_iterator& __i, difference_type __n)
2898 : noexcept(noexcept(basic_const_iterator(__i._M_current + __n)))
2899 : requires random_access_iterator<_It>
2900 : { return basic_const_iterator(__i._M_current + __n); }
2901 :
2902 : friend constexpr basic_const_iterator
2903 : operator+(difference_type __n, const basic_const_iterator& __i)
2904 : noexcept(noexcept(basic_const_iterator(__i._M_current + __n)))
2905 : requires random_access_iterator<_It>
2906 : { return basic_const_iterator(__i._M_current + __n); }
2907 :
2908 : friend constexpr basic_const_iterator
2909 : operator-(const basic_const_iterator& __i, difference_type __n)
2910 : noexcept(noexcept(basic_const_iterator(__i._M_current - __n)))
2911 : requires random_access_iterator<_It>
2912 : { return basic_const_iterator(__i._M_current - __n); }
2913 :
2914 : template<sized_sentinel_for<_It> _Sent>
2915 : constexpr difference_type
2916 : operator-(const _Sent& __y) const
2917 : noexcept(noexcept(_M_current - __y))
2918 : { return _M_current - __y; }
2919 :
2920 : template<__detail::__not_a_const_iterator _Sent>
2921 : requires sized_sentinel_for<_Sent, _It>
2922 : friend constexpr difference_type
2923 : operator-(const _Sent& __x, const basic_const_iterator& __y)
2924 : noexcept(noexcept(__x - __y._M_current))
2925 : { return __x - __y._M_current; }
2926 :
2927 : friend constexpr __rvalue_reference
2928 : iter_move(const basic_const_iterator& __i)
2929 : noexcept(noexcept(static_cast<__rvalue_reference>(ranges::iter_move(__i._M_current))))
2930 : { return static_cast<__rvalue_reference>(ranges::iter_move(__i._M_current)); }
2931 : };
2932 :
2933 : template<typename _Tp, common_with<_Tp> _Up>
2934 : requires input_iterator<common_type_t<_Tp, _Up>>
2935 : struct common_type<basic_const_iterator<_Tp>, _Up>
2936 : { using type = basic_const_iterator<common_type_t<_Tp, _Up>>; };
2937 :
2938 : template<typename _Tp, common_with<_Tp> _Up>
2939 : requires input_iterator<common_type_t<_Tp, _Up>>
2940 : struct common_type<_Up, basic_const_iterator<_Tp>>
2941 : { using type = basic_const_iterator<common_type_t<_Tp, _Up>>; };
2942 :
2943 : template<typename _Tp, common_with<_Tp> _Up>
2944 : requires input_iterator<common_type_t<_Tp, _Up>>
2945 : struct common_type<basic_const_iterator<_Tp>, basic_const_iterator<_Up>>
2946 : { using type = basic_const_iterator<common_type_t<_Tp, _Up>>; };
2947 :
2948 : template<input_iterator _It>
2949 : constexpr const_iterator<_It>
2950 : make_const_iterator(_It __it)
2951 : noexcept(is_nothrow_convertible_v<_It, const_iterator<_It>>)
2952 : { return __it; }
2953 :
2954 : template<semiregular _Sent>
2955 : constexpr const_sentinel<_Sent>
2956 : make_const_sentinel(_Sent __s)
2957 : noexcept(is_nothrow_convertible_v<_Sent, const_sentinel<_Sent>>)
2958 : { return __s; }
2959 : #endif // C++23
2960 : #endif // C++20
2961 :
2962 : /// @} group iterators
2963 :
2964 : template<typename _Iterator>
2965 : _GLIBCXX20_CONSTEXPR
2966 : auto
2967 : __niter_base(move_iterator<_Iterator> __it)
2968 : -> decltype(make_move_iterator(__niter_base(__it.base())))
2969 : { return make_move_iterator(__niter_base(__it.base())); }
2970 :
2971 : template<typename _Iterator>
2972 : struct __is_move_iterator<move_iterator<_Iterator> >
2973 : {
2974 : enum { __value = 1 };
2975 : typedef __true_type __type;
2976 : };
2977 :
2978 : template<typename _Iterator>
2979 : _GLIBCXX20_CONSTEXPR
2980 : auto
2981 : __miter_base(move_iterator<_Iterator> __it)
2982 : -> decltype(__miter_base(__it.base()))
2983 : { return __miter_base(__it.base()); }
2984 :
2985 : #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
2986 : #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
2987 : std::__make_move_if_noexcept_iterator(_Iter)
2988 : #else
2989 : #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
2990 : #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
2991 : #endif // C++11
2992 :
2993 : #if __cpp_deduction_guides >= 201606
2994 : // These helper traits are used for deduction guides
2995 : // of associative containers.
2996 : template<typename _InputIterator>
2997 : using __iter_key_t = remove_const_t<
2998 : #if __glibcxx_tuple_like // >= C++23
2999 : tuple_element_t<0, typename iterator_traits<_InputIterator>::value_type>>;
3000 : #else
3001 : typename iterator_traits<_InputIterator>::value_type::first_type>;
3002 : #endif
3003 :
3004 : template<typename _InputIterator>
3005 : using __iter_val_t
3006 : #if __glibcxx_tuple_like // >= C++23
3007 : = tuple_element_t<1, typename iterator_traits<_InputIterator>::value_type>;
3008 : #else
3009 : = typename iterator_traits<_InputIterator>::value_type::second_type;
3010 : #endif
3011 :
3012 : template<typename _T1, typename _T2>
3013 : struct pair;
3014 :
3015 : template<typename _InputIterator>
3016 : using __iter_to_alloc_t
3017 : = pair<const __iter_key_t<_InputIterator>, __iter_val_t<_InputIterator>>;
3018 : #endif // __cpp_deduction_guides
3019 :
3020 : _GLIBCXX_END_NAMESPACE_VERSION
3021 : } // namespace
3022 :
3023 : #ifdef _GLIBCXX_DEBUG
3024 : # include <debug/stl_iterator.h>
3025 : #endif
3026 :
3027 : #endif
|