104eeddc0SDimitry Andric // -*- C++ -*- 204eeddc0SDimitry Andric //===----------------------------------------------------------------------===// 304eeddc0SDimitry Andric // 404eeddc0SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 504eeddc0SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 604eeddc0SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 704eeddc0SDimitry Andric // 804eeddc0SDimitry Andric //===----------------------------------------------------------------------===// 9bdd1243dSDimitry Andric 1004eeddc0SDimitry Andric #ifndef _LIBCPP___RANGES_OWNING_VIEW_H 1104eeddc0SDimitry Andric #define _LIBCPP___RANGES_OWNING_VIEW_H 1204eeddc0SDimitry Andric 1304eeddc0SDimitry Andric #include <__concepts/constructible.h> 1404eeddc0SDimitry Andric #include <__concepts/movable.h> 1504eeddc0SDimitry Andric #include <__config> 1604eeddc0SDimitry Andric #include <__ranges/access.h> 1704eeddc0SDimitry Andric #include <__ranges/concepts.h> 1804eeddc0SDimitry Andric #include <__ranges/data.h> 1904eeddc0SDimitry Andric #include <__ranges/empty.h> 2004eeddc0SDimitry Andric #include <__ranges/enable_borrowed_range.h> 2104eeddc0SDimitry Andric #include <__ranges/size.h> 2204eeddc0SDimitry Andric #include <__ranges/view_interface.h> 2306c3fb27SDimitry Andric #include <__type_traits/remove_cvref.h> 2404eeddc0SDimitry Andric #include <__utility/move.h> 2504eeddc0SDimitry Andric 2604eeddc0SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2704eeddc0SDimitry Andric # pragma GCC system_header 2804eeddc0SDimitry Andric #endif 2904eeddc0SDimitry Andric 3006c3fb27SDimitry Andric _LIBCPP_PUSH_MACROS 3106c3fb27SDimitry Andric #include <__undef_macros> 3206c3fb27SDimitry Andric 3304eeddc0SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 3404eeddc0SDimitry Andric 3506c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 20 3604eeddc0SDimitry Andric 3704eeddc0SDimitry Andric namespace ranges { 3804eeddc0SDimitry Andric template <range _Rp> 3904eeddc0SDimitry Andric requires movable<_Rp> && (!__is_std_initializer_list<remove_cvref_t<_Rp>>) 4004eeddc0SDimitry Andric class owning_view : public view_interface<owning_view<_Rp>> { 4104eeddc0SDimitry Andric _Rp __r_ = _Rp(); 4204eeddc0SDimitry Andric 4304eeddc0SDimitry Andric public: 44*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI owning_view() 45*cb14a3feSDimitry Andric requires default_initializable<_Rp> 46*cb14a3feSDimitry Andric = default; owning_view(_Rp && __r)4781ad6265SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr owning_view(_Rp&& __r) : __r_(std::move(__r)) {} 4804eeddc0SDimitry Andric 4906c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI owning_view(owning_view&&) = default; 5006c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI owning_view& operator=(owning_view&&) = default; 5104eeddc0SDimitry Andric base()5204eeddc0SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr _Rp& base() & noexcept { return __r_; } base()5304eeddc0SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr const _Rp& base() const& noexcept { return __r_; } base()5481ad6265SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr _Rp&& base() && noexcept { return std::move(__r_); } base()5581ad6265SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr const _Rp&& base() const&& noexcept { return std::move(__r_); } 5604eeddc0SDimitry Andric begin()5704eeddc0SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr iterator_t<_Rp> begin() { return ranges::begin(__r_); } end()5804eeddc0SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr sentinel_t<_Rp> end() { return ranges::end(__r_); } begin()59*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr auto begin() const 60*cb14a3feSDimitry Andric requires range<const _Rp> 61*cb14a3feSDimitry Andric { 62*cb14a3feSDimitry Andric return ranges::begin(__r_); 63*cb14a3feSDimitry Andric } end()64*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr auto end() const 65*cb14a3feSDimitry Andric requires range<const _Rp> 66*cb14a3feSDimitry Andric { 67*cb14a3feSDimitry Andric return ranges::end(__r_); 68*cb14a3feSDimitry Andric } 6904eeddc0SDimitry Andric empty()70*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr bool empty() 71*cb14a3feSDimitry Andric requires requires { ranges::empty(__r_); } 72*cb14a3feSDimitry Andric { 73*cb14a3feSDimitry Andric return ranges::empty(__r_); 74*cb14a3feSDimitry Andric } empty()75*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr bool empty() const 76*cb14a3feSDimitry Andric requires requires { ranges::empty(__r_); } 77*cb14a3feSDimitry Andric { 78*cb14a3feSDimitry Andric return ranges::empty(__r_); 79*cb14a3feSDimitry Andric } 8004eeddc0SDimitry Andric size()81*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr auto size() 82*cb14a3feSDimitry Andric requires sized_range<_Rp> 83*cb14a3feSDimitry Andric { 84*cb14a3feSDimitry Andric return ranges::size(__r_); 85*cb14a3feSDimitry Andric } size()86*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr auto size() const 87*cb14a3feSDimitry Andric requires sized_range<const _Rp> 88*cb14a3feSDimitry Andric { 89*cb14a3feSDimitry Andric return ranges::size(__r_); 90*cb14a3feSDimitry Andric } 9104eeddc0SDimitry Andric data()92*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr auto data() 93*cb14a3feSDimitry Andric requires contiguous_range<_Rp> 94*cb14a3feSDimitry Andric { 95*cb14a3feSDimitry Andric return ranges::data(__r_); 96*cb14a3feSDimitry Andric } data()97*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr auto data() const 98*cb14a3feSDimitry Andric requires contiguous_range<const _Rp> 99*cb14a3feSDimitry Andric { 100*cb14a3feSDimitry Andric return ranges::data(__r_); 101*cb14a3feSDimitry Andric } 10204eeddc0SDimitry Andric }; 103bdd1243dSDimitry Andric _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(owning_view); 10404eeddc0SDimitry Andric 10504eeddc0SDimitry Andric template <class _Tp> 10604eeddc0SDimitry Andric inline constexpr bool enable_borrowed_range<owning_view<_Tp>> = enable_borrowed_range<_Tp>; 10704eeddc0SDimitry Andric 10804eeddc0SDimitry Andric } // namespace ranges 10904eeddc0SDimitry Andric 11006c3fb27SDimitry Andric #endif // _LIBCPP_STD_VER >= 20 11104eeddc0SDimitry Andric 11204eeddc0SDimitry Andric _LIBCPP_END_NAMESPACE_STD 11304eeddc0SDimitry Andric 11406c3fb27SDimitry Andric _LIBCPP_POP_MACROS 11506c3fb27SDimitry Andric 11604eeddc0SDimitry Andric #endif // _LIBCPP___RANGES_OWNING_VIEW_H 117