From Jason Turner

[ranges.syn]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpgrorx98f/{from.md → to.md} +207 -174
tmp/tmpgrorx98f/{from.md → to.md} RENAMED
@@ -1,550 +1,583 @@
1
  ## Header `<ranges>` synopsis <a id="ranges.syn">[[ranges.syn]]</a>
2
 
3
  ``` cpp
 
4
  #include <compare> // see [compare.syn]
5
  #include <initializer_list> // see [initializer.list.syn]
6
  #include <iterator> // see [iterator.synopsis]
7
 
8
  namespace std::ranges {
9
  inline namespace unspecified {
10
  // [range.access], range access
11
- inline constexpr unspecified begin = unspecified; // freestanding
12
- inline constexpr unspecified end = unspecified; // freestanding
13
- inline constexpr unspecified cbegin = unspecified; // freestanding
14
- inline constexpr unspecified cend = unspecified; // freestanding
15
- inline constexpr unspecified rbegin = unspecified; // freestanding
16
- inline constexpr unspecified rend = unspecified; // freestanding
17
- inline constexpr unspecified crbegin = unspecified; // freestanding
18
- inline constexpr unspecified crend = unspecified; // freestanding
19
 
20
- inline constexpr unspecified size = unspecified; // freestanding
21
- inline constexpr unspecified ssize = unspecified; // freestanding
22
- inline constexpr unspecified empty = unspecified; // freestanding
23
- inline constexpr unspecified data = unspecified; // freestanding
24
- inline constexpr unspecified cdata = unspecified; // freestanding
 
25
  }
26
 
27
  // [range.range], ranges
28
  template<class T>
29
- concept range = see below; // freestanding
30
 
31
  template<class T>
32
- constexpr bool enable_borrowed_range = false; // freestanding
33
 
34
  template<class T>
35
- concept borrowed_range = see below; // freestanding
36
 
37
  template<class T>
38
- using iterator_t = decltype(ranges::begin(declval<T&>())); // freestanding
39
  template<range R>
40
- using sentinel_t = decltype(ranges::end(declval<R&>())); // freestanding
41
  template<range R>
42
- using const_iterator_t = const_iterator<iterator_t<R>>; // freestanding
43
  template<range R>
44
- using const_sentinel_t = const_sentinel<sentinel_t<R>>; // freestanding
45
  template<range R>
46
- using range_difference_t = iter_difference_t<iterator_t<R>>; // freestanding
47
  template<sized_range R>
48
- using range_size_t = decltype(ranges::size(declval<R&>())); // freestanding
49
  template<range R>
50
- using range_value_t = iter_value_t<iterator_t<R>>; // freestanding
51
  template<range R>
52
- using range_reference_t = iter_reference_t<iterator_t<R>>; // freestanding
53
  template<range R>
54
- using range_const_reference_t = iter_const_reference_t<iterator_t<R>>; // freestanding
55
  template<range R>
56
- using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>; // freestanding
57
  template<range R>
58
- using range_common_reference_t = iter_common_reference_t<iterator_t<R>>; // freestanding
59
 
60
  // [range.sized], sized ranges
61
  template<class>
62
- constexpr bool disable_sized_range = false; // freestanding
63
 
64
  template<class T>
65
- concept sized_range = see below; // freestanding
 
 
 
66
 
67
  // [range.view], views
68
  template<class T>
69
- constexpr bool enable_view = see below; // freestanding
70
 
71
- struct view_base {}; // freestanding
72
 
73
  template<class T>
74
- concept view = see below; // freestanding
75
 
76
  // [range.refinements], other range refinements
77
  template<class R, class T>
78
- concept output_range = see below; // freestanding
79
 
80
  template<class T>
81
- concept input_range = see below; // freestanding
82
 
83
  template<class T>
84
- concept forward_range = see below; // freestanding
85
 
86
  template<class T>
87
- concept bidirectional_range = see below; // freestanding
88
 
89
  template<class T>
90
- concept random_access_range = see below; // freestanding
91
 
92
  template<class T>
93
- concept contiguous_range = see below; // freestanding
94
 
95
  template<class T>
96
- concept common_range = see below; // freestanding
97
 
98
  template<class T>
99
- concept viewable_range = see below; // freestanding
100
 
101
  template<class T>
102
- concept constant_range = see below; // freestanding
 
 
 
103
 
104
  // [view.interface], class template view_interface
105
  template<class D>
106
  requires is_class_v<D> && same_as<D, remove_cv_t<D>>
107
- class view_interface; // freestanding
108
 
109
  // [range.subrange], sub-ranges
110
- enum class subrange_kind : bool { unsized, sized }; // freestanding
111
 
112
  template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = see below>
113
  requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>)
114
- class subrange; // freestanding
115
 
116
  template<class I, class S, subrange_kind K>
117
- constexpr bool enable_borrowed_range<subrange<I, S, K>> = true; // freestanding
118
 
119
  template<size_t N, class I, class S, subrange_kind K>
120
  requires ((N == 0 && copyable<I>) || N == 1)
121
- constexpr auto get(const subrange<I, S, K>& r); // freestanding
122
 
123
  template<size_t N, class I, class S, subrange_kind K>
124
  requires (N < 2)
125
- constexpr auto get(subrange<I, S, K>&& r); // freestanding
126
  }
127
 
128
  namespace std {
129
- using ranges::get; // freestanding
130
  }
131
 
132
  namespace std::ranges {
133
  // [range.dangling], dangling iterator handling
134
- struct dangling; // freestanding
135
 
136
  // [range.elementsof], class template elements_of
137
  template<range R, class Allocator = allocator<byte>>
138
- struct elements_of;
139
 
140
  template<range R>
141
- using borrowed_iterator_t = see below; // freestanding
142
 
143
  template<range R>
144
- using borrowed_subrange_t = see below; // freestanding
145
 
146
  // [range.utility.conv], range conversions
147
  template<class C, input_range R, class... Args> requires (!view<C>)
148
- constexpr C to(R&& r, Args&&... args); // freestanding
149
  template<template<class...> class C, input_range R, class... Args>
150
- constexpr auto to(R&& r, Args&&... args); // freestanding
151
  template<class C, class... Args> requires (!view<C>)
152
- constexpr auto to(Args&&... args); // freestanding
153
  template<template<class...> class C, class... Args>
154
- constexpr auto to(Args&&... args); // freestanding
155
 
156
  // [range.empty], empty view
157
  template<class T>
158
  requires is_object_v<T>
159
- class empty_view; // freestanding
160
 
161
  template<class T>
162
- constexpr bool enable_borrowed_range<empty_view<T>> = true; // freestanding
163
 
164
  namespace views {
165
  template<class T>
166
- constexpr empty_view<T> empty{}; // freestanding
167
  }
168
 
169
  // [range.single], single view
170
  template<move_constructible T>
171
  requires is_object_v<T>
172
- class single_view; // freestanding
173
 
174
- namespace views { inline constexpr unspecified single = unspecified; } // freestanding
175
 
176
  template<bool Const, class T>
177
  using maybe-const = conditional_t<Const, const T, T>; // exposition only
178
 
179
  // [range.iota], iota view
180
  template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t>
181
  requires weakly-equality-comparable-with<W, Bound> && copyable<W>
182
- class iota_view; // freestanding
183
 
184
  template<class W, class Bound>
185
- constexpr bool enable_borrowed_range<iota_view<W, Bound>> = true; // freestanding
186
 
187
- namespace views { inline constexpr unspecified iota = unspecified; } // freestanding
 
 
 
188
 
189
  // [range.repeat], repeat view
190
  template<move_constructible T, semiregular Bound = unreachable_sentinel_t>
191
  requires see below
192
- class repeat_view; // freestanding
193
 
194
- namespace views { inline constexpr unspecified repeat = unspecified; } // freestanding
195
 
196
  // [range.istream], istream view
197
  template<movable Val, class CharT, class Traits = char_traits<CharT>>
198
  requires see below
199
- class basic_istream_view;
200
  template<class Val>
201
- using istream_view = basic_istream_view<Val, char>;
202
  template<class Val>
203
- using wistream_view = basic_istream_view<Val, wchar_t>;
204
 
205
- namespace views { template<class T> constexpr unspecified istream = unspecified; }
 
 
206
 
207
  // [range.adaptor.object], range adaptor objects
208
  template<class D>
209
  requires is_class_v<D> && same_as<D, remove_cv_t<D>>
210
- class range_adaptor_closure { }; // freestanding
211
 
212
  // [range.all], all view
213
  namespace views {
214
- inline constexpr unspecified all = unspecified; // freestanding
215
 
216
  template<viewable_range R>
217
- using all_t = decltype(all(declval<R>())); // freestanding
218
  }
219
 
220
  // [range.ref.view], ref view
221
  template<range R>
222
  requires is_object_v<R>
223
- class ref_view; // freestanding
224
 
225
  template<class T>
226
- constexpr bool enable_borrowed_range<ref_view<T>> = true; // freestanding
227
 
228
  // [range.owning.view], owning view
229
  template<range R>
230
  requires see below
231
- class owning_view; // freestanding
232
 
233
  template<class T>
234
- constexpr bool enable_borrowed_range<owning_view<T>> = // freestanding
235
  enable_borrowed_range<T>;
236
 
237
  // [range.as.rvalue], as rvalue view
238
  template<view V>
239
  requires input_range<V>
240
- class as_rvalue_view; // freestanding
241
 
242
  template<class T>
243
- constexpr bool enable_borrowed_range<as_rvalue_view<T>> = // freestanding
244
  enable_borrowed_range<T>;
245
 
246
- namespace views { inline constexpr unspecified as_rvalue = unspecified; } // freestanding
247
 
248
  // [range.filter], filter view
249
  template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred>
250
  requires view<V> && is_object_v<Pred>
251
- class filter_view; // freestanding
252
 
253
- namespace views { inline constexpr unspecified filter = unspecified; } // freestanding
254
 
255
  // [range.transform], transform view
256
  template<input_range V, move_constructible F>
257
  requires view<V> && is_object_v<F> &&
258
  regular_invocable<F&, range_reference_t<V>> &&
259
  can-reference<invoke_result_t<F&, range_reference_t<V>>>
260
- class transform_view; // freestanding
261
 
262
- namespace views { inline constexpr unspecified transform = unspecified; } // freestanding
263
 
264
  // [range.take], take view
265
- template<view> class take_view; // freestanding
266
 
267
  template<class T>
268
- constexpr bool enable_borrowed_range<take_view<T>> = // freestanding
269
  enable_borrowed_range<T>;
270
 
271
- namespace views { inline constexpr unspecified take = unspecified; } // freestanding
272
 
273
  // [range.take.while], take while view
274
  template<view V, class Pred>
275
  requires input_range<V> && is_object_v<Pred> &&
276
  indirect_unary_predicate<const Pred, iterator_t<V>>
277
- class take_while_view; // freestanding
278
 
279
- namespace views { inline constexpr unspecified take_while = unspecified; } // freestanding
280
 
281
  // [range.drop], drop view
282
  template<view V>
283
- class drop_view; // freestanding
284
 
285
  template<class T>
286
- constexpr bool enable_borrowed_range<drop_view<T>> = // freestanding
287
  enable_borrowed_range<T>;
288
 
289
- namespace views { inline constexpr unspecified drop = unspecified; } // freestanding
290
 
291
  // [range.drop.while], drop while view
292
  template<view V, class Pred>
293
  requires input_range<V> && is_object_v<Pred> &&
294
  indirect_unary_predicate<const Pred, iterator_t<V>>
295
- class drop_while_view; // freestanding
296
 
297
  template<class T, class Pred>
298
- constexpr bool enable_borrowed_range<drop_while_view<T, Pred>> = // freestanding
299
  enable_borrowed_range<T>;
300
 
301
- namespace views { inline constexpr unspecified drop_while = unspecified; } // freestanding
302
 
303
  // [range.join], join view
304
  template<input_range V>
305
  requires view<V> && input_range<range_reference_t<V>>
306
- class join_view; // freestanding
307
 
308
- namespace views { inline constexpr unspecified join = unspecified; } // freestanding
309
 
310
  // [range.join.with], join with view
311
- template<class R, class P>
312
- concept compatible-joinable-ranges = see below; // exposition only
313
-
314
  template<input_range V, forward_range Pattern>
315
- requires view<V> && input_range<range_reference_t<V>>
316
- && view<Pattern>
317
- && compatible-joinable-ranges<range_reference_t<V>, Pattern>
318
- class join_with_view; // freestanding
319
 
320
- namespace views { inline constexpr unspecified join_with = unspecified; } // freestanding
321
 
322
  // [range.lazy.split], lazy split view
323
  template<class R>
324
  concept tiny-range = see below; // exposition only
325
 
326
  template<input_range V, forward_range Pattern>
327
  requires view<V> && view<Pattern> &&
328
  indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> &&
329
  (forward_range<V> || tiny-range<Pattern>)
330
- class lazy_split_view; // freestanding
331
 
332
  // [range.split], split view
333
  template<forward_range V, forward_range Pattern>
334
  requires view<V> && view<Pattern> &&
335
  indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>
336
- class split_view; // freestanding
337
 
338
  namespace views {
339
- inline constexpr unspecified lazy_split = unspecified; // freestanding
340
- inline constexpr unspecified split = unspecified; // freestanding
341
  }
342
 
 
 
 
 
 
 
 
343
  // [range.counted], counted view
344
- namespace views { inline constexpr unspecified counted = unspecified; } // freestanding
345
 
346
  // [range.common], common view
347
  template<view V>
348
  requires (!common_range<V> && copyable<iterator_t<V>>)
349
- class common_view; // freestanding
350
 
351
  template<class T>
352
- constexpr bool enable_borrowed_range<common_view<T>> = // freestanding
353
  enable_borrowed_range<T>;
354
 
355
- namespace views { inline constexpr unspecified common = unspecified; } // freestanding
356
 
357
  // [range.reverse], reverse view
358
  template<view V>
359
  requires bidirectional_range<V>
360
- class reverse_view; // freestanding
361
 
362
  template<class T>
363
- constexpr bool enable_borrowed_range<reverse_view<T>> = // freestanding
364
  enable_borrowed_range<T>;
365
 
366
- namespace views { inline constexpr unspecified reverse = unspecified; } // freestanding
367
 
368
  // [range.as.const], as const view
369
  template<input_range R>
370
- constexpr auto& possibly-const-range(R& r) { // exposition only
371
- if constexpr (constant_range<const R> && !constant_range<R>) {
372
  return const_cast<const R&>(r);
373
  } else {
374
  return r;
375
  }
376
  }
377
 
378
  template<view V>
379
  requires input_range<V>
380
- class as_const_view; // freestanding
381
 
382
  template<class T>
383
- constexpr bool enable_borrowed_range<as_const_view<T>> = // freestanding
384
  enable_borrowed_range<T>;
385
 
386
- namespace views { inline constexpr unspecified as_const = unspecified; } // freestanding
387
 
388
  // [range.elements], elements view
389
  template<input_range V, size_t N>
390
  requires see below
391
- class elements_view; // freestanding
392
 
393
  template<class T, size_t N>
394
- constexpr bool enable_borrowed_range<elements_view<T, N>> = // freestanding
395
  enable_borrowed_range<T>;
396
 
397
  template<class R>
398
- using keys_view = elements_view<R, 0>; // freestanding
399
  template<class R>
400
- using values_view = elements_view<R, 1>; // freestanding
401
 
402
  namespace views {
403
  template<size_t N>
404
- constexpr unspecified elements = unspecified; // freestanding
405
- inline constexpr auto keys = elements<0>; // freestanding
406
- inline constexpr auto values = elements<1>; // freestanding
407
  }
408
 
409
  // [range.enumerate], enumerate view
410
- template<input_range View>
411
- requires view<View>
412
- class enumerate_view; // freestanding
413
 
414
  template<class View>
415
- constexpr bool enable_borrowed_range<enumerate_view<View>> = // freestanding
416
  enable_borrowed_range<View>;
417
 
418
- namespace views { inline constexpr unspecified enumerate = unspecified; } // freestanding
419
 
420
  // [range.zip], zip view
421
  template<input_range... Views>
422
  requires (view<Views> && ...) && (sizeof...(Views) > 0)
423
- class zip_view; // freestanding
424
 
425
  template<class... Views>
426
- constexpr bool enable_borrowed_range<zip_view<Views...>> = // freestanding
427
  (enable_borrowed_range<Views> && ...);
428
 
429
- namespace views { inline constexpr unspecified zip = unspecified; } // freestanding
430
 
431
  // [range.zip.transform], zip transform view
432
  template<move_constructible F, input_range... Views>
433
  requires (view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
434
  regular_invocable<F&, range_reference_t<Views>...> &&
435
  can-reference<invoke_result_t<F&, range_reference_t<Views>...>>
436
- class zip_transform_view; // freestanding
437
 
438
- namespace views { inline constexpr unspecified zip_transform = unspecified; } // freestanding
439
 
440
  // [range.adjacent], adjacent view
441
  template<forward_range V, size_t N>
442
  requires view<V> && (N > 0)
443
- class adjacent_view; // freestanding
444
 
445
  template<class V, size_t N>
446
- constexpr bool enable_borrowed_range<adjacent_view<V, N>> = // freestanding
447
  enable_borrowed_range<V>;
448
 
449
  namespace views {
450
  template<size_t N>
451
- constexpr unspecified adjacent = unspecified; // freestanding
452
- inline constexpr auto pairwise = adjacent<2>; // freestanding
453
  }
454
 
455
  // [range.adjacent.transform], adjacent transform view
456
  template<forward_range V, move_constructible F, size_t N>
457
  requires see below
458
- class adjacent_transform_view; // freestanding
459
 
460
  namespace views {
461
  template<size_t N>
462
- constexpr unspecified adjacent_transform = unspecified; // freestanding
463
- inline constexpr auto pairwise_transform = adjacent_transform<2>; // freestanding
464
  }
465
 
466
  // [range.chunk], chunk view
467
  template<view V>
468
  requires input_range<V>
469
- class chunk_view; // freestanding
470
 
471
  template<view V>
472
  requires forward_range<V>
473
- class chunk_view<V>; // freestanding
474
 
475
  template<class V>
476
- constexpr bool enable_borrowed_range<chunk_view<V>> = // freestanding
477
  forward_range<V> && enable_borrowed_range<V>;
478
 
479
- namespace views { inline constexpr unspecified chunk = unspecified; } // freestanding
480
 
481
  // [range.slide], slide view
482
  template<forward_range V>
483
  requires view<V>
484
- class slide_view; // freestanding
485
 
486
  template<class V>
487
- constexpr bool enable_borrowed_range<slide_view<V>> =
488
- enable_borrowed_range<V>; // freestanding
489
 
490
- namespace views { inline constexpr unspecified slide = unspecified; } // freestanding
491
 
492
  // [range.chunk.by], chunk by view
493
  template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred>
494
  requires view<V> && is_object_v<Pred>
495
- class chunk_by_view; // freestanding
496
 
497
- namespace views { inline constexpr unspecified chunk_by = unspecified; } // freestanding
498
 
499
  // [range.stride], stride view
500
  template<input_range V>
501
  requires view<V>
502
- class stride_view; // freestanding
503
 
504
  template<class V>
505
- constexpr bool enable_borrowed_range<stride_view<V>> = // freestanding
506
  enable_borrowed_range<V>;
507
 
508
- namespace views { inline constexpr unspecified stride = unspecified; } // freestanding
509
 
510
  // [range.cartesian], cartesian product view
511
  template<input_range First, forward_range... Vs>
512
  requires (view<First> && ... && view<Vs>)
513
- class cartesian_product_view; // freestanding
514
 
515
- namespace views { inline constexpr unspecified cartesian_product = unspecified; } // freestanding
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
516
  }
517
 
518
  namespace std {
519
- namespace views = ranges::views; // freestanding
520
 
521
- template<class T> struct tuple_size; // freestanding
522
- template<size_t I, class T> struct tuple_element; // freestanding
523
 
524
  template<class I, class S, ranges::subrange_kind K>
525
- struct tuple_size<ranges::subrange<I, S, K>> // freestanding
526
  : integral_constant<size_t, 2> {};
527
  template<class I, class S, ranges::subrange_kind K>
528
- struct tuple_element<0, ranges::subrange<I, S, K>> { // freestanding
529
- using type = I; // freestanding
530
  };
531
  template<class I, class S, ranges::subrange_kind K>
532
- struct tuple_element<1, ranges::subrange<I, S, K>> { // freestanding
533
- using type = S; // freestanding
534
  };
535
  template<class I, class S, ranges::subrange_kind K>
536
- struct tuple_element<0, const ranges::subrange<I, S, K>> { // freestanding
537
- using type = I; // freestanding
538
  };
539
  template<class I, class S, ranges::subrange_kind K>
540
- struct tuple_element<1, const ranges::subrange<I, S, K>> { // freestanding
541
- using type = S; // freestanding
542
  };
543
 
544
- struct from_range_t { explicit from_range_t() = default; }; // freestanding
545
- inline constexpr from_range_t from_range{}; // freestanding
546
  }
547
  ```
