X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/af49c4b8a2d3553e733e71c7dd3911881f4c1a2a..be7a101366995b7b7bb76e3d5b1e7dd8fc9a1af8:/include/wx/string.h diff --git a/include/wx/string.h b/include/wx/string.h index 1c6dbc1f0b..d082d97b73 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 /////////////////////////////////////////////////////////////////////////////// /* @@ -190,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 @@ -258,7 +265,7 @@ private: bool AssignCopy(size_t, const wxChar *); // append a (sub)string - bool 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) @@ -314,7 +321,7 @@ public: // 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); } @@ -461,14 +468,16 @@ public: // 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); + 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 convertions: have to return a + // 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 @@ -801,6 +810,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 @@ -833,7 +844,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 @@ -846,6 +857,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) @@ -1259,7 +1275,7 @@ inline wxString operator+(const wxCharBuffer& buf, const wxString& string) #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&);