Path: blob/main/contrib/llvm-project/libcxx/include/__ranges/as_rvalue_view.h
35236 views
//===----------------------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef _LIBCPP___RANGES_AS_RVALUE_H9#define _LIBCPP___RANGES_AS_RVALUE_H1011#include <__concepts/constructible.h>12#include <__concepts/same_as.h>13#include <__config>14#include <__iterator/move_iterator.h>15#include <__iterator/move_sentinel.h>16#include <__ranges/access.h>17#include <__ranges/all.h>18#include <__ranges/concepts.h>19#include <__ranges/enable_borrowed_range.h>20#include <__ranges/range_adaptor.h>21#include <__ranges/size.h>22#include <__ranges/view_interface.h>23#include <__utility/forward.h>24#include <__utility/move.h>2526#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)27# pragma GCC system_header28#endif2930_LIBCPP_PUSH_MACROS31#include <__undef_macros>3233#if _LIBCPP_STD_VER >= 233435_LIBCPP_BEGIN_NAMESPACE_STD3637namespace ranges {38template <view _View>39requires input_range<_View>40class as_rvalue_view : public view_interface<as_rvalue_view<_View>> {41_LIBCPP_NO_UNIQUE_ADDRESS _View __base_ = _View();4243public:44_LIBCPP_HIDE_FROM_ABI as_rvalue_view()45requires default_initializable<_View>46= default;4748_LIBCPP_HIDE_FROM_ABI constexpr explicit as_rvalue_view(_View __base) : __base_(std::move(__base)) {}4950_LIBCPP_HIDE_FROM_ABI constexpr _View base() const&51requires copy_constructible<_View>52{53return __base_;54}5556_LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); }5758_LIBCPP_HIDE_FROM_ABI constexpr auto begin()59requires(!__simple_view<_View>)60{61return move_iterator(ranges::begin(__base_));62}6364_LIBCPP_HIDE_FROM_ABI constexpr auto begin() const65requires range<const _View>66{67return move_iterator(ranges::begin(__base_));68}6970_LIBCPP_HIDE_FROM_ABI constexpr auto end()71requires(!__simple_view<_View>)72{73if constexpr (common_range<_View>) {74return move_iterator(ranges::end(__base_));75} else {76return move_sentinel(ranges::end(__base_));77}78}7980_LIBCPP_HIDE_FROM_ABI constexpr auto end() const81requires range<const _View>82{83if constexpr (common_range<const _View>) {84return move_iterator(ranges::end(__base_));85} else {86return move_sentinel(ranges::end(__base_));87}88}8990_LIBCPP_HIDE_FROM_ABI constexpr auto size()91requires sized_range<_View>92{93return ranges::size(__base_);94}9596_LIBCPP_HIDE_FROM_ABI constexpr auto size() const97requires sized_range<const _View>98{99return ranges::size(__base_);100}101};102103template <class _Range>104as_rvalue_view(_Range&&) -> as_rvalue_view<views::all_t<_Range>>;105106template <class _View>107inline constexpr bool enable_borrowed_range<as_rvalue_view<_View>> = enable_borrowed_range<_View>;108109namespace views {110namespace __as_rvalue {111struct __fn : __range_adaptor_closure<__fn> {112template <class _Range>113[[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto114operator()(_Range&& __range) noexcept(noexcept(as_rvalue_view(std::forward<_Range>(__range))))115-> decltype(/*--------------------------*/ as_rvalue_view(std::forward<_Range>(__range))) {116return /*---------------------------------*/ as_rvalue_view(std::forward<_Range>(__range));117}118119template <class _Range>120requires same_as<range_rvalue_reference_t<_Range>, range_reference_t<_Range>>121[[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto122operator()(_Range&& __range) noexcept(noexcept(views::all(std::forward<_Range>(__range))))123-> decltype(/*--------------------------*/ views::all(std::forward<_Range>(__range))) {124return /*---------------------------------*/ views::all(std::forward<_Range>(__range));125}126};127} // namespace __as_rvalue128129inline namespace __cpo {130inline constexpr auto as_rvalue = __as_rvalue::__fn{};131} // namespace __cpo132} // namespace views133} // namespace ranges134135_LIBCPP_END_NAMESPACE_STD136137#endif // _LIBCPP_STD_VER >= 23138139_LIBCPP_POP_MACROS140141#endif // _LIBCPP___RANGES_AS_RVALUE_H142143144