![]() |
Shadowrun: Awakened 29 September 2011 - Build 871
|
00001 #ifndef __RAK_STRING_H 00002 #define __RAK_STRING_H 00003 00004 #include "Export.h" 00005 #include "DS_List.h" 00006 #include "RakNetTypes.h" // int64_t 00007 #include <stdio.h> 00008 #include "stdarg.h" 00009 00010 00011 #ifdef _WIN32 00012 00013 00014 00015 #include "WindowsIncludes.h" 00016 #endif 00017 00018 namespace RakNet 00019 { 00021 class SimpleMutex; 00022 class BitStream; 00023 00029 class RAK_DLL_EXPORT RakString 00030 { 00031 public: 00032 // Constructors 00033 RakString(); 00034 RakString(char input); 00035 RakString(unsigned char input); 00036 RakString(const unsigned char *format, ...); 00037 RakString(const char *format, ...); 00038 ~RakString(); 00039 RakString( const RakString & rhs); 00040 00042 operator const char* () const {return sharedString->c_str;} 00043 00045 const char *C_String(void) const {return sharedString->c_str;} 00046 00047 // Lets you modify the string. Do not make the string longer - however, you can make it shorter, or change the contents. 00048 // Pointer is only valid in the scope of RakString itself 00049 char *C_StringUnsafe(void) {Clone(); return sharedString->c_str;} 00050 00052 RakString& operator = ( const RakString& rhs ); 00053 RakString& operator = ( const char *str ); 00054 RakString& operator = ( char *str ); 00055 RakString& operator = ( const unsigned char *str ); 00056 RakString& operator = ( char unsigned *str ); 00057 RakString& operator = ( const char c ); 00058 00060 RakString& operator +=( const RakString& rhs); 00061 RakString& operator += ( const char *str ); 00062 RakString& operator += ( char *str ); 00063 RakString& operator += ( const unsigned char *str ); 00064 RakString& operator += ( char unsigned *str ); 00065 RakString& operator += ( const char c ); 00066 00068 unsigned char operator[] ( const unsigned int position ) const; 00069 00070 #ifdef _WIN32 00071 // Return as Wide char 00072 // Deallocate with DeallocWideChar 00073 WCHAR * ToWideChar(void); 00074 void DeallocWideChar(WCHAR * w); 00075 #endif 00076 00083 size_t Find(const char *stringToFind,size_t pos = 0 ); 00084 00086 bool operator==(const RakString &rhs) const; 00087 bool operator==(const char *str) const; 00088 bool operator==(char *str) const; 00089 00090 // Comparison 00091 bool operator < ( const RakString& right ) const; 00092 bool operator <= ( const RakString& right ) const; 00093 bool operator > ( const RakString& right ) const; 00094 bool operator >= ( const RakString& right ) const; 00095 00097 bool operator!=(const RakString &rhs) const; 00098 bool operator!=(const char *str) const; 00099 bool operator!=(char *str) const; 00100 00102 const char * ToLower(void); 00103 00105 const char * ToUpper(void); 00106 00108 void Set(const char *format, ...); 00109 00117 RakString Assign(const char *str,size_t pos, size_t n ); 00118 00120 bool IsEmpty(void) const; 00121 00123 size_t GetLength(void) const; 00124 00126 void Replace(unsigned index, unsigned count, unsigned char c); 00127 00129 void SetChar( unsigned index, unsigned char c ); 00130 00132 void SetChar( unsigned index, RakNet::RakString s ); 00133 00135 void Truncate(unsigned length); 00136 00137 // Gets the substring starting at index for count characters 00138 RakString SubStr(unsigned int index, unsigned int count) const; 00139 00141 void Erase(unsigned int index, unsigned int count); 00142 00144 void TerminateAtFirstCharacter(char c); 00146 void TerminateAtLastCharacter(char c); 00147 00149 void RemoveCharacter(char c); 00150 00153 static RakNet::RakString NonVariadic(const char *str); 00154 00156 static unsigned long ToInteger(const char *str); 00157 static unsigned long ToInteger(const RakString &rs); 00158 00159 // Like strncat, but for a fixed length 00160 void AppendBytes(const char *bytes, unsigned int count); 00161 00163 int StrCmp(const RakString &rhs) const; 00164 00166 int StrICmp(const RakString &rhs) const; 00167 00169 void Clear(void); 00170 00172 void Printf(void); 00173 00175 void FPrintf(FILE *fp); 00176 00178 bool IPAddressMatch(const char *IP); 00179 00181 bool ContainsNonprintableExceptSpaces(void) const; 00182 00184 bool IsEmailAddress(void) const; 00185 00187 RakNet::RakString& URLEncode(void); 00188 00190 RakNet::RakString& URLDecode(void); 00191 00193 void SplitURI(RakNet::RakString &header, RakNet::RakString &domain, RakNet::RakString &path); 00194 00196 RakNet::RakString& SQLEscape(void); 00197 00199 RakNet::RakString& MakeFilePath(void); 00200 00203 static void FreeMemory(void); 00205 static void FreeMemoryNoMutex(void); 00206 00209 void Serialize(BitStream *bs) const; 00210 00212 static void Serialize(const char *str, BitStream *bs); 00213 00219 void SerializeCompressed(BitStream *bs, uint8_t languageId=0, bool writeLanguageId=false) const; 00220 00222 static void SerializeCompressed(const char *str, BitStream *bs, uint8_t languageId=0, bool writeLanguageId=false); 00223 00227 bool Deserialize(BitStream *bs); 00228 00230 static bool Deserialize(char *str, BitStream *bs); 00231 00237 bool DeserializeCompressed(BitStream *bs, bool readLanguageId=false); 00238 00240 static bool DeserializeCompressed(char *str, BitStream *bs, bool readLanguageId=false); 00241 00242 static const char *ToString(int64_t i); 00243 static const char *ToString(uint64_t i); 00244 00246 static size_t GetSizeToAllocate(size_t bytes) 00247 { 00248 const size_t smallStringSize = 128-sizeof(unsigned int)-sizeof(size_t)-sizeof(char*)*2; 00249 if (bytes<=smallStringSize) 00250 return smallStringSize; 00251 else 00252 return bytes*2; 00253 } 00254 00256 struct SharedString 00257 { 00258 SimpleMutex *refCountMutex; 00259 unsigned int refCount; 00260 size_t bytesUsed; 00261 char *bigString; 00262 char *c_str; 00263 char smallString[128-sizeof(unsigned int)-sizeof(size_t)-sizeof(char*)*2]; 00264 }; 00265 00267 RakString( SharedString *_sharedString ); 00268 00270 SharedString *sharedString; 00271 00272 // static SimpleMutex poolMutex; 00273 // static DataStructures::MemoryPool<SharedString> pool; 00275 static SharedString emptyString; 00276 00277 //static SharedString *sharedStringFreeList; 00278 //static unsigned int sharedStringFreeListAllocationCount; 00281 static DataStructures::List<SharedString*> freeList; 00282 00283 static int RakStringComp( RakString const &key, RakString const &data ); 00284 00285 static void LockMutex(void); 00286 static void UnlockMutex(void); 00287 00288 protected: 00289 void Allocate(size_t len); 00290 void Assign(const char *str); 00291 void Assign(const char *str, va_list ap); 00292 00293 void Clone(void); 00294 void Free(void); 00295 unsigned char ToLower(unsigned char c); 00296 unsigned char ToUpper(unsigned char c); 00297 void Realloc(SharedString *sharedString, size_t bytes); 00298 }; 00299 00300 } 00301 00302 const RakNet::RakString RAK_DLL_EXPORT operator+(const RakNet::RakString &lhs, const RakNet::RakString &rhs); 00303 00304 00305 #endif
Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.