14 KiB
[range.iota.iterator]
25 Ranges library [ranges]
25.6 Range factories [range.factories]
25.6.4 Iota view [range.iota]
25.6.4.3 Class iota_view::iterator [range.iota.iterator]
namespace std::ranges {template<weakly_incrementable W, semiregular Bound>requires weakly-equality-comparable-with<W, Bound> && copyablestruct iota_view<W, Bound>::iterator {private: W value_ = W(); // exposition onlypublic:using iterator_concept = see below; using iterator_category = input_iterator_tag; // present only if W models incrementable and// IOTA-DIFF-T(W) is an integral typeusing value_type = W; using difference_type = IOTA-DIFF-T(W); iterator() requires default_initializable = default; constexpr explicit iterator(W value); constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v); constexpr iterator& operator++(); constexpr void operator++(int); constexpr iterator operator++(int) requires incrementable; constexpr iterator& operator--() requires decrementable; constexpr iterator operator--(int) requires decrementable; constexpr iterator& operator+=(difference_type n)requires advanceable; constexpr iterator& operator-=(difference_type n)requires advanceable; constexpr W operator[](difference_type n) constrequires advanceable; friend constexpr bool operator==(const iterator& x, const iterator& y)requires equality_comparable; friend constexpr bool operator<(const iterator& x, const iterator& y)requires totally_ordered; friend constexpr bool operator>(const iterator& x, const iterator& y)requires totally_ordered; friend constexpr bool operator<=(const iterator& x, const iterator& y)requires totally_ordered; friend constexpr bool operator>=(const iterator& x, const iterator& y)requires totally_ordered; friend constexpr auto operator<=>(const iterator& x, const iterator& y)requires totally_ordered && three_way_comparable; friend constexpr iterator operator+(iterator i, difference_type n)requires advanceable; friend constexpr iterator operator+(difference_type n, iterator i)requires advanceable; friend constexpr iterator operator-(iterator i, difference_type n)requires advanceable; friend constexpr difference_type operator-(const iterator& x, const iterator& y)requires advanceable; };}
iterator::iterator_concept is defined as follows:
-
If W models advanceable, theniterator_concept is random_access_iterator_tag.
-
Otherwise, if W models decrementable, theniterator_concept is bidirectional_iterator_tag.
-
Otherwise, if W models incrementable, theniterator_concept is forward_iterator_tag.
-
Otherwise, iterator_concept is input_iterator_tag.
[Note 1:
Overloads for iter_move and iter_swap are omitted intentionally.
â end note]
constexpr explicit iterator(W value);
Effects: Initializes value_ with value.
constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v<W>);
Effects: Equivalent to: return value_;
[Note 2:
The noexcept clause is needed by the default iter_move implementation.
â end note]
constexpr iterator& operator++();
Effects: Equivalent to:++value_;return *this;
constexpr void operator++(int);
Effects: Equivalent to ++*this.
constexpr iterator operator++(int) requires [incrementable](iterator.concept.inc#concept:incrementable "24.3.4.5 Concept incrementable [iterator.concept.inc]")<W>;
Effects: Equivalent to:auto tmp = *this;++*this;return tmp;
constexpr iterator& operator--() requires [decrementable](range.iota.view#concept:decrementable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:--value_;return *this;
constexpr iterator operator--(int) requires [decrementable](range.iota.view#concept:decrementable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:auto tmp = *this;--*this;return tmp;
constexpr iterator& operator+=(difference_type n) requires [advanceable](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:if constexpr (is-integer-like && !is-signed-integer-like) {if (n >= difference_type(0))value_ += static_cast(n); elsevalue_ -= static_cast(-n);} else {value_ += n;}return *this;
constexpr iterator& operator-=(difference_type n) requires [advanceable](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:if constexpr (is-integer-like && !is-signed-integer-like) {if (n >= difference_type(0))value_ -= static_cast(n); elsevalue_ += static_cast(-n);} else {value_ -= n;}return *this;
constexpr W operator[](difference_type n) const requires [advanceable](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to: return W(value_ + n);
friend constexpr bool operator==(const iterator& x, const iterator& y) requires [equality_comparable](concept.equalitycomparable#concept:equality_comparable "18.5.4 Concept equality_comparable [concept.equalitycomparable]")<W>;
Effects: Equivalent to: return x.value_ == y.value_;
friend constexpr bool operator<(const iterator& x, const iterator& y) requires [totally_ordered](concept.totallyordered#concept:totally_ordered "18.5.5 Concept totally_ordered [concept.totallyordered]")<W>;
Effects: Equivalent to: return x.value_ < y.value_;
friend constexpr bool operator>(const iterator& x, const iterator& y) requires [totally_ordered](concept.totallyordered#concept:totally_ordered "18.5.5 Concept totally_ordered [concept.totallyordered]")<W>;
Effects: Equivalent to: return y < x;
friend constexpr bool operator<=(const iterator& x, const iterator& y) requires [totally_ordered](concept.totallyordered#concept:totally_ordered "18.5.5 Concept totally_ordered [concept.totallyordered]")<W>;
Effects: Equivalent to: return !(y < x);
friend constexpr bool operator>=(const iterator& x, const iterator& y) requires [totally_ordered](concept.totallyordered#concept:totally_ordered "18.5.5 Concept totally_ordered [concept.totallyordered]")<W>;
Effects: Equivalent to: return !(x < y);
friend constexpr auto operator<=>(const iterator& x, const iterator& y) requires [totally_ordered](concept.totallyordered#concept:totally_ordered "18.5.5 Concept totally_ordered [concept.totallyordered]")<W> && [three_way_comparable](cmp.concept#concept:three_way_comparable "17.12.4 Concept three_way_comparable [cmp.concept]")<W>;
Effects: Equivalent to: return x.value_ <=> y.value_;
friend constexpr iterator operator+(iterator i, difference_type n) requires [advanceable](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:i += n;return i;
friend constexpr iterator operator+(difference_type n, iterator i) requires [advanceable](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to: return i + n;
friend constexpr iterator operator-(iterator i, difference_type n) requires [advanceable](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:i -= n;return i;
friend constexpr difference_type operator-(const iterator& x, const iterator& y) requires [advanceable](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:using D = difference_type;if constexpr (is-integer-like) {if constexpr (is-signed-integer-like)return D(D(x.value_) - D(y.value_)); elsereturn (y.value_ > x.value_)? D(-D(y.value_ - x.value_)): D(x.value_ - y.value_);} else {return x.value_ - y.value_;}