16
16
#include < __iterator/iterator_traits.h>
17
17
#include < __type_traits/is_constructible.h>
18
18
#include < __utility/move.h>
19
+ #include < iterator>
19
20
20
21
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
21
22
# pragma GCC system_header
@@ -31,7 +32,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD
31
32
/* *
32
33
* __ra_iterator is a random access iterator that wraps an underlying iterator.
33
34
* It also stores the underlying container type in its type so that algorithms
34
- * can optimize based on the underlying container type.
35
+ * can optimize based on the underlying container type, and to avoid inadvertently
36
+ * mixing iterators coming from different containers..
35
37
*/
36
38
template <class _Container , class _Iterator >
37
39
struct __ra_iterator {
@@ -40,6 +42,8 @@ struct __ra_iterator {
40
42
41
43
friend _Container;
42
44
45
+ static_assert (std::random_access_iterator<_Iterator>, " Underlying iterator must be a random access iterator" );
46
+
43
47
public:
44
48
using iterator_concept = random_access_iterator_tag; // deliberately lower contiguous_iterator
45
49
using iterator_category = random_access_iterator_tag;
@@ -50,92 +54,94 @@ struct __ra_iterator {
50
54
requires is_default_constructible_v<_Iterator>
51
55
= default;
52
56
53
- _LIBCPP_HIDE_FROM_ABI explicit __ra_iterator (_Iterator __iter) : __iter_(std::move(__iter)) {}
57
+ _LIBCPP_HIDE_FROM_ABI explicit constexpr __ra_iterator (_Iterator __iter) : __iter_(std::move(__iter)) {}
54
58
55
- _LIBCPP_HIDE_FROM_ABI _Iterator __base () const noexcept (noexcept (_Iterator(__iter_))) { return __iter_; }
59
+ _LIBCPP_HIDE_FROM_ABI constexpr _Iterator __base () const noexcept (noexcept (_Iterator(__iter_))) { return __iter_; }
56
60
57
- _LIBCPP_HIDE_FROM_ABI decltype (auto ) operator*() const { return *__iter_; }
58
- _LIBCPP_HIDE_FROM_ABI decltype (auto ) operator->() const
61
+ _LIBCPP_HIDE_FROM_ABI constexpr decltype (auto ) operator*() const { return *__iter_; }
62
+ _LIBCPP_HIDE_FROM_ABI constexpr decltype (auto ) operator->() const
59
63
requires requires { __iter_.operator ->(); }
60
64
{
61
65
return __iter_.operator ->();
62
66
}
63
67
64
- _LIBCPP_HIDE_FROM_ABI __ra_iterator& operator ++() {
68
+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator& operator ++() {
65
69
++__iter_;
66
70
return *this ;
67
71
}
68
72
69
- _LIBCPP_HIDE_FROM_ABI __ra_iterator operator ++(int ) {
73
+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator operator ++(int ) {
70
74
__ra_iterator __tmp (*this );
71
75
++*this ;
72
76
return __tmp;
73
77
}
74
78
75
- _LIBCPP_HIDE_FROM_ABI __ra_iterator& operator --() {
79
+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator& operator --() {
76
80
--__iter_;
77
81
return *this ;
78
82
}
79
83
80
- _LIBCPP_HIDE_FROM_ABI __ra_iterator operator --(int ) {
84
+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator operator --(int ) {
81
85
__ra_iterator __tmp (*this );
82
86
--*this ;
83
87
return __tmp;
84
88
}
85
89
86
- _LIBCPP_HIDE_FROM_ABI __ra_iterator& operator +=(difference_type __x) {
90
+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator& operator +=(difference_type __x) {
87
91
__iter_ += __x;
88
92
return *this ;
89
93
}
90
94
91
- _LIBCPP_HIDE_FROM_ABI __ra_iterator& operator -=(difference_type __x) {
95
+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator& operator -=(difference_type __x) {
92
96
__iter_ -= __x;
93
97
return *this ;
94
98
}
95
99
96
- _LIBCPP_HIDE_FROM_ABI decltype (auto ) operator[](difference_type __n) const { return *(*this + __n); }
100
+ _LIBCPP_HIDE_FROM_ABI constexpr decltype (auto ) operator[](difference_type __n) const { return *(*this + __n); }
97
101
98
102
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator ==(const __ra_iterator& __x, const __ra_iterator& __y) {
99
103
return __x.__iter_ == __y.__iter_ ;
100
104
}
101
105
102
- _LIBCPP_HIDE_FROM_ABI friend bool operator <(const __ra_iterator& __x, const __ra_iterator& __y) {
106
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator <(const __ra_iterator& __x, const __ra_iterator& __y) {
103
107
return __x.__iter_ < __y.__iter_ ;
104
108
}
105
109
106
- _LIBCPP_HIDE_FROM_ABI friend bool operator >(const __ra_iterator& __x, const __ra_iterator& __y) { return __y < __x; }
110
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator >(const __ra_iterator& __x, const __ra_iterator& __y) {
111
+ return __y < __x;
112
+ }
107
113
108
- _LIBCPP_HIDE_FROM_ABI friend bool operator <=(const __ra_iterator& __x, const __ra_iterator& __y) {
114
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator <=(const __ra_iterator& __x, const __ra_iterator& __y) {
109
115
return !(__y < __x);
110
116
}
111
117
112
- _LIBCPP_HIDE_FROM_ABI friend bool operator >=(const __ra_iterator& __x, const __ra_iterator& __y) {
118
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator >=(const __ra_iterator& __x, const __ra_iterator& __y) {
113
119
return !(__x < __y);
114
120
}
115
121
116
- _LIBCPP_HIDE_FROM_ABI friend auto operator <=>(const __ra_iterator& __x, const __ra_iterator& __y)
122
+ _LIBCPP_HIDE_FROM_ABI friend constexpr auto operator <=>(const __ra_iterator& __x, const __ra_iterator& __y)
117
123
requires three_way_comparable<_Iterator>
118
124
{
119
125
return __x.__iter_ <=> __y.__iter_ ;
120
126
}
121
127
122
- _LIBCPP_HIDE_FROM_ABI friend __ra_iterator operator +(const __ra_iterator& __i, difference_type __n) {
128
+ _LIBCPP_HIDE_FROM_ABI friend constexpr __ra_iterator operator +(const __ra_iterator& __i, difference_type __n) {
123
129
auto __tmp = __i;
124
130
__tmp += __n;
125
131
return __tmp;
126
132
}
127
133
128
- _LIBCPP_HIDE_FROM_ABI friend __ra_iterator operator +(difference_type __n, const __ra_iterator& __i) {
134
+ _LIBCPP_HIDE_FROM_ABI friend constexpr __ra_iterator operator +(difference_type __n, const __ra_iterator& __i) {
129
135
return __i + __n;
130
136
}
131
137
132
- _LIBCPP_HIDE_FROM_ABI friend __ra_iterator operator -(const __ra_iterator& __i, difference_type __n) {
138
+ _LIBCPP_HIDE_FROM_ABI friend constexpr __ra_iterator operator -(const __ra_iterator& __i, difference_type __n) {
133
139
auto __tmp = __i;
134
140
__tmp -= __n;
135
141
return __tmp;
136
142
}
137
143
138
- _LIBCPP_HIDE_FROM_ABI friend difference_type operator -(const __ra_iterator& __x, const __ra_iterator& __y) {
144
+ _LIBCPP_HIDE_FROM_ABI friend constexpr difference_type operator -(const __ra_iterator& __x, const __ra_iterator& __y) {
139
145
return __x.__iter_ - __y.__iter_ ;
140
146
}
141
147
};
0 commit comments