1*4bdff4beSrobert //===----------------------------------------------------------------------===// 2*4bdff4beSrobert // 3*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information. 5*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*4bdff4beSrobert // 7*4bdff4beSrobert //===----------------------------------------------------------------------===// 8*4bdff4beSrobert 9*4bdff4beSrobert #ifndef _LIBCPP___RANGES_AS_RVALUE_H 10*4bdff4beSrobert #define _LIBCPP___RANGES_AS_RVALUE_H 11*4bdff4beSrobert 12*4bdff4beSrobert #include <__concepts/constructible.h> 13*4bdff4beSrobert #include <__concepts/same_as.h> 14*4bdff4beSrobert #include <__config> 15*4bdff4beSrobert #include <__iterator/move_iterator.h> 16*4bdff4beSrobert #include <__iterator/move_sentinel.h> 17*4bdff4beSrobert #include <__ranges/access.h> 18*4bdff4beSrobert #include <__ranges/all.h> 19*4bdff4beSrobert #include <__ranges/concepts.h> 20*4bdff4beSrobert #include <__ranges/enable_borrowed_range.h> 21*4bdff4beSrobert #include <__ranges/range_adaptor.h> 22*4bdff4beSrobert #include <__ranges/size.h> 23*4bdff4beSrobert #include <__ranges/view_interface.h> 24*4bdff4beSrobert #include <__utility/forward.h> 25*4bdff4beSrobert #include <__utility/move.h> 26*4bdff4beSrobert 27*4bdff4beSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 28*4bdff4beSrobert # pragma GCC system_header 29*4bdff4beSrobert #endif 30*4bdff4beSrobert 31*4bdff4beSrobert #if _LIBCPP_STD_VER >= 23 32*4bdff4beSrobert 33*4bdff4beSrobert _LIBCPP_BEGIN_NAMESPACE_STD 34*4bdff4beSrobert 35*4bdff4beSrobert namespace ranges { 36*4bdff4beSrobert template <view _View> 37*4bdff4beSrobert requires input_range<_View> 38*4bdff4beSrobert class as_rvalue_view : public view_interface<as_rvalue_view<_View>> { 39*4bdff4beSrobert _LIBCPP_NO_UNIQUE_ADDRESS _View __base_ = _View(); 40*4bdff4beSrobert 41*4bdff4beSrobert public: 42*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI as_rvalue_view() 43*4bdff4beSrobert requires default_initializable<_View> 44*4bdff4beSrobert = default; 45*4bdff4beSrobert as_rvalue_view(_View __base)46*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr explicit as_rvalue_view(_View __base) : __base_(std::move(__base)) {} 47*4bdff4beSrobert base()48*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr _View base() const& 49*4bdff4beSrobert requires copy_constructible<_View> 50*4bdff4beSrobert { 51*4bdff4beSrobert return __base_; 52*4bdff4beSrobert } 53*4bdff4beSrobert base()54*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); } 55*4bdff4beSrobert begin()56*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto begin() 57*4bdff4beSrobert requires(!__simple_view<_View>) 58*4bdff4beSrobert { 59*4bdff4beSrobert return move_iterator(ranges::begin(__base_)); 60*4bdff4beSrobert } 61*4bdff4beSrobert begin()62*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto begin() const 63*4bdff4beSrobert requires range<const _View> 64*4bdff4beSrobert { 65*4bdff4beSrobert return move_iterator(ranges::begin(__base_)); 66*4bdff4beSrobert } 67*4bdff4beSrobert end()68*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto end() 69*4bdff4beSrobert requires(!__simple_view<_View>) 70*4bdff4beSrobert { 71*4bdff4beSrobert if constexpr (common_range<_View>) { 72*4bdff4beSrobert return move_iterator(ranges::end(__base_)); 73*4bdff4beSrobert } else { 74*4bdff4beSrobert return move_sentinel(ranges::end(__base_)); 75*4bdff4beSrobert } 76*4bdff4beSrobert } 77*4bdff4beSrobert end()78*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto end() const 79*4bdff4beSrobert requires range<const _View> 80*4bdff4beSrobert { 81*4bdff4beSrobert if constexpr (common_range<const _View>) { 82*4bdff4beSrobert return move_iterator(ranges::end(__base_)); 83*4bdff4beSrobert } else { 84*4bdff4beSrobert return move_sentinel(ranges::end(__base_)); 85*4bdff4beSrobert } 86*4bdff4beSrobert } 87*4bdff4beSrobert size()88*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto size() 89*4bdff4beSrobert requires sized_range<_View> 90*4bdff4beSrobert { 91*4bdff4beSrobert return ranges::size(__base_); 92*4bdff4beSrobert } 93*4bdff4beSrobert size()94*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto size() const 95*4bdff4beSrobert requires sized_range<const _View> 96*4bdff4beSrobert { 97*4bdff4beSrobert return ranges::size(__base_); 98*4bdff4beSrobert } 99*4bdff4beSrobert }; 100*4bdff4beSrobert 101*4bdff4beSrobert template <class _Range> 102*4bdff4beSrobert as_rvalue_view(_Range&&) -> as_rvalue_view<views::all_t<_Range>>; 103*4bdff4beSrobert 104*4bdff4beSrobert template <class _View> 105*4bdff4beSrobert inline constexpr bool enable_borrowed_range<as_rvalue_view<_View>> = enable_borrowed_range<_View>; 106*4bdff4beSrobert 107*4bdff4beSrobert namespace views { 108*4bdff4beSrobert namespace __as_rvalue { 109*4bdff4beSrobert struct __fn : __range_adaptor_closure<__fn> { 110*4bdff4beSrobert template <class _Range> 111*4bdff4beSrobert _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range) const 112*4bdff4beSrobert noexcept(noexcept(/**/ as_rvalue_view(std::forward<_Range>(__range)))) 113*4bdff4beSrobert -> decltype(/*--*/ as_rvalue_view(std::forward<_Range>(__range))) { 114*4bdff4beSrobert return /*-------------*/ as_rvalue_view(std::forward<_Range>(__range)); 115*4bdff4beSrobert } 116*4bdff4beSrobert 117*4bdff4beSrobert template <class _Range> 118*4bdff4beSrobert requires same_as<range_rvalue_reference_t<_Range>, range_reference_t<_Range>> 119*4bdff4beSrobert _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range) const 120*4bdff4beSrobert noexcept(noexcept(/**/ views::all(std::forward<_Range>(__range)))) 121*4bdff4beSrobert -> decltype(/*--*/ views::all(std::forward<_Range>(__range))) { 122*4bdff4beSrobert return /*-------------*/ views::all(std::forward<_Range>(__range)); 123*4bdff4beSrobert } 124*4bdff4beSrobert }; 125*4bdff4beSrobert } // namespace __as_rvalue 126*4bdff4beSrobert 127*4bdff4beSrobert inline namespace __cpo { 128*4bdff4beSrobert constexpr auto as_rvalue = __as_rvalue::__fn{}; 129*4bdff4beSrobert } // namespace __cpo 130*4bdff4beSrobert } // namespace views 131*4bdff4beSrobert } // namespace ranges 132*4bdff4beSrobert 133*4bdff4beSrobert _LIBCPP_END_NAMESPACE_STD 134*4bdff4beSrobert 135*4bdff4beSrobert #endif // _LIBCPP_STD_VER >= 23 136*4bdff4beSrobert 137*4bdff4beSrobert #endif // _LIBCPP___RANGES_AS_RVALUE_H 138