sequencer
ring_buffer.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 
5 namespace sequencer::audio
6 {
7  template < class T >
9  {
10  public:
11  using size_type = typename std::vector< T >::size_type;
12  using difference_type = std::size_t;
13  using value_type = T;
14  using reference = T&;
15  using pointer = T*;
16  using iterator_category = std::forward_iterator_tag;
17 
18  explicit ring_buffer_iterator_t( T* t, size_type size, size_type idx = 0,
19  size_type increments = 0 ) noexcept
20  : t_{t}, idx_{idx}, size_{size}, increments_{increments}
21  {
22  }
23 
25  {
26  return *this += 1;
27  }
29  {
30  auto other = *this;
31  ++( *this );
32  return other;
33  }
34 
36  {
37  return ring_buffer_iterator_t{*this} += n;
38  }
39 
41  {
42  n %= size_;
43  idx_ += n;
44  increments_ += n;
45  if ( idx_ >= size_ )
46  {
47  t_ -= ( size_ - n );
48  idx_ %= size_;
49  }
50  else
51  {
52  t_ += n;
53  }
54  return *this;
55  }
56 
57  reference operator*() const noexcept
58  {
59  return *t_;
60  }
61 
62  bool operator==( const ring_buffer_iterator_t& other ) const noexcept
63  {
64  return ( idx_ == other.idx_ && size_ == other.size_ ) ||
65  ( increments_ >= size_ && other.increments_ >= other.size_ );
66  }
67 
68  bool operator!=( const ring_buffer_iterator_t& other ) const noexcept
69  {
70  return !( ( *this ) == other );
71  }
72 
73  private:
74  pointer t_{nullptr};
75  size_type idx_{0};
76  size_type size_;
77  size_type increments_{0};
78  };
79 
80  template < class T >
82  {
83  public:
84  using size_type = typename std::vector< T >::size_type;
85 
86  explicit ring_buffer_t( size_type size ) : buffer_( size, T() )
87  {
88  }
89 
90  T& operator[]( size_type i ) noexcept
91  {
92  return buffer_[ ( offset_ + i ) % buffer_.size() ];
93  }
94 
95  const T& operator[]( size_type i ) const noexcept
96  {
97  return buffer_[ ( offset_ + i ) % buffer_.size() ];
98  }
99 
100  void move( size_type offset ) noexcept
101  {
102  if ( buffer_.empty() )
103  {
104  return;
105  }
106  offset_ += offset;
107  offset_ %= buffer_.size();
108  }
109 
110  void clean( size_type N ) noexcept
111  {
112  std::fill( begin(), begin() + N, 0 );
113  }
114 
115  void clean_and_move( size_type N ) noexcept
116  {
117  clean( N );
118  move( N );
119  }
120 
121  auto begin() noexcept
122  {
123  return ring_buffer_iterator_t{&*( buffer_.begin() + offset_ ), buffer_.size(), offset_};
124  }
125 
126  auto end() noexcept
127  {
128  return ring_buffer_iterator_t< float >{nullptr, buffer_.size(), buffer_.size(),
129  buffer_.size()};
130  }
131 
132  private:
133  std::vector< T > buffer_;
134  size_type offset_{0};
135  };
136 } // namespace sequencer::audio
bool operator!=(const ring_buffer_iterator_t &other) const noexcept
Definition: ring_buffer.hpp:68
ring_buffer_iterator_t operator++(int) noexcept
Definition: ring_buffer.hpp:28
typename std::vector< T >::size_type size_type
Definition: ring_buffer.hpp:11
ring_buffer_t(size_type size)
Definition: ring_buffer.hpp:86
void move(size_type offset) noexcept
Definition: ring_buffer.hpp:100
T value_type
Definition: ring_buffer.hpp:13
reference operator*() const noexcept
Definition: ring_buffer.hpp:57
T * pointer
Definition: ring_buffer.hpp:15
const T & operator[](size_type i) const noexcept
Definition: ring_buffer.hpp:95
T & reference
Definition: ring_buffer.hpp:14
T & operator[](size_type i) noexcept
Definition: ring_buffer.hpp:90
Definition: delay.hpp:12
ring_buffer_iterator_t & operator+=(size_type n) noexcept
Definition: ring_buffer.hpp:40
void clean_and_move(size_type N) noexcept
Definition: ring_buffer.hpp:115
void clean(size_type N) noexcept
Definition: ring_buffer.hpp:110
std::size_t difference_type
Definition: ring_buffer.hpp:12
Definition: ring_buffer.hpp:8
Definition: ring_buffer.hpp:81
ring_buffer_iterator_t operator+(size_type n) noexcept
Definition: ring_buffer.hpp:35
ring_buffer_iterator_t(T *t, size_type size, size_type idx=0, size_type increments=0) noexcept
Definition: ring_buffer.hpp:18
bool operator==(const ring_buffer_iterator_t &other) const noexcept
Definition: ring_buffer.hpp:62
auto begin() noexcept
Definition: ring_buffer.hpp:121
auto end() noexcept
Definition: ring_buffer.hpp:126
std::forward_iterator_tag iterator_category
Definition: ring_buffer.hpp:16
ring_buffer_iterator_t & operator++() noexcept
Definition: ring_buffer.hpp:24