当前位置: 首页 > news >正文

分析 UObjecBaseUtility

分析 UObjecBaseUtility

https://blog.csdn.net/LQT_Junior/article/details/70833505

 

UObjectBaseUtility 继承于 UObjectBase

 

 

 
  1. class COREUOBJECT_API UObjectBaseUtility : public UObjectBase

  2. {

  3. public:

  4. // Constructors.

  5. UObjectBaseUtility() {}

  6. UObjectBaseUtility( EObjectFlags InFlags )

  7. : UObjectBase(InFlags)

  8. {

  9. }

  10.  
  11. /***********************/

  12. /******** Flags ********/

  13. /***********************/

  14.  
  15. /** Flags 相关*/

  16.  
  17. /** 设置flags*/

  18. FORCEINLINE void SetFlags( EObjectFlags NewFlags )

  19. {

  20. checkSlow(!(NewFlags & (RF_MarkAsNative | RF_MarkAsRootSet))); // These flags can't be used outside of constructors / internal code

  21. SetFlagsTo(GetFlags() | NewFlags);

  22. }

  23. /** 清除flags*/

  24. FORCEINLINE void ClearFlags( EObjectFlags NewFlags )

  25. {

  26. checkSlow(!(NewFlags & (RF_MarkAsNative | RF_MarkAsRootSet)) || NewFlags == RF_AllFlags); // These flags can't be used outside of constructors / internal code

  27. SetFlagsTo(GetFlags() & ~NewFlags);

  28. }

  29.  
  30. /** 用于安全检查是否设置了任何传入的Flags。*/

  31. FORCEINLINE bool HasAnyFlags( EObjectFlags FlagsToCheck ) const

  32. {

  33. checkSlow(!(FlagsToCheck & (RF_MarkAsNative | RF_MarkAsRootSet)) || FlagsToCheck == RF_AllFlags); // These flags can't be used outside of constructors / internal code

  34. return (GetFlags() & FlagsToCheck) != 0;

  35. }

  36.  
  37. /** 用于安全检查是否设置了任何所有传入的Flags。*/

  38. FORCEINLINE bool HasAllFlags( EObjectFlags FlagsToCheck ) const

  39. {

  40. checkSlow(!(FlagsToCheck & (RF_MarkAsNative | RF_MarkAsRootSet)) || FlagsToCheck == RF_AllFlags); // These flags can't be used outside of constructors / internal code

  41. return ((GetFlags() & FlagsToCheck) == FlagsToCheck);

  42. }

  43.  
  44. /** 获取flags的标记 Returns object flags that are both in the mask and set on the object.*/

  45. FORCEINLINE EObjectFlags GetMaskedFlags( EObjectFlags Mask = RF_AllFlags ) const

  46. {

  47. return EObjectFlags(GetFlags() & Mask);

  48. }

  49.  
  50. /***********************/

  51. /******** Marks ******* UObjectMarks.cpp */

  52. /***********************/

  53. /** mark相关*/

  54.  
  55. /** 为对象添加mark */

  56. FORCEINLINE void Mark(EObjectMark Marks) const

  57. {

  58. MarkObject(this,Marks);

  59. }

  60.  
  61.  
  62. /** 为对象移除mark */

  63. FORCEINLINE void UnMark(EObjectMark Marks) const

  64. {

  65. UnMarkObject(this,Marks);

  66. }

  67.  
  68. /** 检查对象并获取任何一个mark*/

  69. FORCEINLINE bool HasAnyMarks(EObjectMark Marks) const

  70. {

  71. return ObjectHasAnyMarks(this,Marks);

  72. }

  73.  
  74.  
  75. /** 检查对象并获取任何所有mark*/

  76. FORCEINLINE bool HasAllMarks(EObjectMark Marks) const

  77. {

  78. return ObjectHasAllMarks(this,Marks);

  79. }

  80.  
  81.  
  82. /** 检查是否已经死了但是还在内存中*/

  83. FORCEINLINE bool IsPendingKill() const

  84. {

  85. return GUObjectArray.IndexToObject(InternalIndex)->IsPendingKill();

  86. }

  87.  
  88.  
  89. /** 设置PendingKill mark */

  90. FORCEINLINE void MarkPendingKill()

  91. {

  92. check(!IsRooted());

  93. GUObjectArray.IndexToObject(InternalIndex)->SetPendingKill();

  94. }

  95.  
  96. /** 移除PendingKill mark */

  97. FORCEINLINE void ClearPendingKill()

  98. {

  99. GUObjectArray.IndexToObject(InternalIndex)->ClearPendingKill();

  100. }

  101.  
  102.  
  103. /** 设置Root mark,防止自动回收*/

  104. FORCEINLINE void AddToRoot()

  105. {

  106. GUObjectArray.IndexToObject(InternalIndex)->SetRootSet();

  107. }

  108.  
  109. /** 移除root mark*/

  110. FORCEINLINE void RemoveFromRoot()

  111. {

  112. GUObjectArray.IndexToObject(InternalIndex)->ClearRootSet();

  113. }

  114.  
  115. /** 是否root mark*/

  116. FORCEINLINE bool IsRooted()

  117. {

  118. return GUObjectArray.IndexToObject(InternalIndex)->IsRootSet();

  119. }

  120.  
  121.  
  122. /** 原子的清除无法访问 flags */

  123. FORCEINLINE bool ThisThreadAtomicallyClearedRFUnreachable()

  124. {

  125. return GUObjectArray.IndexToObject(InternalIndex)->ThisThreadAtomicallyClearedRFUnreachable();

  126. }

  127.  
  128.  
  129. /** 是否无法访问 flags */

  130. FORCEINLINE bool IsUnreachable() const

  131. {

  132. return GUObjectArray.IndexToObject(InternalIndex)->IsUnreachable();

  133. }

  134.  
  135. /** 检查对象是否处于待命状态或无法访问 */

  136. FORCEINLINE bool IsPendingKillOrUnreachable() const

  137. {

  138. return GUObjectArray.IndexToObject(InternalIndex)->HasAnyFlags(EInternalObjectFlags::PendingKill | EInternalObjectFlags::Unreachable);

  139. }

  140.  
  141. /** 检查对象是否本地(机)的 */

  142. FORCEINLINE bool IsNative() const

  143. {

  144. return GUObjectArray.IndexToObject(InternalIndex)->HasAnyFlags(EInternalObjectFlags::Native);

  145. }

  146.  
  147. /** 设置内部Flag */

  148. FORCEINLINE void SetInternalFlags(EInternalObjectFlags FlagsToSet) const

  149. {

  150. GUObjectArray.IndexToObject(InternalIndex)->SetFlags(FlagsToSet);

  151. }

  152.  
  153.  
  154. /** 获取内部flags*/

  155. FORCEINLINE EInternalObjectFlags GetInternalFlags() const

  156. {

  157. return GUObjectArray.IndexToObject(InternalIndex)->GetFlags();

  158. }

  159.  
  160.  
  161. /** 用于安全检查是否设置了任何传入的内部标志。*/

  162. FORCEINLINE bool HasAnyInternalFlags(EInternalObjectFlags FlagsToCheck) const

  163. {

  164. return GUObjectArray.IndexToObject(InternalIndex)->HasAnyFlags(FlagsToCheck);

  165. }

  166.  
  167.  
  168. /** 清除内部标志。*/

  169. FORCEINLINE void ClearInternalFlags(EInternalObjectFlags FlagsToClear) const

  170. {

  171. GUObjectArray.IndexToObject(InternalIndex)->ClearFlags(FlagsToClear);

  172. }

  173.  
  174.  
  175. /** 原子的清除内部标志。*/

  176. FORCEINLINE bool AtomicallyClearInternalFlags(EInternalObjectFlags FlagsToClear) const

  177. {

  178. return GUObjectArray.IndexToObject(InternalIndex)->ThisThreadAtomicallyClearedFlag(FlagsToClear);

  179. }

  180.  
  181. /***********************/

  182. /******** Names ********/

  183. /***********************/

  184. /** 名字相关*/

  185.  
  186. /** 获取此对象的完全限定路径名以及类的名称*/

  187. FString GetFullName( const UObject* StopOuter=NULL ) const;

  188.  
  189. /** 获取此对象的完全限定路径名*/

  190. FString GetPathName( const UObject* StopOuter=NULL ) const;

  191.  
  192. public:

  193.  
  194. /** 加载后调用以确定对象是否可以是群集根*/

  195. virtual bool CanBeClusterRoot() const

  196. {

  197. return false;

  198. }

  199.  
  200.  
  201. /** 如果对象可以添加到群集,则在群集构建期间调用*/

  202. virtual bool CanBeInCluster() const;

  203.  
  204.  
  205. /** 在PostLoad期间调用以创建UObject群集*/

  206. virtual void CreateCluster();

  207.  
  208.  
  209. /** 将此对象添加到已存在的GC集群中*/

  210. virtual void AddToCluster(UObjectBaseUtility* ClusterRootOrObjectFromCluster);

  211.  
  212. protected:

  213.  
  214. /** 从UObject创建一个集群的辅助函数 */

  215. static void CreateClusterFromObject(UObjectBaseUtility* ClusterRootObject, UObjectBaseUtility* ReferencingObject);

  216.  
  217.  
  218. /** 获取名字的内部版本 消除了大量副本*/

  219. void GetPathName( const UObject* StopOuter, FString& ResultString ) const;

  220.  
  221. public:

  222.  
  223. /** 如果它忽略的话,获取包的名字*/

  224. FString GetFullGroupName( bool bStartWithOuter ) const;

  225.  
  226.  
  227. /** 返回此对象的名称(没有路径信息)*/

  228. FORCEINLINE FString GetName() const

  229. {

  230. return GetFName().ToString();

  231. }

  232.  
  233. /** GetFullName 优化*/

  234. FORCEINLINE void GetName(FString &ResultString) const

  235. {

  236. GetFName().ToString(ResultString);

  237. }

  238. /** 追加名字*/

  239. FORCEINLINE void AppendName(FString& ResultString) const

  240. {

  241. GetFName().AppendString(ResultString);

  242. }

  243.  
  244. /***********************/

  245. /******** Outer ********/

  246. /***********************/

  247. /** outer 相关*/

  248.  
  249. /** 获取最外部的包*/

  250. UPackage* GetOutermost() const;

  251.  
  252.  
  253. /** 外部包的脏标记,*/

  254. bool MarkPackageDirty() const;

  255.  
  256.  
  257. /** 是否模板对象*/

  258. bool IsTemplate( EObjectFlags TemplateTypes = RF_ArchetypeObject|RF_ClassDefaultObject ) const;

  259.  
  260.  
  261. /** 遍历外链,搜索某个类型的下一个对象。*/

  262. UObject* GetTypedOuter(UClass* Target) const;

  263.  
  264.  
  265. /**遍历外链,搜索某一类型的下一个对象。 (T必须从UObject导出)*/

  266. template<typename T>

  267. T* GetTypedOuter() const

  268. {

  269. return (T *)GetTypedOuter(T::StaticClass());

  270. }

  271.  
  272.  
  273. /** 如果在外部的某处,返回true*/

  274. bool IsIn( const UObject* SomeOuter ) const;

  275.  
  276. /** 找出对象是否在指定类的内部(有一个外部的)*/

  277. bool IsInA( const UClass* SomeBaseClass ) const;

  278.  
  279. /** 检查此对象的最顶层包是否具有指定的标志*/

  280. bool RootPackageHasAnyFlags( uint32 CheckFlagMask ) const;

  281.  
  282. /***********************/

  283. /******** Class ********/

  284. /***********************/

  285. /** Class 相关*/

  286.  
  287. /** 如果此对象是指定类型,则返回true*/

  288. #if !UCLASS_FAST_ISA_COMPARE_WITH_OUTERWALK && UCLASS_FAST_ISA_IMPL != UCLASS_ISA_OUTERWALK

  289. private:

  290. template <typename ClassType>

  291. static FORCEINLINE bool IsAWorkaround(const ClassType* ObjClass, const ClassType* TestCls)

  292. {

  293. #if UCLASS_FAST_ISA_IMPL == UCLASS_ISA_INDEXTREE

  294. return ObjClass->IsAUsingFastTree(*TestCls);

  295. #elif UCLASS_FAST_ISA_IMPL == UCLASS_ISA_CLASSARRAY

  296. return ObjClass->IsAUsingClassArray(*TestCls);

  297. #endif

  298. }

  299.  
  300. public:

  301. template <typename OtherClassType>

  302. FORCEINLINE bool IsA( OtherClassType SomeBase ) const

  303. {

  304. // We have a cyclic dependency between UObjectBaseUtility and UClass,

  305. // so we use a template to allow inlining of something we haven't yet seen, because it delays compilation until the function is called.

  306.  
  307. // 'static_assert' that this thing is actually a UClass pointer or convertible to it.

  308. const UClass* SomeBaseClass = SomeBase;

  309. (void)SomeBaseClass;

  310. checkfSlow(SomeBaseClass, TEXT("IsA(NULL) cannot yield meaningful results"));

  311.  
  312. const UClass* ThisClass = GetClass();

  313.  
  314. // Stop the compiler doing some unnecessary branching for nullptr checks

  315. ASSUME(SomeBaseClass);

  316. ASSUME(ThisClass);

  317.  
  318. return IsAWorkaround(ThisClass, SomeBaseClass);

  319. }

  320. #else

  321. bool IsA( const UClass* SomeBase ) const;

  322. #endif

  323.  
  324.  
  325. /** 如果此对象是模板类型,则返回true*/

  326. template<class T>

  327. bool IsA() const

  328. {

  329. return IsA(T::StaticClass());

  330. }

  331.  
  332.  
  333. /** 查找最传统的类,它是TestClass和此对象的类的父项。*/

  334. const UClass* FindNearestCommonBaseClass( const UClass* TestClass ) const;

  335.  
  336. /** 返回一个指向该对象的指针,安全地转换为指定接口类的指针*/

  337. void* GetInterfaceAddress( UClass* InterfaceClass );

  338.  
  339.  
  340. /** 返回指向此对象实现的本机接口对象的指针*/

  341. void* GetNativeInterfaceAddress(UClass* InterfaceClass);

  342.  
  343.  
  344. /** 返回指向此对象实现的const 本机接口对象的指针*/

  345. const void* GetNativeInterfaceAddress(UClass* InterfaceClass) const

  346. {

  347. return const_cast<UObjectBaseUtility*>(this)->GetNativeInterfaceAddress(InterfaceClass);

  348. }

  349.  
  350.  
  351. /** 返回此组件是否从组件/子对象模板实例化,或者是组件/子对象模板。这是基于与外部类实例查找表的名称比较*/

  352. bool IsDefaultSubobject() const;

  353.  
  354.  
  355. /***********************/

  356. /******** Linker **** UObjectLinker.cpp */

  357. /***********************/

  358. /**Linker 相关*/

  359.  
  360.  
  361. /** 返回此对象的链接器 */

  362. class FLinkerLoad* GetLinker() const;

  363.  
  364. /** 返回此对象的链接器索引 */

  365. int32 GetLinkerIndex() const;

  366.  
  367. /** 返回此对象的链接器UE4版本 */

  368. int32 GetLinkerUE4Version() const;

  369.  
  370.  
  371. /** 返回此对象的链接器的被许可方版本 */

  372. int32 GetLinkerLicenseeUE4Version() const;

  373.  
  374.  
  375. /** 返回与给定自定义版本密钥相对应的此对象的链接程序的自定义版本 */

  376. int32 GetLinkerCustomVersion(FGuid CustomVersionKey) const;

  377.  
  378. /** 重载 按名称比较对象 如果此对象的名称在字典上小于其他对象的名称 */

  379. FORCEINLINE bool operator<( const UObjectBaseUtility& Other ) const

  380. {

  381. return GetName() < Other.GetName();

  382. }

  383. };


 

 

 

 

 

 

