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);
170 TypeInfoBuilder&
Ref(
const char* refType) {
171 if (!m_info.fields.empty() && refType) {
172 m_info.fields.back().refType = refType;
178 TypeInfoBuilder&
Value(
const char* name, int64_t val) {
179 m_info.enumValues.push_back({name, val});
184 TypeInfoBuilder&
Method(
const char* name,
const char* returnType,
185 std::function<
void*(
void*,
const void**)> invoker,
186 std::vector<std::string> paramTypes = {}) {
189 mi.
returnType = returnType ? returnType :
"void";
191 mi.
invoker = std::move(invoker);
192 m_info.methods.push_back(std::move(mi));
197 if (!m_info.methods.empty()) {
198 m_info.methods.back().meta.push_back(meta);
204 TypeInfoBuilder&
Property(
const char* name,
const char* typeName,
205 std::function<
void*(
void*)> getter,
206 std::function<
void(
void*,
const void*)> setter) {
209 pi.
typeName = typeName ? typeName :
"";
210 pi.
getter = std::move(getter);
211 pi.
setter = std::move(setter);
212 m_info.properties.push_back(std::move(pi));
217 if (!m_info.properties.empty()) {
218 m_info.properties.back().meta.push_back(meta);
226 m_info.factory = makeFactory<T>(std::is_abstract<T>{});
232 m_info.typeIndex = std::type_index(
typeid(
T));
235 if (!m_info.baseType && !m_info.baseTypeName.empty()) {
238 m_info.baseType = resolved;
249 : m_info{name, size, nullptr, {}, {}, {}, {}, {},
typeid(
nullptr)} {}
253 static std::function<
void*(
void*)> makeFactory(std::false_type ) {
254 return [](
void* mem) ->
void* {
255 if (mem) return ::new(mem)
T();
261 static std::function<
void*(
void*)> makeFactory(std::true_type ) {
268inline TypeInfoBuilder
ReflectType(
const char* name,
size_t size) {
269 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:268
TypeInfoBuilder & Base(const char *name)
按名称指定基类(延迟解析,消除 SIOF) Register() 时尝试解析,ResolveBases() 时再次尝试
定义 TypeRegistry.h:120
TypeInfoBuilder & Factory()
定义 TypeRegistry.h:225
TypeInfoBuilder & Base()
定义 TypeRegistry.h:126
TypeInfoBuilder & Field(const char *name, M T::*member)
定义 TypeRegistry.h:139
void Register()
定义 TypeRegistry.h:231
TypeInfoBuilder & Property(const char *name, const char *typeName, std::function< void *(void *)> getter, std::function< void(void *, const void *)> setter)
定义 TypeRegistry.h:204
TypeInfoBuilder & Base(const TypeInfo *baseType)
定义 TypeRegistry.h:113
TypeInfoBuilder & MethodMeta(const FieldMeta &meta)
定义 TypeRegistry.h:196
TypeInfoBuilder & Meta(const FieldMeta &meta)
定义 TypeRegistry.h:161
TypeInfoBuilder & Field(const char *name, M T::*member, const char *typeName)
定义 TypeRegistry.h:150
TypeInfoBuilder & PropertyMeta(const FieldMeta &meta)
定义 TypeRegistry.h:216
TypeInfoBuilder & Value(const char *name, int64_t val)
定义 TypeRegistry.h:178
TypeInfoBuilder & Method(const char *name, const char *returnType, std::function< void *(void *, const void **)> invoker, std::vector< std::string > paramTypes={})
定义 TypeRegistry.h:184
TypeInfoBuilder & Ref(const char *refType)
定义 TypeRegistry.h:170
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:268
size_t memberOffset(M T::*member)
计算成员指针相对于类基址的偏移量(供反射注册代码使用) 用法: memberOffset(&MyClass::myField) 需要通过 friend 声明获取 private/protected 成员...
定义 TypeRegistry.h:107
std::string DemangleTypeName(const char *mangled)
定义 TypeRegistry.h:89
方法信息(由 SHIT_METHOD 生成)
定义 TypeInfo.h:73
std::string name
方法名
定义 TypeInfo.h:74
std::string returnType
返回类型名
定义 TypeInfo.h:75
std::vector< std::string > paramTypes
参数类型名列表
定义 TypeInfo.h:76
std::function< void *(void *, const void **)> invoker
调用器:(obj, args) -> returnValue obj = 对象指针,args = 参数指针数组,返回值通过 void* 返回
定义 TypeInfo.h:79
属性信息(由 SHIT_PROPERTY 生成,getter/setter 对)
定义 TypeInfo.h:84
std::string typeName
属性类型名
定义 TypeInfo.h:86
std::string name
属性名
定义 TypeInfo.h:85
std::function< void(void *, const void *)> setter
setter 调用器:(obj, value) 写入值
定义 TypeInfo.h:92
std::function< void *(void *)> getter
getter 调用器:(obj) -> 指向值的指针(静态/线程局部存储)
定义 TypeInfo.h:90