-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcircular_buffer.hpp
73 lines (67 loc) · 1.66 KB
/
circular_buffer.hpp
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
66
67
68
69
70
71
72
73
#ifndef CIRCULAR_BUFFER_HPP_INCLUDED
#define CIRCULAR_BUFFER_HPP_INCLUDED 1
#include <cstddef>
/// @brief 循環バッファです。
///
/// @tparam T 要素の型です。
/// @tparam N 要素の個数です。
template <class T, size_t N>
class CircularBuffer
{
public:
/// @brief コンストラクタです。
CircularBuffer()
: size_(0)
, read_pos_(0)
, write_pos_(0)
{
}
/// @brief バッファからデータを読み出します。
///
/// @param[out] values 読み出したデータを格納するバッファです。
/// @param[in] len 読み出すデータの個数です。
///
/// @return 実際に読み出したデータの個数です。
size_t Read(T *values, size_t len)
{
if (len > size_) {
len = size_;
}
for (size_t i = 0; i < len; ++i) {
values[i] = buf_[read_pos_];
++read_pos_;
if (read_pos_ >= N) {
read_pos_ -= N;
}
}
size_ -= len;
return len;
}
/// @brief バッファへデータを書き込みます。
///
/// @param[in] values バッファへ書き込むデータの先頭アドレスです。
/// @param[in] len 書き込むデータの個数です。
///
/// @return 実際に書き込めたデータの個数です。
size_t Write(const T *values, size_t len)
{
if (len > (N - size_)) {
len = N - size_;
}
for (size_t i = 0; i < len; ++i) {
buf_[write_pos_] = values[i];
++write_pos_;
if (write_pos_ >= N) {
write_pos_ -= N;
}
}
size_ += len;
return len;
}
private:
T buf_[N];
size_t size_;
size_t read_pos_;
size_t write_pos_;
};
#endif // !defined(CIRCULAR_BUFFER_HPP_INCLUDED)