相关文章:

  • 解析PAK文件
  • UE4资源热更打包工具HotPatcher
  • Unity游戏资源逆向工具
  • UE4 Pak 文件格式
  • 更新UnrealPakViewer工具
  • UE4中Taglib使用及插件制作
  • UE4编辑器扩展踩坑血泪史
  • require函数
  • UE4 给static mesh 动态添加Socket
  • UE4 角色用Child Actor组建添加装备 这样方便随时添加,更换套装等行为
  • Unity Assets目录下的特殊文件夹名称
  • Unity-ShaderVariantCollection
  • Unity渲染教程(九):复杂材质 https://www.jianshu.com/p/5e3af869870f
  • HttpWebRequest(System.Net)模拟HTTP发送POST
  • C#中用HttpWebRequest中发送GET/HTTP/HTTPS请求 (转载)
  • 2017 年终总结 —— 在路上
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Hexo+码云+git快速搭建免费的静态Blog
  • HTTP那些事
  • js ES6 求数组的交集,并集,还有差集
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js算法-归并排序(merge_sort)
  • overflow: hidden IE7无效
  • php ci框架整合银盛支付
  • PHP 的 SAPI 是个什么东西
  • python学习笔记 - ThreadLocal
  • SQLServer之创建数据库快照
  • 程序员最讨厌的9句话,你可有补充?
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 基于Android乐音识别(2)
  • 将 Measurements 和 Units 应用到物理学
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 目录与文件属性:编写ls
  • 前端_面试
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 手机端车牌号码键盘的vue组件
  • 通过npm或yarn自动生成vue组件
  • 以太坊客户端Geth命令参数详解
  • ionic异常记录
  • 阿里云服务器购买完整流程
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​ssh免密码登录设置及问题总结
  • #13 yum、编译安装与sed命令的使用
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (算法)Travel Information Center
  • (一)WLAN定义和基本架构转
  • (转)大型网站的系统架构
  • .net 后台导出excel ,word
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /proc/stat文件详解(翻译)
  • @Autowired @Resource @Qualifier的区别
  • @Autowired注解的实现原理
  • @private @protected @public