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,

                                difference_type steps );
(仅用于阐述*)

将当前(全局)位置前进 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,

                                difference_type steps );
(仅用于阐述*)

将当前(全局)位置后退 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 - 要后退的步数