🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
RTTIAPI.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstUtil/SharedPtr.hpp"
25#include "AstUtil/Object.hpp"
26#include "AstUtil/StringView.hpp"
27#include <map>
28
29AST_NAMESPACE_BEGIN
30
36// -----------
37// 类型元信息
38// -----------
39
40
44AST_UTIL_CAPI void aGetAllClassNames(std::vector<std::string>& names);
45
49AST_UTIL_API const std::unordered_map<std::string, Class*>& aGetAllClasses();
50
55AST_UTIL_CAPI Class* aGetClass(StringView name);
56
60AST_UTIL_CAPI bool aIsVirtualClass(StringView name);
61
66AST_UTIL_CAPI void aRegisterClass(Class* cls, StringView name=StringView());
67
72AST_UTIL_API Object* aGetClassDefaultObject(StringView name);
73
78AST_UTIL_API Object* aGetClassDefaultObject(Class* cls);
79
86AST_UTIL_CAPI Object* aNewObject(StringView typeName, Object* parentScope=nullptr);
87
88
93template<typename T>
94T* aNewObject(Object* parentScope=nullptr)
95{
96 T* obj = new T();
97 aSetParentScope(obj, parentScope);
98 return obj;
99}
100
105AST_UTIL_CAPI void aDeleteObject(Object* obj);
106
112AST_UTIL_API SharedPtr<Object> aMakeObject(StringView name, Object* parentScope=nullptr);
113
114
115
122AST_UTIL_API Object* aResolveObject(StringView value, Class* cls = nullptr);
123
124
125template<typename T>
126T aResolveObject(StringView value)
127{
128 using ObjectType = typename std::decay<typename std::remove_pointer<T>::type>::type;
129 static_assert(has_own_getType<ObjectType>::value, "aResolveObject requires the type to has a AST_OBJECT macro");
130 return static_cast<T>(aResolveObject(value, ObjectType::StaticType()));
131}
132
133// -----------
134// 对象管理
135// -----------
136
141AST_UTIL_CAPI Object* aGetObject(uint32_t id);
142
146// AST_UTIL_CAPI uint32_t aGetObjectID(Object* obj);
147
154AST_UTIL_CAPI uint32_t aAddObject(Object* object);
155
156
161AST_UTIL_CAPI errc_t aRemoveObject(Object* object);
162
166AST_UTIL_CAPI void aRemoveAllObjects();
167
171AST_UTIL_CAPI int aGetObjectCount();
172
173
179AST_UTIL_API std::vector<Object*> aFindObjects(Class* cls, StringView name=StringView());
180
181
187AST_UTIL_API Object* aFindObject(Class* cls, StringView name=StringView());
188
189template<typename T>
190T aFindObject(StringView name=StringView())
191{
192 // @todo: 这里逻辑和aobject_cast<T>的重复了,考虑怎么重构
193 using ObjectType = typename std::decay<typename std::remove_pointer<T>::type>::type;
194 static_assert(has_own_getType<ObjectType>::value, "aFindObject requires the type to has a AST_OBJECT macro");
195 return static_cast<T>(aFindObject(ObjectType::StaticType(), name));
196}
197
202AST_UTIL_CAPI errc_t aSetParentScope(Object* obj, Object* parentScope);
203
204
208AST_UTIL_CAPI Object* aGetParentScope(Object* obj);
209
210
215AST_UTIL_CAPI Object* aGetAncestorScope(Object* obj, Class* cls);
216
217template<typename T>
218T aGetAncestorScope(Object* obj)
219{
220 // @todo: 这里逻辑和aobject_cast<T>的重复了,考虑怎么重构
221 using ObjectType = typename std::decay<typename std::remove_pointer<T>::type>::type;
222 static_assert(has_own_getType<ObjectType>::value, "aGetAncestorScope requires the type to has a AST_OBJECT macro");
223 return static_cast<T>(aGetAncestorScope(obj, ObjectType::StaticType()));
224}
225
229AST_UTIL_API std::vector<Object*> aGetAllObjects();
230
231
235AST_UTIL_API void aPrintAllObjects();
236
237
244AST_UTIL_API Object* aFindChild(Object* parentScope, Class* cls=nullptr, StringView name=StringView());
245
246
247template<typename T>
248T aFindChild(Object* parentScope, StringView name=StringView())
249{
250 // @todo: 这里逻辑和aobject_cast<T>的重复了,考虑怎么重构
251 using ObjectType = typename std::decay<typename std::remove_pointer<T>::type>::type;
252 static_assert(has_own_getType<ObjectType>::value, "aFindChild requires the type to has a AST_OBJECT macro");
253 return static_cast<T>(aFindChild(parentScope, ObjectType::StaticType(), name));
254}
255
263AST_UTIL_API errc_t aFindChildren(Object* parentScope, Class* cls, StringView name, std::vector<Object*>& children);
264
265
272AST_UTIL_API std::vector<Object*> aFindChildren(Object* parentScope, Class* cls=nullptr, StringView name=StringView());
273
276 bool printRefCount = false;
277 bool printWeakRefCount = false;
278};
279
280
286AST_UTIL_API void aPrintObject(Object* obj, int indent=0, const ObjectPrintConfig& config = ObjectPrintConfig());
287
288
294AST_UTIL_API void aPrintObjectTree(Object* root, int indent=0);
295AST_UTIL_API void aPrintObjectTree(Object* root, int indent, const ObjectPrintConfig& config);
296
299AST_NAMESPACE_END
对象基类,继承自该类的对象可以使用运行时类型信息相关功能,实现强弱引用计数、运行时元信息(属性访问、序列化等)等基础功能
定义 Object.hpp:86
bool aIsVirtualClass(StringView name)
检查类是否为虚类
定义 RTTIAPI.cpp:49
Object * aFindChild(Object *parentScope, Class *cls, StringView name)
查找对象的子对象
定义 RTTIAPI.cpp:240
Object * aFindObject(Class *cls, StringView name)
查找对象
定义 RTTIAPI.cpp:206
Object * aGetParentScope(Object *obj)
获取对象的父作用域
定义 RTTIAPI.cpp:216
void aPrintObject(Object *obj, int indent, const ObjectPrintConfig &config)
打印对象信息
定义 RTTIAPI.cpp:355
errc_t aRemoveObject(Object *object)
移除对象
定义 RTTIAPI.cpp:185
uint32_t aAddObject(Object *object)
获取对象的索引/对象ID
定义 RTTIAPI.cpp:180
Class * aGetClass(StringView name)
获取类的元数据
定义 RTTIAPI.cpp:44
Object * aNewObject(StringView name, Object *parentScope)
创建对象,返回裸指针
定义 RTTIAPI.cpp:75
int aGetObjectCount()
获取对象管理器中已添加的对象数量
定义 RTTIAPI.cpp:195
Object * aGetObject(uint32_t id)
根据索引获取对象
定义 RTTIAPI.cpp:175
void aRegisterClass(Class *cls, StringView name)
注册类
定义 RTTIAPI.cpp:55
Object * aGetAncestorScope(Object *obj, Class *cls)
获取对象的祖先作用域
定义 RTTIAPI.cpp:221
const std::unordered_map< std::string, Class * > & aGetAllClasses()
获取所有已注册的类
定义 RTTIAPI.cpp:39
errc_t aSetParentScope(Object *obj, Object *parentScope)
设置对象的父作用域
定义 RTTIAPI.cpp:211
errc_t aFindChildren(Object *parentScope, Class *cls, StringView name, std::vector< Object * > &children)
查找对象的子对象
定义 RTTIAPI.cpp:292
void aGetAllClassNames(std::vector< std::string > &names)
获取所有已注册的类名
定义 RTTIAPI.cpp:34
Object * aGetClassDefaultObject(StringView name)
根据类名获取类的默认对象(CDO)
定义 RTTIAPI.cpp:62
void aPrintAllObjects()
打印所有对象
定义 RTTIAPI.cpp:231
std::vector< Object * > aGetAllObjects()
获取所有对象
定义 RTTIAPI.cpp:226
void aRemoveAllObjects()
移除所有对象
定义 RTTIAPI.cpp:190
void aPrintObjectTree(Object *root, int indent)
打印对象树的结构
定义 RTTIAPI.cpp:386
std::string aFindObjects(const JsonValue &arguments)
查找对象
打印对象树的配置结构体
定义 RTTIAPI.hpp:275