X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/628f9e95963c344a294d74c6d60c3e99b6964cd1..3b49331b7441e091fc5997b830801d76a1243f28:/include/wx/string.h diff --git a/include/wx/string.h b/include/wx/string.h index 7345c36d17..b70306b886 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -342,14 +342,16 @@ public: // We have to implement the version without template arguments manually // because of the StringReturnType<> hack, although WX_DEFINE_VARARG_FUNC // normally does it itself. It has to be a template so that we can use - // the hack, even though there's no real template parameter: - struct FormatDummyArg {} ; - + // the hack, even though there's no real template parameter. We can't move + // it to wxStrig, because it would shadow these versions of Format() then. template inline static typename StringReturnType::type - Format(const wxFormatString& fmt, FormatDummyArg dummy = FormatDummyArg()) + Format(const T& fmt) { - return DoFormatWchar(fmt); + // NB: this doesn't compile if T is not (some form of) a string; + // this makes Format's prototype equivalent to + // Format(const wxFormatString& fmt) + return DoFormatWchar(wxFormatString(fmt)); } // int Printf(const wxString& format, ...); @@ -378,8 +380,9 @@ protected: #if wxUSE_UNICODE_UTF8 // see the comment near wxString::iterator for why we need this -struct WXDLLIMPEXP_BASE wxStringIteratorNode +class WXDLLIMPEXP_BASE wxStringIteratorNode { +public: wxStringIteratorNode() : m_str(NULL), m_citer(NULL), m_iter(NULL), m_prev(NULL), m_next(NULL) {} wxStringIteratorNode(const wxString *str, @@ -1085,19 +1088,25 @@ public: void resize(size_t nSize, wxUniChar ch = wxT('\0')) { + const size_t len = length(); + if ( nSize == len) + return; + #if wxUSE_UNICODE_UTF8 - if ( !ch.IsAscii() ) + if ( nSize < len ) { - size_t len = length(); - if ( nSize == len) - return; - else if ( nSize < len ) - erase(nSize); - else - append(nSize - len, ch); + // we can't use wxStringImpl::resize() for truncating the string as it + // counts in bytes, not characters + erase(nSize); + return; } + + // we also can't use (presumably more efficient) resize() if we have to + // append characters taking more than one byte + if ( !ch.IsAscii() ) + append(nSize - len, ch); else -#endif +#endif // wxUSE_UNICODE_UTF8 m_impl.resize(nSize, (wxStringCharType)ch); } @@ -2642,8 +2651,8 @@ private: #endif // wxUSE_UNICODE_UTF8 friend class WXDLLIMPEXP_FWD_BASE wxCStrData; - friend class wxImplStringBuffer; - friend class wxImplStringBufferLength; + friend class wxStringInternalBuffer; + friend class wxStringInternalBufferLength; }; #ifdef wxNEEDS_WXSTRING_PRINTF_MIXIN @@ -2705,16 +2714,16 @@ inline wxString operator+(wchar_t ch, const wxString& string) #if !wxUSE_STL_BASED_WXSTRING // string buffer for direct access to string data in their native // representation: -class wxImplStringBuffer +class wxStringInternalBuffer { public: typedef wxStringCharType CharType; - wxImplStringBuffer(wxString& str, size_t lenWanted = 1024) + wxStringInternalBuffer(wxString& str, size_t lenWanted = 1024) : m_str(str), m_buf(NULL) { m_buf = m_str.DoGetWriteBuf(lenWanted); } - ~wxImplStringBuffer() { m_str.DoUngetWriteBuf(); } + ~wxStringInternalBuffer() { m_str.DoUngetWriteBuf(); } operator wxStringCharType*() const { return m_buf; } @@ -2722,22 +2731,22 @@ private: wxString& m_str; wxStringCharType *m_buf; - DECLARE_NO_COPY_CLASS(wxImplStringBuffer) + DECLARE_NO_COPY_CLASS(wxStringInternalBuffer) }; -class wxImplStringBufferLength +class wxStringInternalBufferLength { public: typedef wxStringCharType CharType; - wxImplStringBufferLength(wxString& str, size_t lenWanted = 1024) + wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024) : m_str(str), m_buf(NULL), m_len(0), m_lenSet(false) { m_buf = m_str.DoGetWriteBuf(lenWanted); wxASSERT(m_buf != NULL); } - ~wxImplStringBufferLength() + ~wxStringInternalBufferLength() { wxASSERT(m_lenSet); m_str.DoUngetWriteBuf(m_len); @@ -2752,13 +2761,13 @@ private: size_t m_len; bool m_lenSet; - DECLARE_NO_COPY_CLASS(wxImplStringBufferLength) + DECLARE_NO_COPY_CLASS(wxStringInternalBufferLength) }; #endif // !wxUSE_STL_BASED_WXSTRING template -class wxStringTypeBufferBase +class WXDLLIMPEXP_BASE wxStringTypeBufferBase { public: typedef T CharType; @@ -2776,7 +2785,7 @@ protected: }; template -class wxStringTypeBufferLengthBase +class WXDLLIMPEXP_BASE wxStringTypeBufferLengthBase { public: typedef T CharType; @@ -2785,12 +2794,6 @@ public: : m_str(str), m_buf(lenWanted), m_len(0), m_lenSet(false) { } - ~wxStringTypeBufferLengthBase() - { - wxASSERT(m_lenSet); - m_str.assign(m_buf.data(), m_len); - } - operator CharType*() { return m_buf.data(); } void SetLength(size_t length) { m_len = length; m_lenSet = true; } @@ -2832,30 +2835,37 @@ public: }; #if wxUSE_STL_BASED_WXSTRING -class wxImplStringBuffer : public wxStringTypeBufferBase + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase ) + +class wxStringInternalBuffer : public wxStringTypeBufferBase { public: - wxImplStringBuffer(wxString& str, size_t lenWanted = 1024) + wxStringInternalBuffer(wxString& str, size_t lenWanted = 1024) : wxStringTypeBufferBase(str, lenWanted) {} - ~wxImplStringBuffer() + ~wxStringInternalBuffer() { m_str.m_impl.assign(m_buf.data()); } - DECLARE_NO_COPY_CLASS(wxImplStringBuffer) + DECLARE_NO_COPY_CLASS(wxStringInternalBuffer) }; -class wxImplStringBufferLength : public wxStringTypeBufferLengthBase +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( + wxStringTypeBufferLengthBase ) + +class wxStringInternalBufferLength + : public wxStringTypeBufferLengthBase { public: - wxImplStringBufferLength(wxString& str, size_t lenWanted = 1024) + wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024) : wxStringTypeBufferLengthBase(str, lenWanted) {} - ~wxImplStringBufferLength() + ~wxStringInternalBufferLength() { wxASSERT(m_lenSet); m_str.m_impl.assign(m_buf.data(), m_len); } - DECLARE_NO_COPY_CLASS(wxImplStringBufferLength) + DECLARE_NO_COPY_CLASS(wxStringInternalBufferLength) }; #endif // wxUSE_STL_BASED_WXSTRING @@ -2864,10 +2874,42 @@ public: typedef wxStringTypeBuffer wxStringBuffer; typedef wxStringTypeBufferLength wxStringBufferLength; #else // if !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8 -typedef wxImplStringBuffer wxStringBuffer; -typedef wxImplStringBufferLength wxStringBufferLength; +typedef wxStringInternalBuffer wxStringBuffer; +typedef wxStringInternalBufferLength wxStringBufferLength; #endif // !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8 +#if wxUSE_UNICODE_UTF8 +typedef wxStringInternalBuffer wxUTF8StringBuffer; +typedef wxStringInternalBufferLength wxUTF8StringBufferLength; +#elif wxUSE_UNICODE_WCHAR + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase ) + +class WXDLLIMPEXP_BASE wxUTF8StringBuffer : public wxStringTypeBufferBase +{ +public: + wxUTF8StringBuffer(wxString& str, size_t lenWanted = 1024) + : wxStringTypeBufferBase(str, lenWanted) {} + ~wxUTF8StringBuffer(); + + DECLARE_NO_COPY_CLASS(wxUTF8StringBuffer) +}; + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferLengthBase ) + +class WXDLLIMPEXP_BASE wxUTF8StringBufferLength + : public wxStringTypeBufferLengthBase +{ +public: + wxUTF8StringBufferLength(wxString& str, size_t lenWanted = 1024) + : wxStringTypeBufferLengthBase(str, lenWanted) {} + ~wxUTF8StringBufferLength(); + + DECLARE_NO_COPY_CLASS(wxUTF8StringBufferLength) +}; +#endif // wxUSE_UNICODE_UTF8/wxUSE_UNICODE_WCHAR + + // --------------------------------------------------------------------------- // wxString comparison functions: operator versions are always case sensitive // --------------------------------------------------------------------------- @@ -2990,7 +3032,15 @@ WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxCharBuffer&); WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxWCharBuffer&); #endif -#endif // wxSTD_STRING_COMPATIBILITY +#if wxUSE_UNICODE && defined(HAVE_WOSTREAM) + +WXDLLIMPEXP_BASE wxSTD wostream& operator<<(wxSTD wostream&, const wxString&); +WXDLLIMPEXP_BASE wxSTD wostream& operator<<(wxSTD wostream&, const wxCStrData&); +WXDLLIMPEXP_BASE wxSTD wostream& operator<<(wxSTD wostream&, const wxWCharBuffer&); + +#endif // wxUSE_UNICODE && defined(HAVE_WOSTREAM) + +#endif // wxUSE_STD_IOSTREAM // --------------------------------------------------------------------------- // wxCStrData implementation