Skip to content

Commit 267a23b

Browse files
huixie90tru
authored andcommitted
[libcxx][ranges] revert join_view::iterator and sentinel to be in-class
(cherry picked from commit 3b059cd)
1 parent 60bba0f commit 267a23b

File tree

3 files changed

+67
-51
lines changed

3 files changed

+67
-51
lines changed

libcxx/include/__ranges/join_view.h

Lines changed: 38 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -69,34 +69,16 @@ namespace ranges {
6969
>;
7070
};
7171

72-
template <input_range _View, bool _Const>
73-
requires view<_View> && input_range<range_reference_t<_View>>
74-
struct __join_view_iterator;
75-
76-
template <input_range _View, bool _Const>
77-
requires view<_View> && input_range<range_reference_t<_View>>
78-
struct __join_view_sentinel;
79-
8072
template<input_range _View>
8173
requires view<_View> && input_range<range_reference_t<_View>>
8274
class join_view
8375
: public view_interface<join_view<_View>> {
8476
private:
8577
using _InnerRange = range_reference_t<_View>;
8678

87-
template<bool _Const>
88-
using __iterator = __join_view_iterator<_View, _Const>;
89-
90-
template<bool _Const>
91-
using __sentinel = __join_view_sentinel<_View, _Const>;
79+
template<bool> struct __iterator;
9280

93-
template <input_range _View2, bool _Const2>
94-
requires view<_View2> && input_range<range_reference_t<_View2>>
95-
friend struct __join_view_iterator;
96-
97-
template <input_range _View2, bool _Const2>
98-
requires view<_View2> && input_range<range_reference_t<_View2>>
99-
friend struct __join_view_sentinel;
81+
template<bool> struct __sentinel;
10082

10183
template <class>
10284
friend struct std::__segmented_iterator_traits;
@@ -167,12 +149,12 @@ namespace ranges {
167149
}
168150
};
169151

