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