@@ -49,12 +49,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD
49
49
50
50
namespace ranges {
51
51
52
- template <class _View , size_t _Np, bool _Const>
53
- class __elements_view_iterator ;
54
-
55
- template <class _View , size_t _Np, bool _Const>
56
- class __elements_view_sentinel ;
57
-
58
52
template <class _Tp , size_t _Np>
59
53
concept __has_tuple_element = __tuple_like<_Tp> && _Np < tuple_size<_Tp>::value;
60
54
@@ -66,6 +60,13 @@ template <input_range _View, size_t _Np>
66
60
__has_tuple_element<remove_reference_t <range_reference_t <_View>>, _Np> &&
67
61
__returnable_element<range_reference_t <_View>, _Np>
68
62
class elements_view : public view_interface <elements_view<_View, _Np>> {
63
+ private:
64
+ template <bool >
65
+ class __iterator ;
66
+
67
+ template <bool >
68
+ class __sentinel ;
69
+
69
70
public:
70
71
_LIBCPP_HIDE_FROM_ABI elements_view ()
71
72
requires default_initializable<_View>
@@ -130,12 +131,6 @@ class elements_view : public view_interface<elements_view<_View, _Np>> {
130
131
}
131
132
132
133
private:
133
- template <bool _Const>
134
- using __iterator = __elements_view_iterator<_View, _Np, _Const>;
135
-
136
- template <bool _Const>
137
- using __sentinel = __elements_view_sentinel<_View, _Np, _Const>;
138
-
139
134
_LIBCPP_NO_UNIQUE_ADDRESS _View __base_ = _View();
140
135
};
141
136
@@ -160,13 +155,18 @@ struct __elements_view_iterator_category_base<_Base, _Np> {
160
155
using iterator_category = decltype (__get_iterator_category());
161
156
};
162
157
163
- template <class _View , size_t _Np, bool _Const>
164
- class __elements_view_iterator : public __elements_view_iterator_category_base <__maybe_const<_Const, _View>, _Np> {
165
- template <class , size_t , bool >
166
- friend class __elements_view_iterator ;
158
+ template <input_range _View, size_t _Np>
159
+ requires view<_View> && __has_tuple_element<range_value_t <_View>, _Np> &&
160
+ __has_tuple_element<remove_reference_t <range_reference_t <_View>>, _Np> &&
161
+ __returnable_element<range_reference_t <_View>, _Np>
162
+ template <bool _Const>
163
+ class elements_view <_View, _Np>::__iterator
164
+ : public __elements_view_iterator_category_base<__maybe_const<_Const, _View>, _Np> {
165
+ template <bool >
166
+ friend class __iterator ;
167
167
168
- template <class , size_t , bool >
169
- friend class __elements_view_sentinel ;
168
+ template <bool >
169
+ friend class __sentinel ;
170
170
171
171
using _Base = __maybe_const<_Const, _View>;
172
172
@@ -198,14 +198,13 @@ class __elements_view_iterator : public __elements_view_iterator_category_base<_
198
198
using value_type = remove_cvref_t <tuple_element_t <_Np, range_value_t <_Base>>>;
199
199
using difference_type = range_difference_t <_Base>;
200
200
201
- _LIBCPP_HIDE_FROM_ABI __elements_view_iterator ()
201
+ _LIBCPP_HIDE_FROM_ABI __iterator ()
202
202
requires default_initializable<iterator_t<_Base>>
203
203
= default;
204
204
205
- _LIBCPP_HIDE_FROM_ABI constexpr explicit __elements_view_iterator (iterator_t <_Base> __current)
206
- : __current_(std::move(__current)) {}
205
+ _LIBCPP_HIDE_FROM_ABI constexpr explicit __iterator (iterator_t <_Base> __current) : __current_(std::move(__current)) {}
207
206
208
- _LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator (__elements_view_iterator<_View, _Np, !_Const> __i)
207
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator (__iterator< !_Const> __i)
209
208
requires _Const && convertible_to<iterator_t<_View>, iterator_t<_Base>>
210
209
: __current_(std::move(__i.__current_)) {}
211
210
@@ -215,44 +214,44 @@ class __elements_view_iterator : public __elements_view_iterator_category_base<_
215
214
216
215
_LIBCPP_HIDE_FROM_ABI constexpr decltype (auto ) operator*() const { return __get_element (__current_); }
217
216
218
- _LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator & operator ++() {
217
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator & operator ++() {
219
218
++__current_;
220
219
return *this ;
221
220
}
222
221
223
222
_LIBCPP_HIDE_FROM_ABI constexpr void operator ++(int ) { ++__current_; }
224
223
225
- _LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator operator ++(int )
224
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator operator ++(int )
226
225
requires forward_range<_Base>
227
226
{
228
227
auto temp = *this ;
229
228
++__current_;
230
229
return temp;
231
230
}
232
231
233
- _LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator & operator --()
232
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator & operator --()
234
233
requires bidirectional_range<_Base>
235
234
{
236
235
--__current_;
237
236
return *this ;
238
237
}
239
238
240
- _LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator operator --(int )
239
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator operator --(int )
241
240
requires bidirectional_range<_Base>
242
241
{
243
242
auto temp = *this ;
244
243
--__current_;
245
244
return temp;
246
245
}
247
246
248
- _LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator & operator +=(difference_type __n)
247
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator & operator +=(difference_type __n)
249
248
requires random_access_range<_Base>
250
249
{
251
250
__current_ += __n;
252
251
return *this ;
253
252
}
254
253
255
- _LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator & operator -=(difference_type __n)
254
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator & operator -=(difference_type __n)
256
255
requires random_access_range<_Base>
257
256
{
258
257
__current_ -= __n;
@@ -265,122 +264,113 @@ class __elements_view_iterator : public __elements_view_iterator_category_base<_
265
264
return __get_element (__current_ + __n);
266
265
}
267
266
268
- _LIBCPP_HIDE_FROM_ABI friend constexpr bool
269
- operator ==(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
267
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator ==(const __iterator& __x, const __iterator& __y)
270
268
requires equality_comparable<iterator_t <_Base>>
271
269
{
272
270
return __x.__current_ == __y.__current_ ;
273
271
}
274
272
275
- _LIBCPP_HIDE_FROM_ABI friend constexpr bool
276
- operator <(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
273
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator <(const __iterator& __x, const __iterator& __y)
277
274
requires random_access_range<_Base>
278
275
{
279
276
return __x.__current_ < __y.__current_ ;
280
277
}
281
278
282
- _LIBCPP_HIDE_FROM_ABI friend constexpr bool
283
- operator >(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
279
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator >(const __iterator& __x, const __iterator& __y)
284
280
requires random_access_range<_Base>
285
281
{
286
282
return __y < __x;
287
283
}
288
284
289
- _LIBCPP_HIDE_FROM_ABI friend constexpr bool
290
- operator <=(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
285
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator <=(const __iterator& __x, const __iterator& __y)
291
286
requires random_access_range<_Base>
292
287
{
293
288
return !(__y < __x);
294
289
}
295
290
296
- _LIBCPP_HIDE_FROM_ABI friend constexpr bool
297
- operator >=(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
291
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator >=(const __iterator& __x, const __iterator& __y)
298
292
requires random_access_range<_Base>
299
293
{
300
294
return !(__x < __y);
301
295
}
302
296
303
- _LIBCPP_HIDE_FROM_ABI friend constexpr auto
304
- operator <=>(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
297
+ _LIBCPP_HIDE_FROM_ABI friend constexpr auto operator <=>(const __iterator& __x, const __iterator& __y)
305
298
requires random_access_range<_Base> && three_way_comparable<iterator_t <_Base>>
306
299
{
307
300
return __x.__current_ <=> __y.__current_ ;
308
301
}
309
302
310
- _LIBCPP_HIDE_FROM_ABI friend constexpr __elements_view_iterator
311
- operator +(const __elements_view_iterator& __x, difference_type __y)
303
+ _LIBCPP_HIDE_FROM_ABI friend constexpr __iterator operator +(const __iterator& __x, difference_type __y)
312
304
requires random_access_range<_Base>
313
305
{
314
- return __elements_view_iterator {__x} += __y;
306
+ return __iterator {__x} += __y;
315
307
}
316
308
317
- _LIBCPP_HIDE_FROM_ABI friend constexpr __elements_view_iterator
318
- operator +(difference_type __x, const __elements_view_iterator& __y)
309
+ _LIBCPP_HIDE_FROM_ABI friend constexpr __iterator operator +(difference_type __x, const __iterator& __y)
319
310
requires random_access_range<_Base>
320
311
{
321
312
return __y + __x;
322
313
}
323
314
324
- _LIBCPP_HIDE_FROM_ABI friend constexpr __elements_view_iterator
325
- operator -(const __elements_view_iterator& __x, difference_type __y)
315
+ _LIBCPP_HIDE_FROM_ABI friend constexpr __iterator operator -(const __iterator& __x, difference_type __y)
326
316
requires random_access_range<_Base>
327
317
{
328
- return __elements_view_iterator {__x} -= __y;
318
+ return __iterator {__x} -= __y;
329
319
}
330
320
331
- _LIBCPP_HIDE_FROM_ABI friend constexpr difference_type
332
- operator -(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
321
+ _LIBCPP_HIDE_FROM_ABI friend constexpr difference_type operator -(const __iterator& __x, const __iterator& __y)
333
322
requires sized_sentinel_for<iterator_t <_Base>, iterator_t <_Base>>
334
323
{
335
324
return __x.__current_ - __y.__current_ ;
336
325
}
337
326
};
338
327
339
- template <class _View , size_t _Np, bool _Const>
340
- class __elements_view_sentinel {
328
+ template <input_range _View, size_t _Np>
329
+ requires view<_View> && __has_tuple_element<range_value_t <_View>, _Np> &&
330
+ __has_tuple_element<remove_reference_t <range_reference_t <_View>>, _Np> &&
331
+ __returnable_element<range_reference_t <_View>, _Np>
332
+ template <bool _Const>
333
+ class elements_view <_View, _Np>::__sentinel {
341
334
private:
342
335
using _Base = __maybe_const<_Const, _View>;
343
336
_LIBCPP_NO_UNIQUE_ADDRESS sentinel_t <_Base> __end_ = sentinel_t <_Base>();
344
337
345
- template <class , size_t , bool >
346
- friend class __elements_view_sentinel ;
338
+ template <bool >
339
+ friend class __sentinel ;
347
340
348
341
template <bool _AnyConst>
349
- _LIBCPP_HIDE_FROM_ABI static constexpr decltype (auto )
350
- __get_current(const __elements_view_iterator<_View, _Np, _AnyConst>& __iter) {
342
+ _LIBCPP_HIDE_FROM_ABI static constexpr decltype (auto ) __get_current(const __iterator<_AnyConst>& __iter) {
351
343
return (__iter.__current_ );
352
344
}
353
345
354
346
public:
355
- _LIBCPP_HIDE_FROM_ABI __elements_view_sentinel () = default;
347
+ _LIBCPP_HIDE_FROM_ABI __sentinel () = default;
356
348
357
- _LIBCPP_HIDE_FROM_ABI constexpr explicit __elements_view_sentinel (sentinel_t <_Base> __end)
358
- : __end_(std::move(__end)) {}
349
+ _LIBCPP_HIDE_FROM_ABI constexpr explicit __sentinel (sentinel_t <_Base> __end) : __end_(std::move(__end)) {}
359
350
360
- _LIBCPP_HIDE_FROM_ABI constexpr __elements_view_sentinel (__elements_view_sentinel<_View, _Np, !_Const> __other)
351
+ _LIBCPP_HIDE_FROM_ABI constexpr __sentinel (__sentinel< !_Const> __other)
361
352
requires _Const && convertible_to<sentinel_t<_View>, sentinel_t<_Base>>
362
353
: __end_(std::move(__other.__end_)) {}
363
354
364
355
_LIBCPP_HIDE_FROM_ABI constexpr sentinel_t <_Base> base () const { return __end_; }
365
356
366
357
template <bool _OtherConst>
367
358
requires sentinel_for<sentinel_t <_Base>, iterator_t <__maybe_const<_OtherConst, _View>>>
368
- _LIBCPP_HIDE_FROM_ABI friend constexpr bool
369
- operator ==(const __elements_view_iterator<_View, _Np, _OtherConst>& __x, const __elements_view_sentinel& __y) {
359
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator ==(const __iterator<_OtherConst>& __x, const __sentinel& __y) {
370
360
return __get_current (__x) == __y.__end_ ;
371
361
}
372
362
373
363
template <bool _OtherConst>
374
364
requires sized_sentinel_for<sentinel_t <_Base>, iterator_t <__maybe_const<_OtherConst, _View>>>
375
365
_LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t <__maybe_const<_OtherConst, _View>>
376
- operator -(const __elements_view_iterator<_View, _Np, _OtherConst>& __x, const __elements_view_sentinel & __y) {
366
+ operator -(const __iterator< _OtherConst>& __x, const __sentinel & __y) {
377
367
return __get_current (__x) - __y.__end_ ;
378
368
}
379
369
380
370
template <bool _OtherConst>
381
371
requires sized_sentinel_for<sentinel_t <_Base>, iterator_t <__maybe_const<_OtherConst, _View>>>
382
372
_LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t <__maybe_const<_OtherConst, _View>>
383
- operator -(const __elements_view_sentinel & __x, const __elements_view_iterator<_View, _Np, _OtherConst>& __y) {
373
+ operator -(const __sentinel & __x, const __iterator< _OtherConst>& __y) {
384
374
return __x.__end_ - __get_current (__y);
385
375
}
386
376
};
0 commit comments