std::ranges::concat_view<Views...>::iterator<Const>::satisfy, prev, advance-fwd, advance-bwd
From cppreference.com
< cpp | ranges | concat view | iterator
以下の解説専用メンバ関数テンプレートは、説明を簡略化するために使用されます。
各ヘルパー関数テンプレートは、std::size_t 型の非型テンプレートパラメータを持ちます。
- テンプレートパラメータの名前が N の場合、テンプレート引数は常に
it_.index() です。 - テンプレートパラメータの名前が I の場合、テンプレート引数は
[0,sizeof...(Views))の範囲の任意の std::size_t 値になります。
ただし、テンプレート引数はコンパイル時定数ではない可能性があるため、helper <non_const>(/* arguments */) の実際の効果は、 if (non_const == 0)
helper <0>(/* arguments */);
else if (non_const == 1)
helper <1>(/* arguments */);
/* other indices */
else if (non_const == (sizeof...(Views) - 1))
helper <sizeof...(Views) - 1>(/* arguments */);
に似ています。
目次 |
[編集] ヘルパーテンプレート
ミニヘルパーテンプレート
template< std::size_t N > constexpr auto /*get-iter*/(); |
(1) | (説明用*) |
template< std::size_t I > constexpr auto /*get-view*/(); |
(2) | (説明用*) |
template< std::size_t I > constexpr auto /*get-begin*/(); |
(3) | (説明用*) |
template< std::size_t I > constexpr auto /*get-end*/(); |
(4) | (説明用*) |
template< std::size_t N > constexpr auto /*to-underlying-diff-type*/( difference_type value ); |
(5) | (説明用*) |
ミニヘルパーテンプレートは、メインのヘルパーテンプレートとメンバ関数の説明を簡略化します。これらは C++ 標準ドキュメントには含まれていません。
1)
it_ に含まれる基底イテレータを取得します。2) 親の
concat_view 内の I 番目のビューを取得します。3) 親の
concat_view 内の I 番目のビューの先頭へのイテレータを取得します。 ranges::begin(
get-view <I>()) を返します。4) 親の
concat_view 内の I 番目のビューの末尾を過ぎたイテレータまたは番兵を取得します。 ranges::end(
get-view <I>()) を返します。 static_cast<std::iter_difference_t<std::variant_alternative_t<N,
base-iter >>>(value) を返します。
std::ranges::concat_view::iterator::satisfy<N>
template< std::size_t N > constexpr void /*satisfy*/(); |
(説明用*) | |
it_ の現在の (グローバルな) 位置を調整します。
std::ranges::concat_view::iterator::prev<N>
template< size_t N > constexpr void /*prev*/(); |
(説明用*) | |
it_ を前の (グローバルな) 位置に移動します。
std::ranges::concat_view::iterator::advance-fwd<N>
template< size_t N > constexpr void /*advance-fwd*/( difference_type offset, |
(説明用*) | |
現在の (グローバルな) 位置を step ステップ前方に進めます。
- N が sizeof...(Views) - 1 の場合、
get-iter<N>() +=to-underlying-diff-type(steps); に相当します。 - それ以外の場合、auto n_size = ranges::distance(
get-view<N>()));
if (offset + steps < n_size)get-iter<N>() +=to-underlying-diff-type(steps);
else
{it_.template emplace<N + 1>(get-begin<N + 1>));advance-fwd<N + 1>(0, offset + steps - n_size);
} に相当します。
パラメータ
| offset | - | it_ が現在参照している範囲の先頭からの現在の (グローバルな) 位置のオフセット |
| ステップ | - | 前方へ進むステップ数 |
std::ranges::concat_view::iterator::advance-bwd<N>
template< size_t N > constexpr void /*advance-bwd*/( difference_type offset, |
(説明用*) | |
現在の (グローバルな) 位置を steps ステップ後方に移動します。
- N が 0 の場合、
get-iter<N>() -=to-underlying-diff-type(steps); に相当します。 - それ以外の場合、if (offset >= steps)
get-iter<N>() -=to-underlying-diff-type(steps);
else
{auto prev_size = ranges::distance(get-view<N - 1>());it_.template emplace<N - 1>(get-end<N - 1>());advance-bwd<N - 1>(prev_size, steps - offset);
} に相当します。
パラメータ
| offset | - | it_ が現在参照している範囲の先頭からの現在の (グローバルな) 位置のオフセット |
| ステップ | - | 後方に進むステップ数 |