struct WXDLLIMPEXP_BASE wxStringOperationsWchar
{
// moves the iterator to the next Unicode character
- static void IncIter(wxStringImpl::iterator& i) { ++i; }
- static void IncIter(wxStringImpl::const_iterator& i) { ++i; }
+ template <typename Iterator>
+ static void IncIter(Iterator& i) { ++i; }
// moves the iterator to the previous Unicode character
- static void DecIter(wxStringImpl::iterator& i) { --i; }
- static void DecIter(wxStringImpl::const_iterator& i) { --i; }
+ template <typename Iterator>
+ static void DecIter(Iterator& i) { --i; }
// moves the iterator by n Unicode characters
- static wxStringImpl::iterator AddToIter(const wxStringImpl::iterator& i, int n)
- { return i + n; }
- static wxStringImpl::const_iterator AddToIter(const wxStringImpl::const_iterator& i, int n)
- { return i + n; }
- static const wxChar* AddToIter(const wxChar *i, int n)
+ template <typename Iterator>
+ static Iterator AddToIter(const Iterator& i, ptrdiff_t n)
{ return i + n; }
// returns distance of the two iterators in Unicode characters
- static int DiffIters(const wxStringImpl::iterator& i1,
- const wxStringImpl::iterator& i2)
- { return i1 - i2; }
- static int DiffIters(const wxStringImpl::const_iterator& i1,
- const wxStringImpl::const_iterator& i2)
+ template <typename Iterator>
+ static ptrdiff_t DiffIters(const Iterator& i1, const Iterator& i2)
{ return i1 - i2; }
// encodes the character to a form used to represent it in internal
struct WXDLLIMPEXP_BASE wxStringOperationsUtf8
{
// checks correctness of UTF-8 sequence
- static bool IsValidUtf8String(const char *c);
-#ifdef __WXDEBUG__
- static bool IsValidUtf8LeadByte(unsigned char c);
-#endif
+ static bool IsValidUtf8String(const char *c,
+ size_t len = wxStringImpl::npos);
+ static bool IsValidUtf8LeadByte(unsigned char c)
+ {
+ return (c <= 0x7F) || (c >= 0xC2 && c <= 0xF4);
+ }
// table of offsets to skip forward when iterating over UTF-8 sequence
- static unsigned char ms_utf8IterTable[256];
+ static const unsigned char ms_utf8IterTable[256];
template<typename Iterator>
}
template<typename Iterator>
- static Iterator AddToIter(const Iterator& i, int n)
+ static Iterator AddToIter(const Iterator& i, ptrdiff_t n)
{
Iterator out(i);
if ( n > 0 )
{
- for ( int j = 0; j < n; ++j )
+ for ( ptrdiff_t j = 0; j < n; ++j )
IncIter(out);
}
else if ( n < 0 )
{
- for ( int j = 0; j > n; --j )
+ for ( ptrdiff_t j = 0; j > n; --j )
DecIter(out);
}
}
template<typename Iterator>
- static int DiffIters(Iterator i1, Iterator i2)
+ static ptrdiff_t DiffIters(Iterator i1, Iterator i2)
{
- int dist = 0;
+ ptrdiff_t dist = 0;
if ( i1 < i2 )
{
return dist;
}
- // buffer for single UTF-8 character
- struct Utf8CharBuffer
- {
- char data[5];
- operator const char*() const { return data; }
- };
-
// encodes the character as UTF-8:
- static Utf8CharBuffer EncodeChar(const wxUniChar& ch);
+ typedef wxUniChar::Utf8CharBuffer Utf8CharBuffer;
+ static Utf8CharBuffer EncodeChar(const wxUniChar& ch)
+ { return ch.AsUTF8(); }
// returns n copies of ch encoded in UTF-8 string
static wxCharBuffer EncodeNChars(size_t n, const wxUniChar& ch);
}
// decodes single UTF-8 character from UTF-8 string
- static wxUniChar DecodeChar(wxStringImpl::const_iterator i);
+ static wxUniChar DecodeChar(wxStringImpl::const_iterator i)
+ {
+ if ( (unsigned char)*i < 0x80 )
+ return (int)*i;
+ return DecodeNonAsciiChar(i);
+ }
+
+private:
+ static wxUniChar DecodeNonAsciiChar(wxStringImpl::const_iterator i);
};
#endif // wxUSE_UNICODE_UTF8