hkSingleton.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:5k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HKBASE_HKSINGLETON_H
  9. #define HKBASE_HKSINGLETON_H
  10. /// Utility class to define global objects.
  11. /// Singletons are created when hkBaseSystem::init() is called.
  12. /// They are deleted automatically when hkBaseSystem::quit() is called.
  13. ///
  14. /// To use this class, make a public default constructor. Parameter type in the template
  15. /// must be derived from hkReferencedObject.
  16. /// You will also need to put a HK_SINGLETON_IMPLEMENTATION
  17. /// macro into its cpp.
  18. template <typename T>
  19. class hkSingleton
  20. {
  21. public:
  22. static T* s_instance;
  23. /// Get the instance of this singleton. This creates an instance when hkBaseSystem::init is called.
  24. static HK_FORCE_INLINE T& HK_CALL getInstance()
  25. {
  26. return *s_instance;
  27. }
  28. /// Remove a reference to the existing singleton and use the supplied one instead.
  29. static void HK_CALL replaceInstance(T* t)
  30. {
  31. if(s_instance)
  32. {
  33. s_instance->removeReferenceLockUnchecked();
  34. }
  35. s_instance = t;
  36. }
  37. /// Has this singleton been initialized?
  38. static hkBool HK_CALL isInitialised()
  39. {
  40. return s_instance != HK_NULL;
  41. }
  42. protected:
  43. hkSingleton() { }
  44. hkSingleton(const hkSingleton&); //not implemented
  45. hkSingleton& operator= (const hkSingleton&); //not implemented
  46. };
  47. extern struct hkSingletonInitNode* hkSingletonInitList;
  48. /// An internal class for registering global instances. You will not need to
  49. /// use it except for very low level hacking.
  50. struct hkSingletonInitNode
  51. {
  52. typedef hkReferencedObject* (HK_CALL *SingletonCreationFunction)();
  53. hkSingletonInitNode(SingletonCreationFunction func, void** ptr)
  54. : m_func(func), m_value(ptr)
  55. {
  56. m_next = hkSingletonInitList;
  57. hkSingletonInitList = this;
  58. }
  59. SingletonCreationFunction m_func;
  60. hkSingletonInitNode* m_next;
  61. void** m_value;
  62. private:
  63. HK_DECLARE_SYSTEM_ALLOCATOR();
  64. };
  65. /// Add BASE_CLASS to the singleton init list.
  66. #define HK_SINGLETON_IMPLEMENTATION(BASE_CLASS) 
  67. template<> BASE_CLASS* hkSingleton<BASE_CLASS>::s_instance = HK_NULL; 
  68. static hkReferencedObject* HK_CALL BASE_CLASS ## create() { return new BASE_CLASS(); } 
  69. static hkSingletonInitNode hkSingletonRegister##BASE_CLASS (&BASE_CLASS ## create, (void**)&BASE_CLASS::s_instance)
  70. /// Add CUSTOM_CLASS as the implementation of BASE_CLASS to the singleton init list.
  71. #define HK_SINGLETON_CUSTOM_IMPLEMENTATION(BASE_CLASS, CUSTOM_CLASS) 
  72. template<> BASE_CLASS* hkSingleton<BASE_CLASS>::s_instance = HK_NULL; 
  73. static hkReferencedObject* HK_CALL BASE_CLASS ## create() { return new CUSTOM_CLASS(); } 
  74. static hkSingletonInitNode hkSingletonRegister##BASE_CLASS (&BASE_CLASS ## create, (void**)&BASE_CLASS::s_instance)
  75. /// When the singleton is to be instantiated at start up a function is called. If the function returns HK_NULL
  76. /// it indicates the construction couldn't be performed, because something else needed to be constructed first.
  77. /// Havok will automatically try to reconstruct once other singletons have been constructed.
  78. /// 
  79. /// The signature of the function should be hkReferencedObject* HK_CALL func() { ... }
  80. #define HK_SINGLETON_CUSTOM_CALL(BASE_CLASS, FUNC) 
  81. template<> BASE_CLASS* hkSingleton<BASE_CLASS>::s_instance = HK_NULL; 
  82. static hkSingletonInitNode hkSingletonRegister##BASE_CLASS (&FUNC, (void**)&BASE_CLASS::s_instance)
  83. /// Manual implementation singletons are not placed on the global init list and must
  84. /// explicitly be initialized in hkBaseSystem::init().
  85. #define HK_SINGLETON_MANUAL_IMPLEMENTATION(BASE_CLASS) 
  86. template<> BASE_CLASS* hkSingleton<BASE_CLASS>::s_instance = HK_NULL
  87. #endif // HKBASE_HKSINGLETON_H
  88. /*
  89. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  90. * Confidential Information of Havok.  (C) Copyright 1999-2009
  91. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  92. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  93. * rights, and intellectual property rights in the Havok software remain in
  94. * Havok and/or its suppliers.
  95. * Use of this software for evaluation purposes is subject to and indicates
  96. * acceptance of the End User licence Agreement for this product. A copy of
  97. * the license is included with this software and is also available at www.havok.com/tryhavok.
  98. */