+ wxString s = str1;
+ s += str2;
+
+ return s;
+}
+
+wxString operator+(const wxString& str, wxUniChar ch)
+{
+#if !wxUSE_STL_BASED_WXSTRING
+ wxASSERT( str.IsValid() );
+#endif
+
+ wxString s = str;
+ s += ch;
+
+ return s;
+}
+
+wxString operator+(wxUniChar ch, const wxString& str)
+{
+#if !wxUSE_STL_BASED_WXSTRING
+ wxASSERT( str.IsValid() );
+#endif
+
+ wxString s = ch;
+ s += str;
+
+ return s;
+}
+
+wxString operator+(const wxString& str, const char *psz)
+{
+#if !wxUSE_STL_BASED_WXSTRING
+ wxASSERT( str.IsValid() );
+#endif
+
+ wxString s;
+ if ( !s.Alloc(strlen(psz) + str.length()) ) {
+ wxFAIL_MSG( _T("out of memory in wxString::operator+") );
+ }
+ s += str;
+ s += psz;
+
+ return s;
+}
+
+wxString operator+(const wxString& str, const wchar_t *pwz)
+{
+#if !wxUSE_STL_BASED_WXSTRING
+ wxASSERT( str.IsValid() );
+#endif
+
+ wxString s;
+ if ( !s.Alloc(wxWcslen(pwz) + str.length()) ) {
+ wxFAIL_MSG( _T("out of memory in wxString::operator+") );
+ }
+ s += str;
+ s += pwz;
+
+ return s;
+}
+
+wxString operator+(const char *psz, const wxString& str)
+{
+#if !wxUSE_STL_BASED_WXSTRING
+ wxASSERT( str.IsValid() );
+#endif
+
+ wxString s;
+ if ( !s.Alloc(strlen(psz) + str.length()) ) {
+ wxFAIL_MSG( _T("out of memory in wxString::operator+") );
+ }
+ s = psz;
+ s += str;
+
+ return s;
+}
+
+wxString operator+(const wchar_t *pwz, const wxString& str)
+{
+#if !wxUSE_STL_BASED_WXSTRING
+ wxASSERT( str.IsValid() );
+#endif
+
+ wxString s;
+ if ( !s.Alloc(wxWcslen(pwz) + str.length()) ) {
+ wxFAIL_MSG( _T("out of memory in wxString::operator+") );
+ }
+ s = pwz;
+ s += str;
+
+ return s;
+}
+
+// ---------------------------------------------------------------------------
+// find_{first,last}_[not]_of functions
+// ---------------------------------------------------------------------------
+
+#if !wxUSE_STL_BASED_WXSTRING || wxUSE_UNICODE_UTF8
+
+// NB: All these functions are implemented with the argument being wxChar*,
+// i.e. widechar string in any Unicode build, even though native string
+// representation is char* in the UTF-8 build. This is because we couldn't
+// use memchr() to determine if a character is in a set encoded as UTF-8.
+
+size_t wxString::find_first_of(const wxChar* sz, size_t nStart) const
+{
+ return find_first_of(sz, nStart, wxStrlen(sz));
+}
+
+size_t wxString::find_first_not_of(const wxChar* sz, size_t nStart) const
+{
+ return find_first_not_of(sz, nStart, wxStrlen(sz));
+}
+
+size_t wxString::find_first_of(const wxChar* sz, size_t nStart, size_t n) const
+{
+ wxASSERT_MSG( nStart <= length(), _T("invalid index") );
+
+ size_t idx = nStart;
+ for ( const_iterator i = begin() + nStart; i != end(); ++idx, ++i )
+ {
+ if ( wxTmemchr(sz, *i, n) )
+ return idx;
+ }
+
+ return npos;
+}
+
+size_t wxString::find_first_not_of(const wxChar* sz, size_t nStart, size_t n) const
+{
+ wxASSERT_MSG( nStart <= length(), _T("invalid index") );
+
+ size_t idx = nStart;
+ for ( const_iterator i = begin() + nStart; i != end(); ++idx, ++i )
+ {
+ if ( !wxTmemchr(sz, *i, n) )
+ return idx;
+ }
+
+ return npos;
+}
+
+
+size_t wxString::find_last_of(const wxChar* sz, size_t nStart) const
+{
+ return find_last_of(sz, nStart, wxStrlen(sz));
+}
+
+size_t wxString::find_last_not_of(const wxChar* sz, size_t nStart) const
+{
+ return find_last_not_of(sz, nStart, wxStrlen(sz));
+}
+
+size_t wxString::find_last_of(const wxChar* sz, size_t nStart, size_t n) const
+{
+ size_t len = length();
+
+ if ( nStart == npos )
+ {
+ nStart = len - 1;
+ }
+ else
+ {
+ wxASSERT_MSG( nStart <= len, _T("invalid index") );
+ }
+
+ size_t idx = nStart;
+ for ( const_reverse_iterator i = rbegin() + (len - nStart - 1);
+ i != rend(); --idx, ++i )
+ {
+ if ( wxTmemchr(sz, *i, n) )
+ return idx;
+ }