Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-03 08:13:40

0001 // -*- C++ -*-
0002 //===----------------------------------------------------------------------===//
0003 //
0004 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0005 // See https://llvm.org/LICENSE.txt for license information.
0006 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0007 //
0008 //===----------------------------------------------------------------------===//
0009 
0010 #ifndef _LIBCPP___CXX03___RANGES_CONCEPTS_H
0011 #define _LIBCPP___CXX03___RANGES_CONCEPTS_H
0012 
0013 #include <__cxx03/__concepts/constructible.h>
0014 #include <__cxx03/__concepts/movable.h>
0015 #include <__cxx03/__concepts/same_as.h>
0016 #include <__cxx03/__config>
0017 #include <__cxx03/__iterator/concepts.h>
0018 #include <__cxx03/__iterator/incrementable_traits.h>
0019 #include <__cxx03/__iterator/iter_move.h>
0020 #include <__cxx03/__iterator/iterator_traits.h>
0021 #include <__cxx03/__iterator/readable_traits.h>
0022 #include <__cxx03/__ranges/access.h>
0023 #include <__cxx03/__ranges/data.h>
0024 #include <__cxx03/__ranges/enable_borrowed_range.h>
0025 #include <__cxx03/__ranges/enable_view.h>
0026 #include <__cxx03/__ranges/size.h>
0027 #include <__cxx03/__type_traits/add_pointer.h>
0028 #include <__cxx03/__type_traits/is_reference.h>
0029 #include <__cxx03/__type_traits/remove_cvref.h>
0030 #include <__cxx03/__type_traits/remove_reference.h>
0031 #include <__cxx03/__utility/declval.h>
0032 #include <__cxx03/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 // [range.range]
0045 
0046 template <class _Tp>
0047 concept range = requires(_Tp& __t) {
0048   ranges::begin(__t); // sometimes equality-preserving
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 // `iterator_t` defined in <__ranges/access.h>
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 // [range.sized]
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 // `disable_sized_range` defined in `<__ranges/size.h>`
0087 
0088 // [range.view], views
0089 
0090 // `enable_view` defined in <__ranges/enable_view.h>
0091 // `view_base` defined in <__ranges/enable_view.h>
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 // [range.refinements], other range refinements
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 } // namespace ranges
0137 
0138 #endif // _LIBCPP_STD_VER >= 20
0139 
0140 _LIBCPP_END_NAMESPACE_STD
0141 
0142 #endif // _LIBCPP___CXX03___RANGES_CONCEPTS_H