170-
template<input_range _View, bool _Const>
152+
template<input_range _View>
171153
requires view<_View> && input_range<range_reference_t<_View>>
172-
struct __join_view_sentinel {
173-
template<input_range _View2, bool>
174-
requires view<_View2> && input_range<range_reference_t<_View2>>
175-
friend struct __join_view_sentinel;
154+
template<bool _Const>
155+
struct join_view<_View>::__sentinel {
156+
template<bool>
157+
friend struct __sentinel;
176158

177159
private:
178160
using _Parent = __maybe_const<_Const, join_view<_View>>;
@@ -181,37 +163,42 @@ namespace ranges {
181163

182164
public:
183165
_LIBCPP_HIDE_FROM_ABI
184-
__join_view_sentinel() = default;
166+
__sentinel() = default;
185167

186168
_LIBCPP_HIDE_FROM_ABI
187-
constexpr explicit __join_view_sentinel(_Parent& __parent)
169+
constexpr explicit __sentinel(_Parent& __parent)
188170
: __end_(ranges::end(__parent.__base_)) {}
189171

190172
_LIBCPP_HIDE_FROM_ABI
191-
constexpr __join_view_sentinel(__join_view_sentinel<_View, !_Const> __s)
173+
constexpr __sentinel(__sentinel<!_Const> __s)
192174
requires _Const && convertible_to<sentinel_t<_View>, sentinel_t<_Base>>
193175
: __end_(std::move(__s.__end_)) {}
194176

195177
template<bool _OtherConst>
196178
requires sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const<_OtherConst, _View>>>
197179
_LIBCPP_HIDE_FROM_ABI
198-
friend constexpr bool operator==(const __join_view_iterator<_View, _OtherConst>& __x, const __join_view_sentinel& __y) {
180+
friend constexpr bool operator==(const __iterator<_OtherConst>& __x, const __sentinel& __y) {
199181
return __x.__outer_ == __y.__end_;
200182
}
201183
};
202184

203-
template<input_range _View, bool _Const>
185+
// https://reviews.llvm.org/D142811#inline-1383022
186+
// To simplify the segmented iterator traits specialization,
187+
// make the iterator `final`
188+
template<input_range _View>
204189
requires view<_View> && input_range<range_reference_t<_View>>
205-
struct __join_view_iterator
190+
template<bool _Const>
191+
struct join_view<_View>::__iterator final
206192
: public __join_view_iterator_category<__maybe_const<_Const, _View>> {
207193

208-
template<input_range _View2, bool>
209-
requires view<_View2> && input_range<range_reference_t<_View2>>
210-
friend struct __join_view_iterator;
194+
template<bool>
195+
friend struct __iterator;
211196

212197
template <class>
213198
friend struct std::__segmented_iterator_traits;
214199

200+
static constexpr bool __is_join_view_iterator = true;
201+
215202
private:
216203
using _Parent = __maybe_const<_Const, join_view<_View>>;
217204
using _Base = __maybe_const<_Const, _View>;
@@ -246,7 +233,7 @@ namespace ranges {
246233
__inner_.reset();
247234
}
248235

249-
_LIBCPP_HIDE_FROM_ABI constexpr __join_view_iterator(_Parent* __parent, _Outer __outer, _Inner __inner)
236+
_LIBCPP_HIDE_FROM_ABI constexpr __iterator(_Parent* __parent, _Outer __outer, _Inner __inner)
250237
: __outer_(std::move(__outer)), __inner_(std::move(__inner)), __parent_(__parent) {}
251238

252239
public:
@@ -267,17 +254,17 @@ namespace ranges {
267254
range_difference_t<_Base>, range_difference_t<range_reference_t<_Base>>>;
268255

269256
_LIBCPP_HIDE_FROM_ABI
270-
__join_view_iterator() requires default_initializable<_Outer> = default;
257+
__iterator() requires default_initializable<_Outer> = default;
271258

272259
_LIBCPP_HIDE_FROM_ABI
273-
constexpr __join_view_iterator(_Parent& __parent, _Outer __outer)
260+
constexpr __iterator(_Parent& __parent, _Outer __outer)
274261
: __outer_(std::move(__outer))
275262
, __parent_(std::addressof(__parent)) {
276263
__satisfy();
277264
}
278265

279266
_LIBCPP_HIDE_FROM_ABI
280-
constexpr __join_view_iterator(__join_view_iterator<_View, !_Const> __i)
267+
constexpr __iterator(__iterator<!_Const> __i)
281268
requires _Const &&
282269
convertible_to<iterator_t<_View>, _Outer> &&
283270
convertible_to<iterator_t<_InnerRange>, _Inner>
@@ -298,7 +285,7 @@ namespace ranges {
298285
}
299286

300287
_LIBCPP_HIDE_FROM_ABI
301-
constexpr __join_view_iterator& operator++() {
288+
constexpr __iterator& operator++() {
302289
auto&& __inner = [&]() -> auto&& {
303290
if constexpr (__ref_is_glvalue)
304291
return *__outer_;
@@ -318,7 +305,7 @@ namespace ranges {
318305
}
319306

320307
_LIBCPP_HIDE_FROM_ABI
321-
constexpr __join_view_iterator operator++(int)
308+
constexpr __iterator operator++(int)
322309
requires __ref_is_glvalue &&
323310
forward_range<_Base> &&
324311
forward_range<range_reference_t<_Base>>
@@ -329,7 +316,7 @@ namespace ranges {
329316
}
330317

331318
_LIBCPP_HIDE_FROM_ABI
332-
constexpr __join_view_iterator& operator--()
319+
constexpr __iterator& operator--()
333320
requires __ref_is_glvalue &&
334321
bidirectional_range<_Base> &&
335322
bidirectional_range<range_reference_t<_Base>> &&
@@ -348,7 +335,7 @@ namespace ranges {
348335
}
349336

350337
_LIBCPP_HIDE_FROM_ABI
351-
constexpr __join_view_iterator operator--(int)
338+
constexpr __iterator operator--(int)
352339
requires __ref_is_glvalue &&
353340
bidirectional_range<_Base> &&
354341
bidirectional_range<range_reference_t<_Base>> &&
@@ -360,7 +347,7 @@ namespace ranges {
360347
}
361348

362349
_LIBCPP_HIDE_FROM_ABI
363-
friend constexpr bool operator==(const __join_view_iterator& __x, const __join_view_iterator& __y)
350+
friend constexpr bool operator==(const __iterator& __x, const __iterator& __y)
364351
requires __ref_is_glvalue &&
365352
equality_comparable<iterator_t<_Base>> &&
366353
equality_comparable<iterator_t<range_reference_t<_Base>>>
@@ -369,14 +356,14 @@ namespace ranges {
369356
}
370357

371358
_LIBCPP_HIDE_FROM_ABI
372-
friend constexpr decltype(auto) iter_move(const __join_view_iterator& __i)
359+
friend constexpr decltype(auto) iter_move(const __iterator& __i)
373360
noexcept(noexcept(ranges::iter_move(*__i.__inner_)))
374361
{
375362
return ranges::iter_move(*__i.__inner_);
376363
}
377364

378365
_LIBCPP_HIDE_FROM_ABI
379-
friend constexpr void iter_swap(const __join_view_iterator& __x, const __join_view_iterator& __y)
366+
friend constexpr void iter_swap(const __iterator& __x, const __iterator& __y)
380367
noexcept(noexcept(ranges::iter_swap(*__x.__inner_, *__y.__inner_)))
381368
requires indirectly_swappable<_Inner>
382369
{
@@ -404,12 +391,12 @@ inline namespace __cpo {
404391
} // namespace views
405392
} // namespace ranges
406393

407-
template <class _View, bool _Const>
408-
requires(ranges::common_range<typename ranges::__join_view_iterator<_View, _Const>::_Parent> &&
409-
__is_cpp17_random_access_iterator<typename ranges::__join_view_iterator<_View, _Const>::_Outer>::value &&
410-
__is_cpp17_random_access_iterator<typename ranges::__join_view_iterator<_View, _Const>::_Inner>::value)
411-
struct __segmented_iterator_traits<ranges::__join_view_iterator<_View, _Const>> {
412-
using _JoinViewIterator = ranges::__join_view_iterator<_View, _Const>;
394+
template <class _JoinViewIterator>
395+
requires(_JoinViewIterator::__is_join_view_iterator &&
396+
ranges::common_range<typename _JoinViewIterator::_Parent> &&
397+
__is_cpp17_random_access_iterator<typename _JoinViewIterator::_Outer>::value &&
398+
__is_cpp17_random_access_iterator<typename _JoinViewIterator::_Inner>::value)
399+
struct __segmented_iterator_traits<_JoinViewIterator> {
413400

414401
using __segment_iterator =
415402
_LIBCPP_NODEBUG __iterator_with_data<typename _JoinViewIterator::_Outer, typename _JoinViewIterator::_Parent*>;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include <deque>
10+
11+
12+
using DequeIterator = typename std::deque<int>::iterator;
13+
static_assert(std::__is_segmented_iterator<DequeIterator>::value, "");
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// UNSUPPORTED: c++03, c++11, c++14, c++17
10+
11+
#include <ranges>
12+
#include <vector>
13+
14+
using JoinView = decltype(std::views::join(std::declval<std::vector<std::vector<int>>&>()));
15+
using JoinIter = std::ranges::iterator_t<JoinView>;
16+
static_assert(std::__is_segmented_iterator<JoinIter>::value);

0 commit comments

Comments
 (0)