libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
queue.hpp
1#pragma once
2
3#include <cstddef>
4#include <cstdio>
5#include <cstring>
6
7#include "libxr_def.hpp"
8
9namespace LibXR
10{
20{
21 public:
28 BaseQueue(uint16_t element_size, size_t length, uint8_t *buffer);
29
35 BaseQueue(uint16_t element_size, size_t length);
36
40 ~BaseQueue();
41
47 [[nodiscard]] void *operator[](uint32_t index);
48
55 ErrorCode Push(const void *data);
56
63 ErrorCode Peek(void *data);
64
72 ErrorCode Pop(void *data = nullptr);
73
80 int GetLastElementIndex() const;
81
88 int GetFirstElementIndex() const;
89
97 ErrorCode PushBatch(const void *data, size_t size);
98
107 ErrorCode PopBatch(void *data, size_t size);
108
116 ErrorCode PeekBatch(void *data, size_t size);
117
124 ErrorCode Overwrite(const void *data);
125
129 void Reset();
130
135 [[nodiscard]] size_t Size() const;
136
141 [[nodiscard]] size_t EmptySize() const;
142
143 BaseQueue(const BaseQueue &) = delete;
144 BaseQueue &operator=(const BaseQueue &) = delete;
145 BaseQueue &operator=(BaseQueue &) = delete;
146 BaseQueue &operator=(const BaseQueue &&) = delete;
147 BaseQueue &operator=(BaseQueue &&) = delete;
148
149 uint8_t *queue_array_;
150 const uint16_t ELEMENT_SIZE;
151 size_t head_ = 0;
152 size_t tail_ = 0;
153 bool is_full_ = false;
154 size_t length_;
155 bool own_buffer_ = false;
156};
157
169template <typename Data>
170class Queue : public BaseQueue
171{
172 public:
178 Queue(size_t length) : BaseQueue(sizeof(Data), length) {}
179
186 Queue(size_t length, uint8_t *buffer) : BaseQueue(sizeof(Data), length, buffer) {}
187
202 Data &operator[](int32_t index)
203 {
204 if (index >= 0)
205 {
206 index = (head_ + index) % length_;
207 }
208 else
209 {
210 index = (tail_ + index + length_) % length_;
211 }
212
213 return *reinterpret_cast<Data *>(&queue_array_[index * ELEMENT_SIZE]);
214 }
215
224 ErrorCode Push(const Data &data) { return BaseQueue::Push(&data); }
225
234 ErrorCode Pop(Data &data) { return BaseQueue::Pop(&data); }
235
243 ErrorCode Pop() { return BaseQueue::Pop(); }
244
253 ErrorCode Peek(Data &data) { return BaseQueue::Peek(&data); }
254
264 ErrorCode PushBatch(const Data *data, size_t size)
265 {
266 return BaseQueue::PushBatch(data, size);
267 }
268
279 ErrorCode PopBatch(Data *data, size_t size) { return BaseQueue::PopBatch(data, size); }
280
291 ErrorCode PeekBatch(Data *data, size_t size)
292 {
293 return BaseQueue::PeekBatch(data, size);
294 }
295
303 ErrorCode Overwrite(const Data &data) { return BaseQueue::Overwrite(&data); }
304};
305
306} // namespace LibXR
基础队列类,提供固定大小的循环缓冲区 (Base queue class providing a fixed-size circular buffer).
Definition queue.hpp:20
bool is_full_
队列是否已满 (Indicates if the queue is full).
Definition queue.hpp:153
size_t tail_
尾部索引 (Tail index).
Definition queue.hpp:152
ErrorCode Peek(void *data)
获取队列头部的元素但不移除 (Peek at the front element without removing it).
Definition queue.cpp:54
size_t head_
头部索引 (Head index).
Definition queue.hpp:151
size_t length_
队列最大容量 (Maximum queue capacity).
Definition queue.hpp:154
ErrorCode Overwrite(const void *data)
覆盖队列中的数据 (Overwrite the queue with new data).
Definition queue.cpp:186
ErrorCode PeekBatch(void *data, size_t size)
批量获取多个元素但不移除 (Peek at multiple elements without removing them).
Definition queue.cpp:161
void * operator[](uint32_t index)
访问指定索引的元素 (Access an element at a specified index).
Definition queue.cpp:29
ErrorCode PushBatch(const void *data, size_t size)
批量推入多个元素 (Push multiple elements into the queue).
Definition queue.cpp:103
size_t Size() const
获取队列中的元素个数 (Get the number of elements in the queue).
Definition queue.cpp:210
BaseQueue(uint16_t element_size, size_t length, uint8_t *buffer)
构造函数,初始化队列 (Constructor to initialize the queue).
Definition queue.cpp:5
bool own_buffer_
是否由队列自己管理缓冲区 (Owns buffer memory).
Definition queue.hpp:155
~BaseQueue()
析构函数,释放队列内存 (Destructor to free queue memory).
Definition queue.cpp:21
int GetFirstElementIndex() const
获取队列中第一个元素的索引 (Get the index of the first element in the queue).
Definition queue.cpp:94
ErrorCode Push(const void *data)
向队列中添加一个元素 (Push an element into the queue).
Definition queue.cpp:34
ErrorCode Pop(void *data=nullptr)
移除队列头部的元素 (Pop the front element from the queue).
Definition queue.cpp:69
void Reset()
重置队列,清空所有数据 (Reset the queue and clear all data).
Definition queue.cpp:204
size_t EmptySize() const
获取队列的空闲空间 (Get the available space in the queue).
Definition queue.cpp:226
ErrorCode PopBatch(void *data, size_t size)
批量移除多个元素 (Pop multiple elements from the queue).
Definition queue.cpp:132
int GetLastElementIndex() const
获取队列中最后一个元素的索引 (Get the index of the last element in the queue).
Definition queue.cpp:85
uint8_t * queue_array_
存储队列数据的数组 (Array storing queue data).
Definition queue.hpp:149
const uint16_t ELEMENT_SIZE
每个元素的大小 (Size of each element).
Definition queue.hpp:150
基于 BaseQueue 的泛型队列模板类 (Generic queue template class based on BaseQueue).
Definition queue.hpp:171
ErrorCode PopBatch(Data *data, size_t size)
批量移除多个元素,并获取数据 (Pop multiple elements from the queue and retrieve data).
Definition queue.hpp:279
Queue(size_t length, uint8_t *buffer)
构造函数,初始化队列 (Constructor to initialize the queue).
Definition queue.hpp:186
ErrorCode PeekBatch(Data *data, size_t size)
批量查看多个元素但不移除 (Peek at multiple elements without removing them).
Definition queue.hpp:291
ErrorCode PushBatch(const Data *data, size_t size)
批量推入多个元素 (Push multiple elements into the queue).
Definition queue.hpp:264
ErrorCode Peek(Data &data)
查看队列头部的元素但不移除 (Peek at the front element without removing it).
Definition queue.hpp:253
ErrorCode Overwrite(const Data &data)
覆盖队列中的数据 (Overwrite the queue with new data).
Definition queue.hpp:303
ErrorCode Pop()
仅从队列中移除头部元素,不获取数据 (Remove the front element from the queue without retrieving data).
Definition queue.hpp:243
Queue(size_t length)
构造函数,初始化队列 (Constructor to initialize the queue).
Definition queue.hpp:178
ErrorCode Pop(Data &data)
从队列中移除头部元素,并获取该元素的数据 (Remove the front element from the queue and retrieve its data).
Definition queue.hpp:234
Data & operator[](int32_t index)
访问队列中的元素 (Access an element in the queue).
Definition queue.hpp:202
ErrorCode Push(const Data &data)
向队列中添加一个元素 (Push an element into the queue).
Definition queue.hpp:224
LibXR 命名空间
Definition ch32_gpio.hpp:9