Skip to content

Commit 37e7b7d

Browse files
huixie90tru
authored andcommitted
[libc++][ranges] move all range iterators back in class
move all range iterators back in class, as out of class iterators requires extra template parameters, which changes ADL Differential Revision: https://reviews.llvm.org/D143324 (cherry picked from commit 4c2ad19)
1 parent 267a23b commit 37e7b7d

File tree

8 files changed

+448
-465
lines changed

8 files changed

+448
-465
lines changed

libcxx/include/__ranges/elements_view.h

Lines changed: 54 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD
4949

5050
namespace ranges {
5151

52-
template <class _View, size_t _Np, bool _Const>
53-
class __elements_view_iterator;
54-
55-
template <class _View, size_t _Np, bool _Const>
56-
class __elements_view_sentinel;
57-
5852
template <class _Tp, size_t _Np>
5953
concept __has_tuple_element = __tuple_like<_Tp> && _Np < tuple_size<_Tp>::value;
6054

@@ -66,6 +60,13 @@ template <input_range _View, size_t _Np>
6660
__has_tuple_element<remove_reference_t<range_reference_t<_View>>, _Np> &&
6761
__returnable_element<range_reference_t<_View>, _Np>
6862
class elements_view : public view_interface<elements_view<_View, _Np>> {
63+
private:
64+
template <bool>
65+
class __iterator;
66+
67+
template <bool>
68+
class __sentinel;
69+
6970
public:
7071
_LIBCPP_HIDE_FROM_ABI elements_view()
7172
requires default_initializable<_View>
@@ -130,12 +131,6 @@ class elements_view : public view_interface<elements_view<_View, _Np>> {
130131
}
131132

132133
private:
133-
template <bool _Const>
134-
using __iterator = __elements_view_iterator<_View, _Np, _Const>;
135-
136-
template <bool _Const>
137-
using __sentinel = __elements_view_sentinel<_View, _Np, _Const>;
138-
139134
_LIBCPP_NO_UNIQUE_ADDRESS _View __base_ = _View();
140135
};
141136

@@ -160,13 +155,18 @@ struct __elements_view_iterator_category_base<_Base, _Np> {
160155
using iterator_category = decltype(__get_iterator_category());
161156
};
162157

163-
template <class _View, size_t _Np, bool _Const>
164-
class __elements_view_iterator : public __elements_view_iterator_category_base<__maybe_const<_Const, _View>, _Np> {
165-
template <class, size_t, bool >
166-
friend class __elements_view_iterator;
158+
template <input_range _View, size_t _Np>
159+
requires view<_View> && __has_tuple_element<range_value_t<_View>, _Np> &&
160+
__has_tuple_element<remove_reference_t<range_reference_t<_View>>, _Np> &&
161+
__returnable_element<range_reference_t<_View>, _Np>
162+
template <bool _Const>
163+
class elements_view<_View, _Np>::__iterator
164+
: public __elements_view_iterator_category_base<__maybe_const<_Const, _View>, _Np> {
165+
template <bool>
166+
friend class __iterator;
167167

168-
template <class, size_t, bool >
169-
friend class __elements_view_sentinel;
168+
template <bool>
169+
friend class __sentinel;
170170

171171
using _Base = __maybe_const<_Const, _View>;
172172

@@ -198,14 +198,13 @@ class __elements_view_iterator : public __elements_view_iterator_category_base<_
198198
using value_type = remove_cvref_t<tuple_element_t<_Np, range_value_t<_Base>>>;
199199
using difference_type = range_difference_t<_Base>;
200200

201-
_LIBCPP_HIDE_FROM_ABI __elements_view_iterator()
201+
_LIBCPP_HIDE_FROM_ABI __iterator()
202202
requires default_initializable<iterator_t<_Base>>
203203
= default;
204204

205-
_LIBCPP_HIDE_FROM_ABI constexpr explicit __elements_view_iterator(iterator_t<_Base> __current)
206-
: __current_(std::move(__current)) {}
205+
_LIBCPP_HIDE_FROM_ABI constexpr explicit __iterator(iterator_t<_Base> __current) : __current_(std::move(__current)) {}
207206

208-
_LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator(__elements_view_iterator<_View, _Np, !_Const> __i)
207+
_LIBCPP_HIDE_FROM_ABI constexpr __iterator(__iterator<!_Const> __i)
209208
requires _Const && convertible_to<iterator_t<_View>, iterator_t<_Base>>
210209
: __current_(std::move(__i.__current_)) {}
211210

@@ -215,44 +214,44 @@ class __elements_view_iterator : public __elements_view_iterator_category_base<_
215214

216215
_LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator*() const { return __get_element(__current_); }
217216

218-
_LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator& operator++() {
217+
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator++() {
219218
++__current_;
220219
return *this;
221220
}
222221

223222
_LIBCPP_HIDE_FROM_ABI constexpr void operator++(int) { ++__current_; }
224223

225-
_LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator operator++(int)
224+
_LIBCPP_HIDE_FROM_ABI constexpr __iterator operator++(int)
226225
requires forward_range<_Base>
227226
{
228227
auto temp = *this;
229228
++__current_;
230229
return temp;
231230
}
232231

233-
_LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator& operator--()
232+
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator--()
234233
requires bidirectional_range<_Base>
235234
{
236235
--__current_;
237236
return *this;
238237
}
239238

240-
_LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator operator--(int)
239+
_LIBCPP_HIDE_FROM_ABI constexpr __iterator operator--(int)
241240
requires bidirectional_range<_Base>
242241
{
243242
auto temp = *this;
244243
--__current_;
245244
return temp;
246245
}
247246

248-
_LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator& operator+=(difference_type __n)
247+
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator+=(difference_type __n)
249248
requires random_access_range<_Base>
250249
{
251250
__current_ += __n;
252251
return *this;
253252
}
254253

255-
_LIBCPP_HIDE_FROM_ABI constexpr __elements_view_iterator& operator-=(difference_type __n)
254+
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator-=(difference_type __n)
256255
requires random_access_range<_Base>
257256
{
258257
__current_ -= __n;
@@ -265,122 +264,113 @@ class __elements_view_iterator : public __elements_view_iterator_category_base<_
265264
return __get_element(__current_ + __n);
266265
}
267266

268-
_LIBCPP_HIDE_FROM_ABI friend constexpr bool
269-
operator==(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
267+
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const __iterator& __x, const __iterator& __y)
270268
requires equality_comparable<iterator_t<_Base>>
271269
{
272270
return __x.__current_ == __y.__current_;
273271
}
274272

275-
_LIBCPP_HIDE_FROM_ABI friend constexpr bool
276-
operator<(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
273+
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator<(const __iterator& __x, const __iterator& __y)
277274
requires random_access_range<_Base>
278275
{
279276
return __x.__current_ < __y.__current_;
280277
}
281278

282-
_LIBCPP_HIDE_FROM_ABI friend constexpr bool
283-
operator>(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
279+
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator>(const __iterator& __x, const __iterator& __y)
284280
requires random_access_range<_Base>
285281
{
286282
return __y < __x;
287283
}
288284

289-
_LIBCPP_HIDE_FROM_ABI friend constexpr bool
290-
operator<=(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
285+
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator<=(const __iterator& __x, const __iterator& __y)
291286
requires random_access_range<_Base>
292287
{
293288
return !(__y < __x);
294289
}
295290

296-
_LIBCPP_HIDE_FROM_ABI friend constexpr bool
297-
operator>=(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
291+
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator>=(const __iterator& __x, const __iterator& __y)
298292
requires random_access_range<_Base>
299293
{
300294
return !(__x < __y);
301295
}
302296

303-
_LIBCPP_HIDE_FROM_ABI friend constexpr auto
304-
operator<=>(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
297+
_LIBCPP_HIDE_FROM_ABI friend constexpr auto operator<=>(const __iterator& __x, const __iterator& __y)
305298
requires random_access_range<_Base> && three_way_comparable<iterator_t<_Base>>
306299
{
307300
return __x.__current_ <=> __y.__current_;
308301
}
309302

310-
_LIBCPP_HIDE_FROM_ABI friend constexpr __elements_view_iterator
311-
operator+(const __elements_view_iterator& __x, difference_type __y)
303+
_LIBCPP_HIDE_FROM_ABI friend constexpr __iterator operator+(const __iterator& __x, difference_type __y)
312304
requires random_access_range<_Base>
313305
{
314-
return __elements_view_iterator{__x} += __y;
306+
return __iterator{__x} += __y;
315307
}
316308

317-
_LIBCPP_HIDE_FROM_ABI friend constexpr __elements_view_iterator
318-
operator+(difference_type __x, const __elements_view_iterator& __y)
309+
_LIBCPP_HIDE_FROM_ABI friend constexpr __iterator operator+(difference_type __x, const __iterator& __y)
319310
requires random_access_range<_Base>
320311
{
321312
return __y + __x;
322313
}
323314

324-
_LIBCPP_HIDE_FROM_ABI friend constexpr __elements_view_iterator
325-
operator-(const __elements_view_iterator& __x, difference_type __y)
315+
_LIBCPP_HIDE_FROM_ABI friend constexpr __iterator operator-(const __iterator& __x, difference_type __y)
326316
requires random_access_range<_Base>
327317
{
328-
return __elements_view_iterator{__x} -= __y;
318+
return __iterator{__x} -= __y;
329319
}
330320

331-
_LIBCPP_HIDE_FROM_ABI friend constexpr difference_type
332-
operator-(const __elements_view_iterator& __x, const __elements_view_iterator& __y)
321+
_LIBCPP_HIDE_FROM_ABI friend constexpr difference_type operator-(const __iterator& __x, const __iterator& __y)
333322
requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
334323
{
335324
return __x.__current_ - __y.__current_;
336325
}
337326
};
338327

339-
template <class _View, size_t _Np, bool _Const>
340-
class __elements_view_sentinel {
328+
template <input_range _View, size_t _Np>
329+
requires view<_View> && __has_tuple_element<range_value_t<_View>, _Np> &&
330+
__has_tuple_element<remove_reference_t<range_reference_t<_View>>, _Np> &&
331+
__returnable_element<range_reference_t<_View>, _Np>
332+
template <bool _Const>
333+
class elements_view<_View, _Np>::__sentinel {
341334
private:
342335
using _Base = __maybe_const<_Const, _View>;
343336
_LIBCPP_NO_UNIQUE_ADDRESS sentinel_t<_Base> __end_ = sentinel_t<_Base>();
344337

345-
template <class, size_t, bool >
346-
friend class __elements_view_sentinel;
338+
template <bool>
339+
friend class __sentinel;
347340

348341
template <bool _AnyConst>
349-
_LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto)
350-
__get_current(const __elements_view_iterator<_View, _Np, _AnyConst>& __iter) {
342+
_LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __get_current(const __iterator<_AnyConst>& __iter) {
351343
return (__iter.__current_);
352344
}
353345

354346
public:
355-
_LIBCPP_HIDE_FROM_ABI __elements_view_sentinel() = default;
347+
_LIBCPP_HIDE_FROM_ABI __sentinel() = default;
356348

357-
_LIBCPP_HIDE_FROM_ABI constexpr explicit __elements_view_sentinel(sentinel_t<_Base> __end)
358-
: __end_(std::move(__end)) {}
349+
_LIBCPP_HIDE_FROM_ABI constexpr explicit __sentinel(sentinel_t<_Base> __end) : __end_(std::move(__end)) {}
359350

360-
_LIBCPP_HIDE_FROM_ABI constexpr __elements_view_sentinel(__elements_view_sentinel<_View, _Np, !_Const> __other)
351+
_LIBCPP_HIDE_FROM_ABI constexpr __sentinel(__sentinel<!_Const> __other)
361352
requires _Const && convertible_to<sentinel_t<_View>, sentinel_t<_Base>>
362353
: __end_(std::move(__other.__end_)) {}
363354

364355
_LIBCPP_HIDE_FROM_ABI constexpr sentinel_t<_Base> base() const { return __end_; }
365356

366357
template <bool _OtherConst>
367358
requires sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const<_OtherConst, _View>>>
368-
_LIBCPP_HIDE_FROM_ABI friend constexpr bool
369-
operator==(const __elements_view_iterator<_View, _Np, _OtherConst>& __x, const __elements_view_sentinel& __y) {
359+
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const __iterator<_OtherConst>& __x, const __sentinel& __y) {
370360
return __get_current(__x) == __y.__end_;
371361
}
372362

373363
template <bool _OtherConst>
374364
requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const<_OtherConst, _View>>>
375365
_LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<__maybe_const<_OtherConst, _View>>
376-
operator-(const __elements_view_iterator<_View, _Np, _OtherConst>& __x, const __elements_view_sentinel& __y) {
366+
operator-(const __iterator<_OtherConst>& __x, const __sentinel& __y) {
377367
return __get_current(__x) - __y.__end_;
378368
}
379369

380370
template <bool _OtherConst>
381371
requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const<_OtherConst, _View>>>
382372
_LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<__maybe_const<_OtherConst, _View>>
383-
operator-(const __elements_view_sentinel& __x, const __elements_view_iterator<_View, _Np, _OtherConst>& __y) {
373+
operator-(const __sentinel& __x, const __iterator<_OtherConst>& __y) {
384374
return __x.__end_ - __get_current(__y);
385375
}
386376
};

0 commit comments

Comments
 (0)