]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/string.h
wxDC rework, forgot these
[wxWidgets.git] / include / wx / string.h
index cc791c7d7fef4f5681cdc567772799c1735378bc..b70306b886a239975a99e78c592e3d45043f8dcf 100644 (file)
@@ -342,14 +342,16 @@ public:
     // We have to implement the version without template arguments manually
     // because of the StringReturnType<> hack, although WX_DEFINE_VARARG_FUNC
     // normally does it itself. It has to be a template so that we can use
-    // the hack, even though there's no real template parameter:
-    struct FormatDummyArg {} ;
-
+    // the hack, even though there's no real template parameter. We can't move
+    // it to wxStrig, because it would shadow these versions of Format() then.
     template<typename T>
     inline static typename StringReturnType<T>::type
-    Format(const wxFormatString& fmt, FormatDummyArg dummy = FormatDummyArg())
+    Format(const T& fmt)
     {
-        return DoFormatWchar(fmt);
+        // NB: this doesn't compile if T is not (some form of) a string;
+        //     this makes Format's prototype equivalent to
+        //     Format(const wxFormatString& fmt)
+        return DoFormatWchar(wxFormatString(fmt));
     }
 
     // int Printf(const wxString& format, ...);
@@ -378,8 +380,9 @@ protected:
 
 #if wxUSE_UNICODE_UTF8
 // see the comment near wxString::iterator for why we need this
