libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
list.hpp
1#pragma once
2
3#include <utility>
4
5#include "libxr_assert.hpp"
6#include "libxr_def.hpp"
7#include "mutex.hpp"
8
9namespace LibXR
10{
11
22class List
23{
24 public:
30 {
31 public:
39 BaseNode(size_t size);
40
45 ~BaseNode();
46
47 BaseNode* next_ = nullptr;
48 size_t size_;
49 };
50
58 template <typename Data>
59 class Node : public BaseNode
60 {
61 public:
66 Node() : BaseNode(sizeof(Data)) {}
67
75 explicit Node(const Data& data) : BaseNode(sizeof(Data)), data_(data) {}
76
82 template <typename... Args>
83 explicit Node(Args&&... args)
84 : BaseNode(sizeof(Data)), data_{std::forward<Args>(args)...}
85 {
86 }
87
97 Node& operator=(const Data& data)
98 {
99 data_ = data;
100 return *this;
101 }
102
107 Data* operator->() noexcept { return &data_; }
108 const Data* operator->() const noexcept { return &data_; }
109 Data& operator*() noexcept { return data_; }
110 operator Data&() noexcept { return data_; }
111
112 Data data_;
113 };
114
119 List() noexcept;
120
125 ~List();
126
134 void Add(BaseNode& data);
135
143 uint32_t Size() noexcept;
144
154 ErrorCode Delete(BaseNode& data) noexcept;
155
171 template <typename Data, typename Func, SizeLimitMode LimitMode = SizeLimitMode::MORE>
172 ErrorCode Foreach(Func func)
173 {
174 mutex_.Lock();
175 for (auto pos = head_.next_; pos != &head_; pos = pos->next_)
176 {
177 Assert::SizeLimitCheck<LimitMode>(sizeof(Data), pos->size_);
178 if (auto res = func(static_cast<Node<Data>*>(pos)->data_); res != ErrorCode::OK)
179 {
180 mutex_.Unlock();
181 return res;
182 }
183 }
184 mutex_.Unlock();
185 return ErrorCode::OK;
186 }
187
188 private:
191};
192
193} // namespace LibXR
链表基础节点,所有节点都继承自该类。 Base node for the linked list, serving as a parent for all nodes.
Definition list.hpp:30
BaseNode * next_
指向下一个节点的指针。 Pointer to the next node.
Definition list.hpp:47
~BaseNode()
析构函数,确保节点不会在列表中残留。 Destructor ensuring the node does not remain in the list.
Definition list.cpp:7
size_t size_
当前节点的数据大小(字节)。 Size of the current node (in bytes).
Definition list.hpp:48
BaseNode(size_t size)
构造 BaseNode 并设置节点大小。 Constructs a BaseNode and sets its size.
Definition list.cpp:5
数据节点模板,继承自 BaseNode,用于存储具体数据类型。 Template data node that inherits from BaseNode to store specific data...
Definition list.hpp:60
Data * operator->() noexcept
操作符重载,提供数据访问接口。 Operator overloads providing access to the data.
Definition list.hpp:107
Node & operator=(const Data &data)
赋值运算符重载,允许直接对节点赋值。 Overloaded assignment operator for assigning values to the node.
Definition list.hpp:97
Node(Args &&... args)
通过参数列表构造节点 (Constructor initializing a node using arguments list).
Definition list.hpp:83
Data data_
存储的数据。 The stored data.
Definition list.hpp:112
Node()
默认构造函数,初始化节点大小。 Default constructor initializing the node size.
Definition list.hpp:66
Node(const Data &data)
使用数据值构造 Node 节点。 Constructs a Node with the given data value.
Definition list.hpp:75
链表实现,用于存储和管理数据节点。 A linked list implementation for storing and managing data nodes.
Definition list.hpp:23
LibXR::Mutex mutex_
线程安全的互斥锁。 Thread-safe mutex.
Definition list.hpp:190
ErrorCode Delete(BaseNode &data) noexcept
从链表中删除指定的节点。 Deletes a specified node from the linked list.
Definition list.cpp:45
uint32_t Size() noexcept
获取链表中的节点数量。 Gets the number of nodes in the linked list.
Definition list.cpp:31
void Add(BaseNode &data)
向链表添加一个节点。 Adds a node to the linked list.
Definition list.cpp:23
List() noexcept
默认构造函数,初始化链表头节点。 Default constructor initializing the linked list head node.
Definition list.cpp:9
ErrorCode Foreach(Func func)
遍历链表中的每个节点,并应用回调函数。 Iterates over each node in the list and applies a callback function.
Definition list.hpp:172
BaseNode head_
链表头节点。 The head node of the list.
Definition list.hpp:189
互斥锁类,提供线程同步机制 (Mutex class providing thread synchronization mechanisms).
Definition mutex.hpp:18
ErrorCode Lock()
加锁,如果锁已被占用,则阻塞等待 (Lock the mutex, blocking if it is already locked).
Definition mutex.cpp:14
void Unlock()
解锁互斥锁 (Unlock the mutex).
Definition mutex.cpp:28
LibXR 命名空间
Definition ch32_gpio.hpp:9