[range.zip.iterator] (original) (raw)

25 Ranges library [ranges]

25.7 Range adaptors [range.adaptors]

25.7.25 Zip view [range.zip]

25.7.25.3 Class template zip_view​::​iterator [range.zip.iterator]

namespace std::ranges { template<input_range... Views> requires (view<Views> && ...) && (sizeof...(Views) > 0) template<bool Const> class zip_view<Views...>::iterator { tuple<iterator_t<_maybe-const_<Const, Views>>...> current_; constexpr explicit iterator(tuple<iterator_t<_maybe-const_<Const, Views>>...>);public: using iterator_category = input_iterator_tag; using iterator_concept = see below;using value_type = tuple<range_value_t<_maybe-const_<Const, Views>>...>;using difference_type = common_type_t<range_difference_t<_maybe-const_<Const, Views>>...>;iterator() = default;constexpr iterator(iterator<!Const> i) requires Const && (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...);constexpr auto operator*() const;constexpr iterator& operator++();constexpr void operator++(int);constexpr iterator operator++(int) requires all-forward<Const, Views...>;constexpr iterator& operator--() requires all-bidirectional<Const, Views...>;constexpr iterator operator--(int) requires all-bidirectional<Const, Views...>;constexpr iterator& operator+=(difference_type x) requires all-random-access<Const, Views...>;constexpr iterator& operator-=(difference_type x) requires all-random-access<Const, Views...>;constexpr auto operator[](difference_type n) const requires all-random-access<Const, Views...>;friend constexpr bool operator==(const iterator& x, const iterator& y) requires (equality_comparable<iterator_t<_maybe-const_<Const, Views>>> && ...);friend constexpr auto operator<=>(const iterator& x, const iterator& y) requires all-random-access<Const, Views...>;friend constexpr iterator operator+(const iterator& i, difference_type n) requires all-random-access<Const, Views...>;friend constexpr iterator operator+(difference_type n, const iterator& i) requires all-random-access<Const, Views...>;friend constexpr iterator operator-(const iterator& i, difference_type n) requires all-random-access<Const, Views...>;friend constexpr difference_type operator-(const iterator& x, const iterator& y) requires (sized_sentinel_for<iterator_t<_maybe-const_<Const, Views>>, iterator_t<_maybe-const_<Const, Views>>> && ...);friend constexpr auto iter_move(const iterator& i) noexcept(see below);friend constexpr void iter_swap(const iterator& l, const iterator& r) noexcept(see below) requires (indirectly_swappable<iterator_t<_maybe-const_<Const, Views>>> && ...);};}

_iterator_​::​iterator_concept is defined as follows:

_iterator_​::​iterator_category is present if and only if all-forward<Const, Views...> is modeled.

If the invocation of any non-const member function of _iterator_exits via an exception, the iterator acquires a singular value.

constexpr explicit _iterator_(tuple<iterator_t<_maybe-const_<Const, Views>>...> current);

Effects: Initializes current_ with std​::​move(current).

