]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/string.h
Made widgets sample take up less space
[wxWidgets.git] / include / wx / string.h
index 24a6585e4d790d54c606645b96e40a319ab95199..51583c89a355333cd55a87df7654b7e1b8cf11b8 100644 (file)
 // compile the std::string compatibility functions if defined
 #define   wxSTD_STRING_COMPATIBILITY
 
 // compile the std::string compatibility functions if defined
 #define   wxSTD_STRING_COMPATIBILITY
 
-// define to derive wxString from wxObject (deprecated!)
-#ifdef WXSTRING_IS_WXOBJECT
-    #undef WXSTRING_IS_WXOBJECT
-#endif
-
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
 
+#include "wx/defs.h"        // everybody should include this
+
 #if defined(__WXMAC__) || defined(__VISAGECPP__)
     #include <ctype.h>
 #endif
 #if defined(__WXMAC__) || defined(__VISAGECPP__)
     #include <ctype.h>
 #endif
 
 #ifdef HAVE_STRINGS_H
     #include <strings.h>    // for strcasecmp()
 
 #ifdef HAVE_STRINGS_H
     #include <strings.h>    // for strcasecmp()
-#endif // AIX
+#endif // HAVE_STRINGS_H
 
 
-#include "wx/defs.h"        // everybody should include this
 #include "wx/wxchar.h"      // for wxChar
 #include "wx/buffer.h"      // for wxCharBuffer
 #include "wx/strconv.h"     // for wxConvertXXX() macros and wxMBConv classes
 
 #include "wx/wxchar.h"      // for wxChar
 #include "wx/buffer.h"      // for wxCharBuffer
 #include "wx/strconv.h"     // for wxConvertXXX() macros and wxMBConv classes
 
-#ifndef  WX_PRECOMP
-  #ifdef    WXSTRING_IS_WXOBJECT
-    #include "wx/object.h" // base class
-  #endif
-#endif // !PCH
-
 // ---------------------------------------------------------------------------
 // macros
 // ---------------------------------------------------------------------------
 
 // ---------------------------------------------------------------------------
 // macros
 // ---------------------------------------------------------------------------
 
-// 'naughty' cast
+// casts [unfortunately!] needed to call some broken functions which require
+// "char *" instead of "const char *"
 #define   WXSTRINGCAST (wxChar *)(const wxChar *)
 #define   wxCSTRINGCAST (wxChar *)(const wxChar *)
 #define   wxMBSTRINGCAST (char *)(const char *)
 #define   wxWCSTRINGCAST (wchar_t *)(const wchar_t *)
 
 // implementation only
 #define   WXSTRINGCAST (wxChar *)(const wxChar *)
 #define   wxCSTRINGCAST (wxChar *)(const wxChar *)
 #define   wxMBSTRINGCAST (char *)(const char *)
 #define   wxWCSTRINGCAST (wchar_t *)(const wchar_t *)
 
 // implementation only
-#define   ASSERT_VALID_INDEX(i) wxASSERT( (unsigned)(i) <= Len() )
+#define   wxASSERT_VALID_INDEX(i) \
+    wxASSERT_MSG( (size_t)(i) <= Len(), _T("invaid index in wxString") )
 
 // ----------------------------------------------------------------------------
 // constants
 
 // ----------------------------------------------------------------------------
 // constants
@@ -139,6 +131,8 @@ inline int Stricmp(const char *psz1, const char *psz2)
   return stricmp(psz1, psz2);
 #elif defined(__WATCOMC__)
   return stricmp(psz1, psz2);
   return stricmp(psz1, psz2);
 #elif defined(__WATCOMC__)
   return stricmp(psz1, psz2);
+#elif defined(__DJGPP__)
+  return stricmp(psz1, psz2);
 #elif defined(__EMX__)
   return stricmp(psz1, psz2);
 #elif defined(__WXPM__)
 #elif defined(__EMX__)
   return stricmp(psz1, psz2);
 #elif defined(__WXPM__)
@@ -241,15 +235,8 @@ struct WXDLLEXPORT wxStringData
 //  - regular expressions support
 // ---------------------------------------------------------------------------
 
 //  - regular expressions support
 // ---------------------------------------------------------------------------
 