-struct WXDLLIMPEXP_BASE wxStringIteratorNode
+class WXDLLIMPEXP_BASE wxStringIteratorNode
 {
+public:
     wxStringIteratorNode()
         : m_str(NULL), m_citer(NULL), m_iter(NULL), m_prev(NULL), m_next(NULL) {}
     wxStringIteratorNode(const wxString *str,
@@ -1085,19 +1088,25 @@ public:
 
   void resize(size_t nSize, wxUniChar ch = wxT('\0'))
   {
+    const size_t len = length();
+    if ( nSize == len)
+        return;
+
 #if wxUSE_UNICODE_UTF8
-    if ( !ch.IsAscii() )
+    if ( nSize < len )
     {
-        size_t len = length();
-        if ( nSize == len)
-            return;
-        else if ( nSize < len )
-            erase(nSize);
-        else
-            append(nSize - len, ch);
+        // we can't use wxStringImpl::resize() for truncating the string as it
+        // counts in bytes, not characters
+        erase(nSize);
+        return;
     }
+
+    // we also can't use (presumably more efficient) resize() if we have to
+    // append characters taking more than one byte
+    if ( !ch.IsAscii() )
+        append(nSize - len, ch);
     else
-#endif
+#endif // wxUSE_UNICODE_UTF8
         m_impl.resize(nSize, (wxStringCharType)ch);
   }
 
@@ -1238,18 +1247,25 @@ public:
     // the behaviour of these functions with the strings containing anything
     // else than 7 bit ASCII characters is undefined, use at your own risk.
 #if wxUSE_UNICODE
-    static wxString FromAscii(const char *ascii, size_t len);  // string
-    static wxString FromAscii(const char *ascii);  // string
-    static wxString FromAscii(const char ascii);   // char
+    static wxString FromAscii(const char *ascii, size_t len);
+    static wxString FromAscii(const char *ascii);
+    static wxString FromAscii(char ascii);
     const wxCharBuffer ToAscii() const;
 #else // ANSI
     static wxString FromAscii(const char *ascii) { return wxString( ascii ); }
     static wxString FromAscii(const char *ascii, size_t len)
         { return wxString( ascii, len ); }
-    static wxString FromAscii(const char ascii) { return wxString( ascii ); }
+    static wxString FromAscii(char ascii) { return wxString( ascii ); }
     const char *ToAscii() const { return c_str(); }
 #endif // Unicode/!Unicode
 
+    // also provide unsigned char overloads as signed/unsigned doesn't matter
+    // for 7 bit ASCII characters
+    static wxString FromAscii(const unsigned char *ascii)
+        { return FromAscii((const char *)ascii); }
+    static wxString FromAscii(const unsigned char *ascii, size_t len)
+        { return FromAscii((const char *)ascii, len); }
+
     // conversion to/from UTF-8:
 #if wxUSE_UNICODE_UTF8
     static wxString FromUTF8(const char *utf8)
@@ -2635,8 +2651,8 @@ private:
 #endif // wxUSE_UNICODE_UTF8
 
   friend class WXDLLIMPEXP_FWD_BASE wxCStrData;
-  friend class wxImplStringBuffer;
-  friend class wxImplStringBufferLength;
+  friend class wxStringInternalBuffer;
+  friend class wxStringInternalBufferLength;
 };
 
 #ifdef wxNEEDS_WXSTRING_PRINTF_MIXIN
@@ -2698,16 +2714,16 @@ inline wxString operator+(wchar_t ch, const wxString& string)
 #if !wxUSE_STL_BASED_WXSTRING
 // string buffer for direct access to string data in their native
 // representation:
-class wxImplStringBuffer
+class wxStringInternalBuffer
 {
 public:
     typedef wxStringCharType CharType;
 
-    wxImplStringBuffer(wxString& str, size_t lenWanted = 1024)
+    wxStringInternalBuffer(wxString& str, size_t lenWanted = 1024)
         : m_str(str), m_buf(NULL)
         { m_buf = m_str.DoGetWriteBuf(lenWanted); }
 
-    ~wxImplStringBuffer() { m_str.DoUngetWriteBuf(); }
+    ~wxStringInternalBuffer() { m_str.DoUngetWriteBuf(); }
 
     operator wxStringCharType*() const { return m_buf; }
 
@@ -2715,22 +2731,22 @@ private:
     wxString&         m_str;
     wxStringCharType *m_buf;
 
-    DECLARE_NO_COPY_CLASS(wxImplStringBuffer)
+    DECLARE_NO_COPY_CLASS(wxStringInternalBuffer)
 };
 
-class wxImplStringBufferLength
+class wxStringInternalBufferLength
 {
 public:
     typedef wxStringCharType CharType;
 
-    wxImplStringBufferLength(wxString& str, size_t lenWanted = 1024)
+    wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024)
         : m_str(str), m_buf(NULL), m_len(0), m_lenSet(false)
     {
         m_buf = m_str.DoGetWriteBuf(lenWanted);
         wxASSERT(m_buf != NULL);
     }
 
-    ~wxImplStringBufferLength()
+    ~wxStringInternalBufferLength()
     {
         wxASSERT(m_lenSet);
         m_str.DoUngetWriteBuf(m_len);
@@ -2745,13 +2761,13 @@ private:
     size_t            m_len;
     bool              m_lenSet;
 
-    DECLARE_NO_COPY_CLASS(wxImplStringBufferLength)
+    DECLARE_NO_COPY_CLASS(wxStringInternalBufferLength)
 };
 
 #endif // !wxUSE_STL_BASED_WXSTRING
 
 template<typename T>
-class wxStringTypeBufferBase
+class WXDLLIMPEXP_BASE wxStringTypeBufferBase
 {
 public:
     typedef T CharType;
@@ -2769,7 +2785,7 @@ protected:
 };
 
 template<typename T>
-class wxStringTypeBufferLengthBase
+class WXDLLIMPEXP_BASE wxStringTypeBufferLengthBase
 {
 public:
     typedef T CharType;
@@ -2778,12 +2794,6 @@ public:
         : m_str(str), m_buf(lenWanted), m_len(0), m_lenSet(false)
         { }
 
-    ~wxStringTypeBufferLengthBase()
-    {
-        wxASSERT(m_lenSet);
-        m_str.assign(m_buf.data(), m_len);
-    }
-
     operator CharType*() { return m_buf.data(); }
     void SetLength(size_t length) { m_len = length; m_lenSet = true; }
 
@@ -2825,30 +2835,37 @@ public:
 };
 
 #if wxUSE_STL_BASED_WXSTRING
-class wxImplStringBuffer : public wxStringTypeBufferBase<wxStringCharType>
+
+WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase<wxStringCharType> )
+
+class wxStringInternalBuffer : public wxStringTypeBufferBase<wxStringCharType>
 {
 public:
-    wxImplStringBuffer(wxString& str, size_t lenWanted = 1024)
+    wxStringInternalBuffer(wxString& str, size_t lenWanted = 1024)
         : wxStringTypeBufferBase<wxStringCharType>(str, lenWanted) {}
-    ~wxImplStringBuffer()
+    ~wxStringInternalBuffer()
         { m_str.m_impl.assign(m_buf.data()); }
 
-    DECLARE_NO_COPY_CLASS(wxImplStringBuffer)
+    DECLARE_NO_COPY_CLASS(wxStringInternalBuffer)
 };
 
