Distributed Ranges
Loading...
Searching...
No Matches
owning_view.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <dr/detail/ranges_shim.hpp>
8
9namespace dr {
10
11namespace __detail {
12
13// TODO: this `owning_view` is needed because range-v3 does not have an
14// `owning_view`. Ideally we would submit a PR to range-v3 /or
15// switch to solely using libstdc++13.
16
17template <rng::range R>
18class owning_view : public rng::view_interface<owning_view<R>> {
19public:
20 owning_view(R &&range) : range_(std::move(range)) {}
21
23 requires std::default_initializable<R>
24 = default;
25 owning_view(owning_view &&other) = default;
26 owning_view(const owning_view &other) = default;
27
28 owning_view &operator=(owning_view &&other) = default;
29 owning_view &operator=(const owning_view &other) = default;
30
31 auto size() const
32 requires(rng::sized_range<R>)
33 {
34 return rng::size(range_);
35 }
36
37 auto empty() const
38 requires(rng::sized_range<R>)
39 {
40 return size() == 0;
41 }
42
43 auto begin() { return rng::begin(range_); }
44
45 auto begin() const
46 requires(rng::range<const R>)
47 {
48 return rng::begin(range_);
49 }
50
51 auto end() { return rng::end(range_); }
52
53 auto end() const
54 requires(rng::range<const R>)
55 {
56 return rng::end(range_);
57 }
58
59 decltype(auto) base() { return range_; }
60
61 decltype(auto) base() const { return range_; }
62
63private:
64 R range_;
65};
66
67} // namespace __detail
68
69} // namespace dr
Definition: owning_view.hpp:18