xref: /llvm-project/libcxx/include/__cxx03/__ranges/concepts.h (revision ce7771902dc50d900de639d499a60486b83f70e0)
1e78f53d1SNikolas Klauser // -*- C++ -*-
2e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
3e78f53d1SNikolas Klauser //
4e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
6e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7e78f53d1SNikolas Klauser //
8e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
9e78f53d1SNikolas Klauser 
10*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03___RANGES_CONCEPTS_H
11*ce777190SNikolas Klauser #define _LIBCPP___CXX03___RANGES_CONCEPTS_H
12e78f53d1SNikolas Klauser 
1373fbae83SNikolas Klauser #include <__cxx03/__concepts/constructible.h>
1473fbae83SNikolas Klauser #include <__cxx03/__concepts/movable.h>
1573fbae83SNikolas Klauser #include <__cxx03/__concepts/same_as.h>
1673fbae83SNikolas Klauser #include <__cxx03/__config>
1773fbae83SNikolas Klauser #include <__cxx03/__iterator/concepts.h>
1873fbae83SNikolas Klauser #include <__cxx03/__iterator/incrementable_traits.h>
1973fbae83SNikolas Klauser #include <__cxx03/__iterator/iter_move.h>
2073fbae83SNikolas Klauser #include <__cxx03/__iterator/iterator_traits.h>
2173fbae83SNikolas Klauser #include <__cxx03/__iterator/readable_traits.h>
2273fbae83SNikolas Klauser #include <__cxx03/__ranges/access.h>
2373fbae83SNikolas Klauser #include <__cxx03/__ranges/data.h>
2473fbae83SNikolas Klauser #include <__cxx03/__ranges/enable_borrowed_range.h>
2573fbae83SNikolas Klauser #include <__cxx03/__ranges/enable_view.h>
2673fbae83SNikolas Klauser #include <__cxx03/__ranges/size.h>
2773fbae83SNikolas Klauser #include <__cxx03/__type_traits/add_pointer.h>
2873fbae83SNikolas Klauser #include <__cxx03/__type_traits/is_reference.h>
2973fbae83SNikolas Klauser #include <__cxx03/__type_traits/remove_cvref.h>
3073fbae83SNikolas Klauser #include <__cxx03/__type_traits/remove_reference.h>
3173fbae83SNikolas Klauser #include <__cxx03/__utility/declval.h>
3273fbae83SNikolas Klauser #include <__cxx03/initializer_list>
33e78f53d1SNikolas Klauser 
34e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
35e78f53d1SNikolas Klauser #  pragma GCC system_header
36e78f53d1SNikolas Klauser #endif
37e78f53d1SNikolas Klauser 
38e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
39e78f53d1SNikolas Klauser 
40e78f53d1SNikolas Klauser #if _LIBCPP_STD_VER >= 20
41e78f53d1SNikolas Klauser 
42e78f53d1SNikolas Klauser namespace ranges {
43e78f53d1SNikolas Klauser 
44e78f53d1SNikolas Klauser // [range.range]
45e78f53d1SNikolas Klauser 
46e78f53d1SNikolas Klauser template <class _Tp>
47e78f53d1SNikolas Klauser concept range = requires(_Tp& __t) {
48e78f53d1SNikolas Klauser   ranges::begin(__t); // sometimes equality-preserving
49e78f53d1SNikolas Klauser   ranges::end(__t);
50e78f53d1SNikolas Klauser };
51e78f53d1SNikolas Klauser 
52e78f53d1SNikolas Klauser template <class _Tp>
53e78f53d1SNikolas Klauser concept input_range = range<_Tp> && input_iterator<iterator_t<_Tp>>;
54e78f53d1SNikolas Klauser 
55e78f53d1SNikolas Klauser template <class _Range>
56e78f53d1SNikolas Klauser concept borrowed_range =
57e78f53d1SNikolas Klauser     range<_Range> && (is_lvalue_reference_v<_Range> || enable_borrowed_range<remove_cvref_t<_Range>>);
58e78f53d1SNikolas Klauser 
59e78f53d1SNikolas Klauser // `iterator_t` defined in <__ranges/access.h>
60e78f53d1SNikolas Klauser 
61e78f53d1SNikolas Klauser template <range _Rp>
62e78f53d1SNikolas Klauser using sentinel_t = decltype(ranges::end(std::declval<_Rp&>()));
63e78f53d1SNikolas Klauser 
64e78f53d1SNikolas Klauser template <range _Rp>
65e78f53d1SNikolas Klauser using range_difference_t = iter_difference_t<iterator_t<_Rp>>;
66e78f53d1SNikolas Klauser 
67e78f53d1SNikolas Klauser template <range _Rp>
68e78f53d1SNikolas Klauser using range_value_t = iter_value_t<iterator_t<_Rp>>;
69e78f53d1SNikolas Klauser 
70e78f53d1SNikolas Klauser template <range _Rp>
71e78f53d1SNikolas Klauser using range_reference_t = iter_reference_t<iterator_t<_Rp>>;
72e78f53d1SNikolas Klauser 
73e78f53d1SNikolas Klauser template <range _Rp>
74e78f53d1SNikolas Klauser using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<_Rp>>;
75e78f53d1SNikolas Klauser 
76e78f53d1SNikolas Klauser template <range _Rp>
77e78f53d1SNikolas Klauser using range_common_reference_t = iter_common_reference_t<iterator_t<_Rp>>;
78e78f53d1SNikolas Klauser 
79e78f53d1SNikolas Klauser // [range.sized]
80e78f53d1SNikolas Klauser template <class _Tp>
81e78f53d1SNikolas Klauser concept sized_range = range<_Tp> && requires(_Tp& __t) { ranges::size(__t); };
82e78f53d1SNikolas Klauser 
83e78f53d1SNikolas Klauser template <sized_range _Rp>
84e78f53d1SNikolas Klauser using range_size_t = decltype(ranges::size(std::declval<_Rp&>()));
85e78f53d1SNikolas Klauser 
86e78f53d1SNikolas Klauser // `disable_sized_range` defined in `<__ranges/size.h>`
87e78f53d1SNikolas Klauser 
88e78f53d1SNikolas Klauser // [range.view], views
89e78f53d1SNikolas Klauser 
90e78f53d1SNikolas Klauser // `enable_view` defined in <__ranges/enable_view.h>
91e78f53d1SNikolas Klauser // `view_base` defined in <__ranges/enable_view.h>
92e78f53d1SNikolas Klauser 
93e78f53d1SNikolas Klauser template <class _Tp>
94e78f53d1SNikolas Klauser concept view = range<_Tp> && movable<_Tp> && enable_view<_Tp>;
95e78f53d1SNikolas Klauser 
96e78f53d1SNikolas Klauser template <class _Range>
97e78f53d1SNikolas Klauser concept __simple_view =
98e78f53d1SNikolas Klauser     view<_Range> && range<const _Range> && same_as<iterator_t<_Range>, iterator_t<const _Range>> &&
99e78f53d1SNikolas Klauser     same_as<sentinel_t<_Range>, sentinel_t<const _Range>>;
100e78f53d1SNikolas Klauser 
101e78f53d1SNikolas Klauser // [range.refinements], other range refinements
102e78f53d1SNikolas Klauser template <class _Rp, class _Tp>
103e78f53d1SNikolas Klauser concept output_range = range<_Rp> && output_iterator<iterator_t<_Rp>, _Tp>;
104e78f53d1SNikolas Klauser 
105e78f53d1SNikolas Klauser template <class _Tp>
106e78f53d1SNikolas Klauser concept forward_range = input_range<_Tp> && forward_iterator<iterator_t<_Tp>>;
107e78f53d1SNikolas Klauser 
108e78f53d1SNikolas Klauser template <class _Tp>
109e78f53d1SNikolas Klauser concept bidirectional_range = forward_range<_Tp> && bidirectional_iterator<iterator_t<_Tp>>;
110e78f53d1SNikolas Klauser 
111e78f53d1SNikolas Klauser template <class _Tp>
112e78f53d1SNikolas Klauser concept random_access_range = bidirectional_range<_Tp> && random_access_iterator<iterator_t<_Tp>>;
113e78f53d1SNikolas Klauser 
114e78f53d1SNikolas Klauser template <class _Tp>
115e78f53d1SNikolas Klauser concept contiguous_range = random_access_range<_Tp> && contiguous_iterator<iterator_t<_Tp>> && requires(_Tp& __t) {
116e78f53d1SNikolas Klauser   { ranges::data(__t) } -> same_as<add_pointer_t<range_reference_t<_Tp>>>;
117e78f53d1SNikolas Klauser };
118e78f53d1SNikolas Klauser 
119e78f53d1SNikolas Klauser template <class _Tp>
120e78f53d1SNikolas Klauser concept common_range = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>;
121e78f53d1SNikolas Klauser 
122e78f53d1SNikolas Klauser template <class _Tp>
123e78f53d1SNikolas Klauser inline constexpr bool __is_std_initializer_list = false;
124e78f53d1SNikolas Klauser 
125e78f53d1SNikolas Klauser template <class _Ep>
126e78f53d1SNikolas Klauser inline constexpr bool __is_std_initializer_list<initializer_list<_Ep>> = true;
127e78f53d1SNikolas Klauser 
128e78f53d1SNikolas Klauser template <class _Tp>
129e78f53d1SNikolas Klauser concept viewable_range =
130e78f53d1SNikolas Klauser     range<_Tp> &&
131e78f53d1SNikolas Klauser     ((view<remove_cvref_t<_Tp>> && constructible_from<remove_cvref_t<_Tp>, _Tp>) ||
132e78f53d1SNikolas Klauser      (!view<remove_cvref_t<_Tp>> &&
133e78f53d1SNikolas Klauser       (is_lvalue_reference_v<_Tp> ||
134e78f53d1SNikolas Klauser        (movable<remove_reference_t<_Tp>> && !__is_std_initializer_list<remove_cvref_t<_Tp>>))));
135e78f53d1SNikolas Klauser 
136e78f53d1SNikolas Klauser } // namespace ranges
137e78f53d1SNikolas Klauser 
138e78f53d1SNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
139e78f53d1SNikolas Klauser 
140e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
141e78f53d1SNikolas Klauser 
142*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___RANGES_CONCEPTS_H
143