-#ifdef  WXSTRING_IS_WXOBJECT
-class WXDLLEXPORT wxString : public wxObject
-{
-    DECLARE_DYNAMIC_CLASS(wxString)
-#else   //WXSTRING_IS_WXOBJECT
 class WXDLLEXPORT wxString
 {
 class WXDLLEXPORT wxString
 {
-#endif  //WXSTRING_IS_WXOBJECT
-
 friend class WXDLLEXPORT wxArrayString;
 
   // NB: special care was taken in arranging the member functions in such order
 friend class WXDLLEXPORT wxArrayString;
 
   // NB: special care was taken in arranging the member functions in such order
@@ -344,7 +331,7 @@ public:
 
 #if wxUSE_WCHAR_T
     // from wide (Unicode) string
 
 #if wxUSE_WCHAR_T
     // from wide (Unicode) string
-  wxString(const wchar_t *pwz, wxMBConv& conv = wxConvLibc);
+  wxString(const wchar_t *pwz, wxMBConv& conv = wxConvLibc, size_t nLength = wxSTRING_MAXLEN);
 #endif // !wxUSE_WCHAR_T
 
     // from wxCharBuffer
 #endif // !wxUSE_WCHAR_T
 
     // from wxCharBuffer
@@ -392,13 +379,13 @@ public:
   // data access (all indexes are 0 based)
     // read access
     wxChar  GetChar(size_t n) const
   // data access (all indexes are 0 based)
     // read access
     wxChar  GetChar(size_t n) const
-      { ASSERT_VALID_INDEX( n );  return m_pchData[n]; }
+      { wxASSERT_VALID_INDEX( n );  return m_pchData[n]; }
     // read/write access
     wxChar& GetWritableChar(size_t n)
     // read/write access
     wxChar& GetWritableChar(size_t n)
-      { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
+      { wxASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
     // write access
     void  SetChar(size_t n, wxChar ch)
     // write access
     void  SetChar(size_t n, wxChar ch)
-      { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); m_pchData[n] = ch; }
+      { wxASSERT_VALID_INDEX( n ); CopyBeforeWrite(); m_pchData[n] = ch; }
 
     // get last character
     wxChar  Last() const
 
     // get last character
     wxChar  Last() const
@@ -431,24 +418,24 @@ public:
 
     // operator version of GetChar
     wxChar  operator[](size_t n) const
 
     // operator version of GetChar
     wxChar  operator[](size_t n) const
-      { ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
+      { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; }
 
     // operator version of GetChar
     wxChar  operator[](int n) const
 
     // operator version of GetChar
     wxChar  operator[](int n) const
-      { ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
+      { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; }
 
     // operator version of GetWriteableChar
     wxChar& operator[](size_t n)
 
     // operator version of GetWriteableChar
     wxChar& operator[](size_t n)
-      { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
+      { wxASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
 
 #ifndef wxSIZE_T_IS_UINT
     // operator version of GetChar
     wxChar operator[](unsigned int n) const
 
 #ifndef wxSIZE_T_IS_UINT
     // operator version of GetChar
     wxChar operator[](unsigned int n) const
-      { ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
+      { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; }
 
     // operator version of GetWriteableChar
     wxChar& operator[](unsigned int n)
 
     // operator version of GetWriteableChar
     wxChar& operator[](unsigned int n)
-      { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
+      { wxASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
 #endif // size_t != unsigned int
 
     // implicit conversion to C string
 #endif // size_t != unsigned int
 
     // implicit conversion to C string
@@ -686,12 +673,15 @@ public:
     // check if the string contents matches a mask containing '*' and '?'
   bool Matches(const wxChar *szMask) const;
 
     // check if the string contents matches a mask containing '*' and '?'
   bool Matches(const wxChar *szMask) const;
 
-    // conversion to numbers: all functions return TRUE only if the whole string
-    // is a number and put the value of this number into the pointer provided
+    // conversion to numbers: all functions return TRUE only if the whole
+    // string is a number and put the value of this number into the pointer
+    // provided, the base is the numeric base in which the conversion should be
+    // done and must be comprised between 2 and 36 or be 0 in which case the
+    // standard C rules apply (leading '0' => octal, "0x" => hex)
         // convert to a signed integer
         // convert to a signed integer
-    bool ToLong(long *val, int base = 0) const;
+    bool ToLong(long *val, int base = 10) const;
         // convert to an unsigned integer
         // convert to an unsigned integer
-    bool ToULong(unsigned long *val, int base = 0) const;
+    bool ToULong(unsigned long *val, int base = 10) const;
         // convert to a double
     bool ToDouble(double *val) const;
 
         // convert to a double
     bool ToDouble(double *val) const;
 
@@ -987,9 +977,17 @@ public:
                                  const wxString& second);
 
   // constructors and destructor
                                  const wxString& second);
 
   // constructors and destructor
-    // default ctor: if autoSort is TRUE, the array is always sorted (in
-    // alphabetical order)
-  wxArrayString(bool autoSort = FALSE);
+    // default ctor
+  wxArrayString() { Init(FALSE); }
+    // if autoSort is TRUE, the array is always sorted (in alphabetical order)
+    //
+    // NB: the reason for using int and not bool is that like this we can avoid
+    //     using this ctor for implicit conversions from "const char *" (which
+    //     we'd like to be implicitly converted to wxString instead!)
+    //
+    //     of course, using explicit would be even better - if all compilers
+    //     supported it...
+  wxArrayString(int autoSort) { Init(autoSort != 0); }
     // copy ctor
   wxArrayString(const wxArrayString& array);
     // assignment operator
     // copy ctor
   wxArrayString(const wxArrayString& array);
     // assignment operator
@@ -1024,6 +1022,12 @@ public:
     // get last item
   wxString& Last() const { wxASSERT( !IsEmpty() ); return Item(Count() - 1); }
 
     // get last item
   wxString& Last() const { wxASSERT( !IsEmpty() ); return Item(Count() - 1); }
 
+    // return a wxString[], useful for the controls which
+    // take one in their ctor.  You must delete[] it yourself
+    // once you are done with it.  Will return NULL if the
+    // ArrayString was empty.
+  wxString* GetStringArray() const;
+
   // item management
     // Search the element in the array, starting from the beginning if
     // bFromEnd is FALSE or from end otherwise. If bCase, comparison is case
   // item management
     // Search the element in the array, starting from the beginning if
     // bFromEnd is FALSE or from end otherwise. If bCase, comparison is case
@@ -1035,6 +1039,8 @@ public:
   size_t Add(const wxString& str);
     // add new element at given position
   void Insert(const wxString& str, size_t uiIndex);
   size_t Add(const wxString& str);
     // add new element at given position
   void Insert(const wxString& str, size_t uiIndex);
+    // expand the array to have count elements
+  void SetCount(size_t count);
     // remove first item matching this value
   void Remove(const wxChar *sz);
     // remove item by index
     // remove first item matching this value
   void Remove(const wxChar *sz);
     // remove item by index
@@ -1055,6 +1061,7 @@ public:
   bool operator!=(const wxArrayString& a) const { return !(*this == a); }
 
 protected:
   bool operator!=(const wxArrayString& a) const { return !(*this == a); }
 
 protected:
+  void Init(bool autoSort);             // common part of all ctors
   void Copy(const wxArrayString& src);  // copies the contents of another array
 
 private:
   void Copy(const wxArrayString& src);  // copies the contents of another array
 
 private:
@@ -1080,6 +1087,25 @@ public:
     { Copy(array); }
 };
 
     { Copy(array); }
 };
 
+// ----------------------------------------------------------------------------
+// wxStringBuffer: a tiny class allowing to get a writable pointer into string
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxStringBuffer
+{
+public:
+    wxStringBuffer(wxString& str, size_t lenWanted = 1024)
+        : m_str(str) { m_buf = m_str.GetWriteBuf(lenWanted); }
+
+    ~wxStringBuffer() { m_str.UngetWriteBuf(); }
+
+    operator wxChar*() const { return m_buf; }
+
+private:
+    wxString& m_str;
+    wxChar   *m_buf;
+};
+
 // ---------------------------------------------------------------------------
 // wxString comparison functions: operator versions are always case sensitive
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // wxString comparison functions: operator versions are always case sensitive
 // ---------------------------------------------------------------------------
@@ -1169,7 +1195,7 @@ inline wxString operator+(const wxCharBuffer& buf, const wxString& string)
 // ---------------------------------------------------------------------------
 
 // don't pollute the library user's name space
 // ---------------------------------------------------------------------------
 
 // don't pollute the library user's name space
-#undef ASSERT_VALID_INDEX
+#undef wxASSERT_VALID_INDEX
 
 #if defined(wxSTD_STRING_COMPATIBILITY) && wxUSE_STD_IOSTREAM
 
 
 #if defined(wxSTD_STRING_COMPATIBILITY) && wxUSE_STD_IOSTREAM