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

其他游戏

开发平台:

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. //
  9. // String Internal Representation
  10. //
  11. //
  12. // private methods
  13. //
  14. // inline methods used by other inlines come first
  15. HK_FORCE_INLINE int hkString::getLength() const
  16. {
  17. // the length of the string is the size -1 (the null termination)
  18. return m_string.getSize() - 1;
  19. }
  20. HK_FORCE_INLINE const char* hkString::cString() const
  21. {
  22. return m_string.begin();
  23. }
  24. HK_FORCE_INLINE void hkString::setLength( int length )
  25. {
  26. m_string.setSize( length + 1 );
  27. }
  28. //
  29. // constructors
  30. //
  31. HK_FORCE_INLINE hkString::hkString()
  32. :m_string(1, 0) // "" string, size==1 => length==0
  33. {
  34. }
  35. HK_FORCE_INLINE hkString::hkString(const hkString& other)
  36. {
  37. setLength( other.getLength() );
  38. memCpy( m_string.begin(), other.cString(), other.m_string.getSize() );
  39. }
  40. HK_FORCE_INLINE hkString::hkString(const char* s)
  41. {
  42. if( s != HK_NULL )
  43. {
  44. setLength( strLen(s) );
  45. hkString::memCpy(m_string.begin(), s, m_string.getSize() ); // copy null too
  46. }
  47. else
  48. {
  49. // empty string
  50. setLength(0);
  51. m_string[0] = 0;
  52. }
  53. }
  54. HK_FORCE_INLINE hkString::hkString(char* ptr, int size, int capacity)
  55. {
  56. m_string.setOwnedData( ptr, size, capacity );
  57. }
  58. HK_FORCE_INLINE hkString::hkString(const char* buf, int len)
  59. {
  60. HK_ASSERT(0x1b0d49f3, len >= 0);
  61. setLength( len );
  62. hkString::memCpy( m_string.begin(), buf, len );
  63. m_string[len] = 0; // null terminate
  64. }
  65. HK_FORCE_INLINE hkString& hkString::operator= (const hkString& other)
  66. {
  67. setLength( other.getLength() );
  68. memCpy( m_string.begin(), other.cString(), m_string.getSize() );
  69. return *this;
  70. }
  71. HK_FORCE_INLINE hkString& hkString::operator= (const char* s)
  72. {
  73. if(s != HK_NULL && *s != 0)
  74. {
  75. int slen = strLen(s);
  76. setLength( slen );
  77. hkString::memCpy(m_string.begin(), s, slen+1); // copy null too
  78. }
  79. else
  80. {
  81. setLength(0);
  82. m_string[0] = 0;
  83. }
  84. return *this;
  85. }
  86. HK_FORCE_INLINE hkString::~hkString()
  87. {
  88. }
  89. HK_FORCE_INLINE char hkString::operator[] (int index) const
  90. {
  91. return m_string[index];
  92. }
  93. HK_FORCE_INLINE int hkString::compareTo(const hkString& other) const
  94. {
  95. return strCmp( cString(), other.cString() );
  96. }
  97. HK_FORCE_INLINE int hkString::compareTo(const char* other) const
  98. {
  99. return strCmp( cString(), other );
  100. }
  101. HK_FORCE_INLINE int hkString::compareToIgnoreCase(const hkString& other) const
  102. {
  103. return strCasecmp( cString(), other.cString() );
  104. }
  105. HK_FORCE_INLINE int hkString::compareToIgnoreCase(const char* other) const
  106. {
  107. return strCasecmp( cString(), other );
  108. }
  109. HK_FORCE_INLINE hkBool hkString::operator< (const hkString& other) const
  110. {
  111. return compareTo(other) < 0;
  112. }
  113. HK_FORCE_INLINE hkBool hkString::operator== (const hkString& other) const
  114. {
  115. return compareTo(other) == 0;
  116. }
  117. HK_FORCE_INLINE hkBool hkString::operator!= (const hkString& other) const
  118. {
  119. return compareTo(other) != 0;
  120. }
  121. HK_FORCE_INLINE hkBool hkString::operator== (const char* other) const
  122. {
  123. return compareTo(other) == 0;
  124. }
  125. HK_FORCE_INLINE hkBool hkString::operator!= (const char* other) const
  126. {
  127. return compareTo(other) != 0;
  128. }
  129. HK_FORCE_INLINE void hkString::setCapacity(int capacity) 
  130. {
  131. m_string.reserve( capacity+1 );
  132. }
  133. HK_FORCE_INLINE int hkString::getCapacity() const
  134. {
  135. return m_string.getCapacity();
  136. }
  137. HK_FORCE_INLINE const hkArray<char>& hkString::getArray() const
  138. {
  139. return m_string;
  140. }
  141. HK_FORCE_INLINE hkString hkString::substr(int index, int maxChars) const
  142. {
  143. if(maxChars > getLength() - index)
  144. {
  145. maxChars = getLength() - index;
  146. }
  147. return hkString(m_string.begin()+index, maxChars);
  148. }
  149. HK_FORCE_INLINE void hkString::setAsSubstr(int index, int maxChars)
  150. {
  151. if(maxChars > getLength() - index)
  152. {
  153. maxChars = getLength() - index;
  154. }
  155. hkString::memMove( m_string.begin(), m_string.begin()+index, maxChars+1 );
  156. m_string[ maxChars ] = 0;
  157. setLength( maxChars );
  158. }
  159. HK_FORCE_INLINE hkBool hkString::beginsWith (const hkString& other) const
  160. {
  161. return this->beginsWith( other.cString() );
  162. }
  163. void HK_CALL hkString::memCpy4( void* dst, const void* src, int numWords)
  164. {
  165. const hkUint32* src32 = reinterpret_cast<const hkUint32*>(src);
  166. hkUint32* dst32       = reinterpret_cast<      hkUint32*>(dst);
  167. {
  168. for (int i = 0; i < numWords; i++)
  169. {
  170. *(dst32++) = *(src32++);
  171. }
  172. }
  173. }
  174. void HK_CALL hkString::memCpy16( void* dst, const void* src, int numQuads)
  175. {
  176. #if defined (HK_PLATFORM_PS3_PPU) || defined (HK_PLATFORM_PS3_SPU)
  177. const vector signed int* srcQuad = reinterpret_cast<const vector signed int*>(src);
  178. vector signed int* dstQuad = reinterpret_cast<vector signed int*>(dst);
  179. {
  180. for (int i = numQuads-1; i>=0; i--)
  181. {
  182. *(dstQuad++) = *(srcQuad++);
  183. }
  184. }
  185. #else
  186. HK_ASSERT2( 0xf021d445, (hkUlong(dst) & 0xf) == 0, "Unaligned address" );
  187. HK_ASSERT2( 0xf021d446, (hkUlong(src) & 0xf) == 0, "Unaligned address" );
  188. const hkUint32* src32 = reinterpret_cast<const hkUint32*>(src);
  189. hkUint32* dst32 = reinterpret_cast<      hkUint32*>(dst);
  190. {
  191. for (int i = 0; i < numQuads; i++)
  192. {
  193. dst32[0] = src32[0];
  194. dst32[1] = src32[1];
  195. dst32[2] = src32[2];
  196. dst32[3] = src32[3];
  197. dst32+= 4;
  198. src32+= 4;
  199. }
  200. }
  201. #endif
  202. }
  203. void HK_CALL hkString::memCpy16NonEmpty( void* dst, const void* src, int numQuads)
  204. {
  205. #if defined (HK_PLATFORM_PS3_PPU) || defined (HK_PLATFORM_PS3_SPU)
  206. const vector signed int* srcQuad = reinterpret_cast<const vector signed int*>(src);
  207. vector signed int* dstQuad = reinterpret_cast<vector signed int*>(dst);
  208. {
  209. do
  210. {
  211. *(dstQuad++) = *(srcQuad++);
  212. }
  213. while ( --numQuads > 0 );
  214. }
  215. #else
  216. HK_ASSERT2( 0xf022d444, numQuads > 0, "Size 0 not allowed" );
  217. HK_ASSERT2( 0xf022d445, (hkUlong(dst) & 0xf) == 0, "Unaligned address" );
  218. HK_ASSERT2( 0xf022d446, (hkUlong(src) & 0xf) == 0, "Unaligned address" );
  219. const hkUint32* src32 = reinterpret_cast<const hkUint32*>(src);
  220. hkUint32* dst32 = reinterpret_cast<      hkUint32*>(dst);
  221. {
  222. do
  223. {
  224. dst32[0] = src32[0];
  225. dst32[1] = src32[1];
  226. dst32[2] = src32[2];
  227. dst32[3] = src32[3];
  228. dst32+= 4;
  229. src32+= 4;
  230. }
  231. while ( --numQuads > 0 );
  232. }
  233. #endif
  234. }
  235. template<int size>
  236. void hkString::memCpy16(void* dst, const void* src)
  237. {
  238. HK_ASSERT( 0xf0dedf34, ((size & 0xf) == 0) && (size <= 128) && (size > 0));
  239. #if defined(HK_PLATFORM_PS3_SPU) || defined(HK_PLATFORM_PS3_PPU)
  240. const vector signed int* srcQuad = reinterpret_cast<const vector signed int*>(src);
  241. vector signed int*       dstQuad = reinterpret_cast<vector signed int*>(dst);
  242. vector signed int a,b,c,d;
  243. if ( size >  0) a = srcQuad[0];
  244. if ( size > 16) b = srcQuad[1];
  245. if ( size > 32) c = srcQuad[2];
  246. if ( size > 48) d = srcQuad[3];
  247. if ( size >  0) dstQuad[0] = a;
  248. if ( size > 64) a = srcQuad[4];
  249. if ( size > 16) dstQuad[1] = b;
  250. if ( size > 80) b = srcQuad[5];
  251. if ( size > 32) dstQuad[2] = c;
  252. if ( size > 96) c = srcQuad[6];
  253. if ( size > 48) dstQuad[3] = d;
  254. if ( size > 112) d = srcQuad[7];
  255. if ( size > 64) dstQuad[4] = a;
  256. if ( size > 80) dstQuad[5] = b;
  257. if ( size > 96) dstQuad[6] = c;
  258. if ( size > 112) dstQuad[7] = d;
  259. #else
  260. hkString::memCpy16NonEmpty(dst, src, size/16);
  261. #endif
  262. }
  263. void hkString::memCpy256(void* dst, const void* src)
  264. {
  265. #if defined(HK_PLATFORM_PS3_SPU) || defined(HK_PLATFORM_PS3_PPU)
  266. const vector signed int* HK_RESTRICT srcQuad = (const vector signed int*)src;
  267. vector signed int*       HK_RESTRICT dstQuad = (vector signed int*)      dst;
  268. vector signed int a = srcQuad[0];
  269. vector signed int b = srcQuad[1];
  270. vector signed int c = srcQuad[2];
  271. vector signed int d = srcQuad[3];
  272. dstQuad[0]  = a; a = srcQuad[4];
  273. dstQuad[1]  = b; b = srcQuad[5];
  274. dstQuad[2]  = c; c = srcQuad[6];
  275. dstQuad[3]  = d; d = srcQuad[7];
  276. dstQuad[4]  = a; a = srcQuad[8];
  277. dstQuad[5]  = b; b = srcQuad[9];
  278. dstQuad[6]  = c; c = srcQuad[10];
  279. dstQuad[7]  = d; d = srcQuad[11];
  280. dstQuad[8]  = a; a = srcQuad[12];
  281. dstQuad[9]  = b; b = srcQuad[13];
  282. dstQuad[10] = c; c = srcQuad[14];
  283. dstQuad[11] = d; d = srcQuad[15];
  284. dstQuad[12] = a;
  285. dstQuad[13] = b;
  286. dstQuad[14] = c;
  287. dstQuad[15] = d;
  288. #else
  289. hkString::memCpy16NonEmpty(dst, src, 16);
  290. #endif
  291. }
  292. void hkString::memSet4(void* dst, const int value, int numWords)
  293. {
  294. hkUint32* dst32 = reinterpret_cast<      hkUint32*>(dst);
  295. for (int i = numWords-1; i>=0; i--)
  296. {
  297. *dst32 = value;
  298. dst32++;
  299. }
  300. }
  301. void HK_CALL hkString::memClear16(void* dst, int numQuads)
  302. {
  303. #if defined (HK_PLATFORM_PS3_PPU) || defined (HK_PLATFORM_PS3_SPU)
  304. vector signed int zero = (vector signed int){0,0,0,0};
  305. vector signed int* dest = (vector signed int*)dst;
  306. for (int i = numQuads-1; i>=0; i--)
  307. {
  308. *(dest++) = zero;
  309. }
  310. #else
  311. HK_ASSERT2( 0xf021d445, (hkUlong(dst)   & 0xf) == 0, "Unaligned address" );
  312. hkUint32* dst32 = reinterpret_cast<      hkUint32*>(dst);
  313. {
  314. for (int i = 0; i < numQuads; i++)
  315. {
  316. dst32[0] = 0;
  317. dst32[1] = 0;
  318. dst32[2] = 0;
  319. dst32[3] = 0;
  320. dst32+= 4;
  321. }
  322. }
  323. #endif
  324. }
  325. // For size up to 512 bytes, on PLAYSTATION(R)3, this will compile down to a sequence of store instructions
  326. // For larger copies or other platforms, it reverts to the looped version.
  327. template<int size>
  328. void hkString::memSet16(void* dst, const void* src)
  329. {
  330. HK_ASSERT( 0xf0dedf34, ((size & 0xf) == 0) && (size > 0) );
  331. #if defined(HK_PLATFORM_SPU) || defined(HK_PLATFORM_PS3_PPU)
  332. if (size < 32 * 16)
  333. {
  334. const hkQuadReal srcQuad = *reinterpret_cast<const hkQuadReal*>(src);
  335. hkQuadReal*      dstQuad =  reinterpret_cast<hkQuadReal*>(dst);
  336. #define HK_SET_ELEM( X )  { if ( size > 16 * (X) ) dstQuad[X] = srcQuad; }
  337. #define HK_SET_ELEM4( X )  { HK_SET_ELEM((X)+0); HK_SET_ELEM((X)+1); HK_SET_ELEM((X)+2); HK_SET_ELEM((X)+3);}
  338. HK_SET_ELEM4(0);
  339. HK_SET_ELEM4(4);
  340. HK_SET_ELEM4(8);
  341. HK_SET_ELEM4(12);
  342. HK_SET_ELEM4(16);
  343. HK_SET_ELEM4(20);
  344. HK_SET_ELEM4(24);
  345. HK_SET_ELEM4(28);
  346. #undef HK_SET_ELEM4
  347. #undef HK_SET_ELEM
  348. }
  349. else
  350. #endif
  351. {
  352. hkString::memSet16(dst, src, size/16);
  353. }
  354. }
  355. void HK_CALL hkString::memSet16(void* dst, const void* value, int numQuads)
  356. {
  357. #if defined (HK_PLATFORM_PS3_PPU) || defined (HK_PLATFORM_PS3_SPU)
  358. const vector signed int* valueQuad = reinterpret_cast<const vector signed int*>(value);
  359. vector signed int* dstQuad = reinterpret_cast<vector signed int*>(dst);
  360. {
  361. for (int i = numQuads-1; i>=0; i--)
  362. {
  363. *(dstQuad++) = *(valueQuad);
  364. }
  365. }
  366. #else
  367. HK_ASSERT2( 0xf021d445, (hkUlong(dst) & 0xf) == 0, "Unaligned address" );
  368. HK_ASSERT2( 0xf021d446, (hkUlong(value) & 0xf) == 0, "Unaligned address" );
  369. const hkUint32* value32 = reinterpret_cast<const hkUint32*>(value);
  370. hkUint32* dst32 = reinterpret_cast<      hkUint32*>(dst);
  371. {
  372. for (int i = 0; i < numQuads; i++)
  373. {
  374. dst32[0] = value32[0];
  375. dst32[1] = value32[1];
  376. dst32[2] = value32[2];
  377. dst32[3] = value32[3];
  378. dst32+= 4;
  379. }
  380. }
  381. #endif
  382. }
  383. /*
  384. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  385. * Confidential Information of Havok.  (C) Copyright 1999-2009
  386. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  387. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  388. * rights, and intellectual property rights in the Havok software remain in
  389. * Havok and/or its suppliers.
  390. * Use of this software for evaluation purposes is subject to and indicates
  391. * acceptance of the End User licence Agreement for this product. A copy of
  392. * the license is included with this software and is also available at www.havok.com/tryhavok.
  393. */