libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::BaseQueue Class Reference

基础队列类,提供固定大小的循环缓冲区 (Base queue class providing a fixed-size circular buffer). More...

#include <queue.hpp>

Inheritance diagram for LibXR::BaseQueue:
[legend]

Public Member Functions

 BaseQueue (uint16_t element_size, size_t length, uint8_t *buffer)
 构造函数,初始化队列 (Constructor to initialize the queue).
 
 BaseQueue (uint16_t element_size, size_t length)
 构造函数,初始化队列 (Constructor to initialize the queue).
 
 ~BaseQueue ()
 析构函数,释放队列内存 (Destructor to free queue memory).
 
void * operator[] (uint32_t index)
 访问指定索引的元素 (Access an element at a specified index).
 
ErrorCode Push (const void *data)
 向队列中添加一个元素 (Push an element into the queue).
 
ErrorCode Peek (void *data)
 获取队列头部的元素但不移除 (Peek at the front element without removing it).
 
ErrorCode Pop (void *data=nullptr)
 移除队列头部的元素 (Pop the front element from the queue).
 
int GetLastElementIndex () const
 获取队列中最后一个元素的索引 (Get the index of the last element in the queue).
 
int GetFirstElementIndex () const
 获取队列中第一个元素的索引 (Get the index of the first element in the queue).
 
ErrorCode PushBatch (const void *data, size_t size)
 批量推入多个元素 (Push multiple elements into the queue).
 
ErrorCode PopBatch (void *data, size_t size)
 批量移除多个元素 (Pop multiple elements from the queue).
 
ErrorCode PeekBatch (void *data, size_t size)
 批量获取多个元素但不移除 (Peek at multiple elements without removing them).
 
ErrorCode Overwrite (const void *data)
 覆盖队列中的数据 (Overwrite the queue with new data).
 
void Reset ()
 重置队列,清空所有数据 (Reset the queue and clear all data).
 
size_t Size () const
 获取队列中的元素个数 (Get the number of elements in the queue).
 
size_t EmptySize () const
 获取队列的空闲空间 (Get the available space in the queue).
 
 BaseQueue (const BaseQueue &)=delete
 
BaseQueueoperator= (const BaseQueue &)=delete
 
BaseQueueoperator= (BaseQueue &)=delete
 
BaseQueueoperator= (const BaseQueue &&)=delete
 
BaseQueueoperator= (BaseQueue &&)=delete
 

Data Fields

uint8_t * queue_array_
 存储队列数据的数组 (Array storing queue data).
 
const uint16_t ELEMENT_SIZE
 每个元素的大小 (Size of each element).
 
size_t head_ = 0
 头部索引 (Head index).
 
size_t tail_ = 0
 尾部索引 (Tail index).
 
bool is_full_ = false
 队列是否已满 (Indicates if the queue is full).
 
size_t length_
 队列最大容量 (Maximum queue capacity).
 
bool own_buffer_ = false
 是否由队列自己管理缓冲区 (Owns buffer memory).
 

Detailed Description

基础队列类,提供固定大小的循环缓冲区 (Base queue class providing a fixed-size circular buffer).

This class implements a circular queue that supports element insertion, retrieval, and batch operations. 该类实现了一个循环队列,支持元素插入、读取和批量操作。

Definition at line 19 of file queue.hpp.

Constructor & Destructor Documentation

◆ BaseQueue() [1/2]

LibXR::BaseQueue::BaseQueue ( uint16_t element_size,
size_t length,
uint8_t * buffer )
inline

构造函数,初始化队列 (Constructor to initialize the queue).

Parameters
element_size队列中每个元素的大小 (Size of each element in the queue).
length队列的最大容量 (Maximum capacity of the queue).
buffer指向缓冲区的指针 (Pointer to the buffer).

Definition at line 28 of file queue.hpp.

29 : queue_array_(buffer),
30 ELEMENT_SIZE(element_size),
31 length_(length),
32 own_buffer_(false)
33 {
34 }
size_t length_
队列最大容量 (Maximum queue capacity).
Definition queue.hpp:345
bool own_buffer_
是否由队列自己管理缓冲区 (Owns buffer memory).
Definition queue.hpp:346
uint8_t * queue_array_
存储队列数据的数组 (Array storing queue data).
Definition queue.hpp:340
const uint16_t ELEMENT_SIZE
每个元素的大小 (Size of each element).
Definition queue.hpp:341

