NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
registry.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_REFLECT_REGISTRY_HPP__
2#define NEFORCE_CORE_REFLECT_REGISTRY_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15NEFORCE_BEGIN_REFLECT__
16
22
30class registry {
31private:
32 mutex mutex_;
34
35 registry() = default;
36
37public:
42 static registry& instance() {
43 static registry inst;
44 return inst;
45 }
46
55 template <typename T>
57 type_id id = name.to_hash();
58
59 lock<mutex> lk(mutex_);
60 auto it = types_.find(id);
61 if (it != types_.end()) {
62 return *it->second;
63 }
64
65 auto new_it = types_.emplace(id, make_unique<meta_type>(name, id, sizeof(T))).first;
66 return *new_it->second;
67 }
68
77 auto it = types_.find(name.to_hash());
78 return it != types_.end() ? it->second.get() : nullptr;
79 }
80
87 lock<mutex> lock(mutex_);
88 return find_unlocked(name);
89 }
90
97 lock<mutex> lock(mutex_);
98 auto it = types_.find(id);
99 return it != types_.end() ? it->second.get() : nullptr;
100 }
101
109 template <typename Func>
110 void for_each(Func&& func) {
111 lock<mutex> lock(mutex_);
112 for (auto& type: types_) {
113 func(*type.second);
114 }
115 }
116
124 lock<mutex> lk(mutex_);
125 for (auto& type: types_) {
126 type.second->resolve_bases_unlocked(this);
127 }
128 }
129};
130 // Reflection
132
134
136 for (auto& base_name: pending_base_names_) {
137 if (registry) {
138 auto* base = registry->find(base_name.view());
139 if (base) {
140 base_types_.push_back(base);
141 }
142 }
143 }
144 pending_base_names_.clear();
145}
146
148 for (auto& base_name: pending_base_names_) {
149 if (registry) {
150 auto* base = registry->find_unlocked(base_name.view());
151 if (base) {
152 base_types_.push_back(base);
153 }
154 }
155 }
156 pending_base_names_.clear();
157}
158
160
161NEFORCE_END_REFLECT__
162NEFORCE_END_NAMESPACE__
163#endif // NEFORCE_CORE_REFLECT_REGISTRY_HPP__
锁管理器模板
类型反射元数据类
void resolve_bases(registry *registry)
解析待解析的基类名称
void resolve_bases_unlocked(registry *registry)
解析待解析的基类名称
非递归互斥锁
反射类型注册表
void for_each(Func &&func)
遍历所有注册的类型
meta_type * find(string_view name)
查找类型
meta_type * find_unlocked(string_view name)
查找类型
meta_type & register_type(string_view name)
注册类型
meta_type * find(type_id id)
查找类型
void resolve_all_bases()
解析所有类型的基类关系
static registry & instance()
获取单例实例
无序映射容器
size_t type_id
类型标识符
basic_string_view< char > string_view
字符字符串视图
NEFORCE_ALWAYS_INLINE_INLINE bool name(char *buffer, size_t size)
获取当前线程名称
NEFORCE_CONSTEXPR20 unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
互斥锁
类型反射元数据