constexpr _iterator_(_iterator_<!Const> i) requires Const && ([convertible_to](concept.convertible#concept:convertible%5Fto "18.4.4 Concept convertible_­to [concept.convertible]")<iterator_t<Views>, iterator_t<const Views>> && ...);

Effects: Initializes current_ with std​::​move(i.current_).

constexpr auto operator*() const;

Effects: Equivalent to:return tuple-transform([](auto& i) -> decltype(auto) { return *i; }, current_);

constexpr _iterator_& operator++();

Effects: Equivalent to:tuple-for-each([](auto& i) { ++i; }, current_);return *this;

constexpr void operator++(int);

Effects: Equivalent to ++*this.

constexpr _iterator_ operator++(int) requires [_all-forward_](range.adaptor.helpers#concept:all-forward "25.7.5 Range adaptor helpers [range.adaptor.helpers]")<Const, Views...>;

Effects: Equivalent to:auto tmp = *this;++*this;return tmp;

Effects: Equivalent to:tuple-for-each([](auto& i) { --i; }, current_);return *this;

Effects: Equivalent to:auto tmp = *this;--*this;return tmp;

constexpr _iterator_& operator+=(difference_type x) requires [_all-random-access_](range.adaptor.helpers#concept:all-random-access "25.7.5 Range adaptor helpers [range.adaptor.helpers]")<Const, Views...>;

Effects: Equivalent to:tuple-for-each([&]<class I>(I& i) { i += iter_difference_t<I>(x); }, current_);return *this;

constexpr _iterator_& operator-=(difference_type x) requires [_all-random-access_](range.adaptor.helpers#concept:all-random-access "25.7.5 Range adaptor helpers [range.adaptor.helpers]")<Const, Views...>;

Effects: Equivalent to:tuple-for-each([&]<class I>(I& i) { i -= iter_difference_t<I>(x); }, current_);return *this;

constexpr auto operator[](difference_type n) const requires [_all-random-access_](range.adaptor.helpers#concept:all-random-access "25.7.5 Range adaptor helpers [range.adaptor.helpers]")<Const, Views...>;

Effects: Equivalent to:return tuple-transform([&]<class I>(I& i) -> decltype(auto) { return i[iter_difference_t<I>(n)];}, current_);

friend constexpr bool operator==(const _iterator_& x, const _iterator_& y) requires ([equality_comparable](concept.equalitycomparable#concept:equality%5Fcomparable "18.5.4 Concept equality_­comparable [concept.equalitycomparable]")<iterator_t<_maybe-const_<Const, Views>>> && ...);

Returns:

friend constexpr auto operator<=>(const _iterator_& x, const _iterator_& y) requires [_all-random-access_](range.adaptor.helpers#concept:all-random-access "25.7.5 Range adaptor helpers [range.adaptor.helpers]")<Const, Views...>;

Returns: x.current_ <=> y.current_.

friend constexpr _iterator_ operator+(const _iterator_& i, difference_type n) requires [_all-random-access_](range.adaptor.helpers#concept:all-random-access "25.7.5 Range adaptor helpers [range.adaptor.helpers]")<Const, Views...>;friend constexpr _iterator_ operator+(difference_type n, const _iterator_& i) requires [_all-random-access_](range.adaptor.helpers#concept:all-random-access "25.7.5 Range adaptor helpers [range.adaptor.helpers]")<Const, Views...>;

Effects: Equivalent to:auto r = i; r += n;return r;

friend constexpr _iterator_ operator-(const _iterator_& i, difference_type n) requires [_all-random-access_](range.adaptor.helpers#concept:all-random-access "25.7.5 Range adaptor helpers [range.adaptor.helpers]")<Const, Views...>;

Effects: Equivalent to:auto r = i; r -= n;return r;

friend constexpr difference_type operator-(const _iterator_& x, const _iterator_& y) requires ([sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized%5Fsentinel%5Ffor "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]")<iterator_t<_maybe-const_<Const, Views>>, iterator_t<_maybe-const_<Const, Views>>> && ...);

Let DIST(i) be difference_type(std​::​get<i>(x.current_) - std​::​get<i>(y.current_)).

Returns: The value with the smallest absolute value among DIST(n)for all integers .

friend constexpr auto iter_move(const _iterator_& i) noexcept(_see below_);

Effects: Equivalent to:return tuple-transform(ranges::iter_move, i.current_);

Remarks: The exception specification is equivalent to:(noexcept(ranges::iter_move(declval<const iterator_t<_maybe-const_<Const, Views>>&>())) && ...) && (is_nothrow_move_constructible_v<range_rvalue_reference_t<_maybe-const_<Const, Views>>> && ...)

friend constexpr void iter_swap(const _iterator_& l, const _iterator_& r) noexcept(_see below_) requires ([indirectly_swappable](alg.req.ind.swap#concept:indirectly%5Fswappable "24.3.7.4 Concept indirectly_­swappable [alg.req.ind.swap]")<iterator_t<_maybe-const_<Const, Views>>> && ...);

Effects: For every integer , performs:ranges::iter_swap(std::get<i>(l.current_), std::get<i>(r.current_))

Remarks: The exception specification is equivalent to the logical and of the following expressions:noexcept(ranges::iter_swap(std::get<i>(l.current_), std::get<i>(r.current_))) for every integer .