◆ BaseQueue() [2/2]

LibXR::BaseQueue::BaseQueue ( uint16_t element_size,
size_t length )
inline

构造函数,初始化队列 (Constructor to initialize the queue).

Parameters
element_size队列中每个元素的大小 (Size of each element in the queue).
length队列的最大容量 (Maximum capacity of the queue).

Definition at line 41 of file queue.hpp.

42 : queue_array_(new uint8_t[length * element_size]),
43 ELEMENT_SIZE(element_size),
44 length_(length),
45 own_buffer_(true)
46 {
47 }

◆ ~BaseQueue()

LibXR::BaseQueue::~BaseQueue ( )
inline

析构函数,释放队列内存 (Destructor to free queue memory).

Definition at line 52 of file queue.hpp.

53 {
54 if (own_buffer_)
55 {
56 delete[] queue_array_;
57 }
58 }

Member Function Documentation

◆ EmptySize()

size_t LibXR::BaseQueue::EmptySize ( ) const
inlinenodiscard

获取队列的空闲空间 (Get the available space in the queue).

Returns
队列中可存储的元素个数 (Number of available slots in the queue).

Definition at line 332 of file queue.hpp.

332{ return length_ - Size(); }
size_t Size() const
获取队列中的元素个数 (Get the number of elements in the queue).
Definition queue.hpp:312

◆ GetFirstElementIndex()

int LibXR::BaseQueue::GetFirstElementIndex ( ) const
inline

获取队列中第一个元素的索引 (Get the index of the first element in the queue).

Returns
如果队列非空,返回第一个元素的索引,否则返回 -1 (Returns the index of the first element if the queue is not empty, otherwise -1).

Definition at line 161 of file queue.hpp.

162 {
163 if (Size() == 0)
164 {
165 return -1;
166 }
167 return static_cast<int>(head_);
168 }
size_t head_
头部索引 (Head index).
Definition queue.hpp:342

◆ GetLastElementIndex()

int LibXR::BaseQueue::GetLastElementIndex ( ) const
inline

获取队列中最后一个元素的索引 (Get the index of the last element in the queue).

Returns
如果队列非空,返回最后一个元素的索引,否则返回 -1 (Returns the index of the last element if the queue is not empty, otherwise -1).

Definition at line 146 of file queue.hpp.

147 {
148 if (Size() == 0)
149 {
150 return -1;
151 }
152 return static_cast<int>((tail_ + length_ - 1) % length_);
153 }
size_t tail_
尾部索引 (Tail index).
Definition queue.hpp:343

◆ operator[]()

void * LibXR::BaseQueue::operator[] ( uint32_t index)
inlinenodiscard

访问指定索引的元素 (Access an element at a specified index).

Parameters
index目标索引 (Target index).
Returns
指向该索引处元素的指针 (Pointer to the element at the specified index).

Definition at line 65 of file queue.hpp.

66 {
67 return &queue_array_[static_cast<size_t>(index * ELEMENT_SIZE)];
68 }

◆ Overwrite()

ErrorCode LibXR::BaseQueue::Overwrite ( const void * data)
inline

覆盖队列中的数据 (Overwrite the queue with new data).

Parameters
data指向新数据的缓冲区 (Pointer to the new data buffer).
Returns
操作结果,成功返回 ErrorCode::OK (Operation result: ErrorCode::OK on success).

Definition at line 281 of file queue.hpp.

282 {
283 ASSERT(data != nullptr);
284
285 head_ = tail_ = 0;
286 is_full_ = false;
287
288 memcpy(queue_array_, data, ELEMENT_SIZE * length_);
289
290 tail_ = (tail_ + 1) % length_;
291 if (head_ == tail_)
292 {
293 is_full_ = true;
294 }
295
296 return ErrorCode::OK;
297 }
bool is_full_
队列是否已满 (Indicates if the queue is full).
Definition queue.hpp:344

◆ Peek()

ErrorCode LibXR::BaseQueue::Peek ( void * data)
inline

获取队列头部的元素但不移除 (Peek at the front element without removing it).

