refactor(templates): make FTypeInfo behave more like std::type_info and optimize TAny

This commit is contained in:
2022-04-05 17:00:33 +08:00
parent 2a3a5aec35
commit a539f70535
4 changed files with 60 additions and 65 deletions

View File

@ -11,31 +11,24 @@ NAMESPACE_MODULE_BEGIN(Utility)
struct FTypeInfo
{
constexpr FTypeInfo() : FTypeInfo(typeid(void)) { }
FTypeInfo() = delete;
FTypeInfo(FTypeInfo&&) = delete;
FTypeInfo(const FTypeInfo&) = delete;
FTypeInfo& operator=(FTypeInfo&&) = delete;
FTypeInfo& operator=(const FTypeInfo&) = delete;
constexpr FTypeInfo(FInvalid) : FTypeInfo() { }
constexpr FTypeInfo(const std::type_info& InTypeInfo) : Ptr(&InTypeInfo) { }
size_t GetTypeHash() const { return Ptr->hash_code(); }
const char* GetName() const { return Ptr->name(); }
FORCEINLINE size_t GetTypeHash() const { return reinterpret_cast<const std::type_info*>(this)->hash_code(); }
FORCEINLINE const char* GetName() const { return reinterpret_cast<const std::type_info*>(this)->name(); }
private:
const std::type_info* Ptr;
friend FORCEINLINE bool operator==(const FTypeInfo& LHS, const FTypeInfo& RHS) { return &LHS != &RHS ? *reinterpret_cast<const std::type_info*>(&LHS) == *reinterpret_cast<const std::type_info*>(&RHS) : true; }
friend FORCEINLINE bool operator< (const FTypeInfo& LHS, const FTypeInfo& RHS) { return reinterpret_cast<const std::type_info*>(&LHS)->before(*reinterpret_cast<const std::type_info*>(&RHS)); }
friend FORCEINLINE bool operator<=(const FTypeInfo& LHS, const FTypeInfo& RHS) { return LHS == RHS || LHS < RHS; }
friend FORCEINLINE bool operator>=(const FTypeInfo& LHS, const FTypeInfo& RHS) { return LHS == RHS || LHS > RHS; }
friend FORCEINLINE bool operator> (const FTypeInfo& LHS, const FTypeInfo& RHS) { return !(LHS < RHS); }
friend bool operator==(FTypeInfo LHS, FTypeInfo RHS) { return *LHS.Ptr == *RHS.Ptr; }
friend bool operator<(FTypeInfo LHS, FTypeInfo RHS) { return LHS.Ptr->before(*RHS.Ptr); }
friend bool operator<=(FTypeInfo LHS, FTypeInfo RHS) { return LHS == RHS || LHS.Ptr->before(*RHS.Ptr); }
friend bool operator>=(FTypeInfo LHS, FTypeInfo RHS) { return LHS == RHS || !LHS.Ptr->before(*RHS.Ptr); }
friend bool operator>(FTypeInfo LHS, FTypeInfo RHS) { return !LHS.Ptr->before(*RHS.Ptr); }
friend strong_ordering operator<=>(FTypeInfo LHS, FTypeInfo RHS)
friend FORCEINLINE strong_ordering operator<=>(const FTypeInfo& LHS, const FTypeInfo& RHS)
{
if (LHS == RHS) return strong_ordering::equal;
return LHS < RHS ? strong_ordering::less : strong_ordering::greater;
@ -43,7 +36,7 @@ private:
};
#define Typeid(...) (FTypeInfo(typeid(__VA_ARGS__)))
#define Typeid(...) (*reinterpret_cast<const FTypeInfo*>(&typeid(__VA_ARGS__)))
NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft)