-
Notifications
You must be signed in to change notification settings - Fork 0
/
CircularBuffer.cpp
65 lines (51 loc) · 1.34 KB
/
CircularBuffer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "CircularBuffer.hpp"
#include <memory>
CircularBuffer::CircularBuffer(size_t capacity):
m_ptr(std::make_unique<pointer_type[]>(capacity)),
m_capacity(capacity)
{
for (uint32_t i = 0; i < capacity; ++i) {
m_ptr[i] = std::make_unique<value_type[]>(bytesInMegabyte);
}
}
void CircularBuffer::reset() {
m_head = m_tail;
m_full = false;
}
bool CircularBuffer::empty() const noexcept {
return (!m_full && (m_head == m_tail));
}
bool CircularBuffer::full() const noexcept {
return m_full;
}
size_t CircularBuffer::capacity() const noexcept {
return m_capacity;
}
size_t CircularBuffer::size() const noexcept {
size_t size = m_capacity;
if (!m_full) {
if (m_head >= m_tail) {
size = m_head - m_tail;
} else {
size = m_capacity + m_head - m_tail;
}
}
return size;
}
void CircularBuffer::fill() {
for (uint32_t i = 0; i < bytesInMegabyte; ++i) {
m_ptr[m_head][i] = counter++;
}
if (m_full)
{
m_tail = (m_tail + 1) % m_capacity;
}
m_head = (m_head + 1) % m_capacity;
m_full = m_head == m_tail;
}
const CircularBuffer::pointer_type& CircularBuffer::front() const noexcept {
return m_ptr[m_tail];
}
const CircularBuffer::pointer_type& CircularBuffer::back() const noexcept {
return m_ptr[m_head];
}