wxSTD ostream& operator<<(wxSTD ostream& os, const wxCStrData& str)
{
-// FIXME-UTF8: always, not only if wxUSE_UNICODE
-#if wxUSE_UNICODE && !defined(__BORLANDC__)
- return os << (const wchar_t*)str.AsWCharBuf();
+#if wxUSE_UNICODE && !wxUSE_UNICODE_UTF8
+ return os << (const char *)str.AsCharBuf();
#else
- return os << (const char*)str.AsCharBuf();
+ return os << str.AsInternal();
#endif
}
}
#endif
+#if wxUSE_UNICODE && defined(HAVE_WOSTREAM)
+
+wxSTD wostream& operator<<(wxSTD wostream& wos, const wxString& str)
+{
+ return wos << str.wc_str();
+}
+
+wxSTD wostream& operator<<(wxSTD wostream& wos, const wxCStrData& str)
+{
+ return wos << str.AsWChar();
+}
+
+wxSTD wostream& operator<<(wxSTD wostream& wos, const wxWCharBuffer& str)
+{
+ return wos << str.data();
+}
+
+#endif // wxUSE_UNICODE && defined(HAVE_WOSTREAM)
+
#endif // wxUSE_STD_IOSTREAM
// ===========================================================================
wxString *str = wxConstCast(m_str, wxString);
// convert the string:
+ //
+ // FIXME-UTF8: we'd like to do the conversion in the existing buffer (if we
+ // have it) but it's unfortunately not obvious to implement
+ // because we don't know how big buffer do we need for the
+ // given string length (in case of multibyte encodings, e.g.
+ // ISO-2022-JP or UTF-8 when internal representation is wchar_t)
+ //
+ // One idea would be to store more than just m_convertedToChar
+ // in wxString: then we could record the length of the string
+ // which was converted the last time and try to reuse the same
+ // buffer if the current length is not greater than it (this
+ // could still fail because string could have been modified in
+ // place but it would work most of the time, so we'd do it and
+ // only allocate the new buffer if in-place conversion returned
+ // an error). We could also store a bit saying if the string
+ // was modified since the last conversion (and update it in all
+ // operation modifying the string, of course) to avoid unneeded
+ // consequential conversions. But both of these ideas require
+ // adding more fields to wxString and require profiling results
+ // to be sure that we really gain enough from them to justify
+ // doing it.
wxCharBuffer buf(str->mb_str());
// if it failed, return empty string and not NULL to avoid crashes in code
if ( !buf )
return "";
- // FIXME-UTF8: do the conversion in-place in the existing buffer
if ( str->m_convertedToChar &&
strlen(buf) == strlen(str->m_convertedToChar) )
{
{
// FIXME-UTF8: use wxUniChar::ToLower/ToUpper once added
- size_t idx = 0;
const_iterator i1 = begin();
const_iterator end1 = end();
const_iterator i2 = s.begin();
const_iterator end2 = s.end();
- for ( ; i1 != end1 && i2 != end2; ++idx, ++i1, ++i2 )
+ for ( ; i1 != end1 && i2 != end2; ++i1, ++i2 )
{
wxUniChar lower1 = (wxChar)wxTolower(*i1);
wxUniChar lower2 = (wxChar)wxTolower(*i2);
// find last non-space character
reverse_iterator psz = rbegin();
while ( (psz != rend()) && wxSafeIsspace(*psz) )
- psz++;
+ ++psz;
// truncate at trailing space start
erase(psz.base(), end());
// find first non-space character
iterator psz = begin();
while ( (psz != end()) && wxSafeIsspace(*psz) )
- psz++;
+ ++psz;
// fix up data and length
erase(begin(), psz);