X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/39c20230ba7ca49fbdfd7c558b4669ddc15ba4aa..7ee7191cee3842b45a27908fb7219e29c7f8f24d:/include/wx/string.h?ds=sidebyside diff --git a/include/wx/string.h b/include/wx/string.h index 04483f3e12..813dc956aa 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -59,7 +59,7 @@ #include "wx/stringops.h" #include "wx/unichar.h" -class WXDLLIMPEXP_BASE wxString; +class WXDLLIMPEXP_FWD_BASE wxString; // unless this symbol is predefined to disable the compatibility functions, do // use them @@ -276,7 +276,7 @@ private: size_t m_offset; bool m_owned; - friend class WXDLLIMPEXP_BASE wxString; + friend class WXDLLIMPEXP_FWD_BASE wxString; }; // ---------------------------------------------------------------------------- @@ -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, ...); @@ -652,13 +654,13 @@ public: /* for internal wxString use only: */ \ underlying_iterator impl() const { return m_cur; } \ \ - friend class WXDLLIMPEXP_BASE wxString; \ - friend class WXDLLIMPEXP_BASE wxCStrData; \ + friend class wxString; \ + friend class wxCStrData; \ \ private: \ underlying_iterator m_cur - class WXDLLIMPEXP_BASE const_iterator; + class WXDLLIMPEXP_FWD_BASE const_iterator; #if wxUSE_UNICODE_UTF8 // NB: In UTF-8 build, (non-const) iterator needs to keep reference @@ -1202,17 +1204,20 @@ public: // implicit conversion to C string operator wxCStrData() const { return c_str(); } - // these operators conflict with operators for conversion to std::string, - // so they must be disabled in STL build: + // the first two operators conflict with operators for conversion to + // std::string and they must be disabled in STL build; the next one only + // makes sense if conversions to char* are also defined and not defining it + // in STL build also helps us to get more clear error messages for the code + // which relies on implicit conversion to char* in STL build #if !wxUSE_STL operator const char*() const { return c_str(); } operator const wchar_t*() const { return c_str(); } -#endif // implicit conversion to untyped pointer for compatibility with previous // wxWidgets versions: this is the same as conversion to const char * so it // may fail! operator const void*() const { return c_str(); } +#endif // wxUSE_STL // identical to c_str(), for MFC compatibility const wxCStrData GetData() const { return c_str(); } @@ -1235,18 +1240,25 @@ 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, size_t len); // string - static wxString FromAscii(const char *ascii); // string - static wxString FromAscii(const char ascii); // char + static wxString FromAscii(const char *ascii, size_t len); + static wxString FromAscii(const char *ascii); + static wxString FromAscii(char ascii); const wxCharBuffer ToAscii() const; #else // ANSI static wxString FromAscii(const char *ascii) { return wxString( ascii ); } static wxString FromAscii(const char *ascii, size_t len) { return wxString( ascii, len ); } - static wxString FromAscii(const char ascii) { return wxString( ascii ); } + static wxString FromAscii(char ascii) { return wxString( ascii ); } const char *ToAscii() const { return c_str(); } #endif // Unicode/!Unicode + // also provide unsigned char overloads as signed/unsigned doesn't matter + // for 7 bit ASCII characters + static wxString FromAscii(const unsigned char *ascii) + { return FromAscii((const char *)ascii); } + static wxString FromAscii(const unsigned char *ascii, size_t len) + { return FromAscii((const char *)ascii, len); } + // conversion to/from UTF-8: #if wxUSE_UNICODE_UTF8 static wxString FromUTF8(const char *utf8) @@ -2627,11 +2639,11 @@ private: wxStringIteratorNodeHead m_iterators; - friend class WXDLLIMPEXP_BASE wxStringIteratorNode; - friend class WXDLLIMPEXP_BASE wxUniCharRef; + friend class WXDLLIMPEXP_FWD_BASE wxStringIteratorNode; + friend class WXDLLIMPEXP_FWD_BASE wxUniCharRef; #endif // wxUSE_UNICODE_UTF8 - friend class WXDLLIMPEXP_BASE wxCStrData; + friend class WXDLLIMPEXP_FWD_BASE wxCStrData; friend class wxImplStringBuffer; friend class wxImplStringBufferLength; }; @@ -2686,16 +2698,7 @@ inline wxString operator+(wchar_t ch, const wxString& string) { return wxUniChar(ch) + string; } -#if wxUSE_STL_BASED_WXSTRING - // return an empty wxString (not very useful with wxUSE_STL == 1) - inline const wxString wxGetEmptyString() { return wxString(); } -#else // !wxUSE_STL_BASED_WXSTRING - // return an empty wxString (more efficient than wxString() here) - inline const wxString& wxGetEmptyString() - { - return *(wxString *)&wxEmptyString; - } -#endif // wxUSE_STL_BASED_WXSTRING/!wxUSE_STL_BASED_WXSTRING +#define wxGetEmptyString() wxString() // ---------------------------------------------------------------------------- // wxStringBuffer: a tiny class allowing to get a writable pointer into string @@ -3010,7 +3013,7 @@ inline wxCStrData::wxCStrData(const wxCStrData& data) inline wxCStrData::~wxCStrData() { if ( m_owned ) - delete m_str; + delete wx_const_cast(wxString*, m_str); // cast to silence warnings } // simple cases for AsChar() and AsWChar(), the complicated ones are @@ -3126,7 +3129,7 @@ void wxStringIteratorNode::DoSet(const wxString *str, wxStringImpl::const_iterator *citer, wxStringImpl::iterator *iter) { - m_next = m_prev = NULL; + m_prev = NULL; m_iter = iter; m_citer = citer; m_str = str; @@ -3137,6 +3140,10 @@ void wxStringIteratorNode::DoSet(const wxString *str, if ( m_next ) m_next->m_prev = this; } + else + { + m_next = NULL; + } } void wxStringIteratorNode::clear()