File indexing completed on 2026-05-03 08:14:01
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LIBCPP___RANGES_CONCEPTS_H
0011 #define _LIBCPP___RANGES_CONCEPTS_H
0012
0013 #include <__concepts/constructible.h>
0014 #include <__concepts/movable.h>
0015 #include <__concepts/same_as.h>
0016 #include <__config>
0017 #include <__iterator/concepts.h>
0018 #include <__iterator/incrementable_traits.h>
0019 #include <__iterator/iter_move.h>
0020 #include <__iterator/iterator_traits.h>
0021 #include <__iterator/readable_traits.h>
0022 #include <__ranges/access.h>
0023 #include <__ranges/data.h>
0024 #include <__ranges/enable_borrowed_range.h>
0025 #include <__ranges/enable_view.h>
0026 #include <__ranges/size.h>
0027 #include <__type_traits/add_pointer.h>
0028 #include <__type_traits/is_reference.h>
0029 #include <__type_traits/remove_cvref.h>
0030 #include <__type_traits/remove_reference.h>
0031 #include <__utility/declval.h>
0032 #include <initializer_list>
0033
0034 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0035 # pragma GCC system_header
0036 #endif
0037
0038 _LIBCPP_BEGIN_NAMESPACE_STD
0039
0040 #if _LIBCPP_STD_VER >= 20
0041
0042 namespace ranges {
0043
0044
0045
0046 template <class _Tp>
0047 concept range = requires(_Tp& __t) {
0048 ranges::begin(__t);
0049 ranges::end(__t);
0050 };
0051
0052 template <class _Tp>
0053 concept input_range = range<_Tp> && input_iterator<iterator_t<_Tp>>;
0054
0055 template <class _Range>
0056 concept borrowed_range =
0057 range<_Range> && (is_lvalue_reference_v<_Range> || enable_borrowed_range<remove_cvref_t<_Range>>);
0058
0059
0060
0061 template <range _Rp>
0062 using sentinel_t = decltype(ranges::end(std::declval<_Rp&>()));
0063
0064 template <range _Rp>
0065 using range_difference_t = iter_difference_t<iterator_t<_Rp>>;
0066
0067 template <range _Rp>
0068 using range_value_t = iter_value_t<iterator_t<_Rp>>;
0069
0070 template <range _Rp>
0071 using range_reference_t = iter_reference_t<iterator_t<_Rp>>;
0072
0073 template <range _Rp>
0074 using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<_Rp>>;
0075
0076 template <range _Rp>
0077 using range_common_reference_t = iter_common_reference_t<iterator_t<_Rp>>;
0078
0079
0080 template <class _Tp>
0081 concept sized_range = range<_Tp> && requires(_Tp& __t) { ranges::size(__t); };
0082
0083 template <sized_range _Rp>
0084 using range_size_t = decltype(ranges::size(std::declval<_Rp&>()));
0085
0086
0087
0088
0089
0090
0091
0092
0093 template <class _Tp>
0094 concept view = range<_Tp> && movable<_Tp> && enable_view<_Tp>;
0095
0096 template <class _Range>
0097 concept __simple_view =
0098 view<_Range> && range<const _Range> && same_as<iterator_t<_Range>, iterator_t<const _Range>> &&
0099 same_as<sentinel_t<_Range>, sentinel_t<const _Range>>;
0100
0101
0102 template <class _Rp, class _Tp>
0103 concept output_range = range<_Rp> && output_iterator<iterator_t<_Rp>, _Tp>;
0104
0105 template <class _Tp>
0106 concept forward_range = input_range<_Tp> && forward_iterator<iterator_t<_Tp>>;
0107
0108 template <class _Tp>
0109 concept bidirectional_range = forward_range<_Tp> && bidirectional_iterator<iterator_t<_Tp>>;
0110
0111 template <class _Tp>
0112 concept random_access_range = bidirectional_range<_Tp> && random_access_iterator<iterator_t<_Tp>>;
0113
0114 template <class _Tp>
0115 concept contiguous_range = random_access_range<_Tp> && contiguous_iterator<iterator_t<_Tp>> && requires(_Tp& __t) {
0116 { ranges::data(__t) } -> same_as<add_pointer_t<range_reference_t<_Tp>>>;
0117 };
0118
0119 template <class _Tp>
0120 concept common_range = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>;
0121
0122 template <class _Tp>
0123 inline constexpr bool __is_std_initializer_list = false;
0124
0125 template <class _Ep>
0126 inline constexpr bool __is_std_initializer_list<initializer_list<_Ep>> = true;
0127
0128 template <class _Tp>
0129 concept viewable_range =
0130 range<_Tp> &&
0131 ((view<remove_cvref_t<_Tp>> && constructible_from<remove_cvref_t<_Tp>, _Tp>) ||
0132 (!view<remove_cvref_t<_Tp>> &&
0133 (is_lvalue_reference_v<_Tp> ||
0134 (movable<remove_reference_t<_Tp>> && !__is_std_initializer_list<remove_cvref_t<_Tp>>))));
0135
0136 }
0137
0138 #endif
0139
0140 _LIBCPP_END_NAMESPACE_STD
0141
0142 #endif