ShitEngine
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
载入中...
搜索中...
未找到
TypeRegistry.h
浏览该文件的文档.
1#pragma once
2
5
6#include <string_view>
7#include <functional>
8#include <deque>
9#include <unordered_map>
10#include <string>
11
12// ── P1-3: 类型名 demangle 依赖 ──────────────────────
13#if defined(__GNUC__) || defined(__clang__)
14#if __has_include(<cxxabi.h>)
15#include <cxxabi.h>
16#define SHIT_HAS_CXXABI 1
17#endif
18#endif
19
20namespace Shit {
21
22class TypeInfoBuilder;
23
25public:
28 void resolveBases();
29 bool unregisterType(std::string_view name);
31 void setRegistrationSource(std::string_view source);
33 size_t unregisterTypesBySource(std::string_view source);
34
35 [[nodiscard]] const TypeInfo* getType(std::string_view name) const;
36
38 [[nodiscard]] const TypeInfo* getType(std::type_index ti) const;
39
40 template<typename T>
41 [[nodiscard]] const TypeInfo* getType() const {
42 auto it = m_typeIndexMap.find(std::type_index(typeid(T)));
43 return it != m_typeIndexMap.end() ? it->second : nullptr;
44 }
45
46 void forEach(std::function<void(const TypeInfo&)> callback) const;
47 [[nodiscard]] size_t count() const { return m_typeStorage.size(); }
48
49 // ── 静态门面 ──
50
52
53 static void Register(TypeInfo info) { GetInstance().registerType(std::move(info)); }
54 static void InitBuiltinTypes() { GetInstance().initBuiltinTypes(); }
55 static void ResolveBases() { GetInstance().resolveBases(); }
56 static bool UnregisterType(std::string_view name) { return GetInstance().unregisterType(name); }
57 static void SetRegistrationSource(std::string_view source) { GetInstance().setRegistrationSource(source); }
58 static size_t UnregisterTypesBySource(std::string_view source) { return GetInstance().unregisterTypesBySource(source); }
59 static const TypeInfo* Get(std::string_view name) { return GetInstance().getType(name); }
60 static const TypeInfo* Get(std::type_index ti) { return GetInstance().getType(ti); }
61
62 template<typename T>
63 static const TypeInfo* Get() { return GetInstance().getType<T>(); }
64
65 static void ForEach(std::function<void(const TypeInfo&)> callback) { GetInstance().forEach(std::move(callback)); }
66 static size_t Count() { return GetInstance().count(); }
67
68 TypeRegistry(const TypeRegistry&) = delete;
72
73private:
74 friend class EngineContext;
75 TypeRegistry() = default;
76 ~TypeRegistry() = default;
77
78 friend class TypeInfoBuilder;
79
80 // deque 保证元素地址稳定(push_back/emplace_back 不失效指向元素的指针)
81 std::deque<TypeInfo> m_typeStorage;
82 std::unordered_map<std::string, TypeInfo*> m_nameMap;
83 std::unordered_map<std::type_index, const TypeInfo*> m_typeIndexMap;
84 std::string m_currentSource;
85};
86
87// ── P1-3: 类型名 demangle ────────────────────────────
88// GCC/MinGW: abi::__cxa_demangle, MSVC: typeid 直接可读
89inline std::string DemangleTypeName(const char* mangled) {
90#if defined(SHIT_HAS_CXXABI)
91 int status = 0;
92 char* demangled = abi::__cxa_demangle(mangled, nullptr, nullptr, &status);
93 if (status == 0 && demangled) {
94 std::string result(demangled);
95 ::free(demangled);
96 return result;
97 }
98#endif
99 // MSVC 或 demangle 失败:直接返回原名
100 return std::string(mangled);
101}
102
106template<typename T, typename M>
107inline size_t memberOffset(M T::*member) {
108 return reinterpret_cast<size_t>(&(static_cast<T*>(nullptr)->*member));
109}
110
111class SHIT_API TypeInfoBuilder {
112public:
113 TypeInfoBuilder& Base(const TypeInfo* baseType) {
114 m_info.baseType = baseType;
115 return *this;
116 }
117
120 TypeInfoBuilder& Base(const char* name) {
121 m_info.baseTypeName = name ? name : "";
122 return *this;
123 }
124
125 template<typename T>
126 TypeInfoBuilder& Base() {
127 m_info.baseType = TypeRegistry::Get<T>();
128 return *this;
129 }
130
131 // 原始 Field 注册(offset + size)
132 TypeInfoBuilder& Field(const char* name, size_t offset, size_t size, const char* typeName) {
133 m_info.fields.push_back({name, offset, size, typeName});
134 return *this;
135 }
136
137 // ── P1-3: 成员指针重载(自动推导 offset + size + typeName)──
138 template<typename T, typename M>
139 TypeInfoBuilder& Field(const char* name, M T::*member) {
140 m_info.fields.push_back({
141 name,
142 memberOffset(member),
143 sizeof(M),
144 DemangleTypeName(typeid(M).name())
145 });
146 return *this;
147 }
148
149 template<typename T, typename M>
150 TypeInfoBuilder& Field(const char* name, M T::*member, const char* typeName) {
151 m_info.fields.push_back({
152 name,
153 memberOffset(member),
154 sizeof(M),
155 typeName
156 });
157 return *this;
158 }
159
160 // ── P2: 字段元数据(编辑器属性显示用)───────────
161 TypeInfoBuilder& Meta(const FieldMeta& meta) {
162 if (!m_info.fields.empty()) {
163 m_info.fields.back().meta.push_back(meta);
164 }
165 return *this;
166 }
167
168 // ── P3: 枚举常量 ──────────────────────────────────
169 TypeInfoBuilder& Value(const char* name, int64_t val) {
170 m_info.enumValues.push_back({name, val});
171 return *this;
172 }
173
174 // ── P1-2: 工厂注册 ─────────────────────────────────
175 template<typename T>
176 TypeInfoBuilder& Factory() {
177 m_info.factory = makeFactory<T>(std::is_abstract<T>{});
178 return *this;
179 }
180
181 template<typename T>
182 void Register() {
183 m_info.typeIndex = std::type_index(typeid(T));
184
185 // 尝试立即解析 baseTypeName(若已注册则直接链接,未注册时留待 ResolveBases 处理)
186 if (!m_info.baseType && !m_info.baseTypeName.empty()) {
187 auto* resolved = TypeRegistry::Get(m_info.baseTypeName.c_str());
188 if (resolved) {
189 m_info.baseType = resolved;
190 }
191 }
192
193 TypeRegistry::Register(std::move(m_info));
194 }
195
196private:
197 friend TypeInfoBuilder ReflectType(const char* name, size_t size);
198
199 explicit TypeInfoBuilder(const char* name, size_t size)
200 : m_info{name, size, nullptr, {}, {}, {}, typeid(nullptr)} {}
201
202 // ── Factory SFINAE 辅助:抽象类型跳过 factory ──
203 template<typename T>
204 static std::function<void*(void*)> makeFactory(std::false_type /* not abstract */) {
205 return [](void* mem) -> void* {
206 if (mem) return ::new(mem) T();
207 return new T();
208 };
209 }
210
211 template<typename T>
212 static std::function<void*(void*)> makeFactory(std::true_type /* abstract */) {
213 return nullptr;
214 }
215
216 TypeInfo m_info;
217};
218
219inline TypeInfoBuilder ReflectType(const char* name, size_t size) {
220 return TypeInfoBuilder(name, size);
221}
222
223} // namespace Shit
#define SHIT_API
定义 Core.h:14
定义 TypeRegistry.h:111
TypeInfoBuilder & Field(const char *name, size_t offset, size_t size, const char *typeName)
定义 TypeRegistry.h:132
friend TypeInfoBuilder ReflectType(const char *name, size_t size)
定义 TypeRegistry.h:219
TypeInfoBuilder & Base(const char *name)
按名称指定基类(延迟解析,消除 SIOF) Register() 时尝试解析,ResolveBases() 时再次尝试
定义 TypeRegistry.h:120
TypeInfoBuilder & Factory()
定义 TypeRegistry.h:176
TypeInfoBuilder & Base()
定义 TypeRegistry.h:126
TypeInfoBuilder & Field(const char *name, M T::*member)
定义 TypeRegistry.h:139
void Register()
定义 TypeRegistry.h:182
TypeInfoBuilder & Base(const TypeInfo *baseType)
定义 TypeRegistry.h:113
TypeInfoBuilder & Meta(const FieldMeta &meta)
定义 TypeRegistry.h:161
TypeInfoBuilder & Field(const char *name, M T::*member, const char *typeName)
定义 TypeRegistry.h:150
TypeInfoBuilder & Value(const char *name, int64_t val)
定义 TypeRegistry.h:169
void resolveBases()
解析所有未解析的基类引用(消除 SIOF)
static size_t Count()
定义 TypeRegistry.h:66
static const TypeInfo * Get(std::string_view name)
定义 TypeRegistry.h:59
friend class TypeInfoBuilder
定义 TypeRegistry.h:78
TypeRegistry & operator=(const TypeRegistry &)=delete
static void SetRegistrationSource(std::string_view source)
定义 TypeRegistry.h:57
static void Register(TypeInfo info)
定义 TypeRegistry.h:53
const TypeInfo * getType(std::string_view name) const
static const TypeInfo * Get(std::type_index ti)
定义 TypeRegistry.h:60
TypeRegistry & operator=(TypeRegistry &&)=delete
size_t count() const
定义 TypeRegistry.h:47
bool unregisterType(std::string_view name)
按名称卸载类型
static bool UnregisterType(std::string_view name)
定义 TypeRegistry.h:56
TypeRegistry(const TypeRegistry &)=delete
void setRegistrationSource(std::string_view source)
设置后续注册类型的来源标记(空 = 引擎内置,插件注册前设为插件名)
static void ForEach(std::function< void(const TypeInfo &)> callback)
定义 TypeRegistry.h:65
static const TypeInfo * Get()
定义 TypeRegistry.h:63
static void InitBuiltinTypes()
定义 TypeRegistry.h:54
void registerType(TypeInfo info)
TypeRegistry(TypeRegistry &&)=delete
static void ResolveBases()
定义 TypeRegistry.h:55
void forEach(std::function< void(const TypeInfo &)> callback) const
static size_t UnregisterTypesBySource(std::string_view source)
定义 TypeRegistry.h:58
static TypeRegistry & GetInstance()
friend class EngineContext
定义 TypeRegistry.h:74
const TypeInfo * getType() const
定义 TypeRegistry.h:41
const TypeInfo * getType(std::type_index ti) const
按 type_index 查询(Prefab 动态克隆等场景用)
size_t unregisterTypesBySource(std::string_view source)
卸载指定来源注册的全部类型(插件卸载前调用,防止 factory 悬垂)
定义 AudioPlayer.h:10
TypeInfoBuilder ReflectType(const char *name, size_t size)
定义 TypeRegistry.h:219
@ M
定义 KeyCode.h:24
@ T
定义 KeyCode.h:31
size_t memberOffset(M T::*member)
计算成员指针相对于类基址的偏移量(供反射注册代码使用) 用法: memberOffset(&MyClass::myField) 需要通过 friend 声明获取 private/protected 成员...
定义 TypeRegistry.h:107
std::string DemangleTypeName(const char *mangled)
定义 TypeRegistry.h:89
定义 TypeInfo.h:17
定义 TypeInfo.h:64