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

其他游戏

开发平台:

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_HKSTRING_H
  9. #define HKBASE_HKSTRING_H
  10. #include <Common/Base/Container/Array/hkArray.h>
  11. #include <Common/Base/Math/hkMath.h>
  12. template <typename T> class hkObjectArray;
  13. /// String and buffer functions normally found in libc.
  14. class hkString
  15. {
  16. public:
  17. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_STRING, hkString);
  18. public: // object methods
  19. /// Creates an empty string.
  20. HK_FORCE_INLINE hkString();
  21. /// Creates a new string as a copy from a null terminated character array.
  22. HK_FORCE_INLINE hkString(const char* s);
  23. /// Creates a new string as a copy from a buffer of length len.
  24. /// The copied string will automatically be null terminated.
  25. HK_FORCE_INLINE hkString(const char* b, int len);
  26. /// Creates a new string as a copy of an existing one.
  27. HK_FORCE_INLINE hkString(const hkString& s);
  28. private:
  29. /// For internal use only
  30. /// Noncopying constructor, the buffer pointed by ptr is used. Memory will be deallocated on destruction.
  31. hkString(char* ptr, int size, int capacity);
  32. /// sets the size as length+1
  33. HK_FORCE_INLINE void setLength( int length );
  34. public:
  35. /// Copy of an existing string.
  36. HK_FORCE_INLINE hkString& operator=(const hkString& s);
  37. /// Copy of an existing c string.
  38. HK_FORCE_INLINE hkString& operator=(const char* s);
  39. /// Destroys this string.
  40. HK_FORCE_INLINE ~hkString();
  41. /// Read only access the i'th character.
  42. HK_FORCE_INLINE char operator[] (int i) const;
  43. /// Sets the capacity of the string, can speed up printf operations
  44. HK_FORCE_INLINE void setCapacity(int capacity);
  45. /// Returns the capacity
  46. HK_FORCE_INLINE int getCapacity() const;
  47. /// Returns the raw data
  48. HK_FORCE_INLINE const hkArray<char>& getArray() const;
  49. /// Overwrite the current value. Arguments are the same as for ::sprintf.
  50. void printf(const char* format, ...); // member function, not HK_CALL
  51. /// Returns the first index of c given range, or -1 if not found.
  52. int indexOf (char c, int startIndex=0, int endIndex=HK_INT32_MAX) const;
  53. /// Returns the last index of c, or -1 if not found.
  54. int lastIndexOf (char c, int startIndex=0, int endIndex=HK_INT32_MAX) const;
  55. /// Read only access the internal buffer.
  56. HK_FORCE_INLINE const char* cString() const;
  57. // overload each comparison for char* to avoid creating temporary string objects.
  58. /// Returns <0,0,>0 if *this is lexicographically less than, equal to or greater than other.
  59. int compareTo(const hkString& other) const;
  60. /// Returns <0,0,>0 if *this is lexicographically less than, equal to or greater than other.
  61. int compareTo(const char* other) const;
  62. /// Returns <0,0,>0 if *this is lexicographically less than, equal to or greater than other, ignoring case.
  63. int compareToIgnoreCase(const hkString& other) const;
  64. /// Returns <0,0,>0 if *this is lexicographically less than, equal to or greater than other, ignoring case.
  65. int compareToIgnoreCase(const char* other) const;
  66. /// Convenience operator for use in map<>
  67. HK_FORCE_INLINE hkBool operator< (const hkString& s) const;
  68. /// Returns compareTo(s)==0
  69. HK_FORCE_INLINE hkBool operator== (const hkString& s) const;
  70. /// Returns compareTo(s)!=0
  71. HK_FORCE_INLINE hkBool operator!= (const hkString& s) const;
  72. /// Returns compareTo(s)==0
  73. HK_FORCE_INLINE hkBool operator== (const char* s) const;
  74. /// Returns compareTo(s)!=0
  75. HK_FORCE_INLINE hkBool operator!= (const char* s) const;
  76. /// Does this string begin with s?
  77. HK_FORCE_INLINE hkBool beginsWith(const hkString& s) const;
  78. /// Does this string begin with s?
  79. hkBool beginsWith(const char* s) const;
  80. /// Does this string end with s?
  81. hkBool endsWith(const hkString& s) const;
  82. /// Does this string end with s?
  83. hkBool endsWith(const char* s) const;
  84. /// Returns the concatenation of *this and other.
  85. hkString operator+ (const hkString& other) const;
  86. /// Returns the concatenation of *this and other.
  87. hkString operator+ (const char* other) const;
  88. /// Sets *this as the concatenation of *this and other.
  89. hkString& operator+= (const hkString& other);
  90. /// Sets *this as the concatenation of *this and other.
  91. hkString& operator+= (const char* other);
  92. /// Returns the number of characters in this string excluding the trailing NULL
  93. int getLength() const;
  94. /// Parameter to hkString::replace functions
  95. enum ReplaceType
  96. {
  97. REPLACE_ONE,
  98. REPLACE_ALL
  99. };
  100. /// Returns a new string where occurrences of 'from' have been replaced with 'to'.
  101. /// If ReplaceType==REPLACE_ONE only the first occurrence is replaced.
  102. hkString replace(char from, char to, ReplaceType=REPLACE_ALL) const;
  103. /// Replaces occurrences of 'from' with 'to'.
  104. /// If ReplaceType==REPLACE_ONE only the first occurrence is replaced. returns true if at least an occurrence is found.
  105. hkBool replaceInplace(char from, char to, ReplaceType=REPLACE_ALL);
  106. /// Returns a new string where occurrences of 'from' have been replaced with 'to'.
  107. /// If ReplaceType==REPLACE_ONE only the first occurrence is replaced.
  108. hkString replace(const hkString& from, const hkString& to, ReplaceType=REPLACE_ALL) const;
  109. /// Replaces occurrences of 'from' with 'to'.
  110. /// If ReplaceType==REPLACE_ONE only the first occurrence is replaced. returns true if at least an occurrence is found.
  111. hkBool replaceInplace(const hkString& from, const hkString& to, hkString::ReplaceType rtype=REPLACE_ALL);
  112. /// Returns a copy of the string as upper case.
  113. hkString asUpperCase() const;
  114. /// Makes the string uppercase.
  115. void makeUpperCase();
  116. /// Returns a copy of the string as lower case.
  117. hkString asLowerCase() const;
  118. /// Makes the string lowercase.
  119. void makeLowerCase();
  120. /// Returns a copy of the substring from the index onward.
  121. /// The index begins at 0.
  122. HK_FORCE_INLINE hkString substr(int index, int maxChars=HK_INT32_MAX) const;
  123. /// Sets the string as the substring from the index onward.
  124. /// The index begins at 0.
  125. HK_FORCE_INLINE void setAsSubstr(int index, int maxChars=HK_INT32_MAX);
  126. void split( int c, hkObjectArray<hkString>& bits ) const;
  127. private:
  128. /// the string is kept in an array of chars
  129. hkArray<char> m_string;
  130. public: // static methods
  131. /// Return the upper case of character c
  132. static char HK_CALL toUpper( char c );
  133. /// Return the lower case of character c
  134. static char HK_CALL toLower( char c );
  135. /// Equivalent to sprintf except at most n characters are written.
  136. static int HK_CALL snprintf(char* buf, int n, const char* fmt, ...);
  137. /// Equivalent to snprintf, but with a va_list of arguments.
  138. static int HK_CALL vsnprintf(char* buf, int len, const char* fmt, hk_va_list hkargs);
  139. /// Printf formatting to a string buffer.
  140. static int HK_CALL sprintf(char* buf, const char* fmt, ...);
  141. /// Returns <=1,0,>=1 if s1 is lexicographically less than, equal to or greater than s2.
  142. static int HK_CALL strCmp(const char* s1, const char* s2 );
  143. /// Returns <=1,0,>=1 if s1 is lexicographically less than, equal to or greater than s2. Comparison is done using at most the first n characters.
  144. static int HK_CALL strNcmp(const char* s1, const char* s2, int n);
  145. /// Returns <=1,0,>=1 if s1 is lexicographically less than, equal to or greater than s2, ignoring case.
  146. static int HK_CALL strCasecmp(const char* s1, const char* s2 );
  147. /// Returns <=1,0,>=1 if s1 is lexicographically less than, equal to or greater than s2, ignoring case. Comparison is done using at most the first n characters.
  148. static int HK_CALL strNcasecmp(const char* s1, const char* s2, int n);
  149. /// Copy null terminated src into dst. dst must be large enough to hold src.
  150. static void HK_CALL strCpy(char* dst, const char* src);
  151. /// Copy at most n characters of null terminated src into dst. dst must be large enough to hold src.
  152. static void HK_CALL strNcpy(char* dst, const char* src, int n);
  153. /// Return the length of null terminated string src.
  154. static int HK_CALL strLen(const char* src);
  155. /// Return an integer representing the string (signed, undefined for invalid input)
  156. /// If a base of 0 is specified atoi will attempt to determine the base from string prefix e.g. '0' for octal 'Ox' or 'OX' for hex
  157. static int HK_CALL atoi(const char* in, int base = 0);
  158. /// Return a hkReal representing the string.
  159. static hkReal HK_CALL atof(const char* in); 
  160. /// Return the first occurrence of needle in haystack or null if not found.
  161. static const char* HK_CALL strStr(const char* haystack, const char* needle);
  162. /// Find all the occurrences of needle in haystack and put their start indices in the array. 
  163. /// Return true if at least one was found.
  164. static hkBool HK_CALL findAllOccurrences(const char* haystack, const char* needle, hkArray<int>& indices, hkString::ReplaceType rtype);
  165. /// Return the first occurrence of needle in haystack or null if not found.
  166. static const char* HK_CALL strChr(const char* haystack, int needle);
  167. /// Return the last occurrence of needle in haystack or null if not found.
  168. static const char* HK_CALL strRchr(const char* haystack, int needle);
  169. /// Return a copy of string src. This copy is allocated using hkAllocate<char> and therefore it should be deallocated using hkDeallocate<char>
  170. static char* HK_CALL strDup(const char* src);
  171. /// Return a copy of at most maxlen characters of src.
  172. static char* HK_CALL strNdup(const char* src, int maxlen);
  173. /// Change src to lower case in place.
  174. static char* HK_CALL strLwr(char* src);
  175. /// Change src to upper case in place.
  176. static char* HK_CALL strUpr(char* src);
  177. /// Copy n bytes of src into dst.
  178. static void HK_CALL memCpy(void* dst, const void* src, int n);
  179. /// Copy n words of src into dst.
  180. static HK_FORCE_INLINE void HK_CALL memCpy4(void* dst, const void* src, int numWords);
  181. /// Copy n quad words of src into dst.
  182. static HK_FORCE_INLINE void HK_CALL memCpy16(void* dst, const void* src, int numQuads);
  183. /// Super fast copy of a constant size less than 128 bytes
  184. template<int size>
  185. static HK_FORCE_INLINE void HK_CALL memCpy16(void* dst, const void* src);
  186. /// Copy n quad words of src into dst. n must be greater than 0
  187. static HK_FORCE_INLINE void HK_CALL memCpy16NonEmpty(void* dst, const void* src, int numQuads);
  188. /// Copy 128 bytes of src into dst.
  189. static HK_FORCE_INLINE void HK_CALL memCpy128(void* dst, const void* src);
  190. /// Copy 256 bytes of src into dst.
  191. static HK_FORCE_INLINE void HK_CALL memCpy256(void* dst, const void* src);
  192. /// Copy n bytes of src into dst, possibly overlapping.
  193. static void HK_CALL memMove(void* dst, const void* src, int n);
  194. /// Set n bytes of dst to c.
  195. static void HK_CALL memSet(void* dst, const int c, int nBytes);
  196. /// Set n*4 bytes to c
  197. static HK_FORCE_INLINE void HK_CALL memSet4(void* dst, const int value, int numWords);
  198. /// Set n*16 bytes to 0
  199. static HK_FORCE_INLINE void HK_CALL memClear16(void* dst, int numQuads);
  200. /// Set n*16 bytes to c
  201. static HK_FORCE_INLINE void HK_CALL memSet16(void* dst, const void* value, int numQuads);
  202. /// Set n*16 bytes to c
  203. /// Size must be positive and a multiple of 16
  204. template<int size>
  205. static HK_FORCE_INLINE void HK_CALL memSet16(void* dst, const void* src);
  206. /// Returns <=1,0,>=1 if n bytes of buf1 is less than, equal to or greater than those of buf2.
  207. static int HK_CALL memCmp(const void* buf1, const void* buf2, int n);
  208. private:
  209. /// copy orig into dest replacing occurrences of 'from' with 'to'
  210. static void copyAndReplace( char* dest, const char* orig, int origLen, const hkString& from, const hkString& to, const hkArray<int>& indices);
  211. };
  212. # define HK_PRINTF_FORMAT_INT64 "%I64i"
  213. # define HK_PRINTF_FORMAT_UINT64 "%I64u"
  214. #if HK_POINTER_SIZE==4
  215. # define HK_PRINTF_FORMAT_ULONG "%u"
  216. #else
  217. # define HK_PRINTF_FORMAT_ULONG HK_PRINTF_FORMAT_UINT64
  218. #endif
  219. #include <Common/Base/Container/String/hkString.inl>
  220. #endif // HKBASE_HKSTRING_H
  221. /*
  222. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  223. * Confidential Information of Havok.  (C) Copyright 1999-2009
  224. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  225. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  226. * rights, and intellectual property rights in the Havok software remain in
  227. * Havok and/or its suppliers.
  228. * Use of this software for evaluation purposes is subject to and indicates
  229. * acceptance of the End User licence Agreement for this product. A copy of
  230. * the license is included with this software and is also available at www.havok.com/tryhavok.
  231. */