Scroll to navigation

std::ranges::owning_view(3) C++ Standard Libary std::ranges::owning_view(3)

NAME

std::ranges::owning_view - std::ranges::owning_view

Synopsis


Defined in header <ranges>
template< ranges::range R >


requires std::movable<R> && (!/*is-initializer-list*/<R>) (since C++20)
class owning_view


: public ranges::view_interface<owning_view<R>>


owning_view is a view that has unique ownership of a range. It is move-only and
stores that range within it.


The constant /*is-initializer-list*/<R> in the requires-clause is true if and only
if std::remove_cvref_t<R> is a specialization of std::initializer_list.

Member functions


constructor constructs an owning_view by value-initializing or move-constructing
(C++20) the stored range
(public member function)
operator= move-assigns the stored range
(C++20) (public member function)
base returns a reference to the stored range
(C++20) (public member function)
begin returns the beginning iterator of the stored range
(C++20) (public member function)
end returns the sentinel of the stored range
(C++20) (public member function)
empty checks whether the stored range is empty
(C++20) (public member function)
size returns the size of the stored sized_range
(C++20) (public member function)
data returns the pointer to the beginning of the stored contiguous_range
(C++20) (public member function)
Inherited from std::ranges::view_interface
cbegin returns a constant iterator to the beginning of the range.
(C++23) (public member function of std::ranges::view_interface<D>)
cend returns a sentinel for the constant iterator of the range.
(C++23) (public member function of std::ranges::view_interface<D>)
operator bool returns whether the derived view is not empty. Provided if
(C++20) ranges::empty is applicable to it.
(public member function of std::ranges::view_interface<D>)
front returns the first element in the derived view. Provided if it
(C++20) satisfies forward_range.
(public member function of std::ranges::view_interface<D>)
back returns the last element in the derived view. Provided if it satisfies
(C++20) bidirectional_range and common_range.
(public member function of std::ranges::view_interface<D>)
operator[] returns the n^th element in the derived view. Provided if it satisfies
(C++20) random_access_range.
(public member function of std::ranges::view_interface<D>)

std::ranges::owning_view::owning_view


owning_view() requires std::default_initializable<R> = default; (1) (since C++20)
owning_view( owning_view&& other ) = default; (2) (since C++20)
constexpr owning_view( R&& t ); (3) (since C++20)
owning_view( const owning_view& ) = delete; (4) (since C++20)


1) Default constructor. Value-initializes the stored range by its default member
initializer (= R()).
2) Move constructor. Move constructs the stored range from that of other.
3) Move constructs the stored range from t.
4) Copy constructor is deleted. owning_view is move-only.

Parameters


other - another owning_view to move from
t - range to move from

std::ranges::owning_view::operator=


owning_view& operator=( owning_view&& other ) = default; (1) (since C++20)
owning_view& operator=( const owning_view& ) = delete; (2) (since C++20)


1) Move assignment operator. Move assigns the stored range from that of other.
2) Copy assignment operator is deleted. owning_view is move-only.

Parameters


other - another owning_view to move from

Return value


*this

std::ranges::owning_view::base


constexpr R& base() & noexcept; (1) (since C++20)
constexpr const R& base() const & noexcept; (2) (since C++20)
constexpr R&& base() && noexcept; (3) (since C++20)
constexpr const R&& base() const && noexcept; (4) (since C++20)


Returns a reference to the stored range, keeping value category and
const-qualification.


1,2) Equivalent to return r_;.
3,4) Equivalent to return std::move(r_);.

std::ranges::owning_view::begin


constexpr ranges::iterator_t<R> begin(); (1) (since C++20)
constexpr auto begin() const requires ranges::range<const R>; (2) (since C++20)


Equivalent to return ranges::begin(r_);.

std::ranges::owning_view::end


constexpr ranges::sentinel_t<R> end(); (1) (since C++20)
constexpr auto end() const requires ranges::range<const R>; (2) (since C++20)


Equivalent to return ranges::end(r_);.

std::ranges::owning_view::empty


constexpr bool empty() requires requires { ranges::empty(r_); }; (1) (since C++20)
constexpr bool empty() const requires requires { (2) (since C++20)
ranges::empty(r_); };


Equivalent to return ranges::empty(r_);.

std::ranges::owning_view::size


constexpr auto size() requires ranges::sized_range<R>; (1) (since C++20)
constexpr auto size() const requires ranges::sized_range<const R>; (2) (since C++20)


Equivalent to return ranges::size(r_);.

std::ranges::owning_view::data


constexpr auto data() requires ranges::contiguous_range<R>; (1) (since C++20)
constexpr auto data() const requires (2) (since C++20)
ranges::contiguous_range<const R>;


Equivalent to return ranges::data(r_);.


Helper templates


template< class T >


inline constexpr bool (since C++20)
enable_borrowed_range<std::ranges::owning_view<T>> =


std::ranges::enable_borrowed_range<T>;


This specialization of std::ranges::enable_borrowed_range makes owning_view satisfy
borrowed_range when the underlying range satisfies it.

Example

// Run this code


#include <cassert>
#include <iostream>
#include <ranges>
#include <string>


int main()
{
using namespace std::literals;
std::ranges::owning_view ov{"cosmos"s}; // the deduced type of R is std::string;
// `ov` is the only owner of this string
assert(
ov.empty() == false &&
ov.size() == 6 &&
ov.size() == ov.base().size() &&
ov.front() == 'c' &&
ov.front() == *ov.begin() &&
ov.back() == 's' &&
ov.back() == *(ov.end() - 1) &&
ov.data() == ov.base()
);


std::cout << "sizeof(ov): " << sizeof ov << '\n' // typically equal to sizeof(R)
<< "range-for: ";
for (const char ch : ov)
std::cout << ch;
std::cout << '\n';


std::ranges::owning_view<std::string> ov2;
assert(ov2.empty());
// ov2 = ov; // compile-time error: copy assignment operator is deleted
ov2 = std::move(ov); // OK
assert(ov2.size() == 6);
}

Possible output:


sizeof(ov): 32
range-for: cosmos

See also


ranges::ref_view a view of the elements of some other range
(C++20) (class template)
views::all_t a view that includes all elements of a range
views::all (alias template) (range adaptor object)
(C++20)

2024.06.10 http://cppreference.com