re-enabled using std::string for wxStringImpl if wxUSE_STL again

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45095 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2007-03-28 09:37:34 +00:00
parent 08295a040c
commit a962cdf410
3 changed files with 81 additions and 70 deletions

View File

@ -176,18 +176,7 @@ inline int Stricmp(const char *psz1, const char *psz2)
// deal with STL/non-STL/non-STL-but-wxUSE_STD_STRING
// ----------------------------------------------------------------------------
// FIXME-UTF8: using std::string as wxString base class is currently broken,
// so we use the standard wxString with std::string conversion
// enabled, this is API-compatible.
#if 1
#define wxUSE_STL_BASED_WXSTRING 0
#if wxUSE_STL
#undef wxUSE_STD_STRING
#define wxUSE_STD_STRING 1
#endif
#else
#define wxUSE_STL_BASED_WXSTRING wxUSE_STL
#endif
// in both cases we need to define wxStdString
#if wxUSE_STL_BASED_WXSTRING || wxUSE_STD_STRING
@ -619,7 +608,6 @@ public:
#endif
wxString AsString() const;
operator wxString() const;
// allow expressions like "c_str()[0]":
wxUniChar operator[](int n) const { return operator[](size_t(n)); }
@ -735,10 +723,8 @@ class WXDLLIMPEXP_BASE wxString
// that all inline functions can be effectively inlined, verify that all
// performance critical functions are still inlined if you change order!
public:
#if !wxUSE_STL_BASED_WXSTRING
// an 'invalid' value for string index, moved to this place due to a CW bug
static const size_t npos;
#endif
private:
// if we hadn't made these operators private, it would be possible to
@ -776,11 +762,9 @@ private:
#elif wxUSE_UNICODE_WCHAR
typedef SubstrBufFromType<const wchar_t*> SubstrBufFromWC;
typedef SubstrBufFromType<wxWCharBuffer> SubstrBufFromMB;
typedef SubstrBufFromWC SubstrBufFrom;
#else
typedef SubstrBufFromType<const char*> SubstrBufFromMB;
typedef SubstrBufFromType<wxCharBuffer> SubstrBufFromWC;
typedef SubstrBufFromMB SubstrBufFrom;
#endif
@ -792,27 +776,28 @@ private:
#if wxUSE_UNICODE
// FIXME-UTF8: This will need changes when UTF8 build is introduced
static SubstrBufFromMB ConvertStr(const char *psz, size_t nLength,
const wxMBConv& conv);
const wxMBConv& conv);
#else
static SubstrBufFromWC ConvertStr(const wchar_t *pwz, size_t nLength,
const wxMBConv& conv);
const wxMBConv& conv);
#endif
#if !wxUSE_UNICODE_UTF8 // wxUSE_UNICODE_WCHAR or !wxUSE_UNICODE
// returns C string encoded as the implementation expects (version for
// the same char type as used internally)
static const wxStringCharType* ImplStr(const wxStringCharType* str)
{ return str; }
static const SubstrBufFrom ImplStr(const wxStringCharType* str, size_t n)
{ return SubstrBufFrom(str, n); }
// returns C string encoded as the implementation expects:
#if wxUSE_UNICODE
// returns C string encoded as the implementation expects (version for
// the other char type than the one used internally)
static const wchar_t* ImplStr(const wchar_t* str)
{ return str; }
static const SubstrBufFromWC ImplStr(const wchar_t* str, size_t n)
{ return SubstrBufFromWC(str, n == npos ? wxWcslen(str) : n); }
static wxWCharBuffer ImplStr(const char* str)
{ return ConvertStr(str, npos, wxConvLibc).data; }
static SubstrBufFromMB ImplStr(const char* str, size_t n)
{ return ConvertStr(str, n, wxConvLibc); }
#else
static const char* ImplStr(const char* str)
{ return str; }
static const SubstrBufFromMB ImplStr(const char* str, size_t n)
{ return SubstrBufFromMB(str, n == npos ? wxStrlen(str) : n); }
static wxCharBuffer ImplStr(const wchar_t* str)
{ return ConvertStr(str, npos, wxConvLibc).data; }
static SubstrBufFromWC ImplStr(const wchar_t* str, size_t n)
@ -922,10 +907,10 @@ public:
// unconditionally add this ctor as it would make wx lib dependent on
// libstdc++ on some Linux versions which is bad, so instead we ask the
// client code to define this wxUSE_STD_STRING symbol if they need it
#if wxUSE_STD_STRING
#if wxUSE_STD_STRING && !wxUSE_STL_BASED_WXSTRING
wxString(const wxStdString& s)
: m_impl(s.c_str()) { }
#endif // wxUSE_STD_STRING
: m_impl(s.c_str()) { } // FIXME-UTF8: this is broken for embedded 0s
#endif // wxUSE_STD_STRING && !wxUSE_STL_BASED_WXSTRING
#if wxUSE_UNICODE
// from multibyte string
@ -958,6 +943,9 @@ public:
: m_impl(psz) { }
#endif // Unicode/ANSI
wxString(const wxCStrData& cstr)
: m_impl(cstr.AsString().m_impl) { }
// as we provide both ctors with this signature for both char and unsigned
// char string, we need to provide one for wxCStrData to resolve ambiguity
wxString(const wxCStrData& cstr, size_t nLength)
@ -979,18 +967,27 @@ public:
typedef size_t size_type;
typedef wxUniChar const_reference;
#if wxUSE_STL
#define WX_STR_ITERATOR_TAG std::random_access_iterator_tag
#else
#define WX_STR_ITERATOR_TAG void /* dummy type */
#endif
#define WX_STR_ITERATOR_IMPL(iterator_name, pointer_type, \
reference_type, reference_ctor) \
private: \
typedef wxStringImpl::iterator_name underlying_iterator; \
public: \
typedef WX_STR_ITERATOR_TAG iterator_category; \
typedef wxUniChar value_type; \
typedef int difference_type; \
typedef reference_type reference; \
typedef pointer_type pointer; \
\
iterator_name(const iterator_name& i) : m_cur(i.m_cur) {} \
\
reference operator*() const { return reference_ctor; } \
reference operator[](size_t n) const { return *(*this + n); } \
\
iterator_name& operator++() \
{ wxString::IncIter(m_cur); return *this; } \
@ -1049,7 +1046,6 @@ public:
operator underlying_iterator() const { return m_cur; } \
\
friend class WXDLLIMPEXP_BASE wxString; \
friend class WXDLLIMPEXP_BASE wxStringImpl; \
friend class WXDLLIMPEXP_BASE wxCStrData; \
\
private: \
@ -1076,6 +1072,7 @@ public:
const_iterator(const iterator& i) : m_cur(i.m_cur) {}
};
#undef WX_STR_ITERATOR_TAG
#undef WX_STR_ITERATOR_IMPL
friend class iterator;
@ -1086,7 +1083,10 @@ public:
{
public:
typedef T iterator_type;
typedef typename T::iterator_category iterator_category;
typedef typename T::value_type value_type;
typedef typename T::difference_type difference_type;
typedef typename T::reference reference;
typedef typename T::pointer *pointer;
@ -1097,6 +1097,7 @@ public:
iterator_type base() const { return m_cur; }
reference operator*() const { return *(m_cur-1); }
reference operator[](size_t n) const { return *(*this + n); }
reverse_iterator_impl& operator++()
{ --m_cur; return *this; }
@ -2103,20 +2104,20 @@ public:
// sizeof(wchar_t)==2 and surrogates are present in the string;
// should we care? Probably not.
size_t find_first_of(const wxString& str, size_t nStart = 0) const
{ return m_impl.find_first_of(str.impl, nStart); }
{ return m_impl.find_first_of(str.m_impl, nStart); }
size_t find_first_of(const char* sz, size_t nStart = 0) const
{ return m_impl.find_first_of(ImplStr(sz), nStart); }
size_t find_first_of(const wchar_t* sz, size_t nStart = 0) const
{ return m_impl.find_first_of(ImplStr(sz), nStart); }
size_t find_first_of(const char* sz, size_t nStart, size_t n) const;
size_t find_first_of(const char* sz, size_t nStart, size_t n) const
{ return m_impl.find_first_of(ImplStr(sz), nStart, n); }
size_t find_first_of(const wchar_t* sz, size_t nStart, size_t n) const;
size_t find_first_of(const wchar_t* sz, size_t nStart, size_t n) const
{ return m_impl.find_first_of(ImplStr(sz), nStart, n); }
size_t find_first_of(wxUniChar c, size_t nStart = 0) const
{ return m_impl.find_first_of((wxChar)c, nStart); }
size_t find_last_of(const wxStringImpl& str, size_t nStart = npos) const
{ return m_impl.find_last_of(str.impl, nStart); }
size_t find_last_of(const wxString& str, size_t nStart = npos) const
{ return m_impl.find_last_of(str.m_impl, nStart); }
size_t find_last_of(const char* sz, size_t nStart = npos) const
{ return m_impl.find_last_of(ImplStr(sz), nStart); }
size_t find_last_of(const wchar_t* sz, size_t nStart = npos) const
@ -2128,30 +2129,30 @@ public:
size_t find_last_of(wxUniChar c, size_t nStart = npos) const
{ return m_impl.find_last_of((wxChar)c, nStart); }
size_t find_first_not_of(const wxStringImpl& str, size_t nStart = 0) const
size_t find_first_not_of(const wxString& str, size_t nStart = 0) const
{ return m_impl.find_first_not_of(str.m_impl, nStart); }
size_t find_first_not_of(const char* sz, size_t nStart = 0) const;
size_t find_first_not_of(const char* sz, size_t nStart = 0) const
{ return m_impl.find_first_not_of(ImplStr(sz), nStart); }
size_t find_first_not_of(const wchar_t* sz, size_t nStart = 0) const;
size_t find_first_not_of(const wchar_t* sz, size_t nStart = 0) const
{ return m_impl.find_first_not_of(ImplStr(sz), nStart); }
size_t find_first_not_of(const char* sz, size_t nStart, size_t n) const;
size_t find_first_not_of(const char* sz, size_t nStart, size_t n) const
{ return m_impl.find_first_not_of(ImplStr(sz), nStart, n); }
size_t find_first_not_of(const wchar_t* sz, size_t nStart, size_t n) const;
size_t find_first_not_of(const wchar_t* sz, size_t nStart, size_t n) const
{ return m_impl.find_first_not_of(ImplStr(sz), nStart, n); }
size_t find_first_not_of(wxUniChar c, size_t nStart = 0) const;
size_t find_first_not_of(wxUniChar c, size_t nStart = 0) const
{ return m_impl.find_first_not_of((wxChar)c, nStart); }
size_t find_last_not_of(const wxStringImpl& str, size_t nStart = npos) const
size_t find_last_not_of(const wxString& str, size_t nStart = npos) const
{ return m_impl.find_last_not_of(str.m_impl, nStart); }
size_t find_last_not_of(const char* sz, size_t nStart = npos) const;
size_t find_last_not_of(const char* sz, size_t nStart = npos) const
{ return m_impl.find_last_not_of(ImplStr(sz), nStart); }
size_t find_last_not_of(const wchar_t* sz, size_t nStart = npos) const;
size_t find_last_not_of(const wchar_t* sz, size_t nStart = npos) const
{ return m_impl.find_last_not_of(ImplStr(sz), nStart); }
size_t find_last_not_of(const char* sz, size_t nStart, size_t n) const;
size_t find_last_not_of(const char* sz, size_t nStart, size_t n) const
{ return m_impl.find_last_not_of(ImplStr(sz), nStart, n); }
size_t find_last_not_of(const wchar_t* sz, size_t nStart, size_t n) const;
size_t find_last_not_of(const wchar_t* sz, size_t nStart, size_t n) const
{ return m_impl.find_last_not_of(ImplStr(sz), nStart, n); }
size_t find_last_not_of(wxUniChar c, size_t nStart = npos) const;
size_t find_last_not_of(wxUniChar c, size_t nStart = npos) const
{ return m_impl.find_last_not_of((wxChar)c, nStart); }
#else
// we can't use std::string implementation in UTF-8 build, because the
@ -2281,6 +2282,25 @@ private:
#pragma warning (default:4275)
#endif
// string iterator operators that satisfy STL Random Access Iterator
// requirements:
inline wxString::iterator operator+(int n, wxString::iterator i)
{ return i + n; }
inline wxString::iterator operator+(size_t n, wxString::iterator i)
{ return i + n; }
inline wxString::const_iterator operator+(int n, wxString::const_iterator i)
{ return i + n; }
inline wxString::const_iterator operator+(size_t n, wxString::const_iterator i)
{ return i + n; }
inline wxString::reverse_iterator operator+(int n, wxString::reverse_iterator i)
{ return i + n; }
inline wxString::reverse_iterator operator+(size_t n, wxString::reverse_iterator i)
{ return i + n; }
inline wxString::const_reverse_iterator operator+(int n, wxString::const_reverse_iterator i)
{ return i + n; }
inline wxString::const_reverse_iterator operator+(size_t n, wxString::const_reverse_iterator i)
{ return i + n; }
// notice that even though for many compilers the friend declarations above are
// enough, from the point of view of C++ standard we must have the declarations
// here as friend ones are not injected in the enclosing namespace and without
@ -2430,11 +2450,6 @@ private:
// wxString comparison functions: operator versions are always case sensitive
// ---------------------------------------------------------------------------
// note that when wxUSE_STL_BASED_WXSTRING == 1 the comparison operators taking
// std::string are used and defining them also for wxString would only result
// in compilation ambiguities when comparing std::string and wxString
#if !wxUSE_STL_BASED_WXSTRING
#define wxCMP_WXCHAR_STRING(p, s, op) s.Cmp(p) op 0
wxDEFINE_ALL_COMPARISONS(const wxChar *, const wxString&, wxCMP_WXCHAR_STRING)
@ -2488,10 +2503,7 @@ inline wxString operator+(const wxCharBuffer& buf, const wxString& string)
{ return (const char *)buf + string; }
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
#endif // !wxUSE_STL_BASED_WXSTRING
// comparison with char (those are not defined by std::[w]string and so should
// be always available)
// comparison with char
inline bool operator==(const wxUniChar& c, const wxString& s) { return s.IsSameAs(c); }
inline bool operator==(const wxUniCharRef& c, const wxString& s) { return s.IsSameAs(c); }
inline bool operator==(char c, const wxString& s) { return s.IsSameAs(c); }
@ -2574,10 +2586,8 @@ inline const wchar_t* wxCStrData::AsWChar() const
inline const char* wxCStrData::AsChar() const
#endif
{
if ( m_offset == 0 )
return m_str->wx_str(); // FIXME-UTF8
else
return (const wxChar*)(m_str->begin() + m_offset);
// FIXME-UTF8: incorrect position, incorrect charset
return m_str->wx_str() + m_offset;
}
inline wxString wxCStrData::AsString() const
@ -2588,8 +2598,6 @@ inline wxString wxCStrData::AsString() const
return m_str->Mid(m_offset);
}
inline wxCStrData::operator wxString() const { return AsString(); }
inline wxUniChar wxCStrData::operator*() const
{
if ( m_str->empty() )

View File

@ -14,6 +14,10 @@
#include "wx/defs.h"
#include "wx/chartype.h"
// NB: this header is included from string.h as well, but from the place
// where wxStringImpl is already declared and that's all we need
#include "wx/string.h"
class WXDLLIMPEXP_BASE wxUniCharRef;
// This class represents single Unicode character. It can be converted to
@ -112,9 +116,10 @@ private:
class WXDLLIMPEXP_BASE wxUniCharRef
{
private:
typedef wxStringImpl::iterator iterator;
// create the reference
// FIXME-UTF8: the interface will need changes for UTF-8 build
wxUniCharRef(wxChar *pos) : m_pos(pos) {}
wxUniCharRef(iterator pos) : m_pos(pos) {}
public:
// NB: we have to make this public, because we don't have wxString
@ -122,9 +127,7 @@ public:
// as friend; so at least don't use a ctor but a static function
// that must be used explicitly (this is more than using 'explicit'
// keyword on ctor!):
//
// FIXME-UTF8: the interface will need changes for UTF-8 build
static wxUniCharRef CreateForString(wxChar *pos)
static wxUniCharRef CreateForString(iterator pos)
{ return wxUniCharRef(pos); }
wxUniChar::value_type GetValue() const { return UniChar().GetValue(); }
@ -185,7 +188,7 @@ private:
private:
// pointer to the character in string
wxChar *m_pos;
iterator m_pos;
};
inline wxUniChar::wxUniChar(const wxUniCharRef& c)

View File

@ -814,7 +814,7 @@ int wxString::compare(size_t nStart, size_t nLen,
size_t pos, len;
PosLenToImpl(nStart, nLen, &pos, &len);
SubstrBufFromMB str(sz, nCount);
SubstrBufFromMB str(ImplStr(sz, nCount));
return m_impl.compare(pos, len, str.data, str.len);
}
@ -825,7 +825,7 @@ int wxString::compare(size_t nStart, size_t nLen,
size_t pos, len;
PosLenToImpl(nStart, nLen, &pos, &len);
SubstrBufFromWC str(sz, nCount);
SubstrBufFromWC str(ImplStr(sz, nCount));
return m_impl.compare(pos, len, str.data, str.len);
}