std::ranges:: lazy_split_view<V, Pattern>:: outer_iterator
template
<
bool
Const
>
struct /*outer_iterator*/ ; |
(since C++20)
( exposition only* ) |
|
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
.
Member types
Member | Definition |
Parent
|
maybe-const
<
Const,
ranges::
lazy_split_view
>
( exposition-only member type* ) |
Base
|
maybe-const
<
Const, V
>
( exposition-only member type* ) |
iterator_concept
(C++20)
|
std::forward_iterator_tag
if
Base
models
forward_range
, otherwise
std::input_iterator_tag
|
iterator_category
(C++20)
(conditionally present) |
std::input_iterator_tag
if
Base
models
forward_range
. Not present otherwise.
|
(C++20)
|
the value type of the
outer_iterator
(public member class) |
difference_type
(C++20)
|
ranges:: range_difference_t < Base > |
Data members
Member | Definition |
Parent*
parent_
(private)
|
A pointer to the parent object
lazy_split_view
( exposition-only member object* ) |
ranges::
iterator_t
<
Base
>
current_
(private)
(present only if
V
models
forward_range
)
|
An iterator into the underlying
view
( exposition-only member object* ) |
bool
trailing_empty_
(private)
|
A flag that indicates whether an empty trailing subrange (if any) was reached
( exposition-only member object* ) |
Member functions
(constructor)
(C++20)
|
constructs an iterator
(public member function) |
operator*
(C++20)
|
returns the current subrange
(public member function) |
operator++
operator++
(int)
(C++20)
|
advances the iterator
(public member function) |
cur
(C++20)
|
returns conditionally a reference to the
current_
(if present) or to the
*
parent_
-
>
current_
( exposition-only member function* ) |
Member functions
std::ranges::lazy_split_view:: outer_iterator :: outer_iterator
/*outer_iterator*/
(
)
=
default
;
|
(1) | (since C++20) |
constexpr
explicit
/*outer_iterator*/
(
Parent
&
parent
)
requires ( ! ranges:: forward_range < Base > ) ; |
(2) | (since C++20) |
constexpr
/*outer_iterator*/
(
Parent
&
parent,
ranges::
iterator_t
<
Base
>
current
)
|
(3) | (since C++20) |
constexpr
/*outer_iterator*/
(
/*outer_iterator*/
<
!
Const
>
i
)
requires Const
&&
std::
convertible_to
<
ranges::
iterator_t
<
V
>
,
|
(4) | (since C++20) |
- parent_ = nullptr ; ,
-
current_
=
iterator_t
<
Base
>
(
)
;
(present only if
V
modelsforward_range
),
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
.
std::ranges::lazy_split_view:: outer_iterator :: operator*
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) |
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;
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)
( exposition only* ) |
constexpr
auto
&
/*cur*/
(
)
const
noexcept
;
|
(2) |
(since C++20)
( exposition only* ) |
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
.
if constexpr (ranges::forward_range<V>) return current_; else return *parent->current_;
Non-member functions
operator==
(C++20)
|
compares the underlying iterators or the underlying iterator and
std::default_sentinel
(function) |
operator== (std::ranges::split_view:: outer_iterator )
friend
constexpr
bool
operator
==
(
const
/*outer_iterator*/
&
x,
const
/*outer_iterator*/
&
y
)
|
(1) | (since C++20) |
friend
constexpr
bool
operator
==
(
const
/*outer_iterator*/
&
x,
std:: default_sentinel_t ) ; |
(2) | (since C++20) |
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.
Defect reports
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++20 |
trailing_empty_
was not initialized in constructor (
4
)
|
initialized |