Spec-Zone.ru › C++

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

template< bool Const >
struct /*outer_iterator*/;
(начиная с C++20)
(только для иллюстрации*)

Тип возвращаемого значения lazy_split_view::begin и lazy_split_view::end, если базовое представление является common_range и forward_range.

Если V или Pattern не является простым представлением (например, если ranges::iterator_t<constV> недопустим или отличается от ranges::iterator_t<V>), Const для итераторов, возвращаемых перегрузками для константных объектов, является true, а в остальных случаях — false. Если V является простым представлением, Const является true тогда и только тогда, когда V является forward_range.

Типы-члены

Член Определение
Parent maybe-const <Const,ranges::lazy_split_view>
(тип-член, используемый только для иллюстрации*)
Base maybe-const <Const,V>
(тип-член, используемый только для иллюстрации*)
iterator_concept
  • std::forward_iterator_tag, если Base моделирует forward_range,
  • std::input_iterator_tag, в противном случае
iterator_category
(присутствует, только если Base моделирует forward_range)
std::input_iterator_tag
value_type
тип значения outer_iterator
(открытый класс-член)
difference_type ranges::range_difference_t<Base>

Поля данных

Член Описание
Parent* parent_ (закрытый) указатель на родительский объект lazy_split_view
(объект-член, используемый только для иллюстрации*)
ranges::iterator_t<Base> current_ (закрытый)
(присутствует, только если V моделирует forward_range)
итератор базового view
(объект-член, используемый только для иллюстрации*)
bool trailing_empty_ (закрытый) флаг, указывающий, был ли достигнут пустой конечный поддиапазон (если он есть)
(объект-член, используемый только для иллюстрации*)

Функции-члены

(constructor)
создаёт итератор
(открытая функция-член)
operator*
возвращает текущий поддиапазон
(открытая функция-член)
operator++operator++(int)
перемещает итератор вперёд
(открытая функция-член)
cur
условно возвращает ссылку на current_ (если он присутствует) или на *parent_->current_
(функция-член, используемая только для иллюстрации*)

Функции-члены

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>(); (присутствует только если V моделирует forward_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_;

Функции, не являющиеся членами

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 является ассоциированным классом аргументов.

Отчеты об исправлениях дефектов

Следующие отчеты об исправлениях, изменяющих поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применяется к Поведение согласно опубликованной версии Правильное поведение
LWG 3904 C++20 trailing_empty_ не инициализировался в конструкторе (4) инициализируется

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/lazy_split_view/outer_iterator

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API