[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:
- If all-random-access<Const, Views...> is modeled, then iterator_concept denotes random_access_iterator_tag.
- Otherwise, if all-bidirectional<Const, Views...> is modeled, then iterator_concept denotes bidirectional_iterator_tag.
- Otherwise, if all-forward<Const, Views...> is modeled, then iterator_concept denotes forward_iterator_tag.
- Otherwise, iterator_concept denotes input_iterator_tag.
_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:
- Otherwise, trueif there exists an integer such that bool(std::get<i>(x.current_) ==std::get<i>(y.current_)) is true.
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 .