548
 
549
  Within this Clause, for an integer-like type `X`
550
  [[iterator.concept.winc]], `make-unsigned-like-t<X>` denotes
 
1
  ## Header `<ranges>` synopsis <a id="ranges.syn">[[ranges.syn]]</a>
2
 
3
  ``` cpp
4
+ // mostly freestanding
5
  #include <compare> // see [compare.syn]
6
  #include <initializer_list> // see [initializer.list.syn]
7
  #include <iterator> // see [iterator.synopsis]
8
 
9
  namespace std::ranges {
10
  inline namespace unspecified {
11
  // [range.access], range access
12
+ inline constexpr unspecified begin = unspecified;
13
+ inline constexpr unspecified end = unspecified;
14
+ inline constexpr unspecified cbegin = unspecified;
15
+ inline constexpr unspecified cend = unspecified;
16
+ inline constexpr unspecified rbegin = unspecified;
17
+ inline constexpr unspecified rend = unspecified;
18
+ inline constexpr unspecified crbegin = unspecified;
19
+ inline constexpr unspecified crend = unspecified;
20
 
21
+ inline constexpr unspecified size = unspecified;
22
+ inline constexpr unspecified reserve_hint = unspecified;
23
+ inline constexpr unspecified ssize = unspecified;
24
+ inline constexpr unspecified empty = unspecified;
25
+ inline constexpr unspecified data = unspecified;
26
+ inline constexpr unspecified cdata = unspecified;
27
  }
28
 
29
  // [range.range], ranges
30
  template<class T>
31
+ concept range = see below;
32
 
33
  template<class T>
34
+ constexpr bool enable_borrowed_range = false;
35
 
36
  template<class T>
37
+ concept borrowed_range = see below;
38
 
39
  template<class T>
40
+ using iterator_t = decltype(ranges::begin(declval<T&>()));
41
  template<range R>
42
+ using sentinel_t = decltype(ranges::end(declval<R&>()));
43
  template<range R>
44
+ using const_iterator_t = decltype(ranges::cbegin(declval<R&>()));
45
  template<range R>
46
+ using const_sentinel_t = decltype(ranges::cend(declval<R&>()));
47
  template<range R>
48
+ using range_difference_t = iter_difference_t<iterator_t<R>>;
49
  template<sized_range R>
50
+ using range_size_t = decltype(ranges::size(declval<R&>()));
51
  template<range R>
52
+ using range_value_t = iter_value_t<iterator_t<R>>;
53
  template<range R>
54
+ using range_reference_t = iter_reference_t<iterator_t<R>>;
55
  template<range R>
56
+ using range_const_reference_t = iter_const_reference_t<iterator_t<R>>;
57
  template<range R>
58
+ using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>;
59
  template<range R>
60
+ using range_common_reference_t = iter_common_reference_t<iterator_t<R>>;
61
 
62
  // [range.sized], sized ranges
63
  template<class>
64
+ constexpr bool disable_sized_range = false;
65
 
66
  template<class T>
67
+ concept approximately_sized_range = see below;
68
+
69
+ template<class T>
70
+ concept sized_range = see below;
71
 
72
  // [range.view], views
73
  template<class T>
74
+ constexpr bool enable_view = see below;
75
 
76
+ struct view_base {};
77
 
78
  template<class T>
79
+ concept view = see below;
80
 
81
  // [range.refinements], other range refinements
82
  template<class R, class T>
83
+ concept output_range = see below;
84
 
85
  template<class T>
86
+ concept input_range = see below;
87
 
88
  template<class T>
89
+ concept forward_range = see below;
90
 
91
  template<class T>
92
+ concept bidirectional_range = see below;
93
 
94
  template<class T>
95
+ concept random_access_range = see below;
96
 
97
  template<class T>
98
+ concept contiguous_range = see below;
99
 
100
  template<class T>
101
+ concept common_range = see below;
102
 
103
  template<class T>
104
+ concept viewable_range = see below;
105
 
106
  template<class T>
107
+ concept constant_range = see below;
108
+
109
+ template<class T>
110
+ concept sized-random-access-range = see belownc; // exposition only
111
 
112
  // [view.interface], class template view_interface
113
  template<class D>
114
  requires is_class_v<D> && same_as<D, remove_cv_t<D>>
115
+ class view_interface;
116
 
117
  // [range.subrange], sub-ranges
118
+ enum class subrange_kind : bool { unsized, sized };
119
 
120
  template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = see below>
121
  requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>)
122
+ class subrange;
123
 
124
  template<class I, class S, subrange_kind K>
125
+ constexpr bool \libspec{enable_borrowed_range}{subrange}<subrange<I, S, K>> = true;
126
 
127
  template<size_t N, class I, class S, subrange_kind K>
128
  requires ((N == 0 && copyable<I>) || N == 1)
129
+ constexpr auto get(const subrange<I, S, K>& r);
130
 
131
  template<size_t N, class I, class S, subrange_kind K>
132
  requires (N < 2)
133
+ constexpr auto get(subrange<I, S, K>&& r);
134
  }
135
 
136
  namespace std {
137
+ using ranges::get;
138
  }
139
 
140
  namespace std::ranges {
141
  // [range.dangling], dangling iterator handling
142
+ struct dangling;
143
 
144
  // [range.elementsof], class template elements_of
145
  template<range R, class Allocator = allocator<byte>>
146
+ struct elements_of; // hosted
147
 
148
  template<range R>
149
+ using borrowed_iterator_t = see below;
150
 
151
  template<range R>
152
+ using borrowed_subrange_t = see below;
153
 
154
  // [range.utility.conv], range conversions
155
  template<class C, input_range R, class... Args> requires (!view<C>)
156
+ constexpr C to(R&& r, Args&&... args);
157
  template<template<class...> class C, input_range R, class... Args>
158
+ constexpr auto to(R&& r, Args&&... args);
159
  template<class C, class... Args> requires (!view<C>)
160
+ constexpr auto to(Args&&... args);
161
  template<template<class...> class C, class... Args>
162
+ constexpr auto to(Args&&... args);
163
 
164
  // [range.empty], empty view
165
  template<class T>
166
  requires is_object_v<T>
167
+ class empty_view;
168
 
169
  template<class T>
170
+ constexpr bool \libspec{enable_borrowed_range}{empty_view}<empty_view<T>> = true;
171
 
172
  namespace views {
173
  template<class T>
174
+ constexpr empty_view<T> empty{};
175
  }
176
 
177
  // [range.single], single view
178
  template<move_constructible T>
179
  requires is_object_v<T>
180
+ class single_view;
181
 
182
+ namespace views { inline constexpr unspecified single = unspecified; }
183
 
184
  template<bool Const, class T>
185
  using maybe-const = conditional_t<Const, const T, T>; // exposition only
186
 
187
  // [range.iota], iota view
188
  template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t>
189
  requires weakly-equality-comparable-with<W, Bound> && copyable<W>
190
+ class iota_view;
191
 
192
  template<class W, class Bound>
193
+ constexpr bool \libspec{enable_borrowed_range}{iota_view}<iota_view<W, Bound>> = true;
194
 
195
+ namespace views {
196
+ inline constexpr unspecified iota = unspecified;
197
+ inline constexpr unspecified indices = unspecified;
198
+ }
199
 
200
  // [range.repeat], repeat view
201
  template<move_constructible T, semiregular Bound = unreachable_sentinel_t>
202
  requires see below
203
+ class repeat_view;
204
 
205
+ namespace views { inline constexpr unspecified repeat = unspecified; }
206
 
207
  // [range.istream], istream view
208
  template<movable Val, class CharT, class Traits = char_traits<CharT>>
209
  requires see below
210
+ class basic_istream_view; // hosted
211
  template<class Val>
212
+ using istream_view = basic_istream_view<Val, char>; // hosted
213
  template<class Val>
214
+ using wistream_view = basic_istream_view<Val, wchar_t>; // hosted
215
 
216
+ namespace views {
217
+ template<class T> constexpr unspecified istream = unspecified; // hosted
218
+ }
219
 
220
  // [range.adaptor.object], range adaptor objects
221
  template<class D>
222
  requires is_class_v<D> && same_as<D, remove_cv_t<D>>
223
+ class range_adaptor_closure { };
224
 
225
  // [range.all], all view
226
  namespace views {
227
+ inline constexpr unspecified all = unspecified;
228
 
229
  template<viewable_range R>
230
+ using all_t = decltype(all(declval<R>()));
231
  }
232
 
233
  // [range.ref.view], ref view
234
  template<range R>
235
  requires is_object_v<R>
236
+ class ref_view;
237
 
238
  template<class T>
239
+ constexpr bool \libspec{enable_borrowed_range}{ref_view}<ref_view<T>> = true;
240
 
241
  // [range.owning.view], owning view
242
  template<range R>
243
  requires see below
244
+ class owning_view;
245
 
246
  template<class T>
247
+ constexpr bool \libspec{enable_borrowed_range}{owning_view}<owning_view<T>> =
248
  enable_borrowed_range<T>;
249
 
250
  // [range.as.rvalue], as rvalue view
251
  template<view V>
252
  requires input_range<V>
253
+ class as_rvalue_view;
254
 
255
  template<class T>
256
+ constexpr bool \libspec{enable_borrowed_range}{as_rvalue_view}<as_rvalue_view<T>> =
257
  enable_borrowed_range<T>;
258
 
259
+ namespace views { inline constexpr unspecified as_rvalue = unspecified; }
260
 
261
  // [range.filter], filter view
262
  template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred>
263
  requires view<V> && is_object_v<Pred>
264
+ class filter_view;
265
 
266
+ namespace views { inline constexpr unspecified filter = unspecified; }
267
 
268
  // [range.transform], transform view
269
  template<input_range V, move_constructible F>
270
  requires view<V> && is_object_v<F> &&
271
  regular_invocable<F&, range_reference_t<V>> &&
272
  can-reference<invoke_result_t<F&, range_reference_t<V>>>
273
+ class transform_view;
274
 
275
+ namespace views { inline constexpr unspecified transform = unspecified; }
276
 
277
  // [range.take], take view
278
+ template<view> class take_view;
279
 
280
  template<class T>
281
+ constexpr bool \libspec{enable_borrowed_range}{take_view}<take_view<T>> =
282
  enable_borrowed_range<T>;
283
 
284
+ namespace views { inline constexpr unspecified take = unspecified; }
285
 
286
  // [range.take.while], take while view
287
  template<view V, class Pred>
288
  requires input_range<V> && is_object_v<Pred> &&
289
  indirect_unary_predicate<const Pred, iterator_t<V>>
290
+ class take_while_view;
291
 
292
+ namespace views { inline constexpr unspecified take_while = unspecified; }
293
 
294
  // [range.drop], drop view
295
  template<view V>
296
+ class drop_view;
297
 
298
  template<class T>
299
+ constexpr bool \libspec{enable_borrowed_range}{drop_view}<drop_view<T>> =
300
  enable_borrowed_range<T>;
301
 
302
+ namespace views { inline constexpr unspecified drop = unspecified; }
303
 
304
  // [range.drop.while], drop while view
305
  template<view V, class Pred>
306
  requires input_range<V> && is_object_v<Pred> &&
307
  indirect_unary_predicate<const Pred, iterator_t<V>>
308
+ class drop_while_view;
309
 
310
  template<class T, class Pred>
311
+ constexpr bool \libspec{enable_borrowed_range}{drop_while_view}<drop_while_view<T, Pred>> =
312
  enable_borrowed_range<T>;
313
 
314
+ namespace views { inline constexpr unspecified drop_while = unspecified; }
315
 
316
  // [range.join], join view
317
  template<input_range V>
318
  requires view<V> && input_range<range_reference_t<V>>
319
+ class join_view;
320
 
321
+ namespace views { inline constexpr unspecified join = unspecified; }
322
 
323
  // [range.join.with], join with view
 
 
 
324
  template<input_range V, forward_range Pattern>
325
+ requires see below
326
+ class join_with_view;
 
 
327
 
328
+ namespace views { inline constexpr unspecified join_with = unspecified; }
329
 
330
  // [range.lazy.split], lazy split view
331
  template<class R>
332
  concept tiny-range = see below; // exposition only
333
 
334
  template<input_range V, forward_range Pattern>
335
  requires view<V> && view<Pattern> &&
336
  indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> &&
337
  (forward_range<V> || tiny-range<Pattern>)
338
+ class lazy_split_view;
339
 
340
  // [range.split], split view
341
  template<forward_range V, forward_range Pattern>
342
  requires view<V> && view<Pattern> &&
343
  indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>
344
+ class split_view;
345
 
346
  namespace views {
347
+ inline constexpr unspecified lazy_split = unspecified;
348
+ inline constexpr unspecified split = unspecified;
349
  }
350
 
351
+ // [range.concat], concat view
352
+ template<input_range... Views>
353
+ requires see below
354
+ class concat_view;
355
+
356
+ namespace views { inline constexpr unspecified concat = unspecified; }
357
+
358
  // [range.counted], counted view
359
+ namespace views { inline constexpr unspecified counted = unspecified; }
360
 
361
  // [range.common], common view
362
  template<view V>
363
  requires (!common_range<V> && copyable<iterator_t<V>>)
364
+ class common_view;
365
 
366
  template<class T>
367
+ constexpr bool \libspec{enable_borrowed_range}{common_view}<common_view<T>> =
368
  enable_borrowed_range<T>;
369
 
370
+ namespace views { inline constexpr unspecified common = unspecified; }
371
 
372
  // [range.reverse], reverse view
373
  template<view V>
374
  requires bidirectional_range<V>
375
+ class reverse_view;
376
 
377
  template<class T>
378
+ constexpr bool \libspec{enable_borrowed_range}{reverse_view}<reverse_view<T>> =
379
  enable_borrowed_range<T>;
380
 
381
+ namespace views { inline constexpr unspecified reverse = unspecified; }
382
 
383
  // [range.as.const], as const view
384
  template<input_range R>
385
+ constexpr auto& possibly-const-range(R& r) noexcept { // exposition only
386
+ if constexpr (input_range<const R>) {
387
  return const_cast<const R&>(r);
388
  } else {
389
  return r;
390
  }
391
  }
392
 
393
  template<view V>
394
  requires input_range<V>
395
+ class as_const_view;
396
 
397
  template<class T>
398
+ constexpr bool \libspec{enable_borrowed_range}{as_const_view}<as_const_view<T>> =
399
  enable_borrowed_range<T>;
400
 
401
+ namespace views { inline constexpr unspecified as_const = unspecified; }
402
 
403
  // [range.elements], elements view
404
  template<input_range V, size_t N>
405
  requires see below
406
+ class elements_view;
407
 
408
  template<class T, size_t N>
409
+ constexpr bool \libspec{enable_borrowed_range}{elements_view}<elements_view<T, N>> =
410
  enable_borrowed_range<T>;
411
 
412
  template<class R>
413
+ using keys_view = elements_view<R, 0>;
414
  template<class R>
415
+ using values_view = elements_view<R, 1>;
416
 
417
  namespace views {
418
  template<size_t N>
419
+ constexpr unspecified elements = unspecified;
420
+ inline constexpr auto keys = elements<0>;
421
+ inline constexpr auto values = elements<1>;
422
  }
423
 
424
  // [range.enumerate], enumerate view
425
+ template<view V>
426
+ requires see below
427
+ class enumerate_view;
428
 
429
  template<class View>
430
+ constexpr bool \libspec{enable_borrowed_range}{enumerate_view}<enumerate_view<View>> =
431
  enable_borrowed_range<View>;
432
 
433
+ namespace views { inline constexpr unspecified enumerate = unspecified; }
434
 
435
  // [range.zip], zip view
436
  template<input_range... Views>
437
  requires (view<Views> && ...) && (sizeof...(Views) > 0)
438
+ class zip_view;
439
 
440
  template<class... Views>
441
+ constexpr bool \libspec{enable_borrowed_range}{zip_view}<zip_view<Views...>> =
442
  (enable_borrowed_range<Views> && ...);
443
 
444
+ namespace views { inline constexpr unspecified zip = unspecified; }
445
 
446
  // [range.zip.transform], zip transform view
447
  template<move_constructible F, input_range... Views>
448
  requires (view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
449
  regular_invocable<F&, range_reference_t<Views>...> &&
450
  can-reference<invoke_result_t<F&, range_reference_t<Views>...>>
451
+ class zip_transform_view;
452
 
453
+ namespace views { inline constexpr unspecified zip_transform = unspecified; }
454
 
455
  // [range.adjacent], adjacent view
456
  template<forward_range V, size_t N>
457
  requires view<V> && (N > 0)
458
+ class adjacent_view;
459
 
460
  template<class V, size_t N>
461
+ constexpr bool \libspec{enable_borrowed_range}{adjacent_view}<adjacent_view<V, N>> =
462
  enable_borrowed_range<V>;
463
 
464
  namespace views {
465
  template<size_t N>
466
+ constexpr unspecified adjacent = unspecified;
467
+ inline constexpr auto pairwise = adjacent<2>;
468
  }
469
 
470
  // [range.adjacent.transform], adjacent transform view
471
  template<forward_range V, move_constructible F, size_t N>
472
  requires see below
473
+ class adjacent_transform_view;
474
 
475
  namespace views {
476
  template<size_t N>
477
+ constexpr unspecified adjacent_transform = unspecified;
478
+ inline constexpr auto pairwise_transform = adjacent_transform<2>;
479
  }
480
 
481
  // [range.chunk], chunk view
482
  template<view V>
483
  requires input_range<V>
484
+ class chunk_view;
485
 
486
  template<view V>
487
  requires forward_range<V>
488
+ class chunk_view<V>;
489
 
490
  template<class V>
491
+ constexpr bool \libspec{enable_borrowed_range}{chunk_view}<chunk_view<V>> =
492
  forward_range<V> && enable_borrowed_range<V>;
493
 
494
+ namespace views { inline constexpr unspecified chunk = unspecified; }
495
 
496
  // [range.slide], slide view
497
  template<forward_range V>
498
  requires view<V>
499
+ class slide_view;
500
 
501
  template<class V>
502
+ constexpr bool \libspec{enable_borrowed_range}{slide_view}<slide_view<V>> =
503
+ enable_borrowed_range<V>;
504
 
505
+ namespace views { inline constexpr unspecified slide = unspecified; }
506
 
507
  // [range.chunk.by], chunk by view
508
  template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred>
509
  requires view<V> && is_object_v<Pred>
510
+ class chunk_by_view;
511
 
512
+ namespace views { inline constexpr unspecified chunk_by = unspecified; }
513
 
514
  // [range.stride], stride view
515
  template<input_range V>
516
  requires view<V>
517
+ class stride_view;
518
 
519
  template<class V>
520
+ constexpr bool \libspec{enable_borrowed_range}{stride_view}<stride_view<V>> =
521
  enable_borrowed_range<V>;
522
 
523
+ namespace views { inline constexpr unspecified stride = unspecified; }
524
 
525
  // [range.cartesian], cartesian product view
526
  template<input_range First, forward_range... Vs>
527
  requires (view<First> && ... && view<Vs>)
528
+ class cartesian_product_view;
529
 
530
+ namespace views { inline constexpr unspecified cartesian_product = unspecified; }
531
+
532
+ // [range.cache.latest], cache latest view
533
+ template<input_range V>
534
+ requires view<V>
535
+ class cache_latest_view;
536
+
537
+ namespace views { inline constexpr unspecified cache_latest = unspecified; }
538
+
539
+ // [range.to.input], to input view
540
+ template<input_range V>
541
+ requires view<V>
542
+ class to_input_view;
543
+
544
+ template<class V>
545
+ constexpr bool enable_borrowed_range<to_input_view<V>> =
546
+ enable_borrowed_range<V>;
547
+
548
+ namespace views { inline constexpr unspecified to_input = unspecified; }
549
  }
550
 
551
  namespace std {
552
+ namespace views = ranges::views;
553
 
554
+ template<class T> struct tuple_size;
555
+ template<size_t I, class T> struct tuple_element;
556
 
557
  template<class I, class S, ranges::subrange_kind K>
558
+ struct tuple_size<ranges::subrange<I, S, K>>
559
  : integral_constant<size_t, 2> {};
560
  template<class I, class S, ranges::subrange_kind K>
561
+ struct tuple_element<0, ranges::subrange<I, S, K>> {
562
+ using type = I;
563
  };
564
  template<class I, class S, ranges::subrange_kind K>
565
+ struct tuple_element<1, ranges::subrange<I, S, K>> {
566
+ using type = S;
567
  };
568
  template<class I, class S, ranges::subrange_kind K>
569
+ struct tuple_element<0, const ranges::subrange<I, S, K>> {
570
+ using type = I;
571
  };
572
  template<class I, class S, ranges::subrange_kind K>
573
+ struct tuple_element<1, const ranges::subrange<I, S, K>> {
574
+ using type = S;
575
  };
576
 
577
+ struct from_range_t { explicit from_range_t() = default; };
578
+ inline constexpr from_range_t from_range{};
579
  }
580
  ```
581
 
582
  Within this Clause, for an integer-like type `X`
583
  [[iterator.concept.winc]], `make-unsigned-like-t<X>` denotes