libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
app_framework.hpp
1#pragma once
2
3#include <cstring>
4#include <initializer_list>
5
6#include "libxr_def.hpp"
7#include "libxr_type.hpp"
8#include "lockfree_list.hpp"
9
10namespace LibXR
11{
16template <typename T>
17struct Entry
18{
19 T& object;
20 std::initializer_list<const char*> aliases;
21};
22
27{
28 public:
33 template <typename... Entries>
34 constexpr HardwareContainer(Entries&&... entries)
35 {
36 (Register(std::forward<Entries>(entries)), ...);
37 }
38
42 template <typename T>
43 T* Find(const char* alias) const
44 {
45 T* result = nullptr;
46 alias_list_.Foreach<AliasEntry>(
47 [&](AliasEntry& entry)
48 {
49 if (std::strcmp(entry.name, alias) == 0)
50 {
51 result = static_cast<T*>(entry.object);
52 return ErrorCode::FAILED;
53 }
54 return ErrorCode::OK;
55 });
56 return result;
57 }
58
62 template <typename T>
63 T* Find(const std::initializer_list<const char*> ALIASES) const
64 {
65 for (const auto& alias : ALIASES)
66 {
67 if (T* obj = Find<T>(alias))
68 {
69 return obj;
70 }
71 }
72 return nullptr;
73 }
74
78 template <typename T>
79 T* FindOrExit(std::initializer_list<const char*> aliases) const
80 {
81 T* result = Find<T>(aliases);
82 ASSERT(result != nullptr);
83 return result;
84 }
85
93 template <typename T>
94 void Register(const Entry<T>& entry)
95 {
96 for (const auto& alias : entry.aliases)
97 {
98 auto node = new (std::align_val_t(LIBXR_CACHE_LINE_SIZE))
99 LibXR::LockFreeList::Node<AliasEntry>{alias, static_cast<void*>(&entry.object),
101 alias_list_.Add(*node);
102 }
103 }
104
105 protected:
107 {
108 const char* name;
109 void* object;
110 TypeID::ID id;
111 };
112
113 mutable LibXR::LockFreeList alias_list_;
114};
115
121{
122 public:
123 virtual void OnMonitor() = 0;
124 virtual ~Application() = default;
125};
126
132{
133 public:
135
146 {
147 auto node = new (std::align_val_t(LIBXR_CACHE_LINE_SIZE))
149 app_list_.Add(*node);
150 }
151
157 {
159 [](Application* app)
160 {
161 app->OnMonitor();
162 return ErrorCode::OK;
163 });
164 }
165
172 size_t Size() { return app_list_.Size(); }
173};
174
175} // namespace LibXR
应用模块抽象类,需实现 OnMonitor 方法
virtual void OnMonitor()=0
周期性任务 / Periodic update
应用模块管理器
LibXR::LockFreeList app_list_
模块链表 / Module list
void MonitorAll()
调用所有模块的 OnMonitor
void Register(Application &app)
注册一个应用模块
size_t Size()
获取模块数量
T * FindOrExit(std::initializer_list< const char * > aliases) const
T * Find(const std::initializer_list< const char * > ALIASES) const
void Register(const Entry< T > &entry)
注册一个硬件条目
constexpr HardwareContainer(Entries &&... entries)
T * Find(const char *alias) const
数据节点模板,继承自 BaseNode,用于存储具体数据类型。 Template data node that inherits from BaseNode to store specific data...
链表实现,用于存储和管理数据节点。 A linked list implementation for storing and managing data nodes.
ErrorCode Foreach(Func func)
遍历链表中的每个节点,并应用回调函数。 Iterates over each node in the list and applies a callback function.
void Add(BaseNode &data)
向链表添加一个节点。 Adds a node to the linked list.
uint32_t Size() noexcept
获取链表中的节点数量。 Gets the number of nodes in the linked list.
static ID GetID()
获取类型的唯一标识符
LibXR 命名空间
T & object
设备对象 / Device object
std::initializer_list< const char * > aliases
别名列表 / Alias list