Shadowrun: Awakened 29 September 2011 - Build 871
RakString.h
Go to the documentation of this file.
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.

GNU Lesser General Public License 3 Sourceforge.net