NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
type.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_REFLECT_METATYPE_HPP__
2#define NEFORCE_CORE_REFLECT_METATYPE_HPP__
3
11
16NEFORCE_BEGIN_NAMESPACE__
17NEFORCE_BEGIN_REFLECT__
18
19class registry;
20
26
38class meta_type {
39public:
41
42private:
43 reflect::type_id type_id_;
44 string_view name_;
45 size_t size_;
46 constructor_func constructor_;
47 vector<meta_type*> base_types_;
48 vector<string> pending_base_names_;
51
52 void collect_properties(vector<pair<string, const meta_property*>>& result,
53 vector<reflect::type_id>* visited = nullptr) const {
54 vector<reflect::type_id> local_visited;
55 if (!visited) {
56 visited = &local_visited;
57 }
58
59 if (find(visited->begin(), visited->end(), type_id_) != visited->end()) {
60 return;
61 }
62 visited->push_back(type_id_);
63
64 for (const auto* base: base_types_) {
65 if (base) {
66 base->collect_properties(result, visited);
67 }
68 }
69
70 for (const auto& property: properties_) {
71 const auto& name = property.first;
72 const auto& prop = property.second;
73 result.emplace_back(name, prop.get());
74 }
75 }
76
77 void collect_functions(vector<pair<string, const meta_function*>>& result,
78 vector<reflect::type_id>* visited = nullptr) const {
79 vector<reflect::type_id> local_visited;
80 if (!visited) {
81 visited = &local_visited;
82 }
83
84 if (find(visited->begin(), visited->end(), type_id_) != visited->end()) {
85 return;
86 }
87 visited->push_back(type_id_);
88
89 for (const auto* base: base_types_) {
90 if (base) {
91 base->collect_functions(result, visited);
92 }
93 }
94
95 for (const auto& f: functions_) {
96 const auto& name = f.first;
97 const auto& func = f.second;
98 result.emplace_back(name, func.get());
99 }
100 }
101
102public:
109 meta_type(string_view name, reflect::type_id id, size_t size) :
110 type_id_(id),
111 name_(name),
112 size_(size) {}
113
117 NEFORCE_NODISCARD reflect::type_id type_id() const noexcept { return type_id_; }
118
122 NEFORCE_NODISCARD string_view name() const noexcept { return name_; }
123
127 NEFORCE_NODISCARD size_t size() const noexcept { return size_; }
128
132 NEFORCE_NODISCARD const vector<meta_type*>& base_types() const { return base_types_; }
133
140 if (base) {
141 base_types_.push_back(base);
142 }
143 return *this;
144 }
145
152 pending_base_names_.push_back(base_name);
153 return *this;
154 }
155
161 NEFORCE_NODISCARD bool is_derived_from(reflect::type_id base_id) const {
162 if (type_id_ == base_id) {
163 return true;
164 }
165 for (auto* base: base_types_) {
166 if (base && base->is_derived_from(base_id)) {
167 return true;
168 }
169 }
170 return false;
171 }
172
178 NEFORCE_NODISCARD bool is_derived_from(string_view base_name) const { return is_derived_from(base_name.to_hash()); }
179
188 meta_type& property(string_view name, reflect::type_id prop_type_id, meta_property::getter getter,
189 meta_property::setter setter) {
190 properties_.emplace(name, make_unique<meta_property>(name, prop_type_id, move(getter), move(setter)));
191 return *this;
192 }
193
201 const auto it = functions_.emplace(name, make_unique<meta_function>(name, move(invoker))).first;
202 return it->second.get();
203 }
204
211 constructor_ = move(ctor);
212 return *this;
213 }
214
220 NEFORCE_NODISCARD const meta_property* get_property(string_view name) const {
221 const auto it = properties_.find(string(name));
222 if (it != properties_.end()) {
223 return it->second.get();
224 }
225
226 for (const auto* base: base_types_) {
227 if (base) {
228 if (auto* prop = base->get_property(name)) {
229 return prop;
230 }
231 }
232 }
233 return nullptr;
234 }
235
241 NEFORCE_NODISCARD const meta_function* get_function(string_view name) const {
242 const auto it = functions_.find(string(name));
243 if (it != functions_.end()) {
244 return it->second.get();
245 }
246
247 for (const auto* base: base_types_) {
248 if (base) {
249 if (auto* func = base->get_function(name)) {
250 return func;
251 }
252 }
253 }
254 return nullptr;
255 }
256
261 NEFORCE_NODISCARD meta_any create() const { return constructor_ ? constructor_({}) : meta_any{}; }
262
268 NEFORCE_NODISCARD meta_any create(const vector<meta_any>& args) const {
269 return constructor_ ? constructor_(args) : meta_any{};
270 }
271
276 NEFORCE_NODISCARD const auto& properties() const { return properties_; }
277
282 NEFORCE_NODISCARD const auto& functions() const { return functions_; }
283
290 collect_properties(result);
291 return result;
292 }
293
300 collect_functions(result);
301 return result;
302 }
303
309
315};
316 // Reflection
318
319NEFORCE_END_REFLECT__
320NEFORCE_END_NAMESPACE__
321#endif // NEFORCE_CORE_REFLECT_METATYPE_HPP__
NEFORCE_NODISCARD constexpr size_t to_hash() const noexcept
计算哈希值
类型擦除容器
函数反射元数据类
function< meta_any(void *, const vector< meta_any > &)> invoker
函数调用器类型
属性反射元数据类
function< meta_any(void *)> getter
属性读取器类型
function< void(void *, const meta_any &)> setter
属性写入器类型
_NEFORCE function< meta_any(const vector< meta_any > &)> constructor_func
构造函数调用器类型
NEFORCE_NODISCARD meta_any create(const vector< meta_any > &args) const
创建对象(带参数)
meta_type & constructor(constructor_func ctor)
设置构造函数
meta_type(string_view name, reflect::type_id id, size_t size)
构造函数
NEFORCE_NODISCARD meta_any create() const
创建对象(无参构造)
NEFORCE_NODISCARD bool is_derived_from(string_view base_name) const
检查是否派生自指定类型
meta_type & base_type(string_view base_name)
添加基类(延迟解析)
void resolve_bases(registry *registry)
解析待解析的基类名称
NEFORCE_NODISCARD const auto & properties() const
获取属性映射
NEFORCE_NODISCARD size_t size() const noexcept
获取类型大小
meta_type & base_type(meta_type *base)
添加基类(已解析)
NEFORCE_NODISCARD const meta_property * get_property(string_view name) const
获取属性
NEFORCE_NODISCARD const meta_function * get_function(string_view name) const
获取函数
NEFORCE_NODISCARD bool is_derived_from(reflect::type_id base_id) const
检查是否派生自指定类型
meta_type & property(string_view name, reflect::type_id prop_type_id, meta_property::getter getter, meta_property::setter setter)
添加属性
NEFORCE_NODISCARD const auto & functions() const
获取函数映射
NEFORCE_NODISCARD const vector< meta_type * > & base_types() const
获取基类列表
meta_function * function(string_view name, meta_function::invoker invoker)
添加函数
NEFORCE_NODISCARD string_view name() const noexcept
获取类型名称
void resolve_bases_unlocked(registry *registry)
解析待解析的基类名称
NEFORCE_NODISCARD vector< pair< string, const meta_function * > > all_functions() const
获取所有函数
NEFORCE_NODISCARD reflect::type_id type_id() const noexcept
获取类型ID
NEFORCE_NODISCARD vector< pair< string, const meta_property * > > all_properties() const
获取所有属性
反射类型注册表
无序映射容器
动态大小数组容器
NEFORCE_CONSTEXPR20 void push_back(const T &value)
在末尾拷贝插入元素
NEFORCE_NODISCARD constexpr Iterator find(Iterator first, Iterator last, const T &value)
查找范围内第一个等于指定值的元素
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
NEFORCE_ALWAYS_INLINE_INLINE thread::id id() noexcept
获取当前线程标识符
NEFORCE_CONSTEXPR20 unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
属性反射元数据
函数反射元数据
字符串类型别名和实用函数
存储两个值的元组对
无序映射容器