-class wxImplStringBufferLength : public wxStringTypeBufferLengthBase<wxStringCharType>
+WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(
+    wxStringTypeBufferLengthBase<wxStringCharType> )
+
+class wxStringInternalBufferLength
+    : public wxStringTypeBufferLengthBase<wxStringCharType>
 {
 public:
-    wxImplStringBufferLength(wxString& str, size_t lenWanted = 1024)
+    wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024)
         : wxStringTypeBufferLengthBase<wxStringCharType>(str, lenWanted) {}
 
-    ~wxImplStringBufferLength()
+    ~wxStringInternalBufferLength()
     {
         wxASSERT(m_lenSet);
         m_str.m_impl.assign(m_buf.data(), m_len);
     }
 
-    DECLARE_NO_COPY_CLASS(wxImplStringBufferLength)
+    DECLARE_NO_COPY_CLASS(wxStringInternalBufferLength)
 };
 #endif // wxUSE_STL_BASED_WXSTRING
 
@@ -2857,10 +2874,42 @@ public:
 typedef wxStringTypeBuffer<wxChar>        wxStringBuffer;
 typedef wxStringTypeBufferLength<wxChar>  wxStringBufferLength;
 #else // if !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8
-typedef wxImplStringBuffer                wxStringBuffer;
-typedef wxImplStringBufferLength          wxStringBufferLength;
+typedef wxStringInternalBuffer                wxStringBuffer;
+typedef wxStringInternalBufferLength          wxStringBufferLength;
 #endif // !wxUSE_STL_BASED_WXSTRING && !wxUSE_UNICODE_UTF8
 
+#if wxUSE_UNICODE_UTF8
+typedef wxStringInternalBuffer                wxUTF8StringBuffer;
+typedef wxStringInternalBufferLength          wxUTF8StringBufferLength;
+#elif wxUSE_UNICODE_WCHAR
+
+WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase<char> )
+
+class WXDLLIMPEXP_BASE wxUTF8StringBuffer : public wxStringTypeBufferBase<char>
+{
+public:
+    wxUTF8StringBuffer(wxString& str, size_t lenWanted = 1024)
+        : wxStringTypeBufferBase<char>(str, lenWanted) {}
+    ~wxUTF8StringBuffer();
+
+    DECLARE_NO_COPY_CLASS(wxUTF8StringBuffer)
+};
+
+WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferLengthBase<char> )
+
+class WXDLLIMPEXP_BASE wxUTF8StringBufferLength
+    : public wxStringTypeBufferLengthBase<char>
+{
+public:
+    wxUTF8StringBufferLength(wxString& str, size_t lenWanted = 1024)
+        : wxStringTypeBufferLengthBase<char>(str, lenWanted) {}
+    ~wxUTF8StringBufferLength();
+
+    DECLARE_NO_COPY_CLASS(wxUTF8StringBufferLength)
+};
+#endif // wxUSE_UNICODE_UTF8/wxUSE_UNICODE_WCHAR
+
+
 // ---------------------------------------------------------------------------
 // wxString comparison functions: operator versions are always case sensitive
 // ---------------------------------------------------------------------------
@@ -2983,7 +3032,15 @@ WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxCharBuffer&);
 WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxWCharBuffer&);
 #endif
 
-#endif  // wxSTD_STRING_COMPATIBILITY
+#if wxUSE_UNICODE && defined(HAVE_WOSTREAM)
+
+WXDLLIMPEXP_BASE wxSTD wostream& operator<<(wxSTD wostream&, const wxString&);
+WXDLLIMPEXP_BASE wxSTD wostream& operator<<(wxSTD wostream&, const wxCStrData&);
+WXDLLIMPEXP_BASE wxSTD wostream& operator<<(wxSTD wostream&, const wxWCharBuffer&);
+
+#endif  // wxUSE_UNICODE && defined(HAVE_WOSTREAM)
+
+#endif  // wxUSE_STD_IOSTREAM
 
 // ---------------------------------------------------------------------------
 // wxCStrData implementation