-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathfixed_fifo.hpp
158 lines (131 loc) · 4.56 KB
/
fixed_fifo.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#pragma once
//=====================================================================//
/*! @file
@brief Fixed FIFO (first in first out) テンプレート
@author 平松邦仁 ([email protected])
@copyright Copyright (C) 2017 Kunihito Hiramatsu @n
Released under the MIT license @n
https://github.com/hirakuni45/RX/blob/master/LICENSE
*/
//=====================================================================//
#include <cstdint>
namespace utils {
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief fifo クラス
@param[in] UNIT 基本形
@param[in] SIZE バッファサイズ(最大65536)
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
template <class UNIT, uint32_t SIZE>
class fixed_fifo {
volatile uint16_t get_;
volatile uint16_t put_;
UNIT buff_[SIZE];
public:
//-----------------------------------------------------------------//
/*!
@brief コンストラクター
*/
//-----------------------------------------------------------------//
fixed_fifo() noexcept : get_(0), put_(0) { }
//-----------------------------------------------------------------//
/*!
@brief バッファのサイズを返す
@return バッファのサイズ
*/
//-----------------------------------------------------------------//
uint32_t size() const noexcept { return SIZE; }
//-----------------------------------------------------------------//
/*!
@brief 長さを返す
@return 長さ
*/
//-----------------------------------------------------------------//
uint32_t length() const noexcept {
if(put_ >= get_) return (put_ - get_);
else return (SIZE + put_ - get_);
}
//-----------------------------------------------------------------//
/*!
@brief クリア
*/
//-----------------------------------------------------------------//
void clear() noexcept { get_ = put_ = 0; }
//-----------------------------------------------------------------//
/*!
@brief 値の格納参照を得る
@return 値の格納参照
*/
//-----------------------------------------------------------------//
inline UNIT& put_at() noexcept { return buff_[put_]; }
//-----------------------------------------------------------------//
/*!
@brief 値の格納ポイントの移動
*/
//-----------------------------------------------------------------//
inline void put_go() noexcept {
volatile uint16_t put = put_;
++put;
if(put >= SIZE) {
put = 0;
}
put_ = put;
}
//-----------------------------------------------------------------//
/*!
@brief 値の格納
@param[in] v 値
*/
//-----------------------------------------------------------------//
void put(const UNIT& v) noexcept {
buff_[put_] = v;
put_go();
}
//-----------------------------------------------------------------//
/*!
@brief 値の取得参照を得る
@return 値の取得参照
*/
//-----------------------------------------------------------------//
const UNIT& get_at() const noexcept { return buff_[get_]; }
//-----------------------------------------------------------------//
/*!
@brief 値の取得
*/
//-----------------------------------------------------------------//
inline void get_go() noexcept {
volatile uint16_t get = get_;
++get;
if(get >= SIZE) {
get = 0;
}
get_ = get;
}
//-----------------------------------------------------------------//
/*!
@brief 値の取得
@return 値
*/
//-----------------------------------------------------------------//
UNIT get() noexcept {
UNIT v = buff_[get_];
get_go();
return v;
}
//-----------------------------------------------------------------//
/*!
@brief get 位置を返す
@return 位置
*/
//-----------------------------------------------------------------//
uint16_t pos_get() const noexcept { return get_; }
//-----------------------------------------------------------------//
/*!
@brief put 位置を返す
@return 位置
*/
//-----------------------------------------------------------------//
uint16_t pos_put() const noexcept { return put_; }
};
}