diff --git a/libcxx/include/__ranges/transform_view.h b/libcxx/include/__ranges/transform_view.h --- a/libcxx/include/__ranges/transform_view.h +++ b/libcxx/include/__ranges/transform_view.h @@ -57,11 +57,31 @@ regular_invocable<_Fn&, range_reference_t<_View>> && __can_reference>>; +template + requires __transform_view_constraints<_View, _Function> +class __transform_view_iterator; + +template + requires __transform_view_constraints<_View, _Function> +class __transform_view_sentinel; + template requires __transform_view_constraints<_View, _Fn> class transform_view : public view_interface> { - template class __iterator; - template class __sentinel; + + template + using __iterator = __transform_view_iterator<_View, _Fn, _IsConst>; + + template + using __sentinel = __transform_view_sentinel<_View, _Fn, _IsConst>; + + template + requires __transform_view_constraints<_ViewType, _FunctionType> + friend class __transform_view_iterator; + + template + requires __transform_view_constraints<_ViewType, _FunctionType> + friend class __transform_view_sentinel; _LIBCPP_NO_UNIQUE_ADDRESS __copyable_box<_Fn> __func_; _LIBCPP_NO_UNIQUE_ADDRESS _View __base_ = _View(); @@ -156,22 +176,23 @@ >; }; -template +template requires __transform_view_constraints<_View, _Fn> -template -class transform_view<_View, _Fn>::__iterator +class __transform_view_iterator : public __transform_view_iterator_category_base<_View, _Fn> { - using _Parent = __maybe_const<_Const, transform_view>; + using _Parent = __maybe_const<_Const, transform_view<_View, _Fn>>; using _Base = __maybe_const<_Const, _View>; _Parent *__parent_ = nullptr; - template - friend class transform_view<_View, _Fn>::__iterator; + template + requires __transform_view_constraints<_ViewType, _FunctionType> + friend class __transform_view_iterator; - template - friend class transform_view<_View, _Fn>::__sentinel; + template + requires __transform_view_constraints<_ViewType, _FunctionType> + friend class __transform_view_sentinel; public: iterator_t<_Base> __current_ = iterator_t<_Base>(); @@ -181,17 +202,17 @@ using difference_type = range_difference_t<_Base>; _LIBCPP_HIDE_FROM_ABI - __iterator() requires default_initializable> = default; + __transform_view_iterator() requires default_initializable> = default; _LIBCPP_HIDE_FROM_ABI - constexpr __iterator(_Parent& __parent, iterator_t<_Base> __current) + constexpr __transform_view_iterator(_Parent& __parent, iterator_t<_Base> __current) : __parent_(std::addressof(__parent)), __current_(std::move(__current)) {} - // Note: `__i` should always be `__iterator`, but directly using - // `__iterator` is ill-formed when `_Const` is false + // Note: `__i` should always be `__transform_view_iterator`, but directly using + // `__transform_view_iterator` is ill-formed when `_Const` is false // (see http://wg21.link/class.copy.ctor#5). _LIBCPP_HIDE_FROM_ABI - constexpr __iterator(__iterator __i) + constexpr __transform_view_iterator(__transform_view_iterator<_View, _Fn, !_Const> __i) requires _Const && convertible_to, iterator_t<_Base>> : __parent_(__i.__parent_), __current_(std::move(__i.__current_)) {} @@ -213,7 +234,7 @@ } _LIBCPP_HIDE_FROM_ABI - constexpr __iterator& operator++() { + constexpr __transform_view_iterator& operator++() { ++__current_; return *this; } @@ -222,7 +243,7 @@ constexpr void operator++(int) { ++__current_; } _LIBCPP_HIDE_FROM_ABI - constexpr __iterator operator++(int) + constexpr __transform_view_iterator operator++(int) requires forward_range<_Base> { auto __tmp = *this; @@ -231,7 +252,7 @@ } _LIBCPP_HIDE_FROM_ABI - constexpr __iterator& operator--() + constexpr __transform_view_iterator& operator--() requires bidirectional_range<_Base> { --__current_; @@ -239,7 +260,7 @@ } _LIBCPP_HIDE_FROM_ABI - constexpr __iterator operator--(int) + constexpr __transform_view_iterator operator--(int) requires bidirectional_range<_Base> { auto __tmp = *this; @@ -248,7 +269,7 @@ } _LIBCPP_HIDE_FROM_ABI - constexpr __iterator& operator+=(difference_type __n) + constexpr __transform_view_iterator& operator+=(difference_type __n) requires random_access_range<_Base> { __current_ += __n; @@ -256,7 +277,7 @@ } _LIBCPP_HIDE_FROM_ABI - constexpr __iterator& operator-=(difference_type __n) + constexpr __transform_view_iterator& operator-=(difference_type __n) requires random_access_range<_Base> { __current_ -= __n; @@ -272,77 +293,77 @@ } _LIBCPP_HIDE_FROM_ABI - friend constexpr bool operator==(const __iterator& __x, const __iterator& __y) + friend constexpr bool operator==(const __transform_view_iterator& __x, const __transform_view_iterator& __y) requires equality_comparable> { return __x.__current_ == __y.__current_; } _LIBCPP_HIDE_FROM_ABI - friend constexpr bool operator<(const __iterator& __x, const __iterator& __y) + friend constexpr bool operator<(const __transform_view_iterator& __x, const __transform_view_iterator& __y) requires random_access_range<_Base> { return __x.__current_ < __y.__current_; } _LIBCPP_HIDE_FROM_ABI - friend constexpr bool operator>(const __iterator& __x, const __iterator& __y) + friend constexpr bool operator>(const __transform_view_iterator& __x, const __transform_view_iterator& __y) requires random_access_range<_Base> { return __x.__current_ > __y.__current_; } _LIBCPP_HIDE_FROM_ABI - friend constexpr bool operator<=(const __iterator& __x, const __iterator& __y) + friend constexpr bool operator<=(const __transform_view_iterator& __x, const __transform_view_iterator& __y) requires random_access_range<_Base> { return __x.__current_ <= __y.__current_; } _LIBCPP_HIDE_FROM_ABI - friend constexpr bool operator>=(const __iterator& __x, const __iterator& __y) + friend constexpr bool operator>=(const __transform_view_iterator& __x, const __transform_view_iterator& __y) requires random_access_range<_Base> { return __x.__current_ >= __y.__current_; } _LIBCPP_HIDE_FROM_ABI - friend constexpr auto operator<=>(const __iterator& __x, const __iterator& __y) + friend constexpr auto operator<=>(const __transform_view_iterator& __x, const __transform_view_iterator& __y) requires random_access_range<_Base> && three_way_comparable> { return __x.__current_ <=> __y.__current_; } _LIBCPP_HIDE_FROM_ABI - friend constexpr __iterator operator+(__iterator __i, difference_type __n) + friend constexpr __transform_view_iterator operator+(__transform_view_iterator __i, difference_type __n) requires random_access_range<_Base> { - return __iterator{*__i.__parent_, __i.__current_ + __n}; + return __transform_view_iterator{*__i.__parent_, __i.__current_ + __n}; } _LIBCPP_HIDE_FROM_ABI - friend constexpr __iterator operator+(difference_type __n, __iterator __i) + friend constexpr __transform_view_iterator operator+(difference_type __n, __transform_view_iterator __i) requires random_access_range<_Base> { - return __iterator{*__i.__parent_, __i.__current_ + __n}; + return __transform_view_iterator{*__i.__parent_, __i.__current_ + __n}; } _LIBCPP_HIDE_FROM_ABI - friend constexpr __iterator operator-(__iterator __i, difference_type __n) + friend constexpr __transform_view_iterator operator-(__transform_view_iterator __i, difference_type __n) requires random_access_range<_Base> { - return __iterator{*__i.__parent_, __i.__current_ - __n}; + return __transform_view_iterator{*__i.__parent_, __i.__current_ - __n}; } _LIBCPP_HIDE_FROM_ABI - friend constexpr difference_type operator-(const __iterator& __x, const __iterator& __y) + friend constexpr difference_type operator-(const __transform_view_iterator& __x, const __transform_view_iterator& __y) requires sized_sentinel_for, iterator_t<_Base>> { return __x.__current_ - __y.__current_; } _LIBCPP_HIDE_FROM_ABI - friend constexpr decltype(auto) iter_move(const __iterator& __i) + friend constexpr decltype(auto) iter_move(const __transform_view_iterator& __i) noexcept(noexcept(*__i)) { if constexpr (is_lvalue_reference_v) @@ -352,33 +373,37 @@ } }; -template +template requires __transform_view_constraints<_View, _Fn> -template -class transform_view<_View, _Fn>::__sentinel { - using _Parent = __maybe_const<_Const, transform_view>; +class __transform_view_sentinel { + using _Parent = __maybe_const<_Const, transform_view<_View, _Fn>>; using _Base = __maybe_const<_Const, _View>; + template + using __iterator = __transform_view_iterator<_View, _Fn, _IsConst>; + sentinel_t<_Base> __end_ = sentinel_t<_Base>(); - template - friend class transform_view<_View, _Fn>::__iterator; + template + requires __transform_view_constraints<_ViewType, _FunctionType> + friend class __transform_view_iterator; - template - friend class transform_view<_View, _Fn>::__sentinel; + template + requires __transform_view_constraints<_ViewType, _FunctionType> + friend class __transform_view_sentinel; public: _LIBCPP_HIDE_FROM_ABI - __sentinel() = default; + __transform_view_sentinel() = default; _LIBCPP_HIDE_FROM_ABI - constexpr explicit __sentinel(sentinel_t<_Base> __end) : __end_(__end) {} + constexpr explicit __transform_view_sentinel(sentinel_t<_Base> __end) : __end_(__end) {} - // Note: `__i` should always be `__sentinel`, but directly using - // `__sentinel` is ill-formed when `_Const` is false + // Note: `__i` should always be `__transform_view_sentinel`, but directly using + // `__transform_view_sentinel` is ill-formed when `_Const` is false // (see http://wg21.link/class.copy.ctor#5). _LIBCPP_HIDE_FROM_ABI - constexpr __sentinel(__sentinel __i) + constexpr __transform_view_sentinel(__transform_view_sentinel<_View, _Fn, !_Const> __i) requires _Const && convertible_to, sentinel_t<_Base>> : __end_(std::move(__i.__end_)) {} @@ -388,7 +413,7 @@ template requires sentinel_for, iterator_t<__maybe_const<_OtherConst, _View>>> _LIBCPP_HIDE_FROM_ABI - friend constexpr bool operator==(const __iterator<_OtherConst>& __x, const __sentinel& __y) { + friend constexpr bool operator==(const __iterator<_OtherConst>& __x, const __transform_view_sentinel& __y) { return __x.__current_ == __y.__end_; } @@ -396,7 +421,7 @@ requires sized_sentinel_for, iterator_t<__maybe_const<_OtherConst, _View>>> _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<__maybe_const<_OtherConst, _View>> - operator-(const __iterator<_OtherConst>& __x, const __sentinel& __y) { + operator-(const __iterator<_OtherConst>& __x, const __transform_view_sentinel& __y) { return __x.__current_ - __y.__end_; } @@ -404,7 +429,7 @@ requires sized_sentinel_for, iterator_t<__maybe_const<_OtherConst, _View>>> _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<__maybe_const<_OtherConst, _View>> - operator-(const __sentinel& __x, const __iterator<_OtherConst>& __y) { + operator-(const __transform_view_sentinel& __x, const __iterator<_OtherConst>& __y) { return __x.__end_ - __y.__current_; } };