Files
2025-10-25 03:02:53 +03:00

14 KiB
Raw Permalink Blame History

[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; };}

1

#

iterator::iterator_concept is defined as follows:

  • (1.1)

    If W models advanceable, theniterator_concept is random_access_iterator_tag.

  • (1.2)

    Otherwise, if W models decrementable, theniterator_concept is bidirectional_iterator_tag.

  • (1.3)

    Otherwise, if W models incrementable, theniterator_concept is forward_iterator_tag.

  • (1.4)

    Otherwise, iterator_concept is input_iterator_tag.

2

#

[Note 1:

Overloads for iter_move and iter_swap are omitted intentionally.

— end note]

🔗

constexpr explicit iterator(W value);

3

#

Effects: Initializes value_ with value.

🔗

constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v<W>);

4

#

Effects: Equivalent to: return value_;

5

#

[Note 2:

The noexcept clause is needed by the default iter_move implementation.

— end note]

🔗

constexpr iterator& operator++();

6

#

Effects: Equivalent to:++value_;return *this;

🔗

constexpr void operator++(int);

7

#

Effects: Equivalent to ++*this.

🔗

constexpr iterator operator++(int) requires [incrementable](iterator.concept.inc#concept:incrementable "24.3.4.5Concept incrementable[iterator.concept.inc]")<W>;

8

#

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

🔗

constexpr iterator& operator--() requires [decrementable](range.iota.view#concept:decrementable "25.6.4.2Class template iota_­view[range.iota.view]")<W>;

9

#

Effects: Equivalent to:--value_;return *this;

🔗

constexpr iterator operator--(int) requires [decrementable](range.iota.view#concept:decrementable "25.6.4.2Class template iota_­view[range.iota.view]")<W>;

10

#

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.2Class template iota_­view[range.iota.view]")<W>;

11

#

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.2Class template iota_­view[range.iota.view]")<W>;

12

#

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.2Class template iota_­view[range.iota.view]")<W>;

13

#

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.4Concept equality_­comparable[concept.equalitycomparable]")<W>;

14

#

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.5Concept totally_­ordered[concept.totallyordered]")<W>;

15

#

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.5Concept totally_­ordered[concept.totallyordered]")<W>;

16

#

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.5Concept totally_­ordered[concept.totallyordered]")<W>;

17

#

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.5Concept totally_­ordered[concept.totallyordered]")<W>;

18

#

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.5Concept totally_­ordered[concept.totallyordered]")<W> && [three_way_comparable](cmp.concept#concept:three_way_comparable "17.12.4Concept three_­way_­comparable[cmp.concept]")<W>;

19

#

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.2Class template iota_­view[range.iota.view]")<W>;

20

#

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.2Class template iota_­view[range.iota.view]")<W>;

21

#

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.2Class template iota_­view[range.iota.view]")<W>;

22

#

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.2Class template iota_­view[range.iota.view]")<W>;

23

#

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_;}