Horizon
repeat_n.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_REPEAT_N_HPP
15 #define RANGES_V3_VIEW_REPEAT_N_HPP
16 
17 #include <utility>
18 
19 #include <range/v3/range_fwd.hpp>
20 
24 #include <range/v3/utility/static_const.hpp>
25 #include <range/v3/view/facade.hpp>
26 
27 #include <range/v3/detail/prologue.hpp>
28 
29 namespace ranges
30 {
33 
34  // Ordinarily, a view shouldn't contain its elements. This is so that copying
35  // and assigning ranges is O(1), and also so that in the event of element
36  // mutation, all the copies of the range see the mutation the same way. The
37  // repeat_n_view *does* own its lone element, though. This is OK because:
38  // - O(N) copying is fine when N==1 as it is in this case, and
39  // - The element is immutable, so there is no potential for incorrect
40  // semantics.
41  template<typename Val>
42  struct repeat_n_view : view_facade<repeat_n_view<Val>, finite>
43  {
44  private:
45  friend range_access;
46  semiregular_box_t<Val> value_;
47  std::ptrdiff_t n_;
48 
49  struct cursor
50  {
51  private:
52  Val const * value_;
53  std::ptrdiff_t n_;
54 
55  public:
56  cursor() = default;
57  cursor(Val const & value, std::ptrdiff_t n)
58  : value_(std::addressof(value))
59  , n_(n)
60  {}
61  Val const & read() const
62  {
63  return *value_;
64  }
65  constexpr bool equal(default_sentinel_t) const
66  {
67  return 0 == n_;
68  }
69  bool equal(cursor const & that) const
70  {
71  return n_ == that.n_;
72  }
73  void next()
74  {
75  RANGES_EXPECT(0 != n_);
76  --n_;
77  }
78  void prev()
79  {
80  ++n_;
81  }
82  void advance(std::ptrdiff_t n)
83  {
84  n_ -= n;
85  }
86  std::ptrdiff_t distance_to(cursor const & that) const
87  {
88  return n_ - that.n_;
89  }
90  };
91  cursor begin_cursor() const
92  {
93  return {value_, n_};
94  }
95 
96  public:
97  repeat_n_view() = default;
98  constexpr repeat_n_view(Val value, std::ptrdiff_t n)
99  : value_(detail::move(value))
100  , n_((RANGES_EXPECT(0 <= n), n))
101  {}
102  constexpr std::size_t size() const
103  {
104  return static_cast<std::size_t>(n_);
105  }
106  };
107 
108  namespace views
109  {
110  struct repeat_n_fn
111  {
112  template(typename Val)(
113  requires copy_constructible<Val>)
114  repeat_n_view<Val> operator()(Val value, std::ptrdiff_t n) const
115  {
116  return repeat_n_view<Val>{std::move(value), n};
117  }
118  };
119 
123  } // namespace views
125 } // namespace ranges
126 
127 #include <range/v3/detail/epilogue.hpp>
128 #include <range/v3/detail/satisfy_boost_range.hpp>
129 RANGES_SATISFY_BOOST_RANGE(::ranges::repeat_n_view)
130 
131 #endif
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
std::integral_constant< std::size_t, N > size_t
An integral constant wrapper for std::size_t.
Definition: meta.hpp:163
repeat_n_c< N::type::value, T > repeat_n
Generate list<T,T,T...T> of size N arguments.
Definition: meta.hpp:1899
Definition: default_sentinel.hpp:26
Definition: repeat_n.hpp:43
A utility for constructing a view from a (derived) type that implements begin and end cursors.
Definition: facade.hpp:66
Definition: repeat_n.hpp:111