Horizon
ref.hpp
Go to the documentation of this file.
1 // 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 
19 #include <range/v3/range_fwd.hpp>
20 
24 #include <range/v3/utility/addressof.hpp>
26 
27 #include <range/v3/detail/prologue.hpp>
28 
29 namespace 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 
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>
121 RANGES_SATISFY_BOOST_RANGE(::ranges::ref_view)
122 
123 #include <range/v3/detail/epilogue.hpp>
124 
125 #endif
decltype(begin(declval(Rng &))) iterator_t
Definition: access.hpp:698
RANGES_INLINE_VARIABLE(detail::to_container_fn< detail::from_range< std::vector >>, to_vector) template< template< typename... > class ContT > auto to(RANGES_HIDDEN_DETAIL(detail
For initializing a container of the specified type with the elements of an Range.
Definition: conversion.hpp:399
meta::size_t< L::size()> size
An integral constant wrapper that is the size of the meta::list L.
Definition: meta.hpp:1696
bool_< 0==size< L >::type::value > empty
An Boolean integral constant wrapper around true if L is an empty type list; false,...
Definition: meta.hpp:2231
Definition: ref.hpp:41
Definition: interface.hpp:129
Definition: ref.hpp:96