9#include <unordered_map>
13#if defined(__GNUC__) || defined(__clang__)
14#if __has_include(<cxxabi.h>)
16#define SHIT_HAS_CXXABI 1
42 auto it = m_typeIndexMap.find(std::type_index(
typeid(
T)));
43 return it != m_typeIndexMap.end() ? it->second :
nullptr;
47 [[nodiscard]]
size_t count()
const {
return m_typeStorage.size(); }
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;
90#if defined(SHIT_HAS_CXXABI)
92 char* demangled = abi::__cxa_demangle(mangled,
nullptr,
nullptr, &status);
93 if (status == 0 && demangled) {
94 std::string result(demangled);
100 return std::string(mangled);
106template<
typename T,
typename M>
108 return reinterpret_cast<size_t>(&(
static_cast<T*
>(
nullptr)->*member));
114 m_info.baseType = baseType;
120 TypeInfoBuilder&
Base(
const char* name) {
121 m_info.baseTypeName = name ? name :
"";
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});
138 template<
typename T,
typename M>
139 TypeInfoBuilder&
Field(
const char* name, M T::*member) {
140 m_info.fields.push_back({
149 template<
typename T,
typename M>
150 TypeInfoBuilder&
Field(
const char* name, M T::*member,
const char* typeName) {
151 m_info.fields.push_back({
162 if (!m_info.fields.empty()) {
163 m_info.fields.back().meta.push_back(meta);
169 TypeInfoBuilder&
Value(
const char* name, int64_t val) {
170 m_info.enumValues.push_back({name, val});
177 m_info.factory = makeFactory<T>(std::is_abstract<T>{});
183 m_info.typeIndex = std::type_index(
typeid(
T));
186 if (!m_info.baseType && !m_info.baseTypeName.empty()) {
189 m_info.baseType = resolved;
200 : m_info{name, size, nullptr, {}, {}, {},
typeid(
nullptr)} {}
204 static std::function<
void*(
void*)> makeFactory(std::false_type ) {
205 return [](
void* mem) ->
void* {
206 if (mem) return ::new(mem)
T();
212 static std::function<
void*(
void*)> makeFactory(std::true_type ) {
219inline TypeInfoBuilder
ReflectType(
const char* name,
size_t size) {
220 return TypeInfoBuilder(name, size);
#define SHIT_API
定义 Core.h:14
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 悬垂)
TypeInfoBuilder ReflectType(const char *name, size_t size)
定义 TypeRegistry.h:219
size_t memberOffset(M T::*member)
计算成员指针相对于类基址的偏移量(供反射注册代码使用) 用法: memberOffset(&MyClass::myField) 需要通过 friend 声明获取 private/protected 成员...
定义 TypeRegistry.h:107
std::string DemangleTypeName(const char *mangled)
定义 TypeRegistry.h:89