mFrame
載入中...
搜尋中...
無符合項目
RingBuffer.h
1
8#ifndef MFRAME_BA359EBF_505B_445E_8A31_2AB82A22FEB8
9#define MFRAME_BA359EBF_505B_445E_8A31_2AB82A22FEB8
10
11/* ***************************************************************************************
12 * Include
13 */
14
15//----------------------------------------------------------------------------------------
16
17//----------------------------------------------------------------------------------------
18#include "./../io/Buffer.h"
19#include "./../lang/Memory.h"
20
21/* ***************************************************************************************
22 * Macro
23 */
24
25/* ***************************************************************************************
26 * Namespace
27 */
28namespace ufm::io {
29 class RingBuffer;
30} // namespace ufm::io
31
32/* ***************************************************************************************
33 * Class/Interface/Struct
34 */
35
46 public ufm::io::Buffer {
47 /* *************************************************************************************
48 * Variable
49 */
50 private:
51 ufm::lang::Memory vMemory;
52 volatile uint32 vCount;
53 volatile uint32 vHead;
54 volatile uint32 vTail;
55
56 /* *************************************************************************************
57 * Abstract Method
58 */
59
60 /* *************************************************************************************
61 * Construct Method
62 */
63 public:
71 RingBuffer(ufm::lang::Memory memory) noexcept;
72
80 inline RingBuffer(int length) : RingBuffer(ufm::lang::Memory(length)) {
81 return;
82 }
83
92 inline RingBuffer(void* pointer, int length)
93 : RingBuffer(ufm::lang::Memory(pointer, length)) {
94 return;
95 }
96
100 virtual ~RingBuffer(void) override;
101
102 /* *************************************************************************************
103 * Operator Method
104 */
105
106 /* *************************************************************************************
107 * Override Method - ufm::io::Buffer
108 */
109 public:
121 virtual void clear(void) override;
122
131 virtual ufm::lang::Readable& getReadable(void) override;
132
141 virtual ufm::lang::Appendable& getAppendable(void) override;
142
143 /* *************************************************************************************
144 * Override Method - ufm::lang::Readable
145 */
146 public:
151 virtual int avariable(void) const override;
152
159 virtual int pollByte(char& result) override;
160
166 virtual int poll(ufm::lang::Appendable& appendable) override;
167
174 virtual int poll(void* pointer, int length) override;
175
176 /* *************************************************************************************
177 * Override Method - ufm::lang::Iterable<const char>
178 */
179 public:
188 virtual void forEach(ufm::func::Consumer<const char&>& action) override;
189
196 virtual const char* elementAt(int index) const override;
197
206 virtual int nextIndex(int index) const override;
207
214
220 virtual ufm::util::Iterator<const char> end(void) override;
221
222 /* *************************************************************************************
223 * Override Method - ufm::lang::Appendable
224 */
225 public:
231 virtual int remaining(void) const override;
232
239 virtual int putByte(const char data) override;
240
249 virtual int put(ufm::lang::Readable& readable) override;
250
260 virtual int put(const void* pointer, int length) override;
261
262 /* *************************************************************************************
263 * Public Method
264 */
265 public:
269 inline int getSize(void) {
270 return static_cast<int>(RingBuffer::vCount);
271 }
272
276 inline int getHeadPosi(void) const {
277 return static_cast<int>((this->vHead & (this->vCount - 1)));
278 }
279
283 inline int getTailPosi(void) const {
284 return static_cast<int>((this->vTail & (this->vCount - 1)));
285 }
286
293 return this->vMemory;
294 }
295
296 /* *************************************************************************************
297 * Protected Method
298 */
299
300 /* *************************************************************************************
301 * Private Method
302 */
303 private:
307 int putMult(ufm::lang::Readable* readable, const void* buffer, int length);
308
312 int pollMult(ufm::lang::Appendable* appendable, void* buffer, int length);
313 /* *************************************************************************************
314 * Static Variable
315 */
316
317 /* *************************************************************************************
318 * Static Method
319 */
320};
321
322/* ***************************************************************************************
323 * End of file
324 */
325#endif /* MFRAME_BA359EBF_505B_445E_8A31_2AB82A22FEB8 */
環形緩衝器實現,支援循環式讀寫操作
Definition RingBuffer.h:46
int getTailPosi(void) const
取得緩衝器中尾部索引位置(模擬環形結構)
Definition RingBuffer.h:283
virtual int put(const void *pointer, int length) override
從記憶體指標附加資料至緩衝區
virtual ufm::util::Iterator< const char > begin(void) override
返回一個迭代器,用於遍歷集合中的元素
virtual int nextIndex(int index) const override
返回當前索引的下一個有效索引。
virtual int remaining(void) const override
取得緩衝區剩餘空閒字節數。
RingBuffer(void *pointer, int length)
使用指定指標和長度建立環形緩衝器
Definition RingBuffer.h:92
RingBuffer(ufm::lang::Memory memory) noexcept
使用指定記憶體建立環形緩衝器
virtual ufm::util::Iterator< const char > end(void) override
返回一個迭代器,用於遍歷集合的結尾
ufm::lang::Memory & getMemory(void)
取得環形緩衝器的記憶體空間
Definition RingBuffer.h:292
virtual const char * elementAt(int index) const override
獲取集合中指定索引處的元素。
int getSize(void)
取得環形緩衝器的總大小(以位元組計算)
Definition RingBuffer.h:269
virtual int pollByte(char &result) override
讀取一個字節並將其從緩衝區移除
virtual void forEach(ufm::func::Consumer< const char & > &action) override
遍歷集合中所有元素,對每個元素執行指定操作。 若所有元素處理完畢或操作中發生異常則停止。
RingBuffer(int length)
使用指定長度建立環形緩衝器
Definition RingBuffer.h:80
virtual int poll(ufm::lang::Appendable &appendable) override
從緩衝區讀取資料並寫入到Appendable物件中
virtual ~RingBuffer(void) override
釋放環形緩衝器資源
int getHeadPosi(void) const
取得緩衝器中頭部索引位置(模擬環形結構)
Definition RingBuffer.h:276
virtual ufm::lang::Readable & getReadable(void) override
取得緩衝區的可讀取介面
virtual int avariable(void) const override
取得可讀取的資料數量
virtual int putByte(const char data) override
輸入單一字節至緩衝區
virtual int put(ufm::lang::Readable &readable) override
從 Readable 物件附加資料至緩衝區
virtual void clear(void) override
清空緩衝區內容
virtual int poll(void *pointer, int length) override
從緩衝區讀取指定長度的資料到指定的記憶體位置
virtual ufm::lang::Appendable & getAppendable(void) override
取得緩衝區的可寫入介面
存儲資料的類別,提供動態記憶體管理功能。
Definition Memory.h:44
物件基底類別
Definition Object.h:63
[Class] 迭代器介面
Definition Iterator.h:42
Definition Buffer.h:24
[Interface] 消費者函數式介面模板
Definition Consumer.h:43
[Interface] 緩衝區基礎介面,定義資料存取的核心功能
Definition Buffer.h:41
資料附加介面 (Appendable)
Definition Appendable.h:43
[Interface] 定義資料讀取介面
Definition Readable.h:46