std::ranges::lazy_split_view<V, Pattern>::outer_iterator
template< bool Const > struct /*outer_iterator*/; |
(seit C++20) (nur Exposition*) |
|
Der Rückgabetyp von lazy_split_view::begin und von lazy_split_view::end, wenn die zugrundeliegende Ansicht ein common_range und forward_range ist.
Wenn entweder V oder Pattern keine einfache Ansicht ist (z.B. wenn ranges::iterator_t<const V> ungültig ist oder sich von ranges::iterator_t<V> unterscheidet), ist Const für Iteratoren, die von den const-Überladungen zurückgegeben werden, true und andernfalls false. Wenn V eine einfache Ansicht ist, ist Const genau dann true, wenn V ein forward_range ist.
[edit] Mitgliedstypen
| Mitglied | Definition |
Parent
|
maybe-const <Const, ranges::lazy_split_view>((nur zur Veranschaulichung)*) |
Basis
|
maybe-const <Const, V>((nur zur Veranschaulichung)*) |
iterator_concept
|
|
iterator_category(nur vorhanden, wenn Base forward_range modelliert)
|
std::input_iterator_tag |
der Werttyp des outer_iterator(public member class) | |
difference_type
|
ranges::range_difference_t<Base> |
[edit] Datenmitglieder
| Mitglied | Beschreibung |
Parent* parent_ (private) |
ein Zeiger auf das Elternobjekt lazy_split_view((exposition-only member object*) |
ranges::iterator_t<Base> current_ (private)(nur vorhanden, wenn V forward_range modelliert)
|
ein Iterator in die zugrundeliegende view((exposition-only member object*) |
bool trailing_empty_ (private) |
ein Flag, das angibt, ob ein leeres nachfolgendes Teilgebiet (falls vorhanden) erreicht wurde ((exposition-only member object*) |
[edit] Mitgliederfunktionen
| (Konstruktor) |
Konstruiert einen Iterator (öffentliche Memberfunktion) |
| operator* |
gibt das aktuelle Teilgebiet zurück (öffentliche Memberfunktion) |
| operator++operator++(int) |
bewegt den Iterator vorwärts (öffentliche Memberfunktion) |
| cur |
gibt bedingt eine Referenz auf current_ (falls vorhanden) oder auf *parent_->current_ zurück(exposition-only Member-Funktion*) |
[edit] Mitgliederfunktionen
std::ranges::lazy_split_view::outer_iterator ::outer_iterator
| /*outer_iterator*/() = default; |
(1) | (seit C++20) |
| constexpr explicit /*outer_iterator*/( Parent& parent ) requires (!ranges::forward_range<Base>); |
(2) | (seit C++20) |
| constexpr /*outer_iterator*/( Parent& parent, ranges::iterator_t<Base> current ) |
(3) | (seit C++20) |
constexpr /*outer_iterator*/( /*outer_iterator*/<!Const> i ) requires Const && std::convertible_to<ranges::iterator_t<V>, |
(4) | (seit C++20) |
- parent_ = nullptr;,
- current_ = iterator_t<Base>(); (nur vorhanden, wenn
Vforward_rangemodelliert),
parent_ mit i.parent_, current_ mit std::move(i.current_) und trailing_empty_ mit t.trailing_empty_.trailing_empty_ wird mit seinem Standard-Member-Initialisierer auf false initialisiert.
std::ranges::lazy_split_view::outer_iterator ::operator*
| constexpr value_type operator*() const; |
(seit C++20) | |
Entspricht return value_type{*this};.
std::ranges::lazy_split_view::outer_iterator ::operator++
| constexpr /*outer_iterator*/& operator++(); |
(1) | (seit C++20) |
| constexpr decltype(auto) operator++(int); |
(2) | (seit 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) | (seit C++20) (nur Exposition*) |
constexpr auto& /*cur*/() const noexcept; |
(2) | (seit C++20) (nur Exposition*) |
Diese Hilfs-Memberfunktion wird von /*outer_iterator*/::operator++(), vom Nicht-Member operator==(const /*outer_iterator*/&, std::default_sentinel_t) und von einigen Memberfunktionen der möglichen Implementierung von inner_iterator referenziert.
if constexpr (ranges::forward_range<V>) return current_; else return *parent->current_;
[edit] Nicht-Member-Funktionen
| operator== (C++20) |
vergleicht die zugrundeliegenden Iteratoren oder den zugrundeliegenden Iterator und std::default_sentinel (Funktion) |
operator==(std::ranges::split_view::outer_iterator)
| friend constexpr bool operator==( const /*outer_iterator*/& x, const /*outer_iterator*/& y ) |
(1) | (seit C++20) |
| friend constexpr bool operator==( const /*outer_iterator*/& x, std::default_sentinel_t ); |
(2) | (seit C++20) |
Der Operator != wird aus operator== synthetisiert.
Diese Funktionen sind für die normale unqualifizierte oder qualifizierte Suche nicht sichtbar und können nur durch Argument-abhängige Suche gefunden werden, wenn std::ranges::split_view::outer_iterator eine zugeordnete Klasse der Argumente ist.
[edit] Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3904 | C++20 | trailing_empty_ wurde im Konstruktor (4) nicht initialisiert |
initialisiert |