1616#include < __iterator/iterator_traits.h>
1717#include < __type_traits/is_constructible.h>
1818#include < __utility/move.h>
19+ #include < iterator>
1920
2021#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2122# pragma GCC system_header
@@ -31,7 +32,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD
3132/* *
3233 * __ra_iterator is a random access iterator that wraps an underlying iterator.
3334 * 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..
3537 */
3638template <class _Container , class _Iterator >
3739struct __ra_iterator {
@@ -40,6 +42,8 @@ struct __ra_iterator {
4042
4143 friend _Container;
4244
45+ static_assert (std::random_access_iterator<_Iterator>, " Underlying iterator must be a random access iterator" );
46+
4347public:
4448 using iterator_concept = random_access_iterator_tag; // deliberately lower contiguous_iterator
4549 using iterator_category = random_access_iterator_tag;
@@ -50,92 +54,94 @@ struct __ra_iterator {
5054 requires is_default_constructible_v<_Iterator>
5155 = default;
5256
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)) {}
5458
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_; }
5660
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
5963 requires requires { __iter_.operator ->(); }
6064 {
6165 return __iter_.operator ->();
6266 }
6367
64- _LIBCPP_HIDE_FROM_ABI __ra_iterator& operator ++() {
68+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator& operator ++() {
6569 ++__iter_;
6670 return *this ;
6771 }
6872
69- _LIBCPP_HIDE_FROM_ABI __ra_iterator operator ++(int ) {
73+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator operator ++(int ) {
7074 __ra_iterator __tmp (*this );
7175 ++*this ;
7276 return __tmp;
7377 }
7478
75- _LIBCPP_HIDE_FROM_ABI __ra_iterator& operator --() {
79+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator& operator --() {
7680 --__iter_;
7781 return *this ;
7882 }
7983
80- _LIBCPP_HIDE_FROM_ABI __ra_iterator operator --(int ) {
84+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator operator --(int ) {
8185 __ra_iterator __tmp (*this );
8286 --*this ;
8387 return __tmp;
8488 }
8589
86- _LIBCPP_HIDE_FROM_ABI __ra_iterator& operator +=(difference_type __x) {
90+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator& operator +=(difference_type __x) {
8791 __iter_ += __x;
8892 return *this ;
8993 }
9094
91- _LIBCPP_HIDE_FROM_ABI __ra_iterator& operator -=(difference_type __x) {
95+ _LIBCPP_HIDE_FROM_ABI constexpr __ra_iterator& operator -=(difference_type __x) {
9296 __iter_ -= __x;
9397 return *this ;
9498 }
9599
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); }
97101
98102 _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator ==(const __ra_iterator& __x, const __ra_iterator& __y) {
99103 return __x.__iter_ == __y.__iter_ ;
100104 }
101105
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) {
103107 return __x.__iter_ < __y.__iter_ ;
104108 }
105109
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+ }
107113
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) {
109115 return !(__y < __x);
110116 }
111117
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) {
113119 return !(__x < __y);
114120 }
115121
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)
117123 requires three_way_comparable<_Iterator>
118124 {
119125 return __x.__iter_ <=> __y.__iter_ ;
120126 }
121127
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) {
123129 auto __tmp = __i;
124130 __tmp += __n;
125131 return __tmp;
126132 }
127133
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) {
129135 return __i + __n;
130136 }
131137
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) {
133139 auto __tmp = __i;
134140 __tmp -= __n;
135141 return __tmp;
136142 }
137143
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) {
139145 return __x.__iter_ - __y.__iter_ ;
140146 }
141147};
0 commit comments