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

其他游戏

开发平台:

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_SERIALISE_DATAOBJECT_IMPL_H
  9. #define HK_SERIALISE_DATAOBJECT_IMPL_H
  10. #include <Common/Serialize/Data/hkDataObject.h>
  11. #include <Common/Base/Reflection/hkClassMemberAccessor.h>
  12. #include <Common/Base/Types/hkTypedUnion.h>
  13. //////////////////////////////////////////////////////////////////////////
  14. // Single threaded refcounted - refcount starts at zero
  15. //////////////////////////////////////////////////////////////////////////
  16. /// This class defines private reference counting
  17. /// for objects that define and manage reflected data.
  18. class hkDataRefCounted
  19. {
  20. public:
  21. HK_DECLARE_CLASS_ALLOCATOR_UNCHECKED(HK_MEMORY_CLASS_SERIALIZE);
  22. virtual ~hkDataRefCounted() { HK_ASSERT(0x6ee903de, (m_count&~1)==0 ); }
  23. hkDataRefCounted() : m_count(0), m_externalCount(0) {}
  24. void addReference() const
  25. {
  26. HK_ASSERT(0x5557d721, m_count >= 0);
  27. ++m_count;
  28. }
  29. void removeReference() const
  30. {
  31. HK_ASSERT(0x5557d720, m_count > 0);
  32. if(--m_count == 0 )
  33. {
  34. HK_ASSERT(0x5557d722, m_externalCount == 0);
  35. delete this;
  36. }
  37. }
  38. int getReferenceCount() const
  39. {
  40. return m_count;
  41. }
  42. void addExternalReference() const
  43. {
  44. HK_ASSERT(0x5557d72b, m_externalCount >= 0);
  45. ++m_externalCount;
  46. addReference();
  47. }
  48. void removeExternalReference() const
  49. {
  50. HK_ASSERT(0x5557d72a, m_externalCount > 0);
  51. --m_externalCount;
  52. removeReference();
  53. }
  54. int getExternalReferenceCount() const
  55. {
  56. return m_externalCount;
  57. }
  58. private:
  59. mutable hkUint16 m_memSize;
  60. mutable hkInt16 m_count;
  61. mutable hkInt16 m_externalCount;
  62. };
  63. //////////////////////////////////////////////////////////////////////////
  64. // Array
  65. //////////////////////////////////////////////////////////////////////////
  66. /// This abstract class defines common private interfaces
  67. /// required to manage a reflected array of data.
  68. class hkDataArrayImpl : public hkDataRefCounted
  69. {
  70. public:
  71. virtual hkDataObject::Type getType() const = 0;
  72. virtual void clear() = 0;
  73. virtual void reserve( int n ) = 0;
  74. virtual void setSize(int size) = 0;
  75. virtual int getSize() const = 0;
  76. virtual const hkDataClassImpl* getClass() const = 0;
  77. // for arrays of homogeneous types (ARRAY_STRUCT) extract the member from each object in
  78. // the array into a virtual array.
  79. virtual hkDataArrayImpl* swizzleObjectMember(const char* name) const { HK_ASSERT(0x4a2c61dc, 0); return HK_NULL; }
  80. # define ITEM_ACCESSOR(TYPE, NAME, UMEMBER) 
  81. virtual TYPE as##NAME(int index) const { HK_ASSERT(0x5d74effa, 0); return 0; } 
  82. virtual void set##NAME(int index, TYPE val) { HK_ASSERT(0x7cf76c5a, 0); }
  83. ITEM_ACCESSOR(const hkReal*, Vec, ra);
  84. ITEM_ACCESSOR(const char*, String, s);
  85. ITEM_ACCESSOR(hkReal, Real, r);
  86. ITEM_ACCESSOR(int, Int, i);
  87. ITEM_ACCESSOR(hkInt64, Int64, i);
  88. ITEM_ACCESSOR(hkDataObjectImpl*, Object, o);
  89. ITEM_ACCESSOR(hkDataArrayImpl*, Array, a);
  90. # undef ITEM_ACCESSOR
  91. # define ARRAY_SET(A) virtual void setAll(const A*, int n) { HK_ASSERT(0x227cd5bd, 0); }
  92. ARRAY_SET(hkBool);
  93. ARRAY_SET(char);
  94. ARRAY_SET(hkInt8);
  95. ARRAY_SET(hkUint8);
  96. ARRAY_SET(hkInt16);
  97. ARRAY_SET(hkUint16);
  98. ARRAY_SET(hkInt32);
  99. ARRAY_SET(hkUint32);
  100. ARRAY_SET(hkInt64);
  101. ARRAY_SET(hkUint64);
  102. ARRAY_SET(hkReal);
  103. # undef ARRAY_SET
  104. void set( int index, hkDataObject::Value val )
  105. {
  106. if( getType() & hkDataObject::TYPE_TUPLE )
  107. {
  108. HK_ASSERT(0x132f8fef, val.asArray().getSize() == asArray(index)->getSize());
  109. setArray(index, val.asArray().getImplementation());
  110. return;
  111. }
  112. switch( getType() )
  113. {
  114. case hkDataObject::TYPE_BYTE:
  115. case hkDataObject::TYPE_INT:
  116. setInt(index, val.asInt());
  117. break;
  118. case hkDataObject::TYPE_REAL:
  119. setReal(index, val.asReal());
  120. break;
  121. case hkDataObject::TYPE_VEC_4:
  122. case hkDataObject::TYPE_VEC_8:
  123. case hkDataObject::TYPE_VEC_12:
  124. case hkDataObject::TYPE_VEC_16:
  125. HK_ASSERT(0x75c75cd9, 0);
  126. setVec( index, val.asVec(0) );
  127. break;
  128. case hkDataObject::TYPE_OBJECT:
  129. case hkDataObject::TYPE_STRUCT:
  130. setObject( index, val.asObject().getImplementation() );
  131. break;
  132. case hkDataObject::TYPE_CSTRING:
  133. setString( index, val.asString());
  134. break;
  135. default:
  136. HK_ASSERT(0x77ca1cb5, 0);
  137. }
  138. }
  139. };
  140. ////////////////////////////////////////////////////////////////////////
  141. // Class
  142. //////////////////////////////////////////////////////////////////////////
  143. /// This abstract class defines common private interfaces
  144. /// required to define reflected data.
  145. class hkDataClassImpl : public hkDataRefCounted
  146. {
  147. public:
  148. virtual const hkDataWorld* getWorld() const = 0;
  149. virtual const char* getName() const = 0;
  150. virtual int getVersion() const = 0;
  151. virtual hkDataClassImpl* getParent() const = 0;
  152. virtual hkBool isSuperClass(const hkDataClassImpl* k) const = 0;
  153. // this class only
  154. virtual int getNumDeclaredMembers() const = 0;
  155. virtual void getDeclaredMemberInfo(int i, hkDataClass::MemberInfo& info) const = 0;
  156. virtual int getDeclaredMemberIndexByName(const char* name) const = 0;
  157. // all members
  158. virtual int getNumMembers() const = 0;
  159. virtual void getMemberInfo(int i, hkDataClass::MemberInfo& info) const = 0;
  160. virtual int getMemberIndexByName(const char* name) const = 0;
  161. };
  162. //////////////////////////////////////////////////////////////////////////
  163. // Object
  164. //////////////////////////////////////////////////////////////////////////
  165. /// This abstract class defines common private interfaces
  166. /// required to manage reflected data.
  167. class hkDataObjectImpl : public hkDataRefCounted
  168. {
  169. public:
  170. typedef hkDataObject::Iterator Iterator;
  171. virtual hkDataObject::Handle getHandle() const = 0;
  172. virtual const hkDataClassImpl* getClass() const = 0;
  173. virtual hkDataObject::Value accessByName(const char* name) = 0;
  174. virtual hkBool32 hasMember(const char* name) const = 0;
  175. virtual Iterator getMemberIterator() const = 0; //DEFAULT?
  176. virtual hkBool32 isValid(Iterator it) const = 0;
  177. virtual Iterator getNextMember(Iterator it) const = 0;
  178. virtual const char* getMemberName(Iterator it) const = 0;
  179. virtual const hkDataObject::Value getMemberValue(Iterator it) const = 0; //DEFAULT?
  180. virtual hkDataArrayImpl* asArray( const char* name ) = 0;
  181. virtual const char* asString( const char* name ) = 0;
  182. virtual hkInt64 asInt( const char* name ) = 0;
  183. virtual hkDataObjectImpl* asObject( const char* name ) = 0;
  184. virtual const hkReal* asVec( const char* name, int nreal ) = 0;
  185. virtual hkReal asReal( const char* name ) = 0;
  186. virtual void assign( const char* name, hkDataObjectImpl* value ) = 0;
  187. virtual void assign( const char* name, hkDataArrayImpl* value ) = 0;
  188. virtual void assign( const char* name, const char* value ) = 0;
  189. virtual void assign( const char* name, hkReal r ) = 0;
  190. virtual void assign( const char* name, const hkReal* r, int nreal ) = 0;
  191. virtual void assign( const char* name, hkInt64 valueIn ) = 0;
  192. };
  193. #endif // HK_SERIALISE_DATAOBJECT_IMPL_H
  194. /*
  195. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  196. * Confidential Information of Havok.  (C) Copyright 1999-2009
  197. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  198. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  199. * rights, and intellectual property rights in the Havok software remain in
  200. * Havok and/or its suppliers.
  201. * Use of this software for evaluation purposes is subject to and indicates
  202. * acceptance of the End User licence Agreement for this product. A copy of
  203. * the license is included with this software and is also available at www.havok.com/tryhavok.
  204. */