]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/string.h
don't build wxscintilla lib if wxSTC is not built
[wxWidgets.git] / include / wx / string.h
index 0b4762344fdc8d22657510cd859ed455e10e152e..208f343912417971fc72e265ca031c86c5dc4543 100644 (file)
@@ -169,7 +169,7 @@ inline int Stricmp(const char *psz1, const char *psz2)
 
 // 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
@@ -182,29 +182,35 @@ public:
     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)); }
@@ -242,7 +248,7 @@ public:
 
     // 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;
@@ -448,6 +454,7 @@ private:
   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
@@ -557,12 +564,14 @@ public:
     // 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
@@ -622,19 +631,19 @@ public:
             { 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; }                                    \
@@ -910,7 +919,8 @@ public:
 
     // 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(); }
@@ -1171,16 +1181,29 @@ public:
     { 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
@@ -1392,13 +1415,19 @@ public:
     // 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]
@@ -1445,10 +1474,19 @@ public:
     // 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)
   {
@@ -1485,9 +1523,23 @@ public:
         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;
@@ -1548,6 +1600,10 @@ public:
     { 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
@@ -1566,6 +1622,7 @@ public:
     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)
@@ -1649,6 +1706,15 @@ public:
     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)
@@ -1680,6 +1746,12 @@ public:
   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)
@@ -2195,12 +2267,8 @@ wxDEFINE_ALL_COMPARISONS(const char *, const wxString&, wxCMP_CHAR_STRING)
 #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
@@ -2237,15 +2305,26 @@ inline wxCStrData::~wxCStrData()
         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
 {
@@ -2268,14 +2347,35 @@ inline wxUniChar wxCStrData::operator[](size_t n) 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_