Horizon
Loading...
Searching...
No Matches
ref.hpp
Go to the documentation of this file.
1
2// Range v3 library
3//
4// Copyright Eric Niebler 2013-present
5//
6// Use, modification and distribution is subject to the
7// Boost Software License, Version 1.0. (See accompanying
8// file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10//
11// Project home: https://github.com/ericniebler/range-v3
12//
13
14#ifndef RANGES_V3_VIEW_REF_HPP
15#define RANGES_V3_VIEW_REF_HPP
16
17#include <concepts/concepts.hpp>
18
20
24#include <range/v3/utility/addressof.hpp>
26
27#include <range/v3/detail/prologue.hpp>
28
29namespace ranges
30{
31 template<typename Rng>
32 struct ref_view;
33
34 template<typename Rng>
35 RANGES_INLINE_VAR constexpr bool enable_borrowed_range<ref_view<Rng>> = true;
36
39 template<typename Rng>
40 struct ref_view : view_interface<ref_view<Rng>, range_cardinality<Rng>::value>
41 {
42 private:
43 CPP_assert(range<Rng>);
44 static_assert(std::is_object<Rng>::value, "");
45 Rng * rng_ = nullptr; // exposition only
46 public:
47 constexpr ref_view() noexcept = default;
48 constexpr ref_view(Rng & rng) noexcept
49 : rng_(detail::addressof(rng))
50 {}
51 constexpr Rng & base() const noexcept
52 {
53 return *rng_;
54 }
55 constexpr iterator_t<Rng> begin() const noexcept(noexcept(ranges::begin(*rng_)))
56 {
57 return ranges::begin(*rng_);
58 }
59 constexpr sentinel_t<Rng> end() const noexcept(noexcept(ranges::end(*rng_)))
60 {
61 return ranges::end(*rng_);
62 }
63 CPP_member
64 constexpr auto empty() const noexcept(noexcept(ranges::empty(*rng_)))
65 -> CPP_ret(bool)(
66 requires detail::can_empty_<Rng>)
67 {
68 return ranges::empty(*rng_);
69 }
70 CPP_auto_member
71 constexpr auto CPP_fun(size)()(const //
72 noexcept(noexcept(ranges::size(*rng_))) //
73 requires sized_range<Rng>)
74 {
75 return ranges::size(*rng_);
76 }
77 CPP_auto_member
78 constexpr auto CPP_fun(data)()(const //
79 noexcept(noexcept(ranges::data(*rng_))) //
80 requires contiguous_range<Rng>)
81 {
82 return ranges::data(*rng_);
83 }
84 };
85
86#if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
87 template(typename R)(
88 requires range<R>)
89 ref_view(R &) //
90 -> ref_view<R>;
91#endif
92
93 namespace views
94 {
95 struct ref_fn
96 {
97 template(typename Rng)(
98 requires range<Rng>)
99 constexpr ref_view<Rng> operator()(Rng & rng) const noexcept
100 {
101 return ref_view<Rng>(rng);
102 }
103 template<typename Rng>
104 void operator()(Rng const && rng) const = delete;
105 };
106
109 RANGES_INLINE_VARIABLE(ref_fn, ref)
110 } // namespace views
111
112 namespace cpp20
113 {
114 template(typename Rng)(
115 requires std::is_object<Rng>::value) //
117 }
118} // namespace ranges
119
120#include <range/v3/detail/satisfy_boost_range.hpp>
121RANGES_SATISFY_BOOST_RANGE(::ranges::ref_view)
122
123#include <range/v3/detail/epilogue.hpp>
124
125#endif
The contiguous_range concept.
The range concept.
The sized_range concept.
decltype(begin(declval(Rng &))) iterator_t
Definition access.hpp:698
Definition ref.hpp:41
Definition interface.hpp:129
Definition ref.hpp:96