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).
 
size_t MaxSize () const
 获取队列的最大容量 (Get the maximum capacity of 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]

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

构造函数,初始化队列 (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 7 of file queue.cpp.

8 : queue_array_(buffer),
9 ELEMENT_SIZE(element_size),
10 length_(length),
11 own_buffer_(false)
12{
13}
size_t length_
队列最大容量 (Maximum queue capacity).
Definition queue.hpp:163
bool own_buffer_
是否由队列自己管理缓冲区 (Owns buffer memory).
Definition queue.hpp:164
uint8_t * queue_array_
存储队列数据的数组 (Array storing queue data).
Definition queue.hpp:158
const uint16_t ELEMENT_SIZE
每个元素的大小 (Size of each element).
Definition queue.hpp:159

◆ BaseQueue() [2/2]

BaseQueue::BaseQueue ( uint16_t element_size,
size_t length )

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

Parameters
element_size队列中每个元素的大小 (Size of each element in the queue).
length队列的最大容量 (Maximum capacity of the queue).
Note
包含动态内存分配。 Contains dynamic memory allocation.

Definition at line 15 of file queue.cpp.

16 : queue_array_(new uint8_t[length * element_size]),
17 ELEMENT_SIZE(element_size),
18 length_(length),
19 own_buffer_(true)
20{
21}

◆ ~BaseQueue()

BaseQueue::~BaseQueue ( )

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

Definition at line 23 of file queue.cpp.

24{
25 if (own_buffer_)
26 {
27 delete[] queue_array_;
28 }
29}

Member Function Documentation

◆ EmptySize()

size_t BaseQueue::EmptySize ( ) const
nodiscard

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

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

Definition at line 231 of file queue.cpp.

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

◆ GetFirstElementIndex()

int BaseQueue::GetFirstElementIndex ( ) const

获取队列中第一个元素的索引 (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 96 of file queue.cpp.

97{
98 if (Size() == 0)
99 {
100 return -1;
101 }
102 return static_cast<int>(head_);
103}
size_t head_
头部索引 (Head index).
Definition queue.hpp:160

◆ GetLastElementIndex()

int BaseQueue::GetLastElementIndex ( ) const

获取队列中最后一个元素的索引 (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 87 of file queue.cpp.

88{
89 if (Size() == 0)
90 {
91 return -1;
92 }
93 return static_cast<int>((tail_ + length_ - 1) % length_);
94}
size_t tail_
尾部索引 (Tail index).
Definition queue.hpp:161

◆ MaxSize()

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

获取队列的最大容量 (Get the maximum capacity of the queue).

Returns
队列的最大容量 (Maximum capacity of the queue).

Definition at line 150 of file queue.hpp.

150{ return length_; }

◆ operator[]()

void * BaseQueue::operator[] ( uint32_t index)
nodiscard

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

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

Definition at line 31 of file queue.cpp.

32{
33 return &queue_array_[static_cast<size_t>(index * ELEMENT_SIZE)];
34}

◆ Overwrite()

ErrorCode BaseQueue::Overwrite ( const void * data)

覆盖队列中的数据 (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 191 of file queue.cpp.

192{
193 ASSERT(data != nullptr);
194
195 head_ = tail_ = 0;
196 is_full_ = false;
197
199
200 tail_ = (tail_ + 1) % length_;
201 if (head_ == tail_)
202 {
203 is_full_ = true;
204 }
205
206 return ErrorCode::OK;
207}
bool is_full_
队列是否已满 (Indicates if the queue is full).
Definition queue.hpp:162
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
Definition libxr_mem.cpp:5
@ OK
操作成功 | Operation successful

◆ Peek()

ErrorCode BaseQueue::Peek ( void * data)

获取队列头部的元素但不移除 (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 56 of file queue.cpp.

57{
58 ASSERT(data != nullptr);
59
60 if (Size() > 0)
61 {
63 return ErrorCode::OK;
64 }
65 else
66 {
67 return ErrorCode::EMPTY;
68 }
69}
@ EMPTY
为空 | Empty

◆ PeekBatch()

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

批量获取多个元素但不移除 (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 165 of file queue.cpp.

166{
167 ASSERT(data != nullptr);
168
169 if (Size() < size)
170 {
171 return ErrorCode::EMPTY;
172 }
173
174 auto index = head_;
175
176 auto tmp = reinterpret_cast<uint8_t*>(data);
177
178 size_t first_part = LibXR::min(size, length_ - index);
180 first_part * ELEMENT_SIZE);
181
182 if (first_part < size)
183 {
185 (size - first_part) * ELEMENT_SIZE);
186 }
187
188 return ErrorCode::OK;
189}
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值

◆ Pop()

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

移除队列头部的元素 (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 71 of file queue.cpp.

72{
73 if (Size() == 0)
74 {
75 return ErrorCode::EMPTY;
76 }
77
78 if (data != nullptr)
79 {
81 }
82 head_ = (head_ + 1) % length_;
83 is_full_ = false;
84 return ErrorCode::OK;
85}

◆ PopBatch()

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

批量移除多个元素 (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 135 of file queue.cpp.

136{
137 if (Size() < size)
138 {
139 return ErrorCode::EMPTY;
140 }
141
142 if (size == 0)
143 {
144 return ErrorCode::OK;
145 }
146 is_full_ = false;
147
148 size_t first_part = LibXR::min(size, length_ - head_);
149 if (data != nullptr)
150 {
151 auto tmp = reinterpret_cast<uint8_t*>(data);
153 first_part * ELEMENT_SIZE);
154 if (size > first_part)
155 {
157 (size - first_part) * ELEMENT_SIZE);
158 }
159 }
160
161 head_ = (head_ + size) % length_;
162 return ErrorCode::OK;
163}

◆ Push()

ErrorCode BaseQueue::Push ( const void * data)

向队列中添加一个元素 (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 36 of file queue.cpp.

37{
38 ASSERT(data != nullptr);
39
40 if (is_full_)
41 {
42 return ErrorCode::FULL;
43 }
44
46
47 tail_ = (tail_ + 1) % length_;
48 if (head_ == tail_)
49 {
50 is_full_ = true;
51 }
52
53 return ErrorCode::OK;
54}
@ FULL
已满 | Full

◆ PushBatch()

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

批量推入多个元素 (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 105 of file queue.cpp.

106{
107 ASSERT(data != nullptr);
108
109 auto avail = EmptySize();
110 if (avail < size)
111 {
112 return ErrorCode::FULL;
113 }
114
115 auto tmp = reinterpret_cast<const uint8_t*>(data);
116
117 size_t first_part = LibXR::min(size, length_ - tail_);
119 first_part * ELEMENT_SIZE);
120
121 if (size > first_part)
122 {
124 (size - first_part) * ELEMENT_SIZE);
125 }
126
127 tail_ = (tail_ + size) % length_;
128 if (head_ == tail_)
129 {
130 is_full_ = true;
131 }
132 return ErrorCode::OK;
133}
size_t EmptySize() const
获取队列的空闲空间 (Get the available space in the queue).
Definition queue.cpp:231

◆ Reset()

void BaseQueue::Reset ( )

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

Definition at line 209 of file queue.cpp.

210{
211 head_ = tail_ = 0;
212 is_full_ = false;
213}

◆ Size()

size_t BaseQueue::Size ( ) const
nodiscard

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

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

Definition at line 215 of file queue.cpp.

216{
217 if (is_full_)
218 {
219 return length_;
220 }
221 else if (tail_ >= head_)
222 {
223 return tail_ - head_;
224 }
225 else
226 {
227 return length_ + tail_ - head_;
228 }
229}

Field Documentation

◆ ELEMENT_SIZE

const uint16_t LibXR::BaseQueue::ELEMENT_SIZE

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

Definition at line 159 of file queue.hpp.

◆ head_

size_t LibXR::BaseQueue::head_ = 0

头部索引 (Head index).

Definition at line 160 of file queue.hpp.

◆ is_full_

bool LibXR::BaseQueue::is_full_ = false

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

Definition at line 162 of file queue.hpp.

◆ length_

size_t LibXR::BaseQueue::length_

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

Definition at line 163 of file queue.hpp.

◆ own_buffer_

bool LibXR::BaseQueue::own_buffer_ = false

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

Definition at line 164 of file queue.hpp.

◆ queue_array_

uint8_t* LibXR::BaseQueue::queue_array_

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

Definition at line 158 of file queue.hpp.

◆ tail_

size_t LibXR::BaseQueue::tail_ = 0

尾部索引 (Tail index).

Definition at line 161 of file queue.hpp.


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