std::ranges::lazy_split_view<V, Pattern>::outer_iterator
template< bool Const > struct /*outer_iterator*/; |
(C++20以降) (説明用*) |
|
lazy_split_view::begin、および基底ビューが common_range であり forward_range である場合の lazy_split_view::end の戻り値の型です。
V または Pattern が シンプルなビューでない場合(例:ranges::iterator_t<const V> が無効であるか、または ranges::iterator_t<V> と異なる場合)、const オーバーロードから返されるイテレータの場合、Const は true となり、それ以外の場合は false となります。V がシンプルなビューである場合、Const は V が forward_range である場合に限り true となります。
[edit] メンバ型
| メンバ | 定義 |
Parent
|
maybe-const <Const, ranges::lazy_split_view>(説明専用メンバ型*) |
Base
|
maybe_const <Const, V>(説明専用メンバ型*) |
iterator_concept
|
|
iterator_category( Base が forward_range をモデルとする場合にのみ存在します)
|
std::input_iterator_tag |
outer_iterator の値型。(public メンバクラス) | |
difference_type
|
ranges::range_difference_t<Base> |
[edit] データメンバ
| メンバ | 説明 |
Parent* parent_ (private) |
基底オブジェクト lazy_split_view へのポインタ。(説明用のメンバオブジェクト*) |
ranges::iterator_t<Base> current_ (private)( V が forward_range をモデルとする場合にのみ存在します)
|
基底 view へのイテレータ。(説明用のメンバオブジェクト*) |
bool trailing_empty_ (private) |
(もしあれば)空の末尾サブレンジに到達したかどうかを示すフラグ。 (説明用のメンバオブジェクト*) |
[edit] メンバ関数
| (コンストラクタ) |
イテレータを構築する (public member function) |
| operator* |
現在のサブレンジを返します。 (public member function) |
| operator++operator++(int) |
イテレータを進める (public member function) |
| cur |
条件付きで current_(存在する場合)への参照、または *parent_->current_ への参照を返します。(説明専用メンバ関数*) |
[edit] メンバ関数
std::ranges::lazy_split_view::outer_iterator ::outer_iterator
| /*outer_iterator*/() = default; |
(1) | (C++20以降) |
| constexpr explicit /*outer_iterator*/( Parent& parent ) requires (!ranges::forward_range<Base>); |
(2) | (C++20以降) |
| constexpr /*outer_iterator*/( Parent& parent, ranges::iterator_t<Base> current ) |
(3) | (C++20以降) |
constexpr /*outer_iterator*/( /*outer_iterator*/<!Const> i ) requires Const && std::convertible_to<ranges::iterator_t<V>, |
(4) | (C++20以降) |
- parent_ = nullptr;,
- current_ = iterator_t<Base>();(
Vがforward_rangeをモデルとする場合にのみ存在します)、
parent_ を i.parent_ で、current_ を std::move(i.current_) で、trailing_empty_ を t.trailing_empty_ で初期化します。trailing_empty_ は、デフォルトメンバ初期化子で false に初期化されます。
std::ranges::lazy_split_view::outer_iterator ::operator*
| constexpr value_type operator*() const; |
(C++20以降) | |
return value_type{*this}; と同等です。
std::ranges::lazy_split_view::outer_iterator ::operator++
| constexpr /*outer_iterator*/& operator++(); |
(1) | (C++20以降) |
| constexpr decltype(auto) operator++(int); |
(2) | (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) | (C++20以降) (説明用*) |
constexpr auto& /*cur*/() const noexcept; |
(2) | (C++20以降) (説明用*) |
この便利なメンバ関数は、/*outer_iterator*/::operator++()、非メンバ関数 operator==(const /*outer_iterator*/&, std::default_sentinel_t)、および inner_iterator の可能な実装の一部のメンバ関数から参照されます。
if constexpr (ranges::forward_range<V>) return current_; else return *parent->current_;
[edit] 非メンバ関数
| operator== (C++20) |
基底イテレータ、または基底イテレータと std::default_sentinel を比較します。 (関数) |
operator==(std::ranges::split_view::outer_iterator)
| friend constexpr bool operator==( const /*outer_iterator*/& x, const /*outer_iterator*/& y ) |
(1) | (C++20以降) |
| friend constexpr bool operator==( const /*outer_iterator*/& x, std::default_sentinel_t ); |
(2) | (C++20以降) |
!= 演算子は operator== から合成される。
これらの関数は、通常の 非修飾または 修飾ルックアップからは見えず、std::ranges::split_view::outer_iterator が引数に関連付けられたクラスである場合にのみ、引数依存ルックアップによって見つけることができます。
[edit] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3904 | C++20 | trailing_empty_ がコンストラクタ(4)で初期化されていませんでした。 |
初期化済み |