xref: /freebsd-src/contrib/llvm-project/libcxx/include/__ranges/as_rvalue_view.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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