xref: /netbsd-src/external/apache2/llvm/dist/libcxx/include/__ranges/concepts.h (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg // -*- C++ -*-
2*4d6fc14bSjoerg //===--------------------- __ranges/concepts.h ----------------------------===//
3*4d6fc14bSjoerg //
4*4d6fc14bSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4d6fc14bSjoerg // See https://llvm.org/LICENSE.txt for license information.
6*4d6fc14bSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4d6fc14bSjoerg //
8*4d6fc14bSjoerg //===----------------------------------------------------------------------===//
9*4d6fc14bSjoerg #ifndef _LIBCPP___RANGES_CONCEPTS_H
10*4d6fc14bSjoerg #define _LIBCPP___RANGES_CONCEPTS_H
11*4d6fc14bSjoerg 
12*4d6fc14bSjoerg #include <__config>
13*4d6fc14bSjoerg #include <__iterator/concepts.h>
14*4d6fc14bSjoerg #include <__ranges/access.h>
15*4d6fc14bSjoerg #include <__ranges/size.h>
16*4d6fc14bSjoerg #include <type_traits>
17*4d6fc14bSjoerg 
18*4d6fc14bSjoerg #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
19*4d6fc14bSjoerg #pragma GCC system_header
20*4d6fc14bSjoerg #endif
21*4d6fc14bSjoerg 
22*4d6fc14bSjoerg _LIBCPP_PUSH_MACROS
23*4d6fc14bSjoerg #include <__undef_macros>
24*4d6fc14bSjoerg 
25*4d6fc14bSjoerg _LIBCPP_BEGIN_NAMESPACE_STD
26*4d6fc14bSjoerg 
27*4d6fc14bSjoerg // clang-format off
28*4d6fc14bSjoerg 
29*4d6fc14bSjoerg #if !defined(_LIBCPP_HAS_NO_RANGES)
30*4d6fc14bSjoerg 
31*4d6fc14bSjoerg namespace ranges {
32*4d6fc14bSjoerg   // [range.range]
33*4d6fc14bSjoerg   template <class _Tp>
requires(_Tp & __t)34*4d6fc14bSjoerg   concept range = requires(_Tp& __t) {
35*4d6fc14bSjoerg     ranges::begin(__t); // sometimes equality-preserving
36*4d6fc14bSjoerg     ranges::end(__t);
37*4d6fc14bSjoerg   };
38*4d6fc14bSjoerg 
39*4d6fc14bSjoerg   template<class _Range>
40*4d6fc14bSjoerg   concept borrowed_range = range<_Range> &&
41*4d6fc14bSjoerg     (is_lvalue_reference_v<_Range> || enable_borrowed_range<remove_cvref_t<_Range>>);
42*4d6fc14bSjoerg 
43*4d6fc14bSjoerg   // `iterator_t` defined in <__ranges/access.h>
44*4d6fc14bSjoerg 
45*4d6fc14bSjoerg   template <range _Rp>
46*4d6fc14bSjoerg   using sentinel_t = decltype(ranges::end(declval<_Rp&>()));
47*4d6fc14bSjoerg 
48*4d6fc14bSjoerg   template <range _Rp>
49*4d6fc14bSjoerg   using range_difference_t = iter_difference_t<iterator_t<_Rp> >;
50*4d6fc14bSjoerg 
51*4d6fc14bSjoerg   template <range _Rp>
52*4d6fc14bSjoerg   using range_value_t = iter_value_t<iterator_t<_Rp> >;
53*4d6fc14bSjoerg 
54*4d6fc14bSjoerg   template <range _Rp>
55*4d6fc14bSjoerg   using range_reference_t = iter_reference_t<iterator_t<_Rp> >;
56*4d6fc14bSjoerg 
57*4d6fc14bSjoerg   template <range _Rp>
58*4d6fc14bSjoerg   using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<_Rp> >;
59*4d6fc14bSjoerg 
60*4d6fc14bSjoerg   // [range.sized]
61*4d6fc14bSjoerg   template <class _Tp>
requires(_Tp & __t)62*4d6fc14bSjoerg   concept sized_range = range<_Tp> && requires(_Tp& __t) { ranges::size(__t); };
63*4d6fc14bSjoerg 
64*4d6fc14bSjoerg   // `disable_sized_range` defined in `<__ranges/size.h>`
65*4d6fc14bSjoerg 
66*4d6fc14bSjoerg   // [range.refinements], other range refinements
67*4d6fc14bSjoerg   template <class _Tp>
68*4d6fc14bSjoerg   concept input_range = range<_Tp> && input_iterator<iterator_t<_Tp> >;
69*4d6fc14bSjoerg 
70*4d6fc14bSjoerg   template <class _Tp>
71*4d6fc14bSjoerg   concept forward_range = input_range<_Tp> && forward_iterator<iterator_t<_Tp> >;
72*4d6fc14bSjoerg 
73*4d6fc14bSjoerg   template <class _Tp>
74*4d6fc14bSjoerg   concept bidirectional_range = forward_range<_Tp> && bidirectional_iterator<iterator_t<_Tp> >;
75*4d6fc14bSjoerg 
76*4d6fc14bSjoerg   template <class _Tp>
77*4d6fc14bSjoerg   concept random_access_range =
78*4d6fc14bSjoerg       bidirectional_range<_Tp> && random_access_iterator<iterator_t<_Tp> >;
79*4d6fc14bSjoerg 
80*4d6fc14bSjoerg   template <class _Tp>
81*4d6fc14bSjoerg   concept common_range = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp> >;
82*4d6fc14bSjoerg } // namespace ranges
83*4d6fc14bSjoerg 
84*4d6fc14bSjoerg #endif // !defined(_LIBCPP_HAS_NO_RANGES)
85*4d6fc14bSjoerg 
86*4d6fc14bSjoerg // clang-format on
87*4d6fc14bSjoerg 
88*4d6fc14bSjoerg _LIBCPP_END_NAMESPACE_STD
89*4d6fc14bSjoerg 
90*4d6fc14bSjoerg _LIBCPP_POP_MACROS
91*4d6fc14bSjoerg 
92*4d6fc14bSjoerg #endif // _LIBCPP___RANGES_CONCEPTS_H
93