Parameters
data指向存储数据的缓冲区 (Pointer to buffer where the data is stored).
Returns
操作结果,成功返回 ErrorCode::OK,队列为空时返回 ErrorCode::EMPTY (Operation result: ErrorCode::OK on success, ErrorCode::EMPTY if empty).

Definition at line 102 of file queue.hpp.

103 {
104 ASSERT(data != nullptr);
105
106 if (Size() > 0)
107 {
108 memcpy(data, &queue_array_[head_ * ELEMENT_SIZE], ELEMENT_SIZE);
109 return ErrorCode::OK;
110 }
111 else
112 {
113 return ErrorCode::EMPTY;
114 }
115 }

◆ PeekBatch()

ErrorCode LibXR::BaseQueue::PeekBatch ( void * data,
size_t size )
inline

批量获取多个元素但不移除 (Peek at multiple elements without removing them).

Parameters
data指向存储数据的缓冲区 (Pointer to buffer where the data is stored).
size要获取的元素个数 (Number of elements to retrieve).
Returns
操作结果,成功返回 ErrorCode::OK,队列为空时返回 ErrorCode::EMPTY (Operation result: ErrorCode::OK on success, ErrorCode::EMPTY if empty).

Definition at line 250 of file queue.hpp.

251 {
252 ASSERT(data != nullptr);
253
254 if (Size() < size)
255 {
256 return ErrorCode::EMPTY;
257 }
258
259 auto index = head_;
260
261 auto tmp = reinterpret_cast<uint8_t *>(data);
262
263 size_t first_part = LibXR::min(size, length_ - index);
264 memcpy(tmp, &queue_array_[index * ELEMENT_SIZE], first_part * ELEMENT_SIZE);
265
266 if (first_part < size)
267 {
268 memcpy(&tmp[first_part * ELEMENT_SIZE], queue_array_,
269 (size - first_part) * ELEMENT_SIZE);
270 }
271
272 return ErrorCode::OK;
273 }
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值

◆ Pop()

ErrorCode LibXR::BaseQueue::Pop ( void * data = nullptr)
inline

移除队列头部的元素 (Pop the front element from the queue).

Parameters
data指向存储数据的缓冲区 (Pointer to buffer where the removed data is stored).
Returns
操作结果,成功返回 ErrorCode::OK,队列为空时返回 ErrorCode::EMPTY (Operation result: ErrorCode::OK on success, ErrorCode::EMPTY if empty).

Definition at line 124 of file queue.hpp.

125 {
126 if (Size() == 0)
127 {
128 return ErrorCode::EMPTY;
129 }
130
131 if (data != nullptr)
132 {
133 memcpy(data, &queue_array_[head_ * ELEMENT_SIZE], ELEMENT_SIZE);
134 }
135 head_ = (head_ + 1) % length_;
136 is_full_ = false;
137 return ErrorCode::OK;
138 }

◆ PopBatch()

ErrorCode LibXR::BaseQueue::PopBatch ( void * data,
size_t size )
inline

批量移除多个元素 (Pop multiple elements from the queue).

Parameters
data指向存储数据的缓冲区 (Pointer to buffer where the removed data is stored).
size要移除的元素个数 (Number of elements to remove).
Returns
操作结果,成功返回 ErrorCode::OK,队列为空时返回 ErrorCode::EMPTY (Operation result: ErrorCode::OK on success, ErrorCode::EMPTY if empty).

Definition at line 214 of file queue.hpp.

215 {
216 if (Size() < size)
217 {
218 return ErrorCode::EMPTY;
219 }
220
221 if (size == 0)
222 {
223 return ErrorCode::OK;
224 }
225 is_full_ = false;
226
227 size_t first_part = LibXR::min(size, length_ - head_);
228 if (data != nullptr)
229 {
230 auto tmp = reinterpret_cast<uint8_t *>(data);
231 memcpy(tmp, &queue_array_[head_ * ELEMENT_SIZE], first_part * ELEMENT_SIZE);
232 if (size > first_part)
233 {
234 memcpy(&tmp[first_part * ELEMENT_SIZE], queue_array_,
235 (size - first_part) * ELEMENT_SIZE);
236 }
237 }
238
239 head_ = (head_ + size) % length_;
240 return ErrorCode::OK;
241 }

◆ Push()

ErrorCode LibXR::BaseQueue::Push ( const void * data)
inline

