// Lightweight object returned by wxString::c_str() and implicitly convertible
// to either const char* or const wchar_t*.
-class wxCStrData
+class WXDLLIMPEXP_BASE wxCStrData
{
private:
// Ctors; for internal use by wxString and wxCStrData only
wxCStrData(char *buf);
wxCStrData(wchar_t *buf);
- ~wxCStrData();
+ inline ~wxCStrData();
- // FIXME: we'll need convertors for both char* and wchar_t* and NONE
- // for wxChar*, but that's after completing the transition to
- // "smart" wxUniChar class. For now, just have conversion to
- // char* in ANSI build and wchar_t in Unicode build.
-#if wxUSE_UNICODE
+ // methods defined inline below must be declared inline or mingw32 3.4.5
+ // warns about "<symbol> defined locally after being referenced with
+ // dllimport linkage"
+#if wxUSE_UNICODE_WCHAR
+ inline
+#endif
const wchar_t* AsWChar() const;
operator const wchar_t*() const { return AsWChar(); }
-#else
+
+ inline operator bool() const;
+
+#if !wxUSE_UNICODE
+ inline
+#endif
const char* AsChar() const;
const unsigned char* AsUnsignedChar() const
{ return (const unsigned char *) AsChar(); }
- operator const void*() const { return AsChar(); }
operator const char*() const { return AsChar(); }
operator const unsigned char*() const { return AsUnsignedChar(); }
-#endif
- wxString AsString() const;
+ operator const void*() const { return AsChar(); }
+
+ inline wxString AsString() const;
// allow expressions like "c_str()[0]":
+ inline wxUniChar operator[](size_t n) const;
wxUniChar operator[](int n) const { return operator[](size_t(n)); }
- wxUniChar operator[](size_t n) const;
wxUniChar operator[](long n) const { return operator[](size_t(n)); }
#ifndef wxSIZE_T_IS_UINT
wxUniChar operator[](unsigned int n) const { return operator[](size_t(n)); }
// this operator is needed to make expressions like "*c_str()" or
// "*(c_str() + 2)" work
- wxUniChar operator*() const;
+ inline wxUniChar operator*() const;
private:
const wxString *m_str;
static void PosLenToImpl(size_t pos, size_t len,
size_t *implPos, size_t *implLen)
{ *implPos = pos; *implLen = len; }
+ static size_t LenToImpl(size_t len) { return len; }
static size_t PosFromImpl(size_t pos) { return pos; }
#else // wxUSE_UNICODE_UTF8
// 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)
- { assign(cstr.AsString(), nLength); }
+ : m_impl(cstr.AsString().Mid(0, nLength).m_impl) {}
// and because wxString is convertible to wxCStrData and const wxChar *
// we also need to provide this one
wxString(const wxString& str, size_t nLength)
- { assign(str, nLength); }
+ : m_impl(str.Mid(0, nLength).m_impl) {}
+
+ ~wxString();
public:
// standard types
{ return iterator_name(wxString::AddToIter(m_cur, -n)); } \
iterator_name operator-(size_t n) const \
{ return iterator_name(wxString::AddToIter(m_cur, -(int)n)); } \
- iterator_name operator+=(int n) \
+ iterator_name& operator+=(int n) \
{ m_cur = wxString::AddToIter(m_cur, n); return *this; } \
- iterator_name operator+=(size_t n) \
+ iterator_name& operator+=(size_t n) \
{ m_cur = wxString::AddToIter(m_cur, (int)n); return *this; } \
- iterator_name operator-=(int n) \
+ iterator_name& operator-=(int n) \
{ m_cur = wxString::AddToIter(m_cur, -n); return *this; } \
- iterator_name operator-=(size_t n) \
+ iterator_name& operator-=(size_t n) \
{ m_cur = wxString::AddToIter(m_cur, -(int)n); return *this; } \
\
unsigned operator-(const iterator_name& i) const \
{ return wxString::DiffIters(m_cur, i.m_cur); } \
\
- bool operator==(const iterator_name&i) const \
+ bool operator==(const iterator_name& i) const \
{ return m_cur == i.m_cur; } \
bool operator!=(const iterator_name& i) const \
{ return m_cur != i.m_cur; } \
// implicit conversion to C string
operator wxCStrData() const { return c_str(); }
- operator const wxChar*() const { return c_str(); }
+ operator const char*() const { return c_str(); }
+ operator const wchar_t*() const { return c_str(); }
// identical to c_str(), for MFC compatibility
const wxCStrData GetData() const { return c_str(); }
{ return CmpNoCase(wxString(pwz)); }
// test for the string equality, either considering case or not
// (if compareWithCase then the case matters)
- bool IsSameAs(const char *psz, bool compareWithCase = true) const
- { return (compareWithCase ? Cmp(psz) : CmpNoCase(psz)) == 0; }
- bool IsSameAs(const wchar_t *pwz, bool compareWithCase = true) const
- { return (compareWithCase ? Cmp(pwz) : CmpNoCase(pwz)) == 0; }
+ bool IsSameAs(const wxString& str, bool compareWithCase = true) const
+ { return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; }
+ bool IsSameAs(const char *str, bool compareWithCase = true) const
+ { return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; }
+ bool IsSameAs(const wchar_t *str, bool compareWithCase = true) const
+ { return (compareWithCase ? Cmp(str) : CmpNoCase(str)) == 0; }
// comparison with a single character: returns true if equal
bool IsSameAs(wxUniChar c, bool compareWithCase = true) const
{
return (length() == 1) && (compareWithCase ? GetChar(0u) == c
: wxToupper(GetChar(0u)) == wxToupper(c));
}
+ // FIXME-UTF8: remove these overloads
+ bool IsSameAs(wxUniCharRef c, bool compareWithCase = true) const
+ { return IsSameAs(wxUniChar(c), compareWithCase); }
+ bool IsSameAs(char c, bool compareWithCase = true) const
+ { return IsSameAs(wxUniChar(c), compareWithCase); }
+ bool IsSameAs(unsigned char c, bool compareWithCase = true) const
+ { return IsSameAs(wxUniChar(c), compareWithCase); }
+ bool IsSameAs(wchar_t c, bool compareWithCase = true) const
+ { return IsSameAs(wxUniChar(c), compareWithCase); }
+ bool IsSameAs(int c, bool compareWithCase = true) const
+ { return IsSameAs(wxUniChar(c), compareWithCase); }
// simple sub-string extraction
// return substring starting at nFirst of length nCount (or till the end
// take nLen chars starting at nPos
wxString(const wxString& str, size_t nPos, size_t nLen)
: m_impl(str.m_impl, nPos, nLen) { }
- // take all characters from pStart to pEnd
- wxString(const void *pStart, const void *pEnd)
- : m_impl((const wxChar*)pStart, (const wxChar*)pEnd) { }
+ // take all characters from first to last
wxString(const_iterator first, const_iterator last)
: m_impl(first, last) { }
- wxString(iterator first, iterator last)
- : m_impl(first, last) { }
+ wxString(const char *first, const char *last)
+ {
+ SubstrBufFromMB str(ImplStr(first, last - first));
+ m_impl.assign(str.data, str.len);
+ }
+ wxString(const wchar_t *first, const wchar_t *last)
+ {
+ SubstrBufFromWC str(ImplStr(first, last - first));
+ m_impl.assign(str.data, str.len);
+ }
// lib.string.modifiers
// append elements str[pos], ..., str[pos+n]
// append from first to last
wxString& append(const_iterator first, const_iterator last)
{ m_impl.append(first, last); return *this; }
+ wxString& append(const char *first, const char *last)
+ { return append(first, last - first); }
+ wxString& append(const wchar_t *first, const wchar_t *last)
+ { return append(first, last - first); }
// same as `this_string = str'
wxString& assign(const wxString& str)
{ m_impl = str.m_impl; return *this; }
+ wxString& assign(const wxString& str, size_t len)
+ {
+ m_impl.assign(str.m_impl, 0, str.LenToImpl(len));
+ return *this;
+ }
// same as ` = str[pos..pos + n]
wxString& assign(const wxString& str, size_t pos, size_t n)
{
m_impl.assign(n, (wxStringCharType)ch);
return *this;
}
+
+ wxString& assign(size_t n, wxUniCharRef ch)
+ { return assign(n, wxUniChar(ch)); }
+ wxString& assign(size_t n, char ch)
+ { return assign(n, wxUniChar(ch)); }
+ wxString& assign(size_t n, unsigned char ch)
+ { return assign(n, wxUniChar(ch)); }
+ wxString& assign(size_t n, wchar_t ch)
+ { return assign(n, wxUniChar(ch)); }
+
// assign from first to last
wxString& assign(const_iterator first, const_iterator last)
{ m_impl.assign(first, last); return *this; }
+ wxString& assign(const char *first, const char *last)
+ { return assign(first, last - first); }
+ wxString& assign(const wchar_t *first, const wchar_t *last)
+ { return assign(first, last - first); }
// string comparison
int compare(const wxString& str) const;
{ return iterator(m_impl.insert(it, EncodeChar(ch))); }
void insert(iterator it, const_iterator first, const_iterator last)
{ m_impl.insert(it, first, last); }
+ void insert(iterator it, const char *first, const char *last)
+ { insert(it - begin(), first, last - first); }
+ void append(iterator it, const wchar_t *first, const wchar_t *last)
+ { insert(it - begin(), first, last - first); }
void insert(iterator it, size_type n, wxUniChar ch)
{
#if wxUSE_UNICODE_UTF8
m_impl.erase(from, len);
return *this;
}
+ // delete characters from first up to last
iterator erase(iterator first, iterator last)
{ return iterator(m_impl.erase(first, last)); }
iterator erase(iterator first)
m_impl.replace(from, len, str.data, str.len);
return *this;
}
+ wxString& replace(size_t nStart, size_t nLen,
+ const wxString& s, size_t nCount)
+ {
+ size_t from, len;
+ PosLenToImpl(nStart, nLen, &from, &len);
+ m_impl.replace(from, len, s.m_impl.c_str(), s.LenToImpl(nCount));
+ return *this;
+ }
+
wxString& replace(iterator first, iterator last, const char* s)
{ m_impl.replace(first, last, ImplStr(s)); return *this; }
wxString& replace(iterator first, iterator last, const wchar_t* s)
wxString& replace(iterator first, iterator last,
const_iterator first1, const_iterator last1)
{ m_impl.replace(first, last, first1, last1); return *this; }
+ wxString& replace(iterator first, iterator last,
+ const char *first1, const char *last1)
+ { replace(first, last, first1, last1 - first1); return *this; }
+ wxString& replace(iterator first, iterator last,
+ const wchar_t *first1, const wchar_t *last1)
+ { replace(first, last, first1, last1 - first1); return *this; }
// swap two strings
void swap(wxString& str)
#define wxCMP_CHAR_CSTRDATA(p, s, op) p op s.AsChar()
#define wxCMP_WCHAR_CSTRDATA(p, s, op) p op s.AsWChar()
-// FIXME: these ifdefs must be removed when wxCStrData has both conversions
-#if wxUSE_UNICODE
- wxDEFINE_ALL_COMPARISONS(const wchar_t *, const wxCStrData&, wxCMP_WCHAR_CSTRDATA)
-#else
- wxDEFINE_ALL_COMPARISONS(const char *, const wxCStrData&, wxCMP_CHAR_CSTRDATA)
-#endif
+wxDEFINE_ALL_COMPARISONS(const wchar_t *, const wxCStrData&, wxCMP_WCHAR_CSTRDATA)
+wxDEFINE_ALL_COMPARISONS(const char *, const wxCStrData&, wxCMP_CHAR_CSTRDATA)
#undef wxCMP_CHAR_CSTRDATA
#undef wxCMP_WCHAR_CSTRDATA
delete m_str;
}
-#if wxUSE_UNICODE
+inline wxCStrData::operator bool() const
+{
+ return !m_str->empty();
+};
+
+// simple cases for AsChar() and AsWChar(), the complicated ones are
+// in string.cpp
+#if wxUSE_UNICODE_WCHAR
inline const wchar_t* wxCStrData::AsWChar() const
-#else
+{
+ return m_str->wx_str() + m_offset;
+}
+#endif // wxUSE_UNICODE_WCHAR
+
+#if !wxUSE_UNICODE
inline const char* wxCStrData::AsChar() const
-#endif
{
- // FIXME-UTF8: incorrect position, incorrect charset
return m_str->wx_str() + m_offset;
}
+#endif // !wxUSE_UNICODE
inline wxString wxCStrData::AsString() const
{
return m_str->at(m_offset + n);
}
+// ----------------------------------------------------------------------------
+// more wxCStrData operators
+// ----------------------------------------------------------------------------
+
+// we need to define those to allow "size_t pos = p - s.c_str()" where p is
+// some pointer into the string
+inline size_t operator-(const char *p, const wxCStrData& cs)
+{
+ return p - cs.AsChar();
+}
+
+inline size_t operator-(const wchar_t *p, const wxCStrData& cs)
+{
+ return p - cs.AsWChar();
+}
+
// ----------------------------------------------------------------------------
// implementation of wx[W]CharBuffer inline methods using wxCStrData
// ----------------------------------------------------------------------------
-// FIXME-UTF8: move this to buffer.h; provide versions for both variants
-inline wxWxCharBuffer::wxWxCharBuffer(const wxCStrData& cstr)
- : wxCharTypeBufferBase((const wxChar *)cstr)
+// FIXME-UTF8: move this to buffer.h
+inline wxCharBuffer::wxCharBuffer(const wxCStrData& cstr)
+ : wxCharTypeBufferBase(cstr.AsChar())
+{
+}
+
+inline wxWCharBuffer::wxWCharBuffer(const wxCStrData& cstr)
+ : wxCharTypeBufferBase(cstr.AsWChar())
{
}
-#endif // _WX_WXSTRING_H__
+#endif // _WX_WXSTRING_H_