Add wxString::ToStdString() and ToStdWstring().

These trivial helper functions are available in all builds (provided that
wxUSE_STD_STRING is not explicitly set to non-default 0 value) unlike implicit
conversions to std::[w]string which are only available when wxUSE_STL==1.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63938 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-04-11 11:08:49 +00:00
parent 13f0c85aa4
commit e3ab69523b
4 changed files with 70 additions and 10 deletions

View File

@@ -440,6 +440,7 @@ All:
- Don't crash when input is empty in wxFileConfig ctor (Lukasz Michalski). - Don't crash when input is empty in wxFileConfig ctor (Lukasz Michalski).
- Correct wxSocket::Peek() to not block (Anders Larsen). - Correct wxSocket::Peek() to not block (Anders Larsen).
- Added IEC and SI units support to GetHumanReadableSize() (Julien Weinzorn). - Added IEC and SI units support to GetHumanReadableSize() (Julien Weinzorn).
- Add convenient wxString::ToStd{String,Wstring}() helpers.
Unix: Unix:

View File

@@ -1341,14 +1341,18 @@ public:
// Unlike ctor from std::string, we provide conversion to std::string only // Unlike ctor from std::string, we provide conversion to std::string only
// if wxUSE_STL and not merely wxUSE_STD_STRING (which is on by default), // if wxUSE_STL and not merely wxUSE_STD_STRING (which is on by default),
// because it conflicts with operator const char/wchar_t*: // because it conflicts with operator const char/wchar_t* but we still
#if wxUSE_STL // provide explicit conversions to std::[w]string for convenience in any case
#if wxUSE_STD_STRING
// We can avoid a copy if we already use this string type internally,
// otherwise we create a copy on the fly:
#if wxUSE_UNICODE_WCHAR && wxUSE_STL_BASED_WXSTRING #if wxUSE_UNICODE_WCHAR && wxUSE_STL_BASED_WXSTRING
// wxStringImpl is std::string in the encoding we want #define wxStringToStdWstringRetType const wxStdWideString&
operator const wxStdWideString&() const { return m_impl; } const wxStdWideString& ToStdWstring() const { return m_impl; }
#else #else
// wxStringImpl is either not std::string or needs conversion // wxStringImpl is either not std::string or needs conversion
operator wxStdWideString() const #define wxStringToStdWstringRetType wxStdWideString
wxStdWideString ToStdWstring() const
{ {
wxScopedWCharBuffer buf(wc_str()); wxScopedWCharBuffer buf(wc_str());
return wxStdWideString(buf.data(), buf.length()); return wxStdWideString(buf.data(), buf.length());
@@ -1357,17 +1361,31 @@ public:
#if (!wxUSE_UNICODE || wxUSE_UTF8_LOCALE_ONLY) && wxUSE_STL_BASED_WXSTRING #if (!wxUSE_UNICODE || wxUSE_UTF8_LOCALE_ONLY) && wxUSE_STL_BASED_WXSTRING
// wxStringImpl is std::string in the encoding we want // wxStringImpl is std::string in the encoding we want
operator const std::string&() const { return m_impl; } #define wxStringToStdStringRetType const std::string&
const std::string& ToStdString() const { return m_impl; }
#else #else
// wxStringImpl is either not std::string or needs conversion // wxStringImpl is either not std::string or needs conversion
operator std::string() const #define wxStringToStdStringRetType std::string
std::string ToStdString() const
{ {
wxScopedCharBuffer buf(mb_str()); wxScopedCharBuffer buf(mb_str());
return std::string(buf.data(), buf.length()); return std::string(buf.data(), buf.length());
} }
#endif #endif
#if wxUSE_STL
// In wxUSE_STL case we also provide implicit conversions as there is no
// ambiguity with the const char/wchar_t* ones as they are disabled in this
// build (for consistency with std::basic_string<>)
operator wxStringToStdStringRetType() const { return ToStdString(); }
operator wxStringToStdWstringRetType() const { return ToStdWstring(); }
#endif // wxUSE_STL #endif // wxUSE_STL
#undef wxStringToStdStringRetType
#undef wxStringToStdWstringRetType
#endif // wxUSE_STD_STRING
wxString Clone() const wxString Clone() const
{ {
// make a deep copy of the string, i.e. the returned string will have // make a deep copy of the string, i.e. the returned string will have

View File

@@ -181,11 +181,15 @@ public:
/** /**
Constructs a string from @a str using the using the current locale encoding Constructs a string from @a str using the using the current locale encoding
to convert it to Unicode (wxConvLibc). to convert it to Unicode (wxConvLibc).
@see ToStdString()
*/ */
wxString(const std::string& str); wxString(const std::string& str);
/** /**
Constructs a string from @a str. Constructs a string from @a str.
@see ToStdWstring()
*/ */
wxString(const std::wstring& str); wxString(const std::wstring& str);
@@ -509,6 +513,36 @@ public:
*/ */
const wxCharBuffer ToAscii() const; const wxCharBuffer ToAscii() const;
/**
Return the string as an std::string in current locale encoding.
Note that if the conversion of (Unicode) string contents to the current
locale fails, the return string will be empty. Be sure to check for
this to avoid silent data loss.
Instead of using this function it's also possible to write
@code
std::string s;
wxString wxs;
...
s = std::string(wxs);
@endcode
but using ToStdString() may make the code more clear.
@since 2.9.1
*/
std::string ToStdString() const;
/**
Return the string as an std::wstring.
Unlike ToStdString(), there is no danger of data loss when using this
function.
@since 2.9.1
*/
std::wstring ToStdWstring() const;
/** /**
Same as utf8_str(). Same as utf8_str().
*/ */

View File

@@ -559,15 +559,22 @@ void StdStringTestCase::StdConversion()
wxString s4("hello"); wxString s4("hello");
// wxString -> std::string conversion is only available in wxUSE_STL case, // notice that implicit wxString -> std::string conversion is only
// because it conflicts with conversion to const char*/wchar_t*: // available in wxUSE_STL case, because it conflicts with conversion to
// const char*/wchar_t*
#if wxUSE_STL #if wxUSE_STL
std::string s5 = s4; std::string s5 = s4;
#else
std::string s5 = s4.ToStdString();
#endif
CPPUNIT_ASSERT_EQUAL( "hello", s5 ); CPPUNIT_ASSERT_EQUAL( "hello", s5 );
#if wxUSE_STL
wxStdWideString s6 = s4; wxStdWideString s6 = s4;
CPPUNIT_ASSERT_EQUAL( "hello", s6 ); #else
wxStdWideString s6 = s4.ToStdWstring();
#endif #endif
CPPUNIT_ASSERT_EQUAL( "hello", s6 );
std::string s7(s4); std::string s7(s4);
CPPUNIT_ASSERT( s7 == "hello" ); CPPUNIT_ASSERT( s7 == "hello" );