分析 UObjecBaseUtility
https://blog.csdn.net/LQT_Junior/article/details/70833505
UObjectBaseUtility 继承于 UObjectBase
-
class COREUOBJECT_API UObjectBaseUtility : public UObjectBase
-
{
-
public:
-
// Constructors.
-
UObjectBaseUtility() {}
-
UObjectBaseUtility( EObjectFlags InFlags )
-
: UObjectBase(InFlags)
-
{
-
}
-
/***********************/
-
/******** Flags ********/
-
/***********************/
-
/** Flags 相关*/
-
/** 设置flags*/
-
FORCEINLINE void SetFlags( EObjectFlags NewFlags )
-
{
-
checkSlow(!(NewFlags & (RF_MarkAsNative | RF_MarkAsRootSet))); // These flags can't be used outside of constructors / internal code
-
SetFlagsTo(GetFlags() | NewFlags);
-
}
-
/** 清除flags*/
-
FORCEINLINE void ClearFlags( EObjectFlags NewFlags )
-
{
-
checkSlow(!(NewFlags & (RF_MarkAsNative | RF_MarkAsRootSet)) || NewFlags == RF_AllFlags); // These flags can't be used outside of constructors / internal code
-
SetFlagsTo(GetFlags() & ~NewFlags);
-
}
-
/** 用于安全检查是否设置了任何传入的Flags。*/
-
FORCEINLINE bool HasAnyFlags( EObjectFlags FlagsToCheck ) const
-
{
-
checkSlow(!(FlagsToCheck & (RF_MarkAsNative | RF_MarkAsRootSet)) || FlagsToCheck == RF_AllFlags); // These flags can't be used outside of constructors / internal code
-
return (GetFlags() & FlagsToCheck) != 0;
-
}
-
/** 用于安全检查是否设置了任何所有传入的Flags。*/
-
FORCEINLINE bool HasAllFlags( EObjectFlags FlagsToCheck ) const
-
{
-
checkSlow(!(FlagsToCheck & (RF_MarkAsNative | RF_MarkAsRootSet)) || FlagsToCheck == RF_AllFlags); // These flags can't be used outside of constructors / internal code
-
return ((GetFlags() & FlagsToCheck) == FlagsToCheck);
-
}
-
/** 获取flags的标记 Returns object flags that are both in the mask and set on the object.*/
-
FORCEINLINE EObjectFlags GetMaskedFlags( EObjectFlags Mask = RF_AllFlags ) const
-
{
-
return EObjectFlags(GetFlags() & Mask);
-
}
-
/***********************/
-
/******** Marks ******* UObjectMarks.cpp */
-
/***********************/
-
/** mark相关*/
-
/** 为对象添加mark */
-
FORCEINLINE void Mark(EObjectMark Marks) const
-
{
-
MarkObject(this,Marks);
-
}
-
/** 为对象移除mark */
-
FORCEINLINE void UnMark(EObjectMark Marks) const
-
{
-
UnMarkObject(this,Marks);
-
}
-
/** 检查对象并获取任何一个mark*/
-
FORCEINLINE bool HasAnyMarks(EObjectMark Marks) const
-
{
-
return ObjectHasAnyMarks(this,Marks);
-
}
-
/** 检查对象并获取任何所有mark*/
-
FORCEINLINE bool HasAllMarks(EObjectMark Marks) const
-
{
-
return ObjectHasAllMarks(this,Marks);
-
}
-
/** 检查是否已经死了但是还在内存中*/
-
FORCEINLINE bool IsPendingKill() const
-
{
-
return GUObjectArray.IndexToObject(InternalIndex)->IsPendingKill();
-
}
-
/** 设置PendingKill mark */
-
FORCEINLINE void MarkPendingKill()
-
{
-
check(!IsRooted());
-
GUObjectArray.IndexToObject(InternalIndex)->SetPendingKill();
-
}
-
/** 移除PendingKill mark */
-
FORCEINLINE void ClearPendingKill()
-
{
-
GUObjectArray.IndexToObject(InternalIndex)->ClearPendingKill();
-
}
-
/** 设置Root mark,防止自动回收*/
-
FORCEINLINE void AddToRoot()
-
{
-
GUObjectArray.IndexToObject(InternalIndex)->SetRootSet();
-
}
-
/** 移除root mark*/
-
FORCEINLINE void RemoveFromRoot()
-
{
-
GUObjectArray.IndexToObject(InternalIndex)->ClearRootSet();
-
}
-
/** 是否root mark*/
-
FORCEINLINE bool IsRooted()
-
{
-
return GUObjectArray.IndexToObject(InternalIndex)->IsRootSet();
-
}
-
/** 原子的清除无法访问 flags */
-
FORCEINLINE bool ThisThreadAtomicallyClearedRFUnreachable()
-
{
-
return GUObjectArray.IndexToObject(InternalIndex)->ThisThreadAtomicallyClearedRFUnreachable();
-
}
-
/** 是否无法访问 flags */
-
FORCEINLINE bool IsUnreachable() const
-
{
-
return GUObjectArray.IndexToObject(InternalIndex)->IsUnreachable();
-
}
-
/** 检查对象是否处于待命状态或无法访问 */
-
FORCEINLINE bool IsPendingKillOrUnreachable() const
-
{
-
return GUObjectArray.IndexToObject(InternalIndex)->HasAnyFlags(EInternalObjectFlags::PendingKill | EInternalObjectFlags::Unreachable);
-
}
-
/** 检查对象是否本地(机)的 */
-
FORCEINLINE bool IsNative() const
-
{
-
return GUObjectArray.IndexToObject(InternalIndex)->HasAnyFlags(EInternalObjectFlags::Native);
-
}
-
/** 设置内部Flag */
-
FORCEINLINE void SetInternalFlags(EInternalObjectFlags FlagsToSet) const
-
{
-
GUObjectArray.IndexToObject(InternalIndex)->SetFlags(FlagsToSet);
-
}
-
/** 获取内部flags*/
-
FORCEINLINE EInternalObjectFlags GetInternalFlags() const
-
{
-
return GUObjectArray.IndexToObject(InternalIndex)->GetFlags();
-
}
-
/** 用于安全检查是否设置了任何传入的内部标志。*/
-
FORCEINLINE bool HasAnyInternalFlags(EInternalObjectFlags FlagsToCheck) const
-
{
-
return GUObjectArray.IndexToObject(InternalIndex)->HasAnyFlags(FlagsToCheck);
-
}
-
/** 清除内部标志。*/
-
FORCEINLINE void ClearInternalFlags(EInternalObjectFlags FlagsToClear) const
-
{
-
GUObjectArray.IndexToObject(InternalIndex)->ClearFlags(FlagsToClear);
-
}
-
/** 原子的清除内部标志。*/
-
FORCEINLINE bool AtomicallyClearInternalFlags(EInternalObjectFlags FlagsToClear) const
-
{
-
return GUObjectArray.IndexToObject(InternalIndex)->ThisThreadAtomicallyClearedFlag(FlagsToClear);
-
}
-
/***********************/
-
/******** Names ********/
-
/***********************/
-
/** 名字相关*/
-
/** 获取此对象的完全限定路径名以及类的名称*/
-
FString GetFullName( const UObject* StopOuter=NULL ) const;
-
/** 获取此对象的完全限定路径名*/
-
FString GetPathName( const UObject* StopOuter=NULL ) const;
-
public:
-
/** 加载后调用以确定对象是否可以是群集根*/
-
virtual bool CanBeClusterRoot() const
-
{
-
return false;
-
}
-
/** 如果对象可以添加到群集,则在群集构建期间调用*/
-
virtual bool CanBeInCluster() const;
-
/** 在PostLoad期间调用以创建UObject群集*/
-
virtual void CreateCluster();
-
/** 将此对象添加到已存在的GC集群中*/
-
virtual void AddToCluster(UObjectBaseUtility* ClusterRootOrObjectFromCluster);
-
protected:
-
/** 从UObject创建一个集群的辅助函数 */
-
static void CreateClusterFromObject(UObjectBaseUtility* ClusterRootObject, UObjectBaseUtility* ReferencingObject);
-
/** 获取名字的内部版本 消除了大量副本*/
-
void GetPathName( const UObject* StopOuter, FString& ResultString ) const;
-
public:
-
/** 如果它忽略的话,获取包的名字*/
-
FString GetFullGroupName( bool bStartWithOuter ) const;
-
/** 返回此对象的名称(没有路径信息)*/
-
FORCEINLINE FString GetName() const
-
{
-
return GetFName().ToString();
-
}
-
/** GetFullName 优化*/
-
FORCEINLINE void GetName(FString &ResultString) const
-
{
-
GetFName().ToString(ResultString);
-
}
-
/** 追加名字*/
-
FORCEINLINE void AppendName(FString& ResultString) const
-
{
-
GetFName().AppendString(ResultString);
-
}
-
/***********************/
-
/******** Outer ********/
-
/***********************/
-
/** outer 相关*/
-
/** 获取最外部的包*/
-
UPackage* GetOutermost() const;
-
/** 外部包的脏标记,*/
-
bool MarkPackageDirty() const;
-
/** 是否模板对象*/
-
bool IsTemplate( EObjectFlags TemplateTypes = RF_ArchetypeObject|RF_ClassDefaultObject ) const;
-
/** 遍历外链,搜索某个类型的下一个对象。*/
-
UObject* GetTypedOuter(UClass* Target) const;
-
/**遍历外链,搜索某一类型的下一个对象。 (T必须从UObject导出)*/
-
template<typename T>
-
T* GetTypedOuter() const
-
{
-
return (T *)GetTypedOuter(T::StaticClass());
-
}
-
/** 如果在外部的某处,返回true*/
-
bool IsIn( const UObject* SomeOuter ) const;
-
/** 找出对象是否在指定类的内部(有一个外部的)*/
-
bool IsInA( const UClass* SomeBaseClass ) const;
-
/** 检查此对象的最顶层包是否具有指定的标志*/
-
bool RootPackageHasAnyFlags( uint32 CheckFlagMask ) const;
-
/***********************/
-
/******** Class ********/
-
/***********************/
-
/** Class 相关*/
-
/** 如果此对象是指定类型,则返回true*/
-
#if !UCLASS_FAST_ISA_COMPARE_WITH_OUTERWALK && UCLASS_FAST_ISA_IMPL != UCLASS_ISA_OUTERWALK
-
private:
-
template <typename ClassType>
-
static FORCEINLINE bool IsAWorkaround(const ClassType* ObjClass, const ClassType* TestCls)
-
{
-
#if UCLASS_FAST_ISA_IMPL == UCLASS_ISA_INDEXTREE
-
return ObjClass->IsAUsingFastTree(*TestCls);
-
#elif UCLASS_FAST_ISA_IMPL == UCLASS_ISA_CLASSARRAY
-
return ObjClass->IsAUsingClassArray(*TestCls);
-
#endif
-
}
-
public:
-
template <typename OtherClassType>
-
FORCEINLINE bool IsA( OtherClassType SomeBase ) const
-
{
-
// We have a cyclic dependency between UObjectBaseUtility and UClass,
-
// so we use a template to allow inlining of something we haven't yet seen, because it delays compilation until the function is called.
-
// 'static_assert' that this thing is actually a UClass pointer or convertible to it.
-
const UClass* SomeBaseClass = SomeBase;
-
(void)SomeBaseClass;
-
checkfSlow(SomeBaseClass, TEXT("IsA(NULL) cannot yield meaningful results"));
-
const UClass* ThisClass = GetClass();
-
// Stop the compiler doing some unnecessary branching for nullptr checks
-
ASSUME(SomeBaseClass);
-
ASSUME(ThisClass);
-
return IsAWorkaround(ThisClass, SomeBaseClass);
-
}
-
#else
-
bool IsA( const UClass* SomeBase ) const;
-
#endif
-
/** 如果此对象是模板类型,则返回true*/
-
template<class T>
-
bool IsA() const
-
{
-
return IsA(T::StaticClass());
-
}
-
/** 查找最传统的类,它是TestClass和此对象的类的父项。*/
-
const UClass* FindNearestCommonBaseClass( const UClass* TestClass ) const;
-
/** 返回一个指向该对象的指针,安全地转换为指定接口类的指针*/
-
void* GetInterfaceAddress( UClass* InterfaceClass );
-
/** 返回指向此对象实现的本机接口对象的指针*/
-
void* GetNativeInterfaceAddress(UClass* InterfaceClass);
-
/** 返回指向此对象实现的const 本机接口对象的指针*/
-
const void* GetNativeInterfaceAddress(UClass* InterfaceClass) const
-
{
-
return const_cast<UObjectBaseUtility*>(this)->GetNativeInterfaceAddress(InterfaceClass);
-
}
-
/** 返回此组件是否从组件/子对象模板实例化,或者是组件/子对象模板。这是基于与外部类实例查找表的名称比较*/
-
bool IsDefaultSubobject() const;
-
/***********************/
-
/******** Linker **** UObjectLinker.cpp */
-
/***********************/
-
/**Linker 相关*/
-
/** 返回此对象的链接器 */
-
class FLinkerLoad* GetLinker() const;
-
/** 返回此对象的链接器索引 */
-
int32 GetLinkerIndex() const;
-
/** 返回此对象的链接器UE4版本 */
-
int32 GetLinkerUE4Version() const;
-
/** 返回此对象的链接器的被许可方版本 */
-
int32 GetLinkerLicenseeUE4Version() const;
-
/** 返回与给定自定义版本密钥相对应的此对象的链接程序的自定义版本 */
-
int32 GetLinkerCustomVersion(FGuid CustomVersionKey) const;
-
/** 重载 按名称比较对象 如果此对象的名称在字典上小于其他对象的名称 */
-
FORCEINLINE bool operator<( const UObjectBaseUtility& Other ) const
-
{
-
return GetName() < Other.GetName();
-
}
-
};