X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/147043343ea6b36fd07f786ab4c5d2d6f6be09e6..ae8c4b33a3272fba39c405542141e7c486b75136:/include/wx/string.h diff --git a/include/wx/string.h b/include/wx/string.h index 098df32cf7..4b02daaeb1 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -6,7 +6,7 @@ // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// /* @@ -18,7 +18,7 @@ #ifndef _WX_WXSTRINGH__ #define _WX_WXSTRINGH__ -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(__APPLE__) #pragma interface "string.h" #endif @@ -29,15 +29,12 @@ // compile the std::string compatibility functions if defined #define wxSTD_STRING_COMPATIBILITY -// define to derive wxString from wxObject (deprecated!) -#ifdef WXSTRING_IS_WXOBJECT - #undef WXSTRING_IS_WXOBJECT -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- +#include "wx/defs.h" // everybody should include this + #if defined(__WXMAC__) || defined(__VISAGECPP__) #include #endif @@ -65,29 +62,24 @@ #include // for strcasecmp() #endif // HAVE_STRINGS_H -#include "wx/defs.h" // everybody should include this #include "wx/wxchar.h" // for wxChar #include "wx/buffer.h" // for wxCharBuffer #include "wx/strconv.h" // for wxConvertXXX() macros and wxMBConv classes -#ifndef WX_PRECOMP - #ifdef WXSTRING_IS_WXOBJECT - #include "wx/object.h" // base class - #endif -#endif // !PCH - // --------------------------------------------------------------------------- // macros // --------------------------------------------------------------------------- -// 'naughty' cast +// casts [unfortunately!] needed to call some broken functions which require +// "char *" instead of "const char *" #define WXSTRINGCAST (wxChar *)(const wxChar *) #define wxCSTRINGCAST (wxChar *)(const wxChar *) #define wxMBSTRINGCAST (char *)(const char *) #define wxWCSTRINGCAST (wchar_t *)(const wchar_t *) // implementation only -#define ASSERT_VALID_INDEX(i) wxASSERT( (unsigned)(i) <= Len() ) +#define wxASSERT_VALID_INDEX(i) \ + wxASSERT_MSG( (size_t)(i) <= Len(), _T("invalid index in wxString") ) // ---------------------------------------------------------------------------- // constants @@ -109,7 +101,7 @@ const unsigned int wxSTRING_MAXLEN = UINT_MAX - 100; // ---------------------------------------------------------------------------- // global pointer to empty string -WXDLLEXPORT_DATA(extern const wxChar*) wxEmptyString; +extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxEmptyString; // --------------------------------------------------------------------------- // global functions complementing standard C string library replacements for @@ -173,17 +165,8 @@ inline int Stricmp(const char *psz1, const char *psz2) #endif // OS/compiler } -// wxSnprintf() is like snprintf() if it's available and sprintf() (always -// available, but dangerous!) if not -extern int WXDLLEXPORT wxSnprintf(wxChar *buf, size_t len, - const wxChar *format, ...); - -// and wxVsnprintf() is like vsnprintf() or vsprintf() -extern int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len, - const wxChar *format, va_list argptr); - // return an empty wxString -class WXDLLEXPORT wxString; // not yet defined +class WXDLLIMPEXP_BASE wxString; // not yet defined inline const wxString& wxGetEmptyString() { return *(wxString *)&wxEmptyString; } // --------------------------------------------------------------------------- @@ -191,7 +174,7 @@ inline const wxString& wxGetEmptyString() { return *(wxString *)&wxEmptyString; // is never used directly (but had to be put here to allow inlining) // --------------------------------------------------------------------------- -struct WXDLLEXPORT wxStringData +struct WXDLLIMPEXP_BASE wxStringData { int nRefs; // reference count size_t nDataLength, // actual string length @@ -207,12 +190,19 @@ struct WXDLLEXPORT wxStringData // lock/unlock void Lock() { if ( !IsEmpty() ) nRefs++; } - // VC++ will refuse to inline this function but profiling shows that it - // is wrong + // VC++ will refuse to inline Unlock but profiling shows that it is wrong #if defined(__VISUALC__) && (__VISUALC__ >= 1200) __forceinline #endif + // VC++ free must take place in same DLL as allocation when using non dll + // run-time library (e.g. Multithreaded instead of Multithreaded DLL) +#if defined(__VISUALC__) && defined(_MT) && !defined(_DLL) + void Unlock() { if ( !IsEmpty() && --nRefs == 0) Free(); } + // we must not inline deallocation since allocation is not inlined + void Free(); +#else void Unlock() { if ( !IsEmpty() && --nRefs == 0) free(this); } +#endif // if we had taken control over string memory (GetWriteBuf), it's // intentionally put in invalid state @@ -243,16 +233,11 @@ struct WXDLLEXPORT wxStringData // - regular expressions support // --------------------------------------------------------------------------- -#ifdef WXSTRING_IS_WXOBJECT -class WXDLLEXPORT wxString : public wxObject +class WXDLLIMPEXP_BASE wxString { - DECLARE_DYNAMIC_CLASS(wxString) -#else //WXSTRING_IS_WXOBJECT -class WXDLLEXPORT wxString -{ -#endif //WXSTRING_IS_WXOBJECT - -friend class WXDLLEXPORT wxArrayString; +#if !wxUSE_STL +friend class WXDLLIMPEXP_BASE wxArrayString; +#endif // NB: special care was taken in arranging the member functions in such order // that all inline functions can be effectively inlined, verify that all @@ -274,20 +259,20 @@ private: void Reinit() { GetStringData()->Unlock(); Init(); } // memory allocation - // allocates memory for string of lenght nLen - void AllocBuffer(size_t nLen); + // allocates memory for string of length nLen + bool AllocBuffer(size_t nLen); // copies data to another string - void AllocCopy(wxString&, int, int) const; + bool AllocCopy(wxString&, int, int) const; // effectively copies data to string - void AssignCopy(size_t, const wxChar *); + bool AssignCopy(size_t, const wxChar *); // append a (sub)string - void ConcatSelf(int nLen, const wxChar *src); + bool ConcatSelf(size_t nLen, const wxChar *src); // functions called before writing to the string: they copy it if there // are other references to our data (should be the only owner when writing) - void CopyBeforeWrite(); - void AllocBeforeWrite(size_t); + bool CopyBeforeWrite(); + bool AllocBeforeWrite(size_t); // if we hadn't made these operators private, it would be possible to // compile "wxString s; s = 17;" without any warnings as 17 is implicitly @@ -307,11 +292,12 @@ private: public: // constructors and destructor // ctor for an empty string - wxString() { Init(); } + wxString() : m_pchData(NULL) { Init(); } // copy ctor - wxString(const wxString& stringSrc) + wxString(const wxString& stringSrc) : m_pchData(NULL) { - wxASSERT( stringSrc.GetStringData()->IsValid() ); + wxASSERT_MSG( stringSrc.GetStringData()->IsValid(), + _T("did you forget to call UngetWriteBuf()?") ); if ( stringSrc.IsEmpty() ) { // nothing to do for an empty string @@ -327,31 +313,35 @@ public: // ctor takes first nLength characters from C string // (default value of wxSTRING_MAXLEN means take all the string) wxString(const wxChar *psz, size_t nLength = wxSTRING_MAXLEN) - { InitWith(psz, 0, nLength); } + : m_pchData(NULL) + { InitWith(psz, 0, nLength); } wxString(const wxChar *psz, wxMBConv& WXUNUSED(conv), size_t nLength = wxSTRING_MAXLEN) - { InitWith(psz, 0, nLength); } + : m_pchData(NULL) + { InitWith(psz, 0, nLength); } #if wxUSE_UNICODE // from multibyte string // (NB: nLength is right now number of Unicode characters, not // characters in psz! So try not to use it yet!) - wxString(const char *psz, wxMBConv& conv = wxConvLibc, size_t nLength = wxSTRING_MAXLEN); + wxString(const char *psz, wxMBConv& conv, size_t nLength = wxSTRING_MAXLEN); // from wxWCharBuffer (i.e. return from wxGetString) wxString(const wxWCharBuffer& psz) { InitWith(psz, 0, wxSTRING_MAXLEN); } #else // ANSI // from C string (for compilers using unsigned char) wxString(const unsigned char* psz, size_t nLength = wxSTRING_MAXLEN) - { InitWith((const char*)psz, 0, nLength); } + : m_pchData(NULL) + { InitWith((const char*)psz, 0, nLength); } #if wxUSE_WCHAR_T // from wide (Unicode) string - wxString(const wchar_t *pwz, wxMBConv& conv = wxConvLibc); + wxString(const wchar_t *pwz, wxMBConv& conv = wxConvLibc, size_t nLength = wxSTRING_MAXLEN); #endif // !wxUSE_WCHAR_T // from wxCharBuffer wxString(const wxCharBuffer& psz) - { InitWith(psz, 0, wxSTRING_MAXLEN); } + : m_pchData(NULL) + { InitWith(psz, 0, wxSTRING_MAXLEN); } #endif // Unicode/ANSI // dtor is not virtual, this class must not be inherited from! @@ -379,8 +369,9 @@ public: if ( !GetStringData()->IsEmpty() ) Reinit(); - wxASSERT( GetStringData()->nDataLength == 0 ); // should be empty - wxASSERT( GetStringData()->nAllocLength == 0 ); // and not own any memory + wxASSERT_MSG( !GetStringData()->nDataLength && + !GetStringData()->nAllocLength, + _T("string should be empty after Clear()") ); } // contents test @@ -394,20 +385,29 @@ public: // data access (all indexes are 0 based) // read access wxChar GetChar(size_t n) const - { ASSERT_VALID_INDEX( n ); return m_pchData[n]; } + { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; } // read/write access wxChar& GetWritableChar(size_t n) - { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; } + { wxASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; } // write access void SetChar(size_t n, wxChar ch) - { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); m_pchData[n] = ch; } + { wxASSERT_VALID_INDEX( n ); CopyBeforeWrite(); m_pchData[n] = ch; } // get last character wxChar Last() const - { wxASSERT( !IsEmpty() ); return m_pchData[Len() - 1]; } + { + wxASSERT_MSG( !IsEmpty(), _T("wxString: index out of bounds") ); + + return m_pchData[Len() - 1]; + } + // get writable last character wxChar& Last() - { wxASSERT( !IsEmpty() ); CopyBeforeWrite(); return m_pchData[Len()-1]; } + { + wxASSERT_MSG( !IsEmpty(), _T("wxString: index out of bounds") ); + CopyBeforeWrite(); + return m_pchData[Len()-1]; + } /* So why do we have all these overloaded operator[]s? A bit of history: @@ -433,36 +433,53 @@ public: // operator version of GetChar wxChar operator[](size_t n) const - { ASSERT_VALID_INDEX( n ); return m_pchData[n]; } + { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; } // operator version of GetChar wxChar operator[](int n) const - { ASSERT_VALID_INDEX( n ); return m_pchData[n]; } + { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; } // operator version of GetWriteableChar wxChar& operator[](size_t n) - { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; } + { wxASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; } #ifndef wxSIZE_T_IS_UINT // operator version of GetChar wxChar operator[](unsigned int n) const - { ASSERT_VALID_INDEX( n ); return m_pchData[n]; } + { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; } // operator version of GetWriteableChar wxChar& operator[](unsigned int n) - { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; } + { wxASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; } #endif // size_t != unsigned int // implicit conversion to C string operator const wxChar*() const { return m_pchData; } + // explicit conversion to C string (use this with printf()!) const wxChar* c_str() const { return m_pchData; } - // identical to c_str() + // identical to c_str(), for wxWin 1.6x compatibility const wxChar* wx_str() const { return m_pchData; } - // identical to c_str() + // identical to c_str(), for MFC compatibility const wxChar* GetData() const { return m_pchData; } - // conversions with (possible) format convertions: have to return a + // conversion to/from plain (i.e. 7 bit) ASCII: this is useful for + // converting numbers or strings which are certain not to contain special + // chars (typically system functions, X atoms, environment variables etc.) + // + // the behaviour of these functions with the strings containing anything + // else than 7 bit ASCII characters is undefined, use at your own risk. +#if wxUSE_UNICODE + static wxString FromAscii(const char *ascii); // string + static wxString FromAscii(const char ascii); // char + const wxCharBuffer ToAscii() const; +#else // ANSI + static wxString FromAscii(const char *ascii) { return wxString( ascii ); } + static wxString FromAscii(const char ascii) { return wxString( ascii ); } + const char *ToAscii() const { return c_str(); } +#endif // Unicode/!Unicode + + // conversions with (possible) format conversions: have to return a // buffer with temporary data // // the functions defined (in either Unicode or ANSI) mode are mb_str() to @@ -512,7 +529,8 @@ public: wxString& operator=(const wxChar *psz); #if wxUSE_UNICODE // from wxWCharBuffer - wxString& operator=(const wxWCharBuffer& psz) { return operator=((const wchar_t *)psz); } + wxString& operator=(const wxWCharBuffer& psz) + { (void) operator=((const wchar_t *)psz); return *this; } #else // ANSI // from another kind of C string wxString& operator=(const unsigned char* psz); @@ -521,7 +539,8 @@ public: wxString& operator=(const wchar_t *pwz); #endif // from wxCharBuffer - wxString& operator=(const wxCharBuffer& psz) { return operator=((const char *)psz); } + wxString& operator=(const wxCharBuffer& psz) + { (void) operator=((const char *)psz); return *this; } #endif // Unicode/ANSI // string concatenation @@ -534,7 +553,8 @@ public: // string += string wxString& operator<<(const wxString& s) { - wxASSERT( s.GetStringData()->IsValid() ); + wxASSERT_MSG( s.GetStringData()->IsValid(), + _T("did you forget to call UngetWriteBuf()?") ); ConcatSelf(s.Len(), s); return *this; @@ -554,14 +574,27 @@ public: // string += buffer (i.e. from wxGetString) #if wxUSE_UNICODE - wxString& operator<<(const wxWCharBuffer& s) { (void)operator<<((const wchar_t *)s); return *this; } - void operator+=(const wxWCharBuffer& s) { (void)operator<<((const wchar_t *)s); } -#else - wxString& operator<<(const wxCharBuffer& s) { (void)operator<<((const char *)s); return *this; } - void operator+=(const wxCharBuffer& s) { (void)operator<<((const char *)s); } -#endif + wxString& operator<<(const wxWCharBuffer& s) + { (void)operator<<((const wchar_t *)s); return *this; } + void operator+=(const wxWCharBuffer& s) + { (void)operator<<((const wchar_t *)s); } +#else // !wxUSE_UNICODE + wxString& operator<<(const wxCharBuffer& s) + { (void)operator<<((const char *)s); return *this; } + void operator+=(const wxCharBuffer& s) + { (void)operator<<((const char *)s); } +#endif // wxUSE_UNICODE/!wxUSE_UNICODE // string += C string + wxString& Append(const wxString& s) + { + // test for IsEmpty() to share the string if possible + if ( IsEmpty() ) + *this = s; + else + ConcatSelf(s.Length(), s.c_str()); + return *this; + } wxString& Append(const wxChar* psz) { ConcatSelf(wxStrlen(psz), psz); return *this; } // append count copies of given character @@ -576,15 +609,15 @@ public: // non-destructive concatenation // - friend wxString WXDLLEXPORT operator+(const wxString& string1, const wxString& string2); + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string1, const wxString& string2); // - friend wxString WXDLLEXPORT operator+(const wxString& string, wxChar ch); + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string, wxChar ch); // - friend wxString WXDLLEXPORT operator+(wxChar ch, const wxString& string); + friend wxString WXDLLIMPEXP_BASE operator+(wxChar ch, const wxString& string); // - friend wxString WXDLLEXPORT operator+(const wxString& string, const wxChar *psz); + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string, const wxChar *psz); // - friend wxString WXDLLEXPORT operator+(const wxChar *psz, const wxString& string); + friend wxString WXDLLIMPEXP_BASE operator+(const wxChar *psz, const wxString& string); // stream-like functions // insert an int into string @@ -688,33 +721,37 @@ public: // check if the string contents matches a mask containing '*' and '?' bool Matches(const wxChar *szMask) const; - // conversion to numbers: all functions return TRUE only if the whole string - // is a number and put the value of this number into the pointer provided + // conversion to numbers: all functions return TRUE only if the whole + // string is a number and put the value of this number into the pointer + // provided, the base is the numeric base in which the conversion should be + // done and must be comprised between 2 and 36 or be 0 in which case the + // standard C rules apply (leading '0' => octal, "0x" => hex) // convert to a signed integer - bool ToLong(long *val, int base = 0) const; + bool ToLong(long *val, int base = 10) const; // convert to an unsigned integer - bool ToULong(unsigned long *val, int base = 0) const; + bool ToULong(unsigned long *val, int base = 10) const; // convert to a double bool ToDouble(double *val) const; // formated input/output // as sprintf(), returns the number of characters written or < 0 on error - int Printf(const wxChar *pszFormat, ...); + // (take 'this' into account in attribute parameter count) + int Printf(const wxChar *pszFormat, ...) ATTRIBUTE_PRINTF_2; // as vprintf(), returns the number of characters written or < 0 on error int PrintfV(const wxChar* pszFormat, va_list argptr); // returns the string containing the result of Printf() to it - static wxString Format(const wxChar *pszFormat, ...); + static wxString Format(const wxChar *pszFormat, ...) ATTRIBUTE_PRINTF_1; // the same as above, but takes a va_list static wxString FormatV(const wxChar *pszFormat, va_list argptr); // raw access to string memory // ensure that string has space for at least nLen characters // only works if the data of this string is not shared - void Alloc(size_t nLen); + bool Alloc(size_t nLen); // minimize the string's memory // only works if the data of this string is not shared - void Shrink(); + bool Shrink(); // get writable buffer of at least nLen bytes. Unget() *must* be called // a.s.a.p. to put string back in a reasonable state! wxChar *GetWriteBuf(size_t nLen); @@ -732,8 +769,9 @@ public: // values for first parameter of Strip function enum stripType {leading = 0x1, trailing = 0x2, both = 0x3}; - // use Printf() - int sprintf(const wxChar *pszFormat, ...); + // use Printf() + // (take 'this' into account in attribute parameter count) + int sprintf(const wxChar *pszFormat, ...) ATTRIBUTE_PRINTF_2; // use Cmp() inline int CompareTo(const wxChar* psz, caseCompare cmp = exact) const @@ -774,6 +812,8 @@ public: // standard types typedef wxChar value_type; + typedef size_t size_type; + typedef value_type *iterator; typedef const value_type *const_iterator; // an 'invalid' value for string index @@ -782,8 +822,11 @@ public: // constructors // take nLen chars starting at nPos wxString(const wxString& str, size_t nPos, size_t nLen) + : m_pchData(NULL) { - wxASSERT( str.GetStringData()->IsValid() ); + wxASSERT_MSG( str.GetStringData()->IsValid(), + _T("did you forget to call UngetWriteBuf()?") ); + InitWith(str.c_str(), nPos, nLen == npos ? 0 : nLen); } // take all characters from pStart to pEnd @@ -803,7 +846,7 @@ public: // returns true if the string is empty bool empty() const { return IsEmpty(); } // inform string about planned change in size - void reserve(size_t size) { Alloc(size); } + void reserve(size_t sz) { Alloc(sz); } // lib.string.access // return the character at position n @@ -816,6 +859,11 @@ public: // position one after the last valid one const_iterator end() const { return wx_str() + length(); } + // first valid index position + iterator begin() { CopyBeforeWrite(); return m_pchData; } + // position one after the last valid one + iterator end() { CopyBeforeWrite(); return m_pchData + length(); } + // lib.string.modifiers // append a string wxString& append(const wxString& str) @@ -966,133 +1014,21 @@ public: #endif // wxSTD_STRING_COMPATIBILITY }; -// ---------------------------------------------------------------------------- -// The string array uses it's knowledge of internal structure of the wxString -// class to optimize string storage. Normally, we would store pointers to -// string, but as wxString is, in fact, itself a pointer (sizeof(wxString) is -// sizeof(char *)) we store these pointers instead. The cast to "wxString *" is -// really all we need to turn such pointer into a string! -// -// Of course, it can be called a dirty hack, but we use twice less memory and -// this approach is also more speed efficient, so it's probably worth it. -// -// Usage notes: when a string is added/inserted, a new copy of it is created, -// so the original string may be safely deleted. When a string is retrieved -// from the array (operator[] or Item() method), a reference is returned. -// ---------------------------------------------------------------------------- - -class WXDLLEXPORT wxArrayString -{ -public: - // type of function used by wxArrayString::Sort() - typedef int (*CompareFunction)(const wxString& first, - const wxString& second); - - // constructors and destructor - // default ctor: if autoSort is TRUE, the array is always sorted (in - // alphabetical order) - wxArrayString(bool autoSort = FALSE); - // copy ctor - wxArrayString(const wxArrayString& array); - // assignment operator - wxArrayString& operator=(const wxArrayString& src); - // not virtual, this class should not be derived from - ~wxArrayString(); - - // memory management - // empties the list, but doesn't release memory - void Empty(); - // empties the list and releases memory - void Clear(); - // preallocates memory for given number of items - void Alloc(size_t nCount); - // minimzes the memory usage (by freeing all extra memory) - void Shrink(); - - // simple accessors - // number of elements in the array - size_t GetCount() const { return m_nCount; } - // is it empty? - bool IsEmpty() const { return m_nCount == 0; } - // number of elements in the array (GetCount is preferred API) - size_t Count() const { return m_nCount; } - - // items access (range checking is done in debug version) - // get item at position uiIndex - wxString& Item(size_t nIndex) const - { wxASSERT( nIndex < m_nCount ); return *(wxString *)&(m_pItems[nIndex]); } - // same as Item() - wxString& operator[](size_t nIndex) const { return Item(nIndex); } - // get last item - wxString& Last() const { wxASSERT( !IsEmpty() ); return Item(Count() - 1); } - - // item management - // Search the element in the array, starting from the beginning if - // bFromEnd is FALSE or from end otherwise. If bCase, comparison is case - // sensitive (default). Returns index of the first item matched or - // wxNOT_FOUND - int Index (const wxChar *sz, bool bCase = TRUE, bool bFromEnd = FALSE) const; - // add new element at the end (if the array is not sorted), return its - // index - size_t Add(const wxString& str); - // add new element at given position - void Insert(const wxString& str, size_t uiIndex); - // expand the array to have count elements - void SetCount(size_t count); - // remove first item matching this value - void Remove(const wxChar *sz); - // remove item by index - void Remove(size_t nIndex); - void RemoveAt(size_t nIndex) { Remove(nIndex); } - - // sorting - // sort array elements in alphabetical order (or reversed alphabetical - // order if reverseOrder parameter is TRUE) - void Sort(bool reverseOrder = FALSE); - // sort array elements using specified comparaison function - void Sort(CompareFunction compareFunction); - - // comparison - // compare two arrays case sensitively - bool operator==(const wxArrayString& a) const; - // compare two arrays case sensitively - bool operator!=(const wxArrayString& a) const { return !(*this == a); } - -protected: - void Copy(const wxArrayString& src); // copies the contents of another array - -private: - void Grow(); // makes array bigger if needed - void Free(); // free all the strings stored - - void DoSort(); // common part of all Sort() variants - - size_t m_nSize, // current size of the array - m_nCount; // current number of elements - - wxChar **m_pItems; // pointer to data - - bool m_autoSort; // if TRUE, keep the array always sorted -}; - -class WXDLLEXPORT wxSortedArrayString : public wxArrayString -{ -public: - wxSortedArrayString() : wxArrayString(TRUE) - { } - wxSortedArrayString(const wxArrayString& array) : wxArrayString(TRUE) - { Copy(array); } -}; +// define wxArrayString, for compatibility +#if WXWIN_COMPATIBILITY_2_4 && !wxUSE_STL + #include "wx/arrstr.h" +#endif // ---------------------------------------------------------------------------- // wxStringBuffer: a tiny class allowing to get a writable pointer into string // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxStringBuffer +class WXDLLIMPEXP_BASE wxStringBuffer { public: wxStringBuffer(wxString& str, size_t lenWanted = 1024) - : m_str(str) { m_buf = m_str.GetWriteBuf(lenWanted); } + : m_str(str), m_buf(NULL) + { m_buf = m_str.GetWriteBuf(lenWanted); } ~wxStringBuffer() { m_str.UngetWriteBuf(); } @@ -1101,6 +1037,8 @@ public: private: wxString& m_str; wxChar *m_buf; + + DECLARE_NO_COPY_CLASS(wxStringBuffer) }; // --------------------------------------------------------------------------- @@ -1170,11 +1108,11 @@ inline bool operator!=(const wxCharBuffer& s1, const wxString& s2) { return (s2.Cmp((const char *)s1) != 0); } #endif // wxUSE_UNICODE/!wxUSE_UNICODE -wxString WXDLLEXPORT operator+(const wxString& string1, const wxString& string2); -wxString WXDLLEXPORT operator+(const wxString& string, wxChar ch); -wxString WXDLLEXPORT operator+(wxChar ch, const wxString& string); -wxString WXDLLEXPORT operator+(const wxString& string, const wxChar *psz); -wxString WXDLLEXPORT operator+(const wxChar *psz, const wxString& string); +wxString WXDLLIMPEXP_BASE operator+(const wxString& string1, const wxString& string2); +wxString WXDLLIMPEXP_BASE operator+(const wxString& string, wxChar ch); +wxString WXDLLIMPEXP_BASE operator+(wxChar ch, const wxString& string); +wxString WXDLLIMPEXP_BASE operator+(const wxString& string, const wxChar *psz); +wxString WXDLLIMPEXP_BASE operator+(const wxChar *psz, const wxString& string); #if wxUSE_UNICODE inline wxString operator+(const wxString& string, const wxWCharBuffer& buf) { return string + (const wchar_t *)buf; } @@ -1192,14 +1130,14 @@ inline wxString operator+(const wxCharBuffer& buf, const wxString& string) // --------------------------------------------------------------------------- // don't pollute the library user's name space -#undef ASSERT_VALID_INDEX +#undef wxASSERT_VALID_INDEX #if defined(wxSTD_STRING_COMPATIBILITY) && wxUSE_STD_IOSTREAM -#include "wx/ioswrap.h" +#include "wx/iosfwrap.h" -WXDLLEXPORT wxSTD istream& operator>>(wxSTD istream&, wxString&); -WXDLLEXPORT wxSTD ostream& operator<<(wxSTD ostream&, const wxString&); +WXDLLIMPEXP_BASE wxSTD istream& operator>>(wxSTD istream&, wxString&); +WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxString&); #endif // wxSTD_STRING_COMPATIBILITY