aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/cxxsupp/libcxx/include/ranges
blob: ca3e7e0956add5453633e2e3c139afe7e73fc519 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
// -*- C++ -*- 
//===--------------------------- ranges -----------------------------------===// 
// 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
// See https://llvm.org/LICENSE.txt for license information. 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
// 
//===----------------------------------------------------------------------===// 
 
#ifndef _LIBCPP_RANGES 
#define _LIBCPP_RANGES 
 
/* 
 
#include <compare>              // see [compare.syn] 
#include <initializer_list>     // see [initializer.list.syn] 
#include <iterator>             // see [iterator.synopsis] 
 
namespace std::ranges { 
  inline namespace unspecified { 
    // [range.access], range access 
    inline constexpr unspecified begin = unspecified; 
    inline constexpr unspecified end = unspecified; 
    inline constexpr unspecified cbegin = unspecified; 
    inline constexpr unspecified cend = unspecified; 
 
    inline constexpr unspecified size = unspecified; 
    inline constexpr unspecified ssize = unspecified; 
  } 
 
  // [range.range], ranges 
  template<class T> 
    concept range = see below; 
 
  template<class T> 
    inline constexpr bool enable_borrowed_range = false; 
 
  template<class T> 
    using iterator_t = decltype(ranges::begin(declval<R&>())); 
  template<range R> 
    using sentinel_t = decltype(ranges::end(declval<R&>())); 
  template<range R> 
    using range_difference_t = iter_difference_t<iterator_t<R>>; 
  template<sized_range R> 
    using range_size_t = decltype(ranges::size(declval<R&>())); 
  template<range R> 
    using range_value_t = iter_value_t<iterator_t<R>>; 
  template<range R> 
    using range_reference_t = iter_reference_t<iterator_t<R>>; 
  template<range R> 
    using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>; 
 
  // [range.sized], sized ranges 
  template<class> 
    inline constexpr bool disable_sized_range = false; 
 
  template<class T> 
    concept sized_range = ...; 
 
  // [range.view], views 
  template<class T> 
    inline constexpr bool enable_view = ...; 
 
  struct view_base { }; 
 
  template<class T> 
    concept view = ...; 
 
  // [range.refinements], other range refinements 
  template<class R, class T> 
    concept output_range = see below; 
 
  template<class T> 
    concept input_range = see below; 
 
  template<class T> 
    concept forward_range = see below; 
 
  template<class T> 
  concept bidirectional_range = see below; 
 
  template<class T> 
  concept random_access_range = see below; 
 
  template<class T> 
  concept contiguous_range = see below; 
 
  template <class _Tp> 
    concept common_range = see below; 
 
  template<class T> 
  concept viewable_range = see below; 
 
  // [view.interface], class template view_interface 
  template<class D> 
    requires is_class_v<D> && same_as<D, remove_cv_t<D>> 
  class view_interface; 
 
  // [range.subrange], sub-ranges 
  enum class subrange_kind : bool { unsized, sized }; 
 
  template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = see below> 
    requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>) 
  class subrange; 
 
  template<class I, class S, subrange_kind K> 
    inline constexpr bool enable_borrowed_range<subrange<I, S, K>> = true; 
 
  // [range.dangling], dangling iterator handling 
  struct dangling; 
 
  template<range R> 
    using borrowed_iterator_t = see below; 
 
  template<range R> 
    using borrowed_subrange_t = see below; 
 
  // [range.empty], empty view 
  template<class T> 
    requires is_object_v<T> 
  class empty_view; 
 
  // [range.all], all view 
  namespace views { 
    inline constexpr unspecified all = unspecified; 
 
    template<viewable_range R> 
      using all_t = decltype(all(declval<R>())); 
  } 
 
  template<range R> 
    requires is_object_v<R> 
  class ref_view; 
 
  template<class T> 
    inline constexpr bool enable_borrowed_range<ref_view<T>> = true; 
 
  // [range.drop], drop view 
  template<view V> 
    class drop_view; 
 
  template<class T> 
    inline constexpr bool enable_borrowed_range<drop_view<T>> = enable_borrowed_range<T>; 
 
  // [range.transform], transform view 
  template<input_range V, copy_constructible F> 
    requires view<V> && is_object_v<F> && 
             regular_invocable<F&, range_reference_t<V>> && 
             can-reference<invoke_result_t<F&, range_reference_t<V>>> 
  class transform_view; 
 
  // [range.counted], counted view 
  namespace views { inline constexpr unspecified counted = unspecified; } 
 
  // [range.common], common view 
  template<view V> 
    requires (!common_range<V> && copyable<iterator_t<V>>) 
  class common_view; 
 
 // [range.reverse], reverse view 
  template<view V> 
    requires bidirectional_range<V> 
  class reverse_view; 
 
  template<class T> 
    inline constexpr bool enable_borrowed_range<reverse_view<T>> = enable_borrowed_range<T>; 
 
  template<class T> 
  inline constexpr bool enable_borrowed_range<common_view<T>> = enable_borrowed_range<T>; 
 
   // [range.take], take view 
  template<view> class take_view; 
 
  template<class T> 
  inline constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>; 
 
  template<copy_constructible T> 
    requires is_object_v<T> 
  class single_view; 
 
  template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> 
    requires weakly-equality-comparable-with<W, Bound> && copyable<W> 
  class iota_view; 
 
  template<class W, class Bound> 
    inline constexpr bool enable_borrowed_range<iota_view<W, Bound>> = true; 
 
  // [range.join], join view 
  template<input_range V> 
    requires view<V> && input_range<range_reference_t<V>> 
  class join_view; 
} 
 
*/ 
 
// Make sure all feature-test macros are available. 
#include <version> 
// Enable the contents of the header only when libc++ was built with LIBCXX_ENABLE_INCOMPLETE_FEATURES. 
#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) 
 
#include <__config> 
#include <__ranges/access.h> 
#include <__ranges/all.h> 
#include <__ranges/common_view.h> 
#include <__ranges/concepts.h> 
#include <__ranges/counted.h> 
#include <__ranges/dangling.h> 
#include <__ranges/data.h> 
#include <__ranges/drop_view.h> 
#include <__ranges/empty_view.h> 
#include <__ranges/empty.h> 
#include <__ranges/enable_borrowed_range.h> 
#include <__ranges/enable_view.h> 
#include <__ranges/iota_view.h> 
#include <__ranges/join_view.h> 
#include <__ranges/ref_view.h> 
#include <__ranges/reverse_view.h> 
#include <__ranges/single_view.h> 
#include <__ranges/size.h> 
#include <__ranges/subrange.h> 
#include <__ranges/take_view.h> 
#include <__ranges/transform_view.h> 
#include <__ranges/view_interface.h> 
#include <compare>          // Required by the standard. 
#include <initializer_list> // Required by the standard. 
#include <iterator>         // Required by the standard. 
#include <type_traits> 
 
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 
#pragma GCC system_header 
#endif 
 
_LIBCPP_BEGIN_NAMESPACE_STD 
 
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_RANGES) 
 
namespace views = ranges::views; 
 
#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_RANGES) 
 
_LIBCPP_END_NAMESPACE_STD 
 
#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) 
 
#endif // _LIBCPP_RANGES