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

其他游戏

开发平台:

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 HK_SERIALIZE_STRUCTURELAYOUT_H
  9. #define HK_SERIALIZE_STRUCTURELAYOUT_H
  10. class hkClassMember;
  11. template <typename K, typename V> class hkPointerMap;
  12. /// Class which can duplicate the compiler structure layout procedure.
  13. class hkStructureLayout
  14. {
  15. public:
  16. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SERIALIZE, hkStructureLayout);
  17. /// Structure to define how the compiler lays out struct members.
  18. struct LayoutRules
  19. {
  20. /// Number of bytes in a pointer. i.e. sizeof(void*)
  21. /// Valid values are 4 or 8.
  22. hkUint8 m_bytesInPointer;
  23. /// Target is little endian.
  24. /// e.g. True for PlayStation(R)2. False for powerpc.
  25. hkUint8 m_littleEndian;
  26. /// Derived members appear after alignment padding.
  27. /// e.g. struct A { hkVector4 x; int i; };
  28. /// struct B : public A { int j; };
  29. /// All compilers have sizeof(A)==2*sizeof(hkVector4)
  30. /// because of the alignment padding. Some compilers simply
  31. /// append members to the base class so that offsetof(B,j)==sizeof(A)
  32. /// Others can reuse the padding for derived classes so that
  33. /// sizeof(B)==sizeof(A) and offsetof(B,j)==offsetof(B,i)+sizeof(int)
  34. /// e.g. True for all gcc based compilers except on OsX, false for msvc and cw.
  35. hkUint8 m_reusePaddingOptimization;
  36. /// The target implements the empty base class optimization.
  37. /// e.g. struct A {}; struct B : public A { int x; };
  38. /// All compilers have sizeof(A) > 0. Some compilers reuse the padding
  39. /// for derived class members such that offsetof(B,x) == 0.
  40. /// e.g. gcc2 does not implement this optimization.
  41. hkUint8 m_emptyBaseClassOptimization;
  42. hkBool operator==(const LayoutRules& other) const
  43. {
  44. return (m_bytesInPointer == other.m_bytesInPointer) && 
  45. (m_littleEndian == other.m_littleEndian) && 
  46. (m_reusePaddingOptimization == other.m_reusePaddingOptimization) && 
  47. (m_emptyBaseClassOptimization == other.m_emptyBaseClassOptimization);
  48. }
  49. private:
  50. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SERIALIZE, hkStructureLayout::LayoutRules );
  51. };
  52. /// Create a structure layout with the host layout rules.
  53. hkStructureLayout();
  54. /// Create a structure layout with the given layout rules.
  55. hkStructureLayout( const LayoutRules& rules );
  56. /// Compute the offsets of the members of klass according to the target rules.
  57. /// The offsets are written into the supplied class. The read-write parameter
  58. /// classesDone keeps track of which classes have been processed so far. This
  59. /// may persist across several calls.
  60. void computeMemberOffsetsInplace( hkClass& klass, hkPointerMap<const hkClass*, int>& classesDone ) const;
  61. /// Access the rules of this layout.
  62. const LayoutRules& getRules() const { return m_rules; }
  63. /// The layout rules for the platform being compiled.
  64. static const LayoutRules HostLayoutRules;
  65. // Layout for various compilers/platforms.
  66. // If no rules match your particular compiler/host combination, you
  67. // can create your own by examining HostLayoutRules on the target.
  68. /// MSVC Win32
  69. static const LayoutRules MsvcWin32LayoutRules;
  70. /// The original xbox. See also Xbox360LayoutRules.
  71. static const LayoutRules MsvcXboxLayoutRules;
  72. /// MSVC AMD64
  73. static const LayoutRules MsvcAmd64LayoutRules;
  74. /// CodeWarrior PlayStation(R)2
  75. static const LayoutRules CwPs2LayoutRules;
  76. /// CodeWarrior Nintendo GameCube
  77. static const LayoutRules CwNgcLayoutRules;
  78. /// CodeWarrior PSP(R) (PlayStation(R)Portable)
  79. static const LayoutRules CwPspLayoutRules;
  80. /// CodeWarrior Wii
  81. static const LayoutRules CwWiiLayoutRules;
  82. /// GCC 3.2 PlayStation(R)2
  83. static const LayoutRules Gcc32Ps2LayoutRules;
  84. /// GCC 1.51 PSP(R)
  85. static const LayoutRules Gcc151PspLayoutRules;
  86. /// GCC 2.95 Linux
  87. static const LayoutRules Gcc295LinuxLayoutRules;
  88. /// GCC 3.3 Linux
  89. static const LayoutRules Gcc33LinuxLayoutRules;
  90. /// SN 3.1 PlayStation(R)2
  91. static const LayoutRules Sn31Ps2LayoutRules;
  92. /// SN 1.0 PSP(R)
  93. static const LayoutRules Sn10PspLayoutRules;
  94. /// SN 3.93 Nintendo GameCube
  95. static const LayoutRules Sn393NgcLayoutRules;
  96. /// Xbox 360
  97. static const LayoutRules Xbox360LayoutRules;
  98. /// GCC PLAYSTATION(R)3
  99. static const LayoutRules GccPs3LayoutRules;
  100. /// GCC 4.0 Mac-PPC
  101. static const LayoutRules Gcc40MacPpcLayoutRules;
  102. /// GCC 4.0 Mac-Intel
  103. static const LayoutRules Gcc40MacIntelLayoutRules;
  104. protected:
  105. LayoutRules m_rules;
  106. };
  107. #endif // HK_SERIALIZE_STRUCTURELAYOUT_H
  108. /*
  109. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  110. * Confidential Information of Havok.  (C) Copyright 1999-2009
  111. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  112. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  113. * rights, and intellectual property rights in the Havok software remain in
  114. * Havok and/or its suppliers.
  115. * Use of this software for evaluation purposes is subject to and indicates
  116. * acceptance of the End User licence Agreement for this product. A copy of
  117. * the license is included with this software and is also available at www.havok.com/tryhavok.
  118. */