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