@@ -3218,7 +3218,7 @@ namespace ranges {
3218
3218
inline constexpr _Join_fn join;
3219
3219
} // namespace views
3220
3220
3221
- // CLASS TEMPLATE ranges::split_view
3221
+ // CLASS TEMPLATE ranges::lazy_split_view
3222
3222
// clang-format off
3223
3223
template <class _Ty>
3224
3224
concept _Tiny_range = sized_range<_Ty>
@@ -3229,24 +3229,24 @@ namespace ranges {
3229
3229
requires view<_Vw> && view<_Pat>
3230
3230
&& indirectly_comparable<iterator_t<_Vw>, iterator_t<_Pat>, _RANGES equal_to>
3231
3231
&& (forward_range<_Vw> || _Tiny_range<_Pat>)
3232
- class split_view ;
3232
+ class lazy_split_view ;
3233
3233
// clang-format on
3234
3234
3235
3235
template <class _Vw, class _Pat>
3236
- class _Split_view_base : public view_interface<split_view <_Vw, _Pat>> {
3236
+ class _Lazy_split_view_base : public view_interface<lazy_split_view <_Vw, _Pat>> {
3237
3237
protected:
3238
3238
/* [[no_unique_address]] */ _Defaultabox<iterator_t<_Vw>> _Current{};
3239
3239
};
3240
3240
3241
3241
template <forward_range _Vw, class _Pat>
3242
- class _Split_view_base <_Vw, _Pat> : public view_interface<split_view <_Vw, _Pat>> {};
3242
+ class _Lazy_split_view_base <_Vw, _Pat> : public view_interface<lazy_split_view <_Vw, _Pat>> {};
3243
3243
3244
3244
// clang-format off
3245
3245
template <input_range _Vw, forward_range _Pat>
3246
3246
requires view<_Vw> && view<_Pat>
3247
3247
&& indirectly_comparable<iterator_t<_Vw>, iterator_t<_Pat>, _RANGES equal_to>
3248
3248
&& (forward_range<_Vw> || _Tiny_range<_Pat>)
3249
- class split_view : public _Split_view_base <_Vw, _Pat> {
3249
+ class lazy_split_view : public _Lazy_split_view_base <_Vw, _Pat> {
3250
3250
// clang-format on
3251
3251
private:
3252
3252
/* [[no_unique_address]] */ _Vw _Range{};
@@ -3281,10 +3281,11 @@ namespace ranges {
3281
3281
friend _Outer_iter<true>;
3282
3282
3283
3283
using _Mybase = _Outer_iter_base<iterator_t<_Maybe_const<_Const, _Vw>>>;
3284
- using _ParentTy = _Maybe_const<_Const, split_view >;
3284
+ using _ParentTy = _Maybe_const<_Const, lazy_split_view >;
3285
3285
using _BaseTy = _Maybe_const<_Const, _Vw>;
3286
3286
3287
- _ParentTy* _Parent = nullptr;
3287
+ _ParentTy* _Parent = nullptr;
3288
+ bool _Trailing_empty = false;
3288
3289
3289
3290
_NODISCARD constexpr iterator_t<_BaseTy>& _Get_current() noexcept {
3290
3291
if constexpr (forward_range<_BaseTy>) {
@@ -3356,6 +3357,7 @@ namespace ranges {
3356
3357
const auto _End = _RANGES end(_Parent->_Range);
3357
3358
auto& _Cur = _Get_current();
3358
3359
if (_Cur == _End) {
3360
+ _Trailing_empty = false;
3359
3361
return *this;
3360
3362
}
3361
3363
@@ -3367,12 +3369,18 @@ namespace ranges {
3367
3369
_Cur = _RANGES _Find_unchecked(_STD move(_Cur), _End, *_Pat_first);
3368
3370
if (_Cur != _End) {
3369
3371
++_Cur;
3372
+ if (_Cur == _End) {
3373
+ _Trailing_empty = true;
3374
+ }
3370
3375
}
3371
3376
} else {
3372
3377
do {
3373
3378
auto _Result = _RANGES mismatch(_Cur, _End, _Pat_first, _Pat_last);
3374
3379
if (_Result.in2 == _Pat_last) { // pattern matches
3375
- _Cur = _STD move(_Result.in1);
3380
+ _Cur = _Result.in1;
3381
+ if (_Cur == _End) {
3382
+ _Trailing_empty = true;
3383
+ }
3376
3384
break;
3377
3385
}
3378
3386
} while (++_Cur != _End);
@@ -3392,11 +3400,11 @@ namespace ranges {
3392
3400
3393
3401
_NODISCARD friend constexpr bool operator==(const _Outer_iter& _Left, const _Outer_iter& _Right) noexcept(
3394
3402
noexcept(_Left._Current == _Right._Current)) /* strengthened */ requires forward_range<_BaseTy> {
3395
- return _Left._Current == _Right._Current;
3403
+ return _Left._Current == _Right._Current && _Left._Trailing_empty == _Right._Trailing_empty ;
3396
3404
}
3397
3405
_NODISCARD friend constexpr bool operator==(const _Outer_iter& _Left, default_sentinel_t) noexcept(
3398
3406
noexcept(_Left._At_end())) /* strengthened */ {
3399
- return _Left._At_end();
3407
+ return _Left._At_end() && !_Left._Trailing_empty ;
3400
3408
}
3401
3409
};
3402
3410
@@ -3483,6 +3491,14 @@ namespace ranges {
3483
3491
is_nothrow_move_constructible_v<_Outer_iter<_Const>>) // strengthened
3484
3492
: _It{_STD move(_It_)} {}
3485
3493
3494
+ constexpr const iterator_t<_BaseTy>& base() const& requires copyable<iterator_t<_BaseTy>> {
3495
+ return _It._Get_current();
3496
+ }
3497
+
3498
+ constexpr iterator_t<_BaseTy>& base() && {
3499
+ return _STD move(_It._Get_current());
3500
+ }
3501
+
3486
3502
_NODISCARD constexpr decltype(auto) operator*() const {
3487
3503
return *_It._Get_current();
3488
3504
}
@@ -3533,18 +3549,18 @@ namespace ranges {
3533
3549
3534
3550
public:
3535
3551
// clang-format off
3536
- split_view () requires default_initializable<_Vw> && default_initializable<_Pat> = default;
3552
+ lazy_split_view () requires default_initializable<_Vw> && default_initializable<_Pat> = default;
3537
3553
// clang-format on
3538
3554
3539
- constexpr split_view (_Vw _Range_, _Pat _Pattern_) noexcept(
3555
+ constexpr lazy_split_view (_Vw _Range_, _Pat _Pattern_) noexcept(
3540
3556
is_nothrow_move_constructible_v<_Vw>&& is_nothrow_move_constructible_v<_Pat>) // strengthened
3541
3557
: _Range(_STD move(_Range_)), _Pattern(_STD move(_Pattern_)) {}
3542
3558
3543
3559
// clang-format off
3544
3560
template <input_range _Rng>
3545
3561
requires constructible_from<_Vw, views::all_t<_Rng>>
3546
3562
&& constructible_from<_Pat, single_view<range_value_t<_Rng>>>
3547
- constexpr split_view (_Rng&& _Range_, range_value_t<_Rng> _Elem)
3563
+ constexpr lazy_split_view (_Rng&& _Range_, range_value_t<_Rng> _Elem)
3548
3564
noexcept(noexcept(_Vw(views::all(_STD forward<_Rng>(_Range_))))
3549
3565
&& noexcept(_Pat(single_view{_STD move(_Elem)}))) // strengthened
3550
3566
: _Range(views::all(_STD forward<_Rng>(_Range_))), _Pattern(single_view{_STD move(_Elem)}) {}
@@ -3589,43 +3605,44 @@ namespace ranges {
3589
3605
};
3590
3606
3591
3607
template <class _Rng, class _Pat>
3592
- split_view (_Rng&&, _Pat&&) -> split_view <views::all_t<_Rng>, views::all_t<_Pat>>;
3608
+ lazy_split_view (_Rng&&, _Pat&&) -> lazy_split_view <views::all_t<_Rng>, views::all_t<_Pat>>;
3593
3609
3594
3610
template <input_range _Rng>
3595
- split_view(_Rng&&, range_value_t<_Rng>) -> split_view<views::all_t<_Rng>, single_view<range_value_t<_Rng>>>;
3611
+ lazy_split_view(_Rng&&, range_value_t<_Rng>)
3612
+ -> lazy_split_view<views::all_t<_Rng>, single_view<range_value_t<_Rng>>>;
3596
3613
3597
3614
namespace views {
3598
3615
// VARIABLE views::split
3599
- class _Split_fn {
3616
+ class _Lazy_split_fn {
3600
3617
private:
3601
3618
template <class _Delim>
3602
3619
struct _Partial : _Pipe::_Base<_Partial<_Delim>> {
3603
3620
/* [[no_unique_address]] */ _Delim _Delimiter;
3604
3621
3605
3622
template <viewable_range _Rng>
3606
3623
_NODISCARD constexpr auto operator()(_Rng&& _Range) const& noexcept(
3607
- noexcept(split_view {_STD forward<_Rng>(_Range), _Delimiter})) requires requires {
3608
- split_view {static_cast<_Rng&&>(_Range), _Delimiter};
3624
+ noexcept(lazy_split_view {_STD forward<_Rng>(_Range), _Delimiter})) requires requires {
3625
+ lazy_split_view {static_cast<_Rng&&>(_Range), _Delimiter};
3609
3626
}
3610
- { return split_view {_STD forward<_Rng>(_Range), _Delimiter}; }
3627
+ { return lazy_split_view {_STD forward<_Rng>(_Range), _Delimiter}; }
3611
3628
3612
3629
template <viewable_range _Rng>
3613
3630
_NODISCARD constexpr auto operator()(_Rng&& _Range) && noexcept(noexcept(
3614
- split_view {_STD forward<_Rng>(_Range), _STD forward<_Delim>(_Delimiter)})) requires requires {
3615
- split_view {static_cast<_Rng&&>(_Range), static_cast<_Delim&&>(_Delimiter)};
3631
+ lazy_split_view {_STD forward<_Rng>(_Range), _STD forward<_Delim>(_Delimiter)})) requires requires {
3632
+ lazy_split_view {static_cast<_Rng&&>(_Range), static_cast<_Delim&&>(_Delimiter)};
3616
3633
}
3617
- { return split_view {_STD forward<_Rng>(_Range), _STD forward<_Delim>(_Delimiter)}; }
3634
+ { return lazy_split_view {_STD forward<_Rng>(_Range), _STD forward<_Delim>(_Delimiter)}; }
3618
3635
};
3619
3636
3620
3637
public:
3621
3638
// clang-format off
3622
3639
template <viewable_range _Rng, class _Pat>
3623
3640
_NODISCARD constexpr auto operator()(_Rng&& _Range, _Pat&& _Pattern) const noexcept(noexcept(
3624
- split_view {_STD forward<_Rng>(_Range), _STD forward<_Pat>(_Pattern)})) requires requires {
3625
- split_view {static_cast<_Rng&&>(_Range), static_cast<_Pat&&>(_Pattern)};
3641
+ lazy_split_view {_STD forward<_Rng>(_Range), _STD forward<_Pat>(_Pattern)})) requires requires {
3642
+ lazy_split_view {static_cast<_Rng&&>(_Range), static_cast<_Pat&&>(_Pattern)};
3626
3643
} {
3627
3644
// clang-format on
3628
- return split_view {_STD forward<_Rng>(_Range), _STD forward<_Pat>(_Pattern)};
3645
+ return lazy_split_view {_STD forward<_Rng>(_Range), _STD forward<_Pat>(_Pattern)};
3629
3646
}
3630
3647
3631
3648
// clang-format off
@@ -3638,7 +3655,7 @@ namespace ranges {
3638
3655
}
3639
3656
};
3640
3657
3641
- inline constexpr _Split_fn split ;
3658
+ inline constexpr _Lazy_split_fn lazy_split ;
3642
3659
3643
3660
// VARIABLE views::counted
3644
3661
class _Counted_fn {
0 commit comments