template< bool Const >
struct /*outer_iterator*/;
The return type of lazy_split_view::begin
, and of lazy_split_view::end
when the underlying view is a common_range
and forward_range
.
If either V
or Pattern
is not a simple view (e.g. if ranges::iterator_t<const V> is invalid or different from ranges::iterator_t<V>), Const
is true for iterators returned from the const overloads, and false otherwise. If V
is a simple view, Const
is true if and only if V
is a forward_range
.
parent_
(private) a pointer to the parent object lazy_split_view
current_
(private)
V
models forward_range
) an iterator into the underlying view
trailing_empty_
(private) a flag that indicates whether an empty trailing subrange (if any) was reached
operator++operator++(int)
advances the iteratorcurrent_
(if present) or to the *parent_
->current_
Value initializes the non-static data members with their default member initializer, that is:
V
models forward_range
),Initializes
parent_
with
std::addressof(parent)and
current_
with
std::move(current).
4) Initializes parent_
with i.parent_, current_
with std::move(i.current_), and trailing_empty_
with t.trailing_empty_.
The trailing_empty_
is initialized with its default member initializer to false.
constexpr value_type operator*() const;
(since C++20)Equivalent to return value_type{*this};.
std::ranges::lazy_split_view::outer_iterator ::operator++constexpr /*outer_iterator*/& operator++();
(1) (since C++20)constexpr decltype(auto) operator++(int);
(2) (since C++20) 1)The function body is equivalent to
const auto end = ranges::end(parent_->base_); if (/*cur*/() == end) { trailing_empty_ = false; return *this; } const auto [pbegin, pend] = ranges::subrange{parent_->pattern_}; if (pbegin == pend) ++/*cur*/(); else if constexpr (/*tiny_range*/<Pattern>) { /*cur*/() = ranges::find(std::move(/*cur*/()), end, *pbegin); if (/*cur*/() != end) { ++/*cur*/(); if (/*cur*/() == end) trailing_empty_ = true; } } else { do { auto [b, p] = ranges::mismatch(/*cur*/(), end, pbegin, pend); if (p == pend) { /*cur*/() = b; if (/*cur*/() == end) trailing_empty_ = true; break; // The pattern matched; skip it } } while (++/*cur*/() != end); } return *this;2)
Equivalent to
if constexpr (ranges::forward_range<Base>) { auto tmp = *this; ++*this; return tmp; } else { ++*this; // no return statement }std::ranges::lazy_split_view::outer_iterator ::cur ()
constexpr auto& /*cur*/() noexcept;
(1) (since C++20)constexpr auto& /*cur*/() const noexcept;
(2) (since C++20)This convenience member function is referred to from /*outer_iterator*/::operator++(), from the non-member operator==(const /*outer_iterator*/&, std::default_sentinel_t), and from some member functions of the possible implementation of inner_iterator
.
const /*outer_iterator*/& y )
1) Equivalent to return x.current_ == y.current_ and x.trailing_empty_ == y.trailing_empty_;.
2)Equivalent to
return x./*cur*/() == ranges::end(x.parent_->base_) and !x.trailing_empty_;.
The !=
operator is synthesized from operator==
.
These functions are not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when std::ranges::split_view::outer_iterator
is an associated class of the arguments.
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior LWG 3904 C++20trailing_empty_
was not initialized in constructor (4) initialized
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4