1*4bdff4beSrobert // -*- C++ -*- 2*4bdff4beSrobert //===----------------------------------------------------------------------===// 3*4bdff4beSrobert // 4*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information. 6*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4bdff4beSrobert // 8*4bdff4beSrobert //===----------------------------------------------------------------------===// 9*4bdff4beSrobert 10*4bdff4beSrobert #ifndef _LIBCPP___RANGES_OWNING_VIEW_H 11*4bdff4beSrobert #define _LIBCPP___RANGES_OWNING_VIEW_H 12*4bdff4beSrobert 13*4bdff4beSrobert #include <__concepts/constructible.h> 14*4bdff4beSrobert #include <__concepts/movable.h> 15*4bdff4beSrobert #include <__config> 16*4bdff4beSrobert #include <__ranges/access.h> 17*4bdff4beSrobert #include <__ranges/concepts.h> 18*4bdff4beSrobert #include <__ranges/data.h> 19*4bdff4beSrobert #include <__ranges/empty.h> 20*4bdff4beSrobert #include <__ranges/enable_borrowed_range.h> 21*4bdff4beSrobert #include <__ranges/size.h> 22*4bdff4beSrobert #include <__ranges/view_interface.h> 23*4bdff4beSrobert #include <__utility/move.h> 24*4bdff4beSrobert #include <type_traits> 25*4bdff4beSrobert 26*4bdff4beSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 27*4bdff4beSrobert # pragma GCC system_header 28*4bdff4beSrobert #endif 29*4bdff4beSrobert 30*4bdff4beSrobert _LIBCPP_BEGIN_NAMESPACE_STD 31*4bdff4beSrobert 32*4bdff4beSrobert #if _LIBCPP_STD_VER > 17 33*4bdff4beSrobert 34*4bdff4beSrobert namespace ranges { 35*4bdff4beSrobert template<range _Rp> 36*4bdff4beSrobert requires movable<_Rp> && (!__is_std_initializer_list<remove_cvref_t<_Rp>>) 37*4bdff4beSrobert class owning_view : public view_interface<owning_view<_Rp>> { 38*4bdff4beSrobert _Rp __r_ = _Rp(); 39*4bdff4beSrobert 40*4bdff4beSrobert public: 41*4bdff4beSrobert owning_view() requires default_initializable<_Rp> = default; owning_view(_Rp && __r)42*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr owning_view(_Rp&& __r) : __r_(std::move(__r)) {} 43*4bdff4beSrobert 44*4bdff4beSrobert owning_view(owning_view&&) = default; 45*4bdff4beSrobert owning_view& operator=(owning_view&&) = default; 46*4bdff4beSrobert base()47*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr _Rp& base() & noexcept { return __r_; } base()48*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr const _Rp& base() const& noexcept { return __r_; } base()49*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr _Rp&& base() && noexcept { return std::move(__r_); } base()50*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr const _Rp&& base() const&& noexcept { return std::move(__r_); } 51*4bdff4beSrobert begin()52*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr iterator_t<_Rp> begin() { return ranges::begin(__r_); } end()53*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr sentinel_t<_Rp> end() { return ranges::end(__r_); } begin()54*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto begin() const requires range<const _Rp> { return ranges::begin(__r_); } end()55*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto end() const requires range<const _Rp> { return ranges::end(__r_); } 56*4bdff4beSrobert empty()57*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr bool empty() requires requires { ranges::empty(__r_); } 58*4bdff4beSrobert { return ranges::empty(__r_); } empty()59*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr bool empty() const requires requires { ranges::empty(__r_); } 60*4bdff4beSrobert { return ranges::empty(__r_); } 61*4bdff4beSrobert size()62*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto size() requires sized_range<_Rp> 63*4bdff4beSrobert { return ranges::size(__r_); } size()64*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto size() const requires sized_range<const _Rp> 65*4bdff4beSrobert { return ranges::size(__r_); } 66*4bdff4beSrobert data()67*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto data() requires contiguous_range<_Rp> 68*4bdff4beSrobert { return ranges::data(__r_); } data()69*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr auto data() const requires contiguous_range<const _Rp> 70*4bdff4beSrobert { return ranges::data(__r_); } 71*4bdff4beSrobert }; 72*4bdff4beSrobert _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(owning_view); 73*4bdff4beSrobert 74*4bdff4beSrobert template<class _Tp> 75*4bdff4beSrobert inline constexpr bool enable_borrowed_range<owning_view<_Tp>> = enable_borrowed_range<_Tp>; 76*4bdff4beSrobert 77*4bdff4beSrobert } // namespace ranges 78*4bdff4beSrobert 79*4bdff4beSrobert #endif // _LIBCPP_STD_VER > 17 80*4bdff4beSrobert 81*4bdff4beSrobert _LIBCPP_END_NAMESPACE_STD 82*4bdff4beSrobert 83*4bdff4beSrobert #endif // _LIBCPP___RANGES_OWNING_VIEW_H 84