30#ifndef _ITERATOR_CONCEPTS_H
31#define _ITERATOR_CONCEPTS_H 1
34#pragma GCC system_header
37#if __cplusplus >= 202002L
42namespace std _GLIBCXX_VISIBILITY(default)
44_GLIBCXX_BEGIN_NAMESPACE_VERSION
66 struct input_iterator_tag;
67 struct output_iterator_tag;
68 struct forward_iterator_tag;
69 struct bidirectional_iterator_tag;
70 struct random_access_iterator_tag;
71 struct contiguous_iterator_tag;
73 template<
typename _Iterator>
74 struct iterator_traits;
76 template<
typename _Tp>
requires is_object_v<_Tp>
77 struct iterator_traits<_Tp*>;
79 template<
typename _Iterator,
typename>
80 struct __iterator_traits;
84 template<
typename _Tp>
85 using __with_ref = _Tp&;
87 template<
typename _Tp>
88 concept __can_reference =
requires {
typename __with_ref<_Tp>; };
90 template<
typename _Tp>
91 concept __dereferenceable =
requires(_Tp& __t)
93 { *__t } -> __can_reference;
97 template<__detail::__dereferenceable _Tp>
106 void iter_move() =
delete;
110 template<
typename _Tp>
112 = (std::__detail::__class_or_enum<remove_reference_t<_Tp>>)
113 &&
requires(_Tp&& __t) { iter_move(
static_cast<_Tp&&
>(__t)); };
120 template<
typename _Tp>
123 template<
typename _Tp>
125 {
using type = __iter_ref_t<_Tp>; };
128 template<
typename _Tp>
129 requires __adl_imove<_Tp>
134 template<
typename _Tp>
135 requires (!__adl_imove<_Tp>)
136 && is_lvalue_reference_v<__iter_ref_t<_Tp>>
147 template<
typename _Tp>
148 static consteval bool
151 if constexpr (__adl_imove<_Tp>)
159 template<
typename _Tp>
160 using __type =
typename __result<_Tp>::type;
162 template<
typename _Tp>
163 requires __adl_imove<_Tp> ||
requires {
typename __iter_ref_t<_Tp>; }
165 constexpr __type<_Tp>
166 operator()(_Tp&& __e)
const
167 noexcept(_S_noexcept<_Tp>())
169 if constexpr (__adl_imove<_Tp>)
170 return iter_move(
static_cast<_Tp&&
>(__e));
171 else if constexpr (is_lvalue_reference_v<__iter_ref_t<_Tp>>)
172 return std::move(*
static_cast<_Tp&&
>(__e));
174 return *
static_cast<_Tp&&
>(__e);
180 inline namespace _Cpo {
181 inline constexpr __imove::_IterMove iter_move{};
186 template<__detail::__dereferenceable _Tp>
187 requires __detail::__can_reference<ranges::__imove::_IterMove::__type<_Tp&>>
190 template<
typename>
struct incrementable_traits { };
192 template<
typename _Tp>
requires is_object_v<_Tp>
193 struct incrementable_traits<_Tp*>
194 {
using difference_type = ptrdiff_t; };
196 template<
typename _Iter>
197 struct incrementable_traits<const _Iter>
198 : incrementable_traits<_Iter> { };
200 template<
typename _Tp>
requires requires {
typename _Tp::difference_type; }
201 struct incrementable_traits<_Tp>
202 {
using difference_type =
typename _Tp::difference_type; };
204 template<
typename _Tp>
205 requires (!
requires {
typename _Tp::difference_type; }
206 &&
requires(
const _Tp& __a,
const _Tp& __b)
207 { { __a - __b } -> integral; })
208 struct incrementable_traits<_Tp>
218 template<
typename _Iter>
219 concept __primary_traits_iter
220 = __is_base_of(__iterator_traits<_Iter, void>, iterator_traits<_Iter>);
222 template<
typename _Iter,
typename _Tp>
223 struct __iter_traits_impl
224 {
using type = iterator_traits<_Iter>; };
226 template<
typename _Iter,
typename _Tp>
227 requires __primary_traits_iter<_Iter>
228 struct __iter_traits_impl<_Iter, _Tp>
229 {
using type = _Tp; };
232 template<
typename _Iter,
typename _Tp = _Iter>
233 using __iter_traits =
typename __iter_traits_impl<_Iter, _Tp>::type;
235 template<
typename _Tp>
236 using __iter_diff_t =
typename
237 __iter_traits<_Tp, incrementable_traits<_Tp>>::difference_type;
240 template<
typename _Tp>
241 using iter_difference_t = __detail::__iter_diff_t<remove_cvref_t<_Tp>>;
245 template<
typename>
struct __cond_value_type { };
247 template<
typename _Tp>
requires is_object_v<_Tp>
248 struct __cond_value_type<_Tp>
249 {
using value_type = remove_cv_t<_Tp>; };
251 template<
typename _Tp>
252 concept __has_member_value_type
253 =
requires {
typename _Tp::value_type; };
255 template<
typename _Tp>
256 concept __has_member_element_type
257 =
requires {
typename _Tp::element_type; };
261 template<
typename>
struct indirectly_readable_traits { };
263 template<
typename _Tp>
264 struct indirectly_readable_traits<_Tp*>
265 : __detail::__cond_value_type<_Tp>
268 template<
typename _Iter>
requires is_array_v<_Iter>
269 struct indirectly_readable_traits<_Iter>
270 {
using value_type = remove_cv_t<remove_extent_t<_Iter>>; };
272 template<
typename _Iter>
273 struct indirectly_readable_traits<const _Iter>
274 : indirectly_readable_traits<_Iter>
277 template<__detail::__has_member_value_type _Tp>
278 struct indirectly_readable_traits<_Tp>
279 : __detail::__cond_value_type<typename _Tp::value_type>
282 template<__detail::__has_member_element_type _Tp>
283 struct indirectly_readable_traits<_Tp>
284 : __detail::__cond_value_type<typename _Tp::element_type>
289 template<__detail::__has_member_value_type _Tp>
290 requires __detail::__has_member_element_type<_Tp>
292 remove_cv_t<typename _Tp::value_type>>
293 struct indirectly_readable_traits<_Tp>
294 : __detail::__cond_value_type<typename _Tp::value_type>
299 template<__detail::__has_member_value_type _Tp>
300 requires __detail::__has_member_element_type<_Tp>
301 struct indirectly_readable_traits<_Tp>
306 template<
typename _Tp>
307 using __iter_value_t =
typename
308 __iter_traits<_Tp, indirectly_readable_traits<_Tp>>::value_type;
311 template<
typename _Tp>
312 using iter_value_t = __detail::__iter_value_t<remove_cvref_t<_Tp>>;
318 template<
typename _Iter>
319 concept __cpp17_iterator =
requires(_Iter __it)
321 { *__it } -> __can_reference;
322 { ++__it } -> same_as<_Iter&>;
323 { *__it++ } -> __can_reference;
324 } && copyable<_Iter>;
326 template<
typename _Iter>
327 concept __cpp17_input_iterator = __cpp17_iterator<_Iter>
328 && equality_comparable<_Iter>
329 &&
requires(_Iter __it)
331 typename incrementable_traits<_Iter>::difference_type;
332 typename indirectly_readable_traits<_Iter>::value_type;
334 typename indirectly_readable_traits<_Iter>::value_type&>;
336 typename indirectly_readable_traits<_Iter>::value_type&>;
337 requires signed_integral<
338 typename incrementable_traits<_Iter>::difference_type>;
343 template<
typename _Iter>
344 concept __cpp17_fwd_iterator = __cpp17_input_iterator<_Iter>
345 && constructible_from<_Iter>
346 && is_reference_v<iter_reference_t<_Iter>>
347 && same_as<remove_cvref_t<iter_reference_t<_Iter>>,
348 typename indirectly_readable_traits<_Iter>::value_type>
349 &&
requires(_Iter __it)
351 { __it++ } -> convertible_to<const _Iter&>;
352 { *__it++ } -> same_as<iter_reference_t<_Iter>>;
355 template<
typename _Iter>
356 concept __cpp17_bidi_iterator = __cpp17_fwd_iterator<_Iter>
357 &&
requires(_Iter __it)
359 { --__it } -> same_as<_Iter&>;
360 { __it-- } -> convertible_to<const _Iter&>;
361 { *__it-- } -> same_as<iter_reference_t<_Iter>>;
364 template<
typename _Iter>
365 concept __cpp17_randacc_iterator = __cpp17_bidi_iterator<_Iter>
366 && totally_ordered<_Iter>
367 &&
requires(_Iter __it,
368 typename incrementable_traits<_Iter>::difference_type __n)
370 { __it += __n } -> same_as<_Iter&>;
371 { __it -= __n } -> same_as<_Iter&>;
372 { __it + __n } -> same_as<_Iter>;
373 { __n + __it } -> same_as<_Iter>;
374 { __it - __n } -> same_as<_Iter>;
375 { __it - __it } -> same_as<
decltype(__n)>;
376 { __it[__n] } -> convertible_to<iter_reference_t<_Iter>>;
379 template<
typename _Iter>
380 concept __iter_with_nested_types =
requires {
381 typename _Iter::iterator_category;
382 typename _Iter::value_type;
383 typename _Iter::difference_type;
384 typename _Iter::reference;
387 template<
typename _Iter>
388 concept __iter_without_nested_types = !__iter_with_nested_types<_Iter>;
390 template<
typename _Iter>
391 concept __iter_without_category
392 = !
requires {
typename _Iter::iterator_category; };
396 template<
typename _Iterator>
397 requires __detail::__iter_with_nested_types<_Iterator>
398 struct __iterator_traits<_Iterator, void>
401 template<
typename _Iter>
403 {
using type = void; };
405 template<
typename _Iter>
requires requires {
typename _Iter::pointer; }
407 {
using type =
typename _Iter::pointer; };
410 using iterator_category =
typename _Iterator::iterator_category;
411 using value_type =
typename _Iterator::value_type;
412 using difference_type =
typename _Iterator::difference_type;
413 using pointer =
typename __ptr<_Iterator>::type;
414 using reference =
typename _Iterator::reference;
417 template<
typename _Iterator>
418 requires __detail::__iter_without_nested_types<_Iterator>
419 && __detail::__cpp17_input_iterator<_Iterator>
420 struct __iterator_traits<_Iterator, void>
423 template<
typename _Iter>
425 {
using type = input_iterator_tag; };
427 template<
typename _Iter>
428 requires requires {
typename _Iter::iterator_category; }
430 {
using type =
typename _Iter::iterator_category; };
432 template<
typename _Iter>
433 requires __detail::__iter_without_category<_Iter>
434 && __detail::__cpp17_randacc_iterator<_Iter>
436 {
using type = random_access_iterator_tag; };
438 template<
typename _Iter>
439 requires __detail::__iter_without_category<_Iter>
440 && __detail::__cpp17_bidi_iterator<_Iter>
442 {
using type = bidirectional_iterator_tag; };
444 template<
typename _Iter>
445 requires __detail::__iter_without_category<_Iter>
446 && __detail::__cpp17_fwd_iterator<_Iter>
448 {
using type = forward_iterator_tag; };
450 template<
typename _Iter>
452 {
using type = void; };
454 template<
typename _Iter>
requires requires {
typename _Iter::pointer; }
456 {
using type =
typename _Iter::pointer; };
458 template<
typename _Iter>
459 requires (!
requires {
typename _Iter::pointer; }
460 &&
requires(_Iter& __it) { __it.operator->(); })
464 template<
typename _Iter>
466 {
using type = iter_reference_t<_Iter>; };
468 template<
typename _Iter>
requires requires {
typename _Iter::reference; }
470 {
using type =
typename _Iter::reference; };
473 using iterator_category =
typename __cat<_Iterator>::type;
475 =
typename indirectly_readable_traits<_Iterator>::value_type;
476 using difference_type
477 =
typename incrementable_traits<_Iterator>::difference_type;
478 using pointer =
typename __ptr<_Iterator>::type;
479 using reference =
typename __ref<_Iterator>::type;
482 template<
typename _Iterator>
483 requires __detail::__iter_without_nested_types<_Iterator>
484 && __detail::__cpp17_iterator<_Iterator>
485 struct __iterator_traits<_Iterator, void>
488 template<
typename _Iter>
490 {
using type = void; };
492 template<
typename _Iter>
494 {
typename incrementable_traits<_Iter>::difference_type; }
497 using type =
typename incrementable_traits<_Iter>::difference_type;
501 using iterator_category = output_iterator_tag;
502 using value_type = void;
503 using difference_type =
typename __diff<_Iterator>::type;
504 using pointer = void;
505 using reference = void;
510 template<
typename _Iter>
511 struct __iter_concept_impl;
514 template<
typename _Iter>
515 requires requires {
typename __iter_traits<_Iter>::iterator_concept; }
516 struct __iter_concept_impl<_Iter>
517 {
using type =
typename __iter_traits<_Iter>::iterator_concept; };
520 template<
typename _Iter>
521 requires (!
requires {
typename __iter_traits<_Iter>::iterator_concept; }
522 &&
requires {
typename __iter_traits<_Iter>::iterator_category; })
523 struct __iter_concept_impl<_Iter>
524 {
using type =
typename __iter_traits<_Iter>::iterator_category; };
527 template<
typename _Iter>
528 requires (!
requires {
typename __iter_traits<_Iter>::iterator_concept; }
529 && !
requires {
typename __iter_traits<_Iter>::iterator_category; }
530 && __primary_traits_iter<_Iter>)
531 struct __iter_concept_impl<_Iter>
532 {
using type = random_access_iterator_tag; };
535 template<
typename _Iter>
536 struct __iter_concept_impl
540 template<
typename _Iter>
541 using __iter_concept =
typename __iter_concept_impl<_Iter>::type;
543 template<
typename _In>
544 concept __indirectly_readable_impl =
requires
546 typename iter_value_t<_In>;
547 typename iter_reference_t<_In>;
549 requires same_as<iter_reference_t<const _In>,
550 iter_reference_t<_In>>;
551 requires same_as<iter_rvalue_reference_t<const _In>,
554 && common_reference_with<iter_reference_t<_In>&&, iter_value_t<_In>&>
555 && common_reference_with<iter_reference_t<_In>&&,
557 && common_reference_with<iter_rvalue_reference_t<_In>&&,
558 const iter_value_t<_In>&>;
563 template<
typename _In>
565 = __detail::__indirectly_readable_impl<remove_cvref_t<_In>>;
569 template<
typename _Tp>
570 struct __indirect_value
571 {
using type = iter_value_t<_Tp>&; };
576 template<
typename _Tp>
577 using __indirect_value_t =
typename __detail::__indirect_value<_Tp>::type;
579 template<indirectly_readable _Tp>
580 using iter_common_reference_t
584 template<
typename _Out,
typename _Tp>
589 const_cast<const iter_reference_t<_Out>&&
>(*__o)
595 namespace ranges::__detail
597 class __max_diff_type;
598 class __max_size_type;
600 template<
typename _Tp>
603 template<
typename _Tp>
604 concept __integral_nonbool = integral<_Tp> && !__cv_bool<_Tp>;
606 template<
typename _Tp>
607 concept __is_integer_like = __integral_nonbool<_Tp>
610 template<
typename _Tp>
611 concept __is_signed_integer_like = signed_integral<_Tp>
616 namespace __detail {
using ranges::__detail::__is_signed_integer_like; }
619 template<
typename _Iter>
621 &&
requires(_Iter __i)
623 typename iter_difference_t<_Iter>;
624 requires __detail::__is_signed_integer_like<iter_difference_t<_Iter>>;
629 template<
typename _Iter>
631 &&
requires(_Iter __i) { { __i++ } -> same_as<_Iter>; };
633 template<
typename _Iter>
634 concept input_or_output_iterator
635 =
requires(_Iter __i) { { *__i } -> __detail::__can_reference; }
638 template<
typename _Sent,
typename _Iter>
639 concept sentinel_for = semiregular<_Sent>
640 && input_or_output_iterator<_Iter>
641 && __detail::__weakly_eq_cmp_with<_Sent, _Iter>;
643 template<
typename _Sent,
typename _Iter>
644 inline constexpr bool disable_sized_sentinel_for =
false;
646 template<
typename _Sent,
typename _Iter>
647 concept sized_sentinel_for = sentinel_for<_Sent, _Iter>
648 && !disable_sized_sentinel_for<remove_cv_t<_Sent>, remove_cv_t<_Iter>>
649 &&
requires(
const _Iter& __i,
const _Sent& __s)
655 template<
typename _Iter>
656 concept input_iterator = input_or_output_iterator<_Iter>
658 &&
requires {
typename __detail::__iter_concept<_Iter>; }
661 template<
typename _Iter,
typename _Tp>
662 concept output_iterator = input_or_output_iterator<_Iter>
666 template<
typename _Iter>
667 concept forward_iterator = input_iterator<_Iter>
669 && incrementable<_Iter> && sentinel_for<_Iter, _Iter>;
671 template<
typename _Iter>
672 concept bidirectional_iterator = forward_iterator<_Iter>
675 &&
requires(_Iter __i)
681 template<
typename _Iter>
682 concept random_access_iterator = bidirectional_iterator<_Iter>
685 && totally_ordered<_Iter> && sized_sentinel_for<_Iter, _Iter>
686 &&
requires(_Iter __i,
const _Iter __j,
687 const iter_difference_t<_Iter> __n)
697 template<
typename _Iter>
698 concept contiguous_iterator = random_access_iterator<_Iter>
700 && is_lvalue_reference_v<iter_reference_t<_Iter>>
702 &&
requires(
const _Iter& __i)
712 template<
typename _Fn,
typename _Iter>
717 invoke_result_t<_Fn&, iter_reference_t<_Iter>>>;
719 template<
typename _Fn,
typename _Iter>
725 invoke_result_t<_Fn&, iter_reference_t<_Iter>>>;
727 template<
typename _Fn,
typename _Iter>
732 template<
typename _Fn,
typename _I1,
typename _I2>
733 concept indirect_binary_predicate
741 template<
typename _Fn,
typename _I1,
typename _I2 = _I1>
742 concept indirect_equivalence_relation
749 iter_reference_t<_I2>>;
751 template<
typename _Fn,
typename _I1,
typename _I2 = _I1>
752 concept indirect_strict_weak_order
760 template<
typename _Fn,
typename... _Is>
763 using indirect_result_t = invoke_result_t<_Fn, iter_reference_t<_Is>...>;
767 template<
typename _Iter,
typename _Proj>
772 using value_type = remove_cvref_t<indirect_result_t<_Proj&, _Iter>>;
773 indirect_result_t<_Proj&, _Iter> operator*()
const;
777 using __projected_Iter = _Iter;
778 using __projected_Proj = _Proj;
782 template<weakly_incrementable _Iter,
typename _Proj>
783 struct __projected<_Iter, _Proj>
787 using value_type = remove_cvref_t<indirect_result_t<_Proj&, _Iter>>;
788 using difference_type = iter_difference_t<_Iter>;
789 indirect_result_t<_Proj&, _Iter> operator*()
const;
791 using __projected_Iter = _Iter;
792 using __projected_Proj = _Proj;
799 indirectly_regular_unary_invocable<_Iter> _Proj>
800 using projected =
typename __detail::__projected<_Iter, _Proj>::__type;
803 template<
typename _Tp>
805 typename _Tp::__projected_Proj>>
806 struct __detail::__indirect_value<_Tp>
808 using _Iter =
typename _Tp::__projected_Iter;
809 using _Proj =
typename _Tp::__projected_Proj;
810 using type = invoke_result_t<_Proj&, __indirect_value_t<_Iter>>;
813#if __glibcxx_algorithm_default_value_type
814 template<indirectly_readable _Iter,
815 indirectly_regular_unary_invocable<_Iter> _Proj>
816 using projected_value_t
817 = remove_cvref_t<invoke_result_t<_Proj&, iter_value_t<_Iter>&>>;
824 template<
typename _In,
typename _Out>
828 template<
typename _In,
typename _Out>
831 && movable<iter_value_t<_In>>
836 template<
typename _In,
typename _Out>
840 template<
typename _In,
typename _Out>
846 && copyable<iter_value_t<_In>>
856 template<
typename _It1,
typename _It2>
857 void iter_swap(_It1, _It2) =
delete;
861 template<
typename _Tp,
typename _Up>
863 = (std::__detail::__class_or_enum<remove_reference_t<_Tp>>
864 || std::__detail::__class_or_enum<remove_reference_t<_Up>>)
865 &&
requires(_Tp&& __t, _Up&& __u) {
866 iter_swap(
static_cast<_Tp&&
>(__t),
static_cast<_Up&&
>(__u));
869 template<
typename _Xp,
typename _Yp>
870 constexpr iter_value_t<_Xp>
871 __iter_exchange_move(_Xp&& __x, _Yp&& __y)
872 noexcept(
noexcept(iter_value_t<_Xp>(iter_move(__x)))
873 &&
noexcept(*__x = iter_move(__y)))
875 iter_value_t<_Xp> __old_value(iter_move(__x));
876 *__x = iter_move(__y);
883 template<
typename _Tp,
typename _Up>
884 static consteval bool
887 if constexpr (__adl_iswap<_Tp, _Up>)
892 && swappable_with<iter_reference_t<_Tp>, iter_reference_t<_Up>>)
902 template<
typename _Tp,
typename _Up>
903 requires __adl_iswap<_Tp, _Up>
906 && swappable_with<iter_reference_t<_Tp>, iter_reference_t<_Up>>)
907 || (indirectly_movable_storable<_Tp, _Up>
908 && indirectly_movable_storable<_Up, _Tp>)
910 operator()(_Tp&& __e1, _Up&& __e2)
const
911 noexcept(_S_noexcept<_Tp, _Up>())
913 if constexpr (__adl_iswap<_Tp, _Up>)
914 iter_swap(
static_cast<_Tp&&
>(__e1),
static_cast<_Up&&
>(__e2));
917 && swappable_with<iter_reference_t<_Tp>, iter_reference_t<_Up>>)
918 ranges::swap(*__e1, *__e2);
920 *__e1 = __iswap::__iter_exchange_move(__e2, __e1);
926 inline namespace _Cpo {
927 inline constexpr __iswap::_IterSwap iter_swap{};
933 template<
typename _I1,
typename _I2 = _I1>
936 &&
requires(
const _I1 __i1,
const _I2 __i2)
938 ranges::iter_swap(__i1, __i1);
939 ranges::iter_swap(__i2, __i2);
940 ranges::iter_swap(__i1, __i2);
941 ranges::iter_swap(__i2, __i1);
945 template<
typename _I1,
typename _I2,
typename _Rel,
typename _P1 =
identity,
948 = indirect_binary_predicate<_Rel, projected<_I1, _P1>,
952 template<
typename _Iter>
954 && indirectly_movable_storable<_Iter, _Iter>
958 template<
typename _I1,
typename _I2,
typename _Out,
961 concept mergeable = input_iterator<_I1> && input_iterator<_I2>
964 && indirect_strict_weak_order<_Rel, projected<_I1, _P1>,
971 && indirect_strict_weak_order<_Rel, projected<_Iter, _Proj>>;
973 struct unreachable_sentinel_t
975 template<weakly_incrementable _It>
976 friend constexpr bool
977 operator==(unreachable_sentinel_t,
const _It&)
noexcept
981 inline constexpr unreachable_sentinel_t unreachable_sentinel{};
984 namespace ranges::__access
986 using std::__detail::__class_or_enum;
988 template<
typename _Tp>
989 concept __member_begin =
requires(_Tp& __t)
991 { _GLIBCXX_AUTO_CAST(__t.begin()) } -> input_or_output_iterator;
995 void begin() =
delete;
997 template<
typename _Tp>
998 concept __adl_begin = __class_or_enum<remove_reference_t<_Tp>>
999 &&
requires(_Tp& __t)
1001 { _GLIBCXX_AUTO_CAST(begin(__t)) } -> input_or_output_iterator;
1006 template<
typename _Tp>
1007 requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
1011 if constexpr (is_array_v<_Tp>)
1013 else if constexpr (__member_begin<_Tp&>)
1023 template<
typename _Tp>
1024 using __range_iter_t
1030_GLIBCXX_END_NAMESPACE_VERSION
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
typename common_reference< _Tp... >::type common_reference_t
typename make_signed< _Tp >::type make_signed_t
Alias template for make_signed.
auto declval() noexcept -> decltype(__declval< _Tp >(0))
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
ISO C++ entities toplevel namespace is std.
typename __detail::__projected< _Iter, _Proj >::__type projected
[projected], projected
constexpr default_sentinel_t default_sentinel
A default sentinel value.
ranges::__imove::_IterMove::__type< _Tp & > iter_rvalue_reference_t
The result type of ranges::iter_move(std::declval<_Tp&>())
Implementation details not part of the namespace std interface.
[func.identity] The identity function.
ranges::less function object type.
Forward iterators support a superset of input iterator operations.
Bidirectional iterators support a superset of forward iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
Contiguous iterators point to objects stored contiguously in memory.
[concept.same], concept same_as
[concept.derived], concept derived_from
[concept.commonref], concept common_reference_with
[concept.assignable], concept assignable_from
[concept.constructible], concept constructible_from
[concept.copyconstructible], concept copy_constructible
[concept.invocable], concept invocable
[concept.regularinvocable], concept regular_invocable
[concept.predicate], concept predicate
[concept.equiv], concept equivalence_relation
[concept.strictweakorder], concept strict_weak_order
Requirements for types that are readable by applying operator*.
Requirements for writing a value into an iterator's referenced object.
Requirements on types that can be incremented with ++.
[alg.req.ind.move], concept indirectly_movable
[alg.req.ind.copy], concept indirectly_copyable
[alg.req.ind.swap], concept indirectly_swappable
[alg.req.ind.cmp], concept indirectly_comparable
[alg.req.permutable], concept permutable
[alg.req.mergeable], concept mergeable
[alg.req.sortable], concept sortable