std::ranges::concat_view<Views...>::iterator<Const>::satisfy, prev, advance-fwd, advance-bwd
来自cppreference.com
< cpp | ranges | concat view | iterator
以下仅用于阐述的成员函数用来辅助 iterator
保持 it_
不能是最后一个适配范围以外的范围的尾后迭代器的不变式。
函数形参 N 的函数实参始终都是 it_
.index()。
std::ranges::concat_view::iterator::satisfy<N>
template< size_t N > constexpr void /*satisfy*/(); |
(仅用于阐述*) | |
调整 it_
的当前(全局)位置。等价于
if constexpr (N < (sizeof...(Views) - 1)) { if (std::get<N>(it_) == ranges::end(std::get<N>(parent_->views_))) { it_.template emplace<N + 1>(ranges::begin(std::get<N + 1>(parent_->views_))); /*satisfy*/<N + 1>(); } }
std::ranges::concat_view::iterator::prev<N>
template< size_t N > constexpr void /*prev*/(); |
(仅用于阐述*) | |
将 it_
移动到上一位置。等价于
if constexpr (N == 0) { --std::get<0>(it_); } else { if (std::get<N>(it_) == ranges::begin(std::get<N>(parent_->views_))) { it_.template emplace<N - 1>(ranges::end(std::get<N - 1>(parent_->views_))); prev<N - 1>(); } else { --std::get<N>(it_); } }
std::ranges::concat_view::iterator::advance-fwd<N>
template< size_t N > constexpr void /*advance-fwd*/( difference_type offset, |
(仅用于阐述*) | |
将当前(全局)位置前进 steps 步。等价于
using underlying_diff_type = std::iter_difference_t<std::variant_alternative_t<N, /*base-iter*/>>; if constexpr (N == sizeof...(Views) - 1) { std::get<N>(it_) += static_cast<underlying_diff_type>(steps); } else { auto n_size = ranges::distance(std::get<N>(parent_->views_)); if (offset + steps < n_size) { std::get<N>(it_) += static_cast<underlying_diff_type>(steps); } else { it_.template emplace<N + 1>(ranges::begin(std::get<N + 1>(parent_->views_))); /*advance-fwd*/<N + 1>(0, offset + steps - n_size); } }
参数
offset | - | 当前(全局)位置到 it_ 当前指向的元素的所属范围开头的距离
|
steps | - | 要前进的步数 |
std::ranges::concat_view::iterator::advance-bwd<N>
template< size_t N > constexpr void /*advance-bwd*/( difference_type offset, |
(仅用于阐述*) | |
将当前(全局)位置后退 steps 步。等价于
using underlying_diff_type = std::iter_difference_t<std::variant_alternative_t<N, /*base-iter*/>>; if constexpr (N == 0) { std::get<N>(it_) -= static_cast<underlying_diff_type>(steps); } else { if (offset >= steps) { std::get<N>(it_) -= static_cast<underlying_diff_type>(steps); } else { auto prev_size = ranges::distance(std::get<N - 1>(parent_->views_)); it_.template emplace<N - 1>(ranges::end(std::get<N - 1>(parent_->views_))); /*advance-bwd*/<N - 1>(prev_size, steps - offset); } }
参数
offset | - | 当前(全局)位置到 it_ 当前指向的元素的所属范围开头的距离
|
steps | - | 要后退的步数 |