brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 955578b Raw
113 lines · c
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCPP___RANGES_SINGLE_VIEW_H11#define _LIBCPP___RANGES_SINGLE_VIEW_H12 13#include <__concepts/constructible.h>14#include <__config>15#include <__cstddef/ptrdiff_t.h>16#include <__cstddef/size_t.h>17#include <__ranges/movable_box.h>18#include <__ranges/range_adaptor.h>19#include <__ranges/view_interface.h>20#include <__type_traits/decay.h>21#include <__type_traits/is_object.h>22#include <__utility/forward.h>23#include <__utility/in_place.h>24#include <__utility/move.h>25 26#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)27#  pragma GCC system_header28#endif29 30_LIBCPP_PUSH_MACROS31#include <__undef_macros>32 33_LIBCPP_BEGIN_NAMESPACE_STD34 35#if _LIBCPP_STD_VER >= 2036 37namespace ranges {38#  if _LIBCPP_STD_VER >= 2339template <move_constructible _Tp>40#  else41template <copy_constructible _Tp>42#  endif43  requires is_object_v<_Tp>44class _LIBCPP_ABI_LLVM18_NO_UNIQUE_ADDRESS single_view : public view_interface<single_view<_Tp>> {45  _LIBCPP_NO_UNIQUE_ADDRESS __movable_box<_Tp> __value_;46 47public:48  _LIBCPP_HIDE_FROM_ABI single_view()49    requires default_initializable<_Tp>50  = default;51 52  _LIBCPP_HIDE_FROM_ABI constexpr explicit single_view(const _Tp& __t)53#  if _LIBCPP_STD_VER >= 2354    requires copy_constructible<_Tp>55#  endif56      : __value_(in_place, __t) {57  }58 59  _LIBCPP_HIDE_FROM_ABI constexpr explicit single_view(_Tp&& __t) : __value_(in_place, std::move(__t)) {}60 61  template <class... _Args>62    requires constructible_from<_Tp, _Args...>63  _LIBCPP_HIDE_FROM_ABI constexpr explicit single_view(in_place_t, _Args&&... __args)64      : __value_{in_place, std::forward<_Args>(__args)...} {}65 66  _LIBCPP_HIDE_FROM_ABI constexpr _Tp* begin() noexcept { return data(); }67 68  _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* begin() const noexcept { return data(); }69 70  _LIBCPP_HIDE_FROM_ABI constexpr _Tp* end() noexcept { return data() + 1; }71 72  _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* end() const noexcept { return data() + 1; }73 74  _LIBCPP_HIDE_FROM_ABI static constexpr bool empty() noexcept { return false; }75 76  _LIBCPP_HIDE_FROM_ABI static constexpr size_t size() noexcept { return 1; }77 78  _LIBCPP_HIDE_FROM_ABI constexpr _Tp* data() noexcept { return __value_.operator->(); }79 80  _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* data() const noexcept { return __value_.operator->(); }81};82 83template <class _Tp>84single_view(_Tp) -> single_view<_Tp>;85 86namespace views {87namespace __single_view {88 89struct __fn : __range_adaptor_closure<__fn> {90  template <class _Range>91  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range) const92      noexcept(noexcept(single_view<decay_t<_Range&&>>(std::forward<_Range>(__range))))93          -> decltype(single_view<decay_t<_Range&&>>(std::forward<_Range>(__range))) {94    return single_view<decay_t<_Range&&>>(std::forward<_Range>(__range));95  }96};97} // namespace __single_view98 99inline namespace __cpo {100inline constexpr auto single = __single_view::__fn{};101} // namespace __cpo102 103} // namespace views104} // namespace ranges105 106#endif // _LIBCPP_STD_VER >= 20107 108_LIBCPP_END_NAMESPACE_STD109 110_LIBCPP_POP_MACROS111 112#endif // _LIBCPP___RANGES_SINGLE_VIEW_H113