Libftpp
A modern C++ library
ring_buffer.cpp
Go to the documentation of this file.
1 #include "ring_buffer.hpp"
2 
3 RingBuffer::RingBuffer() : _buffer(MAX_BUFFER_SIZE), _head(0), _tail(0), _size(0) {}
4 RingBuffer::RingBuffer(const size_t& size_buffer)
5  : _buffer(size_buffer), _head(0), _tail(0), _size(0)
6 {
7 }
8 
9 void RingBuffer::push(const std::string& line)
10 {
11  if (isFull())
12  throw std::out_of_range("trying to write on full buffer");
13 
14  std::vector<unsigned char> tmp(line.begin(), line.end());
15  push(tmp);
16 }
17 
18 void RingBuffer::push(const unsigned char& byte)
19 {
20  if (isFull())
21  throw std::out_of_range("trying to write on full buffer");
22 
23  _buffer[_head] = byte;
24  _head = (_head + 1) % _buffer.size();
25  _size++;
26 }
27 
28 void RingBuffer::push(const std::vector<unsigned char>& bytes)
29 {
30  if (isFull())
31  throw std::out_of_range("trying to write on full buffer, try to increase size");
32 
33  if (bytes.size() > _buffer.size() - _size)
34  throw std::out_of_range("trying to read more than available in buffer");
35 
36  for (size_t i = 0; i < bytes.size(); ++i)
37  {
38  _buffer[_head] = bytes[i];
39  _head = (_head + 1) % _buffer.size();
40  _size++;
41  }
42 }
43 
44 unsigned char RingBuffer::pop()
45 {
46  if (isEmpty())
47  throw std::out_of_range("trying to read on empty buffer");
48 
49  unsigned char byte;
50  byte = _buffer[_tail];
51  _tail = (_tail + 1) % _buffer.size();
52  _size--;
53 
54  return byte;
55 }
56 
57 std::vector<unsigned char> RingBuffer::pop(const size_t& size)
58 {
59  if (size > _size)
60  throw std::out_of_range("trying to read more than available in buffer or empty buffer");
61 
62  std::vector<unsigned char> byte(size);
63  for (size_t i = 0; i < size; ++i)
64  {
65  byte[i] = _buffer[_tail];
66  _tail = (_tail + 1) % _buffer.size();
67  _size--;
68  }
69 
70  return byte;
71 }
72 
73 void RingBuffer::pushInto(const void* data, const size_t& size)
74 {
75  if (capacityAvailable() < size)
76  throw std::out_of_range("trying to put more than available in buffer");
77 
78  const unsigned char* ptr = reinterpret_cast<const unsigned char*>(data);
79  for (size_t i = 0; i < size; ++i)
80  {
81  _buffer[_head] = ptr[i];
82  _head = (_head + 1) % _buffer.size();
83  _size++;
84  }
85 }
86 
87 void RingBuffer::popInto(void* data, const size_t& size)
88 {
89  if (size > _size)
90  throw std::out_of_range("trying to read more than available in buffer or empty buffer");
91 
92  unsigned char* ptr = reinterpret_cast<unsigned char*>(data);
93  for (size_t i = 0; i < size; ++i)
94  {
95  ptr[i] = _buffer[_tail];
96  _tail = (_tail + 1) % _buffer.size();
97  _size--;
98  }
99 }
100 
101 unsigned char RingBuffer::peek() const
102 {
103  if (isEmpty())
104  throw std::out_of_range("trying to read on empty buffer");
105 
106  unsigned char byte;
107  byte = _buffer[_tail];
108  return byte;
109 }
110 
111 std::vector<unsigned char> RingBuffer::peek(const size_t& size) const
112 {
113  if (isEmpty())
114  throw std::out_of_range("trying to read on empty buffer");
115 
116  if (size > _size)
117  throw std::out_of_range("trying to read more than available in buffer");
118 
119  std::vector<unsigned char> byte(size);
120  size_t tmp_idx = _tail;
121 
122  for (size_t i = 0; i < size; ++i)
123  {
124  byte[i] = _buffer[tmp_idx];
125  tmp_idx = (tmp_idx + 1) % _buffer.size();
126  }
127 
128  return byte;
129 }
130 
132 {
133  return _size == 0;
134 }
135 
136 bool RingBuffer::isFull() const
137 {
138  return _buffer.size() == _size;
139 }
140 
141 size_t RingBuffer::size() const
142 {
143  return _size;
144 }
145 
146 size_t RingBuffer::capacity() const
147 {
148  return _buffer.size();
149 }
150 
152 {
153  return _buffer.size() - _size;
154 }
155 
157 {
158  _tail = 0;
159  _head = 0;
160  _size = 0;
161 }
bool isEmpty() const
void push(const unsigned char &byte)
Definition: ring_buffer.cpp:18
size_t size() const
bool isFull() const
unsigned char peek() const
void clear()
unsigned char pop()
Definition: ring_buffer.cpp:44
void popInto(void *data, const size_t &size)
Definition: ring_buffer.cpp:87
size_t capacity() const
void pushInto(const void *data, const size_t &size)
Definition: ring_buffer.cpp:73
size_t capacityAvailable() const
#define MAX_BUFFER_SIZE
Definition: ring_buffer.hpp:10