X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f172cb8200f08ba1c6735a0d507991c877c0d68f..5e0ebb716a29a8240bb855e8a01c99379d03e666:/include/wx/string.h diff --git a/include/wx/string.h b/include/wx/string.h index 8312c04a85..2e7b6ca1b6 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -78,14 +78,6 @@ class WXDLLIMPEXP_FWD_BASE wxString; #define wxMBSTRINGCAST (char *)(const char *) #define wxWCSTRINGCAST (wchar_t *)(const wchar_t *) -// like _T(), but for literals in wxString's internal representation, i.e. -// char* in UTF-8 build and wxChar* otherwise: -#if wxUSE_UNICODE_UTF8 - #define wxSTRING_TEXT(str) str -#else - #define wxSTRING_TEXT(str) _T(str) -#endif - // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -245,22 +237,12 @@ public: wxCStrData operator+(size_t n) const { return wxCStrData(m_str, m_offset + n, m_owned); } - // and these for "str.c_str() + n - 2": - wxCStrData operator-(int n) const - { - wxASSERT_MSG( n <= (int)m_offset, - _T("attempt to construct address before the beginning of the string") ); - return wxCStrData(m_str, m_offset - n, m_owned); - } - wxCStrData operator-(long n) const + // and these for "str.c_str() + (p2 - p1)" (it also works for any integer + // expression but it must be ptrdiff_t and not e.g. int to work in this + // example): + wxCStrData operator-(ptrdiff_t n) const { - wxASSERT_MSG( n <= (int)m_offset, - _T("attempt to construct address before the beginning of the string") ); - return wxCStrData(m_str, m_offset - n, m_owned); - } - wxCStrData operator-(size_t n) const - { - wxASSERT_MSG( n <= m_offset, + wxASSERT_MSG( n <= (ptrdiff_t)m_offset, _T("attempt to construct address before the beginning of the string") ); return wxCStrData(m_str, m_offset - n, m_owned); } @@ -611,25 +593,15 @@ public: return tmp; \ } \ \ - iterator_name& operator+=(int n) \ + iterator_name& operator+=(ptrdiff_t n) \ { \ m_cur = wxStringOperations::AddToIter(m_cur, n); \ return *this; \ } \ - iterator_name& operator+=(size_t n) \ - { \ - m_cur = wxStringOperations::AddToIter(m_cur, (int)n); \ - return *this; \ - } \ - iterator_name& operator-=(int n) \ + iterator_name& operator-=(ptrdiff_t n) \ { \ m_cur = wxStringOperations::AddToIter(m_cur, -n); \ return *this; \ - } \ - iterator_name& operator-=(size_t n) \ - { \ - m_cur = wxStringOperations::AddToIter(m_cur, -(int)n); \ - return *this; \ } \ \ difference_type operator-(const iterator_name& i) const \ @@ -690,14 +662,10 @@ public: reference operator*() { return wxUniCharRef::CreateForString(m_node, m_cur); } - iterator operator+(int n) const + iterator operator+(ptrdiff_t n) const { return iterator(str(), wxStringOperations::AddToIter(m_cur, n)); } - iterator operator+(size_t n) const - { return iterator(str(), wxStringOperations::AddToIter(m_cur, (int)n)); } - iterator operator-(int n) const + iterator operator-(ptrdiff_t n) const { return iterator(str(), wxStringOperations::AddToIter(m_cur, -n)); } - iterator operator-(size_t n) const - { return iterator(str(), wxStringOperations::AddToIter(m_cur, -(int)n)); } private: iterator(wxString *str, underlying_iterator ptr) @@ -731,14 +699,10 @@ public: reference operator*() const { return wxStringOperations::DecodeChar(m_cur); } - const_iterator operator+(int n) const + const_iterator operator+(ptrdiff_t n) const { return const_iterator(str(), wxStringOperations::AddToIter(m_cur, n)); } - const_iterator operator+(size_t n) const - { return const_iterator(str(), wxStringOperations::AddToIter(m_cur, (int)n)); } - const_iterator operator-(int n) const + const_iterator operator-(ptrdiff_t n) const { return const_iterator(str(), wxStringOperations::AddToIter(m_cur, -n)); } - const_iterator operator-(size_t n) const - { return const_iterator(str(), wxStringOperations::AddToIter(m_cur, -(int)n)); } private: // for internal wxString use only: @@ -766,14 +730,10 @@ public: reference operator*() { return wxUniCharRef::CreateForString(m_cur); } - iterator operator+(int n) const + iterator operator+(ptrdiff_t n) const { return iterator(wxStringOperations::AddToIter(m_cur, n)); } - iterator operator+(size_t n) const - { return iterator(wxStringOperations::AddToIter(m_cur, (int)n)); } - iterator operator-(int n) const + iterator operator-(ptrdiff_t n) const { return iterator(wxStringOperations::AddToIter(m_cur, -n)); } - iterator operator-(size_t n) const - { return iterator(wxStringOperations::AddToIter(m_cur, -(int)n)); } private: // for internal wxString use only: @@ -797,14 +757,10 @@ public: reference operator*() const { return wxStringOperations::DecodeChar(m_cur); } - const_iterator operator+(int n) const + const_iterator operator+(ptrdiff_t n) const { return const_iterator(wxStringOperations::AddToIter(m_cur, n)); } - const_iterator operator+(size_t n) const - { return const_iterator(wxStringOperations::AddToIter(m_cur, (int)n)); } - const_iterator operator-(int n) const + const_iterator operator-(ptrdiff_t n) const { return const_iterator(wxStringOperations::AddToIter(m_cur, -n)); } - const_iterator operator-(size_t n) const - { return const_iterator(wxStringOperations::AddToIter(m_cur, -(int)n)); } private: // for internal wxString use only: @@ -852,21 +808,13 @@ public: { reverse_iterator_impl tmp = *this; ++m_cur; return tmp; } // NB: explicit in the functions below is to keep BCC 5.5 happy - reverse_iterator_impl operator+(int n) const + reverse_iterator_impl operator+(ptrdiff_t n) const { return reverse_iterator_impl(m_cur - n); } - reverse_iterator_impl operator+(size_t n) const - { return reverse_iterator_impl(m_cur - n); } - reverse_iterator_impl operator-(int n) const - { return reverse_iterator_impl(m_cur + n); } - reverse_iterator_impl operator-(size_t n) const + reverse_iterator_impl operator-(ptrdiff_t n) const { return reverse_iterator_impl(m_cur + n); } - reverse_iterator_impl operator+=(int n) + reverse_iterator_impl operator+=(ptrdiff_t n) { m_cur -= n; return *this; } - reverse_iterator_impl operator+=(size_t n) - { m_cur -= n; return *this; } - reverse_iterator_impl operator-=(int n) - { m_cur += n; return *this; } - reverse_iterator_impl operator-=(size_t n) + reverse_iterator_impl operator-=(ptrdiff_t n) { m_cur += n; return *this; } unsigned operator-(const reverse_iterator_impl& i) const @@ -1560,14 +1508,23 @@ public: { return compare(s); } // same as Cmp() but not case-sensitive int CmpNoCase(const wxString& s) const; + // test for the string equality, either considering case or not // (if compareWithCase then the case matters) bool IsSameAs(const wxString& str, bool compareWithCase = true) const - { return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; } + { +#if !wxUSE_UNICODE_UTF8 + // in UTF-8 build, length() is O(n) and doing this would be _slower_ + if ( length() != str.length() ) + return false; +#endif + return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; + } bool IsSameAs(const char *str, bool compareWithCase = true) const { return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; } bool IsSameAs(const wchar_t *str, bool compareWithCase = true) const { return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; } + bool IsSameAs(const wxCStrData& str, bool compareWithCase = true) const { return IsSameAs(str.AsString(), compareWithCase); } bool IsSameAs(const wxCharBuffer& str, bool compareWithCase = true) const @@ -2645,21 +2602,13 @@ private: // string iterator operators that satisfy STL Random Access Iterator // requirements: -inline wxString::iterator operator+(int n, wxString::iterator i) - { return i + n; } -inline wxString::iterator operator+(size_t n, wxString::iterator i) - { return i + n; } -inline wxString::const_iterator operator+(int n, wxString::const_iterator i) - { return i + n; } -inline wxString::const_iterator operator+(size_t n, wxString::const_iterator i) - { return i + n; } -inline wxString::reverse_iterator operator+(int n, wxString::reverse_iterator i) +inline wxString::iterator operator+(ptrdiff_t n, wxString::iterator i) { return i + n; } -inline wxString::reverse_iterator operator+(size_t n, wxString::reverse_iterator i) +inline wxString::const_iterator operator+(ptrdiff_t n, wxString::const_iterator i) { return i + n; } -inline wxString::const_reverse_iterator operator+(int n, wxString::const_reverse_iterator i) +inline wxString::reverse_iterator operator+(ptrdiff_t n, wxString::reverse_iterator i) { return i + n; } -inline wxString::const_reverse_iterator operator+(size_t n, wxString::const_reverse_iterator i) +inline wxString::const_reverse_iterator operator+(ptrdiff_t n, wxString::const_reverse_iterator i) { return i + n; } // notice that even though for many compilers the friend declarations above are @@ -2904,12 +2853,10 @@ wxDEFINE_ALL_COMPARISONS(const wxChar *, const wxString&, wxCMP_WXCHAR_STRING) #undef wxCMP_WXCHAR_STRING -// note that there is an optimization in operator==() and !=(): we (quickly) -// checks the strings length first, before comparing their data inline bool operator==(const wxString& s1, const wxString& s2) - { return (s1.Len() == s2.Len()) && (s1.Cmp(s2) == 0); } + { return s1.IsSameAs(s2); } inline bool operator!=(const wxString& s1, const wxString& s2) - { return (s1.Len() != s2.Len()) || (s1.Cmp(s2) != 0); } + { return !s1.IsSameAs(s2); } inline bool operator< (const wxString& s1, const wxString& s2) { return s1.Cmp(s2) < 0; } inline bool operator> (const wxString& s1, const wxString& s2)