@@ -69,34 +69,16 @@ namespace ranges {
69
69
>;
70
70
};
71
71
72
- template <input_range _View, bool _Const>
73
- requires view<_View> && input_range<range_reference_t <_View>>
74
- struct __join_view_iterator ;
75
-
76
- template <input_range _View, bool _Const>
77
- requires view<_View> && input_range<range_reference_t <_View>>
78
- struct __join_view_sentinel ;
79
-
80
72
template <input_range _View>
81
73
requires view<_View> && input_range<range_reference_t <_View>>
82
74
class join_view
83
75
: public view_interface<join_view<_View>> {
84
76
private:
85
77
using _InnerRange = range_reference_t <_View>;
86
78
87
- template <bool _Const>
88
- using __iterator = __join_view_iterator<_View, _Const>;
89
-
90
- template <bool _Const>
91
- using __sentinel = __join_view_sentinel<_View, _Const>;
79
+ template <bool > struct __iterator ;
92
80
93
- template <input_range _View2, bool _Const2>
94
- requires view<_View2> && input_range<range_reference_t <_View2>>
95
- friend struct __join_view_iterator ;
96
-
97
- template <input_range _View2, bool _Const2>
98
- requires view<_View2> && input_range<range_reference_t <_View2>>
99
- friend struct __join_view_sentinel ;
81
+ template <bool > struct __sentinel ;
100
82
101
83
template <class >
102
84
friend struct std ::__segmented_iterator_traits;
@@ -167,12 +149,12 @@ namespace ranges {
167
149
}
168
150
};
169
151
170
- template <input_range _View, bool _Const >
152
+ template <input_range _View>
171
153
requires view<_View> && input_range<range_reference_t <_View>>
172
- struct __join_view_sentinel {
173
- template <input_range _View2, bool >
174
- requires view<_View2> && input_range< range_reference_t <_View2> >
175
- friend struct __join_view_sentinel ;
154
+ template < bool _Const>
155
+ struct join_view <_View>::__sentinel {
156
+ template < bool >
157
+ friend struct __sentinel ;
176
158
177
159
private:
178
160
using _Parent = __maybe_const<_Const, join_view<_View>>;
@@ -181,37 +163,42 @@ namespace ranges {
181
163
182
164
public:
183
165
_LIBCPP_HIDE_FROM_ABI
184
- __join_view_sentinel () = default ;
166
+ __sentinel () = default ;
185
167
186
168
_LIBCPP_HIDE_FROM_ABI
187
- constexpr explicit __join_view_sentinel (_Parent& __parent)
169
+ constexpr explicit __sentinel (_Parent& __parent)
188
170
: __end_(ranges::end(__parent.__base_)) {}
189
171
190
172
_LIBCPP_HIDE_FROM_ABI
191
- constexpr __join_view_sentinel (__join_view_sentinel<_View, !_Const> __s)
173
+ constexpr __sentinel (__sentinel< !_Const> __s)
192
174
requires _Const && convertible_to<sentinel_t<_View>, sentinel_t<_Base>>
193
175
: __end_(std::move(__s.__end_)) {}
194
176
195
177
template <bool _OtherConst>
196
178
requires sentinel_for<sentinel_t <_Base>, iterator_t <__maybe_const<_OtherConst, _View>>>
197
179
_LIBCPP_HIDE_FROM_ABI
198
- friend constexpr bool operator ==(const __join_view_iterator<_View, _OtherConst>& __x, const __join_view_sentinel & __y) {
180
+ friend constexpr bool operator ==(const __iterator< _OtherConst>& __x, const __sentinel & __y) {
199
181
return __x.__outer_ == __y.__end_ ;
200
182
}
201
183
};
202
184
203
- template <input_range _View, bool _Const>
185
+ // https://reviews.llvm.org/D142811#inline-1383022
186
+ // To simplify the segmented iterator traits specialization,
187
+ // make the iterator `final`
188
+ template <input_range _View>
204
189
requires view<_View> && input_range<range_reference_t <_View>>
205
- struct __join_view_iterator
190
+ template <bool _Const>
191
+ struct join_view <_View>::__iterator final
206
192
: public __join_view_iterator_category<__maybe_const<_Const, _View>> {
207
193
208
- template <input_range _View2, bool >
209
- requires view<_View2> && input_range<range_reference_t <_View2>>
210
- friend struct __join_view_iterator ;
194
+ template <bool >
195
+ friend struct __iterator ;
211
196
212
197
template <class >
213
198
friend struct std ::__segmented_iterator_traits;
214
199
200
+ static constexpr bool __is_join_view_iterator = true ;
201
+
215
202
private:
216
203
using _Parent = __maybe_const<_Const, join_view<_View>>;
217
204
using _Base = __maybe_const<_Const, _View>;
@@ -246,7 +233,7 @@ namespace ranges {
246
233
__inner_.reset ();
247
234
}
248
235
249
- _LIBCPP_HIDE_FROM_ABI constexpr __join_view_iterator (_Parent* __parent, _Outer __outer, _Inner __inner)
236
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator (_Parent* __parent, _Outer __outer, _Inner __inner)
250
237
: __outer_(std::move(__outer)), __inner_(std::move(__inner)), __parent_(__parent) {}
251
238
252
239
public:
@@ -267,17 +254,17 @@ namespace ranges {
267
254
range_difference_t <_Base>, range_difference_t <range_reference_t <_Base>>>;
268
255
269
256
_LIBCPP_HIDE_FROM_ABI
270
- __join_view_iterator () requires default_initializable<_Outer> = default ;
257
+ __iterator () requires default_initializable<_Outer> = default ;
271
258
272
259
_LIBCPP_HIDE_FROM_ABI
273
- constexpr __join_view_iterator (_Parent& __parent, _Outer __outer)
260
+ constexpr __iterator (_Parent& __parent, _Outer __outer)
274
261
: __outer_(std::move(__outer))
275
262
, __parent_(std::addressof(__parent)) {
276
263
__satisfy ();
277
264
}
278
265
279
266
_LIBCPP_HIDE_FROM_ABI
280
- constexpr __join_view_iterator (__join_view_iterator<_View, !_Const> __i)
267
+ constexpr __iterator (__iterator< !_Const> __i)
281
268
requires _Const &&
282
269
convertible_to<iterator_t<_View>, _Outer> &&
283
270
convertible_to<iterator_t<_InnerRange>, _Inner>
@@ -298,7 +285,7 @@ namespace ranges {
298
285
}
299
286
300
287
_LIBCPP_HIDE_FROM_ABI
301
- constexpr __join_view_iterator & operator ++() {
288
+ constexpr __iterator & operator ++() {
302
289
auto && __inner = [&]() -> auto && {
303
290
if constexpr (__ref_is_glvalue)
304
291
return *__outer_;
@@ -318,7 +305,7 @@ namespace ranges {
318
305
}
319
306
320
307
_LIBCPP_HIDE_FROM_ABI
321
- constexpr __join_view_iterator operator ++(int )
308
+ constexpr __iterator operator ++(int )
322
309
requires __ref_is_glvalue &&
323
310
forward_range<_Base> &&
324
311
forward_range<range_reference_t <_Base>>
@@ -329,7 +316,7 @@ namespace ranges {
329
316
}
330
317
331
318
_LIBCPP_HIDE_FROM_ABI
332
- constexpr __join_view_iterator & operator --()
319
+ constexpr __iterator & operator --()
333
320
requires __ref_is_glvalue &&
334
321
bidirectional_range<_Base> &&
335
322
bidirectional_range<range_reference_t <_Base>> &&
@@ -348,7 +335,7 @@ namespace ranges {
348
335
}
349
336
350
337
_LIBCPP_HIDE_FROM_ABI
351
- constexpr __join_view_iterator operator --(int )
338
+ constexpr __iterator operator --(int )
352
339
requires __ref_is_glvalue &&
353
340
bidirectional_range<_Base> &&
354
341
bidirectional_range<range_reference_t <_Base>> &&
@@ -360,7 +347,7 @@ namespace ranges {
360
347
}
361
348
362
349
_LIBCPP_HIDE_FROM_ABI
363
- friend constexpr bool operator ==(const __join_view_iterator & __x, const __join_view_iterator & __y)
350
+ friend constexpr bool operator ==(const __iterator & __x, const __iterator & __y)
364
351
requires __ref_is_glvalue &&
365
352
equality_comparable<iterator_t <_Base>> &&
366
353
equality_comparable<iterator_t <range_reference_t <_Base>>>
@@ -369,14 +356,14 @@ namespace ranges {
369
356
}
370
357
371
358
_LIBCPP_HIDE_FROM_ABI
372
- friend constexpr decltype (auto ) iter_move(const __join_view_iterator & __i)
359
+ friend constexpr decltype (auto ) iter_move(const __iterator & __i)
373
360
noexcept (noexcept (ranges::iter_move(*__i.__inner_)))
374
361
{
375
362
return ranges::iter_move (*__i.__inner_ );
376
363
}
377
364
378
365
_LIBCPP_HIDE_FROM_ABI
379
- friend constexpr void iter_swap (const __join_view_iterator & __x, const __join_view_iterator & __y)
366
+ friend constexpr void iter_swap (const __iterator & __x, const __iterator & __y)
380
367
noexcept (noexcept (ranges::iter_swap(*__x.__inner_, *__y.__inner_)))
381
368
requires indirectly_swappable<_Inner>
382
369
{
@@ -404,12 +391,12 @@ inline namespace __cpo {
404
391
} // namespace views
405
392
} // namespace ranges
406
393
407
- template <class _View , bool _Const >
408
- requires (ranges::common_range< typename ranges::__join_view_iterator<_View, _Const>::_Parent> &&
409
- __is_cpp17_random_access_iterator< typename ranges::__join_view_iterator<_View, _Const>::_Outer>::value &&
410
- __is_cpp17_random_access_iterator<typename ranges::__join_view_iterator<_View, _Const >::_Inner>:: value)
411
- struct __segmented_iterator_traits<ranges::__join_view_iterator<_View, _Const>> {
412
- using _JoinViewIterator = ranges::__join_view_iterator<_View, _Const>;
394
+ template <class _JoinViewIterator >
395
+ requires (_JoinViewIterator::__is_join_view_iterator &&
396
+ ranges::common_range< typename _JoinViewIterator::_Parent> &&
397
+ __is_cpp17_random_access_iterator<typename _JoinViewIterator::_Outer >::value &&
398
+ __is_cpp17_random_access_iterator< typename _JoinViewIterator::_Inner>::value)
399
+ struct __segmented_iterator_traits<_JoinViewIterator> {
413
400
414
401
using __segment_iterator =
415
402
_LIBCPP_NODEBUG __iterator_with_data<typename _JoinViewIterator::_Outer, typename _JoinViewIterator::_Parent*>;
0 commit comments