1349cc55cSDimitry Andric // -*- C++ -*- 2349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 3349cc55cSDimitry Andric // 4349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 6349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7349cc55cSDimitry Andric // 8349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 9bdd1243dSDimitry Andric 10349cc55cSDimitry Andric #ifndef _LIBCPP___RANGES_SINGLE_VIEW_H 11349cc55cSDimitry Andric #define _LIBCPP___RANGES_SINGLE_VIEW_H 12349cc55cSDimitry Andric 13bdd1243dSDimitry Andric #include <__concepts/constructible.h> 14349cc55cSDimitry Andric #include <__config> 1506c3fb27SDimitry Andric #include <__ranges/movable_box.h> 1681ad6265SDimitry Andric #include <__ranges/range_adaptor.h> 1704eeddc0SDimitry Andric #include <__ranges/view_interface.h> 1806c3fb27SDimitry Andric #include <__type_traits/decay.h> 1906c3fb27SDimitry Andric #include <__type_traits/is_object.h> 20349cc55cSDimitry Andric #include <__utility/forward.h> 21349cc55cSDimitry Andric #include <__utility/in_place.h> 22349cc55cSDimitry Andric #include <__utility/move.h> 2306c3fb27SDimitry Andric #include <cstddef> 24349cc55cSDimitry Andric 25349cc55cSDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 26349cc55cSDimitry Andric # pragma GCC system_header 27349cc55cSDimitry Andric #endif 28349cc55cSDimitry Andric 29b3edf446SDimitry Andric _LIBCPP_PUSH_MACROS 30b3edf446SDimitry Andric #include <__undef_macros> 31b3edf446SDimitry Andric 32349cc55cSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 33349cc55cSDimitry Andric 3406c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 20 35349cc55cSDimitry Andric 36349cc55cSDimitry Andric namespace ranges { 3706c3fb27SDimitry Andric # if _LIBCPP_STD_VER >= 23 3806c3fb27SDimitry Andric template <move_constructible _Tp> 3906c3fb27SDimitry Andric # else 40349cc55cSDimitry Andric template <copy_constructible _Tp> 4106c3fb27SDimitry Andric # endif 42349cc55cSDimitry Andric requires is_object_v<_Tp> 437a6dacacSDimitry Andric class _LIBCPP_ABI_LLVM18_NO_UNIQUE_ADDRESS single_view : public view_interface<single_view<_Tp>> { 44647cbc5dSDimitry Andric _LIBCPP_NO_UNIQUE_ADDRESS __movable_box<_Tp> __value_; 45349cc55cSDimitry Andric 46349cc55cSDimitry Andric public: 4706c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI single_view() 4806c3fb27SDimitry Andric requires default_initializable<_Tp> 4906c3fb27SDimitry Andric = default; 50349cc55cSDimitry Andric 5106c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit single_view(const _Tp& __t) 5206c3fb27SDimitry Andric # if _LIBCPP_STD_VER >= 23 5306c3fb27SDimitry Andric requires copy_constructible<_Tp> 5406c3fb27SDimitry Andric # endif 5506c3fb27SDimitry Andric : __value_(in_place, __t) { 5606c3fb27SDimitry Andric } 57349cc55cSDimitry Andric 5806c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit single_view(_Tp&& __t) : __value_(in_place, std::move(__t)) {} 59349cc55cSDimitry Andric 60349cc55cSDimitry Andric template <class... _Args> 61349cc55cSDimitry Andric requires constructible_from<_Tp, _Args...> 6206c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit single_view(in_place_t, _Args&&... __args) 6381ad6265SDimitry Andric : __value_{in_place, std::forward<_Args>(__args)...} {} 64349cc55cSDimitry Andric 6506c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr _Tp* begin() noexcept { return data(); } 66349cc55cSDimitry Andric 6706c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* begin() const noexcept { return data(); } 68349cc55cSDimitry Andric 6906c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr _Tp* end() noexcept { return data() + 1; } 70349cc55cSDimitry Andric 7106c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* end() const noexcept { return data() + 1; } 72349cc55cSDimitry Andric 73*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI static constexpr bool empty() noexcept { return false; } 74*0fca6ea1SDimitry Andric 7506c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI static constexpr size_t size() noexcept { return 1; } 76349cc55cSDimitry Andric 7706c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr _Tp* data() noexcept { return __value_.operator->(); } 78349cc55cSDimitry Andric 7906c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* data() const noexcept { return __value_.operator->(); } 80349cc55cSDimitry Andric }; 81349cc55cSDimitry Andric 82349cc55cSDimitry Andric template <class _Tp> 83349cc55cSDimitry Andric single_view(_Tp) -> single_view<_Tp>; 8481ad6265SDimitry Andric 8581ad6265SDimitry Andric namespace views { 8681ad6265SDimitry Andric namespace __single_view { 8781ad6265SDimitry Andric 8881ad6265SDimitry Andric struct __fn : __range_adaptor_closure<__fn> { 8981ad6265SDimitry Andric template <class _Range> 90cb14a3feSDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range) const 9181ad6265SDimitry Andric noexcept(noexcept(single_view<decay_t<_Range&&>>(std::forward<_Range>(__range)))) 92cb14a3feSDimitry Andric -> decltype(single_view<decay_t<_Range&&>>(std::forward<_Range>(__range))) { 93cb14a3feSDimitry Andric return single_view<decay_t<_Range&&>>(std::forward<_Range>(__range)); 94cb14a3feSDimitry Andric } 9581ad6265SDimitry Andric }; 9681ad6265SDimitry Andric } // namespace __single_view 9781ad6265SDimitry Andric 9881ad6265SDimitry Andric inline namespace __cpo { 9981ad6265SDimitry Andric inline constexpr auto single = __single_view::__fn{}; 10081ad6265SDimitry Andric } // namespace __cpo 10181ad6265SDimitry Andric 10281ad6265SDimitry Andric } // namespace views 103349cc55cSDimitry Andric } // namespace ranges 104349cc55cSDimitry Andric 10506c3fb27SDimitry Andric #endif // _LIBCPP_STD_VER >= 20 106349cc55cSDimitry Andric 107349cc55cSDimitry Andric _LIBCPP_END_NAMESPACE_STD 108349cc55cSDimitry Andric 109b3edf446SDimitry Andric _LIBCPP_POP_MACROS 110b3edf446SDimitry Andric 111349cc55cSDimitry Andric #endif // _LIBCPP___RANGES_SINGLE_VIEW_H 112