X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c16471b6e8b08bd7d02c4c4988a06f46b83634e1..77c46f00b51b8476ec53691dabbc2fa8a7f6a165:/include/wx/string.h diff --git a/include/wx/string.h b/include/wx/string.h index 0d8bcc184c..2daf622c90 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: string.h +// Name: wx/string.h // Purpose: wxString and wxArrayString classes // Author: Vadim Zeitlin // Modified by: @@ -11,14 +11,14 @@ /* Efficient string class [more or less] compatible with MFC CString, - wxWindows version 1 wxString and std::string and some handy functions + wxWidgets version 1 wxString and std::string and some handy functions missing from string.h. */ #ifndef _WX_WXSTRINGH__ #define _WX_WXSTRINGH__ -#if defined(__GNUG__) && !defined(__APPLE__) +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma interface "string.h" #endif @@ -32,10 +32,6 @@ #include #endif -#ifdef __EMX__ - #include -#endif - #if defined(__VISAGECPP__) && __IBMCPP__ >= 400 // problem in VACPP V4 with including stdlib.h multiple times // strconv includes it anyway @@ -51,9 +47,9 @@ # include #endif -#ifdef HAVE_STRINGS_H +#ifdef HAVE_STRCASECMP_IN_STRINGS_H #include // for strcasecmp() -#endif // HAVE_STRINGS_H +#endif // HAVE_STRCASECMP_IN_STRINGS_H #include "wx/wxchar.h" // for wxChar #include "wx/buffer.h" // for wxCharBuffer @@ -138,7 +134,9 @@ inline int Stricmp(const char *psz1, const char *psz2) return stricmp(psz1, psz2); #elif defined(__WXPM__) return stricmp(psz1, psz2); -#elif defined(__UNIX__) || defined(__GNUWIN32__) +#elif defined(HAVE_STRCASECMP_IN_STRING_H) || \ + defined(HAVE_STRCASECMP_IN_STRINGS_H) || \ + defined(__GNUWIN32__) return strcasecmp(psz1, psz2); #elif defined(__MWERKS__) && !defined(__INTEL__) register char c1, c2; @@ -177,7 +175,7 @@ inline const wxString& wxGetEmptyString() { return *(wxString *)&wxEmptyString; #include "wx/afterstd.h" #if wxUSE_UNICODE - #if HAVE_STD_WSTRING + #ifdef HAVE_STD_WSTRING typedef std::wstring wxStringBase; #else typedef std::basic_string wxStringBase; @@ -187,7 +185,7 @@ inline const wxString& wxGetEmptyString() { return *(wxString *)&wxEmptyString; #endif #if (defined(__GNUG__) && (__GNUG__ < 3)) || \ - (defined(_MSC_VER) && (_MSC_VER <= 1100)) + (defined(_MSC_VER) && (_MSC_VER <= 1200)) #define wxSTRING_BASE_HASNT_CLEAR #endif @@ -243,6 +241,9 @@ class WXDLLIMPEXP_BASE wxStringBase #if !wxUSE_STL friend class WXDLLIMPEXP_BASE wxArrayString; #endif +public : + // an 'invalid' value for string index, moved to this place due to a CW bug + static const size_t npos; protected: // points to data preceded by wxStringData structure with ref count info wxChar *m_pchData; @@ -291,9 +292,6 @@ public: typedef value_type *iterator; typedef const value_type *const_iterator; - // an 'invalid' value for string index - static const size_t npos; - // constructors and destructor // ctor for an empty string wxStringBase() { Init(); } @@ -335,8 +333,21 @@ public: wxStringBase(const void *pStart, const void *pEnd); // dtor is not virtual, this class must not be inherited from! - ~wxStringBase() { GetStringData()->Unlock(); } + ~wxStringBase() + { +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) + //RN - according to the above VC++ does indeed inline this, + //even though it spits out two warnings + #pragma warning (disable:4714) +#endif + GetStringData()->Unlock(); + } + +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) + //re-enable inlining warning + #pragma warning (default:4714) +#endif // overloaded assignment // from another wxString wxStringBase& operator=(const wxStringBase& stringSrc); @@ -418,9 +429,9 @@ public: const_iterator end() const { return m_pchData + length(); } // first valid index position - iterator begin() { CopyBeforeWrite(); return m_pchData; } + iterator begin(); // position one after the last valid one - iterator end() { CopyBeforeWrite(); return m_pchData + length(); } + iterator end(); // insert another string wxStringBase& insert(size_t nPos, const wxStringBase& str) @@ -443,7 +454,7 @@ public: wxStringBase& insert(size_t nPos, size_t n, wxChar ch) { return insert(nPos, wxStringBase(n, ch)); } iterator insert(iterator it, wxChar ch) - { size_t idx = it - begin(); insert(idx, 1, ch); return begin() + idx; } + { size_t idx = it - begin(); insert(idx, 1, ch); return begin() + idx; } void insert(iterator it, const_iterator first, const_iterator last) { insert(it - begin(), first, last - first); } void insert(iterator it, size_type n, wxChar ch) @@ -505,11 +516,9 @@ public: size_t find(const wxChar* sz, size_t nStart = 0, size_t n = npos) const; #endif // VC++ 1.5 - // Gives a duplicate symbol (presumably a case-insensitivity problem) -#if !defined(__BORLANDC__) // find the first occurence of character ch after nStart size_t find(wxChar ch, size_t nStart = 0) const; -#endif + // rfind() family is exactly like find() but works right to left // as find, but from the end @@ -529,6 +538,7 @@ public: { return find_first_of(str.c_str(), nStart); } // same as above size_t find_first_of(const wxChar* sz, size_t nStart = 0) const; + size_t find_first_of(const wxChar* sz, size_t nStart, size_t n) const; // same as find(char, size_t) size_t find_first_of(wxChar c, size_t nStart = 0) const { return find(c, nStart); } @@ -537,6 +547,7 @@ public: { return find_last_of(str.c_str(), nStart); } // same as above size_t find_last_of (const wxChar* sz, size_t nStart = npos) const; + size_t find_last_of(const wxChar* sz, size_t nStart, size_t n) const; // same as above size_t find_last_of(wxChar c, size_t nStart = npos) const { return rfind(c, nStart); } @@ -548,13 +559,15 @@ public: { return find_first_not_of(str.c_str(), nStart); } // same as above size_t find_first_not_of(const wxChar* sz, size_t nStart = 0) const; + size_t find_first_not_of(const wxChar* sz, size_t nStart, size_t n) const; // same as above size_t find_first_not_of(wxChar ch, size_t nStart = 0) const; // as strcspn() size_t find_last_not_of(const wxStringBase& str, size_t nStart = npos) const - { return find_first_not_of(str.c_str(), nStart); } + { return find_last_not_of(str.c_str(), nStart); } // same as above size_t find_last_not_of(const wxChar* sz, size_t nStart = npos) const; + size_t find_last_not_of(const wxChar* sz, size_t nStart, size_t n) const; // same as above size_t find_last_not_of(wxChar ch, size_t nStart = npos) const; @@ -662,8 +675,6 @@ public: #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, size_t nLength = npos); // from wxWCharBuffer (i.e. return from wxGetString) wxString(const wxWCharBuffer& psz) : wxStringBase(psz.data()) { } @@ -679,7 +690,7 @@ public: // from wxCharBuffer wxString(const wxCharBuffer& psz) - : wxStringBase(psz, npos) { } + : wxStringBase(psz) { } #endif // Unicode/ANSI // generic attributes & operations @@ -1082,7 +1093,7 @@ public: void UngetWriteBuf(size_t nLen); #endif - // wxWindows version 1 compatibility functions + // wxWidgets version 1 compatibility functions // use Mid() wxString SubString(size_t from, size_t to) const @@ -1138,7 +1149,7 @@ public: : wxStringBase(str, nPos, nLen) { } // take all characters from pStart to pEnd wxString(const void *pStart, const void *pEnd) - : wxStringBase((const char*)pStart, (const char*)pEnd) { } + : wxStringBase((const wxChar*)pStart, (const wxChar*)pEnd) { } #if wxUSE_STL wxString(const_iterator first, const_iterator last) : wxStringBase(first, last) { } @@ -1211,7 +1222,7 @@ public: wxString& insert(size_t nPos, size_t n, wxChar ch) { return (wxString&)wxStringBase::insert(nPos, n, ch); } iterator insert(iterator it, wxChar ch) - { return wxStringBase::insert(it, ch); } + { return wxStringBase::insert(it, ch); } void insert(iterator it, const_iterator first, const_iterator last) { wxStringBase::insert(it, first, last); } void insert(iterator it, size_type n, wxChar ch)