Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement ranges::split_view #1731

Merged
merged 9 commits into from
Mar 18, 2021
46 changes: 31 additions & 15 deletions stl/inc/ranges
Original file line number Diff line number Diff line change
Expand Up @@ -2525,21 +2525,29 @@ namespace ranges {
/* [[no_unique_address]] */ _Vw _Range{};
/* [[no_unique_address]] */ _Pat _Pattern{};

template <bool>
class _Inner_iter;

template <class>
struct _Outer_iter_base {};
class _Outer_iter_base {};

// clang-format off
template <forward_iterator _Iter>
struct _Outer_iter_base<_Iter> {
class _Outer_iter_base<_Iter> {
// clang-format on
protected:
_Iter _Current{};
};

template <bool _Const>
class _Inner_iter;
public:
using iterator_category = input_iterator_tag;

_Outer_iter_base() = default;
constexpr _Outer_iter_base(_Iter _Current_) noexcept(is_nothrow_move_constructible_v<_Iter>)
CaseyCarter marked this conversation as resolved.
Show resolved Hide resolved
: _Current{_STD move(_Current_)} {}
};

template <bool _Const>
class _Outer_iter : private _Outer_iter_base<iterator_t<_Maybe_const<_Const, _Vw>>> {
class _Outer_iter : public _Outer_iter_base<iterator_t<_Maybe_const<_Const, _Vw>>> {
private:
template <bool>
friend class _Inner_iter;
Expand Down Expand Up @@ -2573,9 +2581,8 @@ namespace ranges {
}

public:
using iterator_concept = conditional_t<forward_range<_BaseTy>, forward_iterator_tag, input_iterator_tag>;
using iterator_category = input_iterator_tag;
using difference_type = range_difference_t<_BaseTy>;
using iterator_concept = conditional_t<forward_range<_BaseTy>, forward_iterator_tag, input_iterator_tag>;
using difference_type = range_difference_t<_BaseTy>;

class value_type : public view_interface<value_type> {
private:
Expand Down Expand Up @@ -2672,8 +2679,20 @@ namespace ranges {
}
};

template <class _BaseTy>
class _Inner_iter_base {};
template <forward_range _BaseTy>
class _Inner_iter_base<_BaseTy> {
CaseyCarter marked this conversation as resolved.
Show resolved Hide resolved
private:
using _BaseCategory = typename iterator_traits<iterator_t<_BaseTy>>::iterator_category;

public:
using iterator_category =
conditional_t<derived_from<_BaseCategory, forward_iterator_tag>, forward_iterator_tag, _BaseCategory>;
};

template <bool _Const>
class _Inner_iter {
class _Inner_iter : public _Inner_iter_base<_Maybe_const<_Const, _Vw>> {
private:
using _BaseTy = _Maybe_const<_Const, _Vw>;

Expand Down Expand Up @@ -2729,14 +2748,11 @@ namespace ranges {
}
}

using _BaseCategory = typename iterator_traits<iterator_t<_BaseTy>>::iterator_category;

public:
using iterator_concept = typename _Outer_iter<_Const>::iterator_concept;
using iterator_category =
conditional_t<derived_from<_BaseCategory, forward_iterator_tag>, forward_iterator_tag, _BaseCategory>;
using value_type = range_value_t<_BaseTy>;
using difference_type = range_difference_t<_BaseTy>;
using value_type = range_value_t<_BaseTy>;
using difference_type = range_difference_t<_BaseTy>;

_Inner_iter() = default;
constexpr explicit _Inner_iter(_Outer_iter<_Const> _It_) noexcept(
Expand Down