auxiliary
 All Classes Namespaces Files Functions Typedefs Enumerations Enumerator Macros
circular_buffer.hpp
Go to the documentation of this file.
1 
39 #pragma once
40 
41 namespace auxiliary
42 {
44  template <typename T>
46  {
47  typedef T value_type;
48  typedef T& reference;
49  typedef const T& const_reference;
50  typedef size_t size_type;
51  public:
52  explicit circular_buffer(const size_type n): buffer_(n), size_(n), contents_size_(0), head_(0), tail_(0) {}
53 
55  reference next()
56  {
57  assert(contents_size_ == size_);
58  inc_head();
59  inc_tail();
60  return buffer_[tail_];
61  }
62 
64  void push_back(const value_type& item)
65  {
66  if (contents_size_ == 0) {
67  buffer_[tail_] = item;
68  contents_size_++;
69  } else {
70  inc_tail();
71  buffer_[tail_] = item;
72 
73  if (contents_size_ == size_)
74  inc_head();
75  else
76  contents_size_++;
77  }
78 
79  buffer_[tail_] = item;
80  }
81 
83  inline reference front() { return buffer_[head_]; }
84 
86  inline const_reference front() const { return buffer_[head_]; }
87 
89  inline reference back() { return buffer_[tail_]; }
90 
92  inline const_reference back() const { return buffer_[tail_]; }
93 
95  inline const_reference operator[] (size_type i) const
96  {
97  assert(i < size_);
98  return buffer_[(head_ + i) % size_];
99  }
100 
102  inline reference operator[] (size_type i)
103  {
104  assert(i < size_);
105  return buffer_[(head_ + i) % size_];
106  }
107 
109  void clear()
110  {
111  head_ = tail_ = contents_size_ = 0;
112  buffer_.clear();
113  }
114 
116  inline size_type size() const { return size_; }
117 
118  private:
119  void inc_head()
120  {
121  ++head_;
122  if (head_ == size_) head_ = 0;
123  }
124 
125  void inc_tail()
126  {
127  ++tail_;
128  if (tail_ == size_) tail_ = 0;
129  }
130 
131  private:
132  std::vector<T> buffer_;
133  size_type size_;
134  size_type contents_size_;
135  size_type head_;
136  size_type tail_;
137  };
138 }
const_reference back() const
Access the last element.
Definition: circular_buffer.hpp:92
void clear()
Removes all elements.
Definition: circular_buffer.hpp:109
const_reference operator[](size_type i) const
Accesses the element.
Definition: circular_buffer.hpp:95
reference back()
Accesses the last element.
Definition: circular_buffer.hpp:89
circular_buffer(const size_type n)
Definition: circular_buffer.hpp:52
reference front()
Accesses the first element.
Definition: circular_buffer.hpp:83
size_type size() const
Counts the number of elements.
Definition: circular_buffer.hpp:116
A minimal implementation of circular buffer class.
Definition: circular_buffer.hpp:45
reference next()
Get next element in the circular buffer.
Definition: circular_buffer.hpp:55
const_reference front() const
Accesses the first element.
Definition: circular_buffer.hpp:86
void push_back(const value_type &item)
Add new last element.
Definition: circular_buffer.hpp:64