向队列中添加一个元素 (Push an element into the queue).

Parameters
data指向要添加的数据 (Pointer to the data to be added).
Returns
操作结果,成功返回 ErrorCode::OK,队列满时返回 ErrorCode::FULL (Operation result: ErrorCode::OK on success, ErrorCode::FULL if full).

Definition at line 76 of file queue.hpp.

77 {
78 ASSERT(data != nullptr);
79
80 if (is_full_)
81 {
82 return ErrorCode::FULL;
83 }
84
86
87 tail_ = (tail_ + 1) % length_;
88 if (head_ == tail_)
89 {
90 is_full_ = true;
91 }
92
93 return ErrorCode::OK;
94 }

◆ PushBatch()

ErrorCode LibXR::BaseQueue::PushBatch ( const void * data,
size_t size )
inline

批量推入多个元素 (Push multiple elements into the queue).

Parameters
data指向数据缓冲区 (Pointer to the data buffer).
size要推入的元素个数 (Number of elements to push).
Returns
操作结果,成功返回 ErrorCode::OK,队列满时返回 ErrorCode::FULL (Operation result: ErrorCode::OK on success, ErrorCode::FULL if full).

Definition at line 177 of file queue.hpp.

178 {
179 ASSERT(data != nullptr);
180
181 auto avail = EmptySize();
182 if (avail < size)
183 {
184 return ErrorCode::FULL;
185 }
186
187 auto tmp = reinterpret_cast<const uint8_t *>(data);
188
189 size_t first_part = LibXR::min(size, length_ - tail_);
190 memcpy(&queue_array_[tail_ * ELEMENT_SIZE], tmp, first_part * ELEMENT_SIZE);
191
192 if (size > first_part)
193 {
194 memcpy(queue_array_, &tmp[first_part * ELEMENT_SIZE],
195 (size - first_part) * ELEMENT_SIZE);
196 }
197
198 tail_ = (tail_ + size) % length_;
199 if (head_ == tail_)
200 {
201 is_full_ = true;
202 }
203 return ErrorCode::OK;
204 }
size_t EmptySize() const
获取队列的空闲空间 (Get the available space in the queue).
Definition queue.hpp:332

◆ Reset()

void LibXR::BaseQueue::Reset ( )
inline

重置队列,清空所有数据 (Reset the queue and clear all data).

Definition at line 302 of file queue.hpp.

303 {
304 head_ = tail_ = 0;
305 is_full_ = false;
306 }

◆ Size()

size_t LibXR::BaseQueue::Size ( ) const
inlinenodiscard

获取队列中的元素个数 (Get the number of elements in the queue).

Returns
当前队列中的元素个数 (Current number of elements in the queue).

Definition at line 312 of file queue.hpp.

313 {
314 if (is_full_)
315 {
316 return length_;
317 }
318 else if (tail_ >= head_)
319 {
320 return tail_ - head_;
321 }
322 else
323 {
324 return length_ + tail_ - head_;
325 }
326 }

Field Documentation

◆ ELEMENT_SIZE

const uint16_t LibXR::BaseQueue::ELEMENT_SIZE

每个元素的大小 (Size of each element).

Definition at line 341 of file queue.hpp.

◆ head_

size_t LibXR::BaseQueue::head_ = 0

头部索引 (Head index).

Definition at line 342 of file queue.hpp.

◆ is_full_

bool LibXR::BaseQueue::is_full_ = false

队列是否已满 (Indicates if the queue is full).

Definition at line 344 of file queue.hpp.

◆ length_

size_t LibXR::BaseQueue::length_

队列最大容量 (Maximum queue capacity).

Definition at line 345 of file queue.hpp.

◆ own_buffer_

bool LibXR::BaseQueue::own_buffer_ = false

是否由队列自己管理缓冲区 (Owns buffer memory).

Definition at line 346 of file queue.hpp.

◆ queue_array_

uint8_t* LibXR::BaseQueue::queue_array_

存储队列数据的数组 (Array storing queue data).

Definition at line 340 of file queue.hpp.

◆ tail_

size_t LibXR::BaseQueue::tail_ = 0

尾部索引 (Tail index).

Definition at line 343 of file queue.hpp.


The documentation for this class was generated from the following file: