名前空間
変種
操作

std::ranges::lazy_split_view<V, Pattern>::outer_iterator

From cppreference.com
 
 
Rangesライブラリ
Rangeアダプタ
 
 
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 オーバーロードから返されるイテレータの場合、Consttrue となり、それ以外の場合は false となります。V がシンプルなビューである場合、ConstVforward_range である場合に限り true となります。

目次

[edit] メンバ型

メンバ 定義
Parent maybe-const <Const, ranges::lazy_split_view>
(説明専用メンバ型*)
Base maybe_const <Const, V>
(説明専用メンバ型*)
iterator_concept
iterator_category
(Baseforward_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)
(Vforward_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 )

    requires ranges::forward_range<Base>;
(3) (C++20以降)
constexpr /*outer_iterator*/( /*outer_iterator*/<!Const> i )

    requires Const && std::convertible_to<ranges::iterator_t<V>,

                                          ranges::iterator_t<Base>>;
(4) (C++20以降)
1) 非静的メンバ変数をデフォルトメンバ初期化子で値初期化します。すなわち、
  • parent_ = nullptr;,
  • current_ = iterator_t<Base>();Vforward_range をモデルとする場合にのみ存在します)、
2) parent_std::addressof(parent) で初期化します。
3) parent_std::addressof(parent) で、current_std::move(current) で初期化します。
4) 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以降)
1) 関数の本体は、
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) 同値:
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 の可能な実装の一部のメンバ関数から参照されます。

1,2) 同等です。
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 )

      requires forward_range<Base>;
(1) (C++20以降)
friend constexpr bool operator==( const /*outer_iterator*/& x,
                                  std::default_sentinel_t );
(2) (C++20以降)
1) return x.current_ == y.current_ and x.trailing_empty_ == y.trailing_empty_; と同等です。
2) return x./*cur*/() == ranges::end(x.parent_->base_) and !x.trailing_empty_; と同等です。

!= 演算子は operator== から合成される。

これらの関数は、通常の 非修飾または 修飾ルックアップからは見えず、std::ranges::split_view::outer_iterator が引数に関連付けられたクラスである場合にのみ、引数依存ルックアップによって見つけることができます。

[edit] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3904 C++20 trailing_empty_ がコンストラクタ(4)で初期化されていませんでした。 初期化済み
English 日本語 中文(简体) 中文(繁體)