brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · 08acf3d Raw
143 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef _LIBCPP___RANGES_AS_RVALUE_H10#define _LIBCPP___RANGES_AS_RVALUE_H11 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_header29#endif30 31_LIBCPP_PUSH_MACROS32#include <__undef_macros>33 34#if _LIBCPP_STD_VER >= 2335 36_LIBCPP_BEGIN_NAMESPACE_STD37 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() const66    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() const82    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() const98    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 auto115  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 <input_range _Range>121    requires same_as<range_rvalue_reference_t<_Range>, range_reference_t<_Range>>122  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto123  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_rvalue129 130inline namespace __cpo {131inline constexpr auto as_rvalue = __as_rvalue::__fn{};132} // namespace __cpo133} // namespace views134} // namespace ranges135 136_LIBCPP_END_NAMESPACE_STD137 138#endif // _LIBCPP_STD_VER >= 23139 140_LIBCPP_POP_MACROS141 142#endif // _LIBCPP___RANGES_AS_RVALUE_H143