Add helper wxString::IterOffsetInMBStr() method.

This method can be used to recover the pointer in char* buffer containing
multi-byte string representation corresponding to the given iterator which is
useful for implementing backwards-compatible functions that must be able to
return such pointers.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70995 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2012-03-25 16:45:50 +00:00
parent 9d98c19792
commit 52dc2108ae

View File

@ -1150,6 +1150,25 @@ public:
#undef WX_STR_ITERATOR_TAG #undef WX_STR_ITERATOR_TAG
#undef WX_STR_ITERATOR_IMPL #undef WX_STR_ITERATOR_IMPL
// This method is mostly used by wxWidgets itself and return the offset of
// the given iterator in bytes relative to the start of the buffer
// representing the current string contents in the current locale encoding.
//
// It is inefficient as it involves converting part of the string to this
// encoding (and also unsafe as it simply returns 0 if the conversion fails)
// and so should be avoided if possible, wx itself only uses it to implement
// backwards-compatible API.
ptrdiff_t IterOffsetInMBStr(const const_iterator& i) const
{
const wxString str(begin(), i);
// This is logically equivalent to strlen(str.mb_str()) but avoids
// actually converting the string to multibyte and just computes the
// length that it would have after conversion.
size_t ofs = wxConvLibc.FromWChar(NULL, 0, str.wc_str(), str.length());
return ofs == wxCONV_FAILED ? 0 : static_cast<ptrdiff_t>(ofs);
}
friend class iterator; friend class iterator;
friend class const_iterator; friend class const_iterator;