From Jason Turner

[const.iterators.iterator]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmproivlg37/{from.md → to.md} +125 -0
tmp/tmproivlg37/{from.md → to.md} RENAMED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Class template `basic_const_iterator` <a id="const.iterators.iterator">[[const.iterators.iterator]]</a>
2
+
3
+ ``` cpp
4
+ namespace std {
5
+ template<class I>
6
+ concept not-a-const-iterator = see below; // exposition only
7
+
8
+ template<indirectly_readable I>
9
+ using iter-const-rvalue-reference-t = // exposition only
10
+ common_reference_t<const iter_value_t<I>&&, iter_rvalue_reference_t<I>>;
11
+
12
+ template<input_iterator Iterator>
13
+ class basic_const_iterator {
14
+ Iterator current_ = Iterator(); // exposition only
15
+ using reference = iter_const_reference_t<Iterator>; // exposition only
16
+ using rvalue-reference = // exposition only
17
+ iter-const-rvalue-reference-t<Iterator>;
18
+
19
+ public:
20
+ using iterator_concept = see below;
21
+ using iterator_category = see below; // not always present
22
+ using value_type = iter_value_t<Iterator>;
23
+ using difference_type = iter_difference_t<Iterator>;
24
+
25
+ basic_const_iterator() requires default_initializable<Iterator> = default;
26
+ constexpr basic_const_iterator(Iterator current);
27
+ template<convertible_to<Iterator> U>
28
+ constexpr basic_const_iterator(basic_const_iterator<U> current);
29
+ template<different-from<basic_const_iterator> T>
30
+ requires convertible_to<T, Iterator>
31
+ constexpr basic_const_iterator(T&& current);
32
+
33
+ constexpr const Iterator& base() const & noexcept;
34
+ constexpr Iterator base() &&;
35
+
36
+ constexpr reference operator*() const;
37
+ constexpr const auto* operator->() const
38
+ requires is_lvalue_reference_v<iter_reference_t<Iterator>> &&
39
+ same_as<remove_cvref_t<iter_reference_t<Iterator>>, value_type>;
40
+
41
+ constexpr basic_const_iterator& operator++();
42
+ constexpr void operator++(int);
43
+ constexpr basic_const_iterator operator++(int) requires forward_iterator<Iterator>;
44
+
45
+ constexpr basic_const_iterator& operator--() requires bidirectional_iterator<Iterator>;
46
+ constexpr basic_const_iterator operator--(int) requires bidirectional_iterator<Iterator>;
47
+
48
+ constexpr basic_const_iterator& operator+=(difference_type n)
49
+ requires random_access_iterator<Iterator>;
50
+ constexpr basic_const_iterator& operator-=(difference_type n)
51
+ requires random_access_iterator<Iterator>;
52
+
53
+ constexpr reference operator[](difference_type n) const
54
+ requires random_access_iterator<Iterator>;
55
+
56
+ template<sentinel_for<Iterator> S>
57
+ constexpr bool operator==(const S& s) const;
58
+
59
+ constexpr bool operator<(const basic_const_iterator& y) const
60
+ requires random_access_iterator<Iterator>;
61
+ constexpr bool operator>(const basic_const_iterator& y) const
62
+ requires random_access_iterator<Iterator>;
63
+ constexpr bool operator<=(const basic_const_iterator& y) const
64
+ requires random_access_iterator<Iterator>;
65
+ constexpr bool operator>=(const basic_const_iterator& y) const
66
+ requires random_access_iterator<Iterator>;
67
+ constexpr auto operator<=>(const basic_const_iterator& y) const
68
+ requires random_access_iterator<Iterator> && three_way_comparable<Iterator>;
69
+
70
+ template<different-from<basic_const_iterator> I>
71
+ constexpr bool operator<(const I& y) const
72
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
73
+ template<different-from<basic_const_iterator> I>
74
+ constexpr bool operator>(const I& y) const
75
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
76
+ template<different-from<basic_const_iterator> I>
77
+ constexpr bool operator<=(const I& y) const
78
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
79
+ template<different-from<basic_const_iterator> I>
80
+ constexpr bool operator>=(const I& y) const
81
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
82
+ template<different-from<basic_const_iterator> I>
83
+ constexpr auto operator<=>(const I& y) const
84
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I> &&
85
+ three_way_comparable_with<Iterator, I>;
86
+ template<not-a-const-iterator I>
87
+ friend constexpr bool operator<(const I& x, const basic_const_iterator& y)
88
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
89
+ template<not-a-const-iterator I>
90
+ friend constexpr bool operator>(const I& x, const basic_const_iterator& y)
91
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
92
+ template<not-a-const-iterator I>
93
+ friend constexpr bool operator<=(const I& x, const basic_const_iterator& y)
94
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
95
+ template<not-a-const-iterator I>
96
+ friend constexpr bool operator>=(const I& x, const basic_const_iterator& y)
97
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
98
+
99
+ friend constexpr basic_const_iterator operator+(const basic_const_iterator& i,
100
+ difference_type n)
101
+ requires random_access_iterator<Iterator>;
102
+ friend constexpr basic_const_iterator operator+(difference_type n,
103
+ const basic_const_iterator& i)
104
+ requires random_access_iterator<Iterator>;
105
+ friend constexpr basic_const_iterator operator-(const basic_const_iterator& i,
106
+ difference_type n)
107
+ requires random_access_iterator<Iterator>;
108
+ template<sized_sentinel_for<Iterator> S>
109
+ constexpr difference_type operator-(const S& y) const;
110
+ template<not-a-const-iterator S>
111
+ requires sized_sentinel_for<S, Iterator>
112
+ friend constexpr difference_type operator-(const S& x, const basic_const_iterator& y);
113
+ friend constexpr rvalue-reference iter_move(const basic_const_iterator& i)
114
+ noexcept(noexcept(static_cast<rvalue-reference>(ranges::iter_move(i.current_))))
115
+ {
116
+ return static_cast<rvalue-reference>(ranges::iter_move(i.current_));
117
+ }
118
+ };
119
+ }
120
+ ```
121
+
122
+ Given some type `I`, the concept *not-a-const-iterator* is defined as
123
+ `false` if `I` is a specialization of `basic_const_iterator` and `true`
124
+ otherwise.
125
+