]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/string.h
wxCheckListBox fixes: crash/memory leak when items are dynamically
[wxWidgets.git] / include / wx / string.h
index d385f10b615b645e2ee991c2a32e005f7048e825..518b8f5f79732278439b9859b77982b9f1d51322 100644 (file)
@@ -56,7 +56,7 @@
 
 // maximum possible length for a string means "take all string" everywhere
 //  (as sizeof(StringData) is unknown here we substract 100)
-#define   STRING_MAXLEN     (UINT_MAX - 100)
+const unsigned int wxSTRING_MAXLEN = UINT_MAX - 100;
 
 // 'naughty' cast
 #define   WXSTRINGCAST (char *)(const char *)
@@ -70,7 +70,7 @@
 //---------------------------------------------------------------------------
 
 // checks whether the passed in pointer is NULL and if the string is empty
-inline bool WXDLLEXPORT IsEmpty(const char *p) { return !p || !*p; }
+inline bool WXDLLEXPORT IsEmpty(const char *p) { return (!p || !*p); }
 
 // safe version of strlen() (returns 0 if passed NULL pointer)
 inline size_t WXDLLEXPORT Strlen(const char *psz)
@@ -79,7 +79,7 @@ inline size_t WXDLLEXPORT Strlen(const char *psz)
 // portable strcasecmp/_stricmp
 inline int WXDLLEXPORT Stricmp(const char *psz1, const char *psz2)
 {
-#if     defined(__VISUALC__) || defined(__MWERKS__)
+#if     defined(__VISUALC__) || ( defined(__MWERKS__) && defined(__INTEL__) )
   return _stricmp(psz1, psz2);
 #elif     defined(__SC__)
   return _stricmp(psz1, psz2);
@@ -91,7 +91,7 @@ inline int WXDLLEXPORT Stricmp(const char *psz1, const char *psz2)
   return stricmp(psz1, psz2);
 #elif   defined(__UNIX__) || defined(__GNUWIN32__)
   return strcasecmp(psz1, psz2);
-#elif defined(__MWERKS__) && !defined(_MSC_VER)
+#elif defined(__MWERKS__) && !defined(__INTEL__)
   register char c1, c2;
   do {
     c1 = tolower(*psz1++);
@@ -144,8 +144,8 @@ struct WXDLLEXPORT wxStringData
   char* data() const { return (char*)(this + 1); }
 
   // empty string has a special ref count so it's never deleted
-  bool  IsEmpty()   const { return nRefs == -1; }
-  bool  IsShared()  const { return nRefs > 1;   }
+  bool  IsEmpty()   const { return (nRefs == -1); }
+  bool  IsShared()  const { return (nRefs > 1);   }
 
   // lock/unlock
   void  Lock()   { if ( !IsEmpty() ) nRefs++;                    }
@@ -153,8 +153,8 @@ struct WXDLLEXPORT wxStringData
 
   // if we had taken control over string memory (GetWriteBuf), it's
   // intentionally put in invalid state
-  void  Validate(bool b)  { nRefs = b ? 1 : 0; }
-  bool  IsValid() const   { return nRefs != 0; }
+  void  Validate(bool b)  { nRefs = (b ? 1 : 0); }
+  bool  IsValid() const   { return (nRefs != 0); }
 };
 
 // ---------------------------------------------------------------------------
@@ -206,7 +206,7 @@ private:
     // ctors, use Reinit() otherwise)
   void Init() { m_pchData = (char *)g_szNul; }
     // initializaes the string with (a part of) C-string
-  void InitWith(const char *psz, size_t nPos = 0, size_t nLen = STRING_MAXLEN);
+  void InitWith(const char *psz, size_t nPos = 0, size_t nLen = wxSTRING_MAXLEN);
     // as Init, but also frees old data
   void Reinit() { GetStringData()->Unlock(); Init(); }
 
@@ -226,6 +226,13 @@ private:
   void CopyBeforeWrite();
   void AllocBeforeWrite(size_t);
 
+  // this method is not implemented - there is _no_ conversion from int to
+  // string, you're doing something wrong if the compiler wants to call it!
+  //
+  // try `s << i' or `s.Printf("%d", i)' instead
+  wxString(int);
+  wxString(long);
+
 public:
   // constructors and destructor
     // ctor for an empty string
@@ -247,11 +254,11 @@ public:
     // string containing nRepeat copies of ch
   wxString(char ch, size_t nRepeat = 1);
     // ctor takes first nLength characters from C string
-    // (default value of STRING_MAXLEN means take all the string)
-  wxString(const char *psz, size_t nLength = STRING_MAXLEN)
+    // (default value of wxSTRING_MAXLEN means take all the string)
+  wxString(const char *psz, size_t nLength = wxSTRING_MAXLEN)
     { InitWith(psz, 0, nLength); }
     // from C string (for compilers using unsigned char)
-  wxString(const unsigned char* psz, size_t nLength = STRING_MAXLEN);
+  wxString(const unsigned char* psz, size_t nLength = wxSTRING_MAXLEN);
     // from wide (UNICODE) string
   wxString(const wchar_t *pwz);
     // dtor is not virtual, this class must not be inherited from!
@@ -403,7 +410,7 @@ public:
   wxString& operator<<(double d);
 
   // string comparison
-    // case-sensitive comparison: return 0 if =, +1 if > or -1 if <
+    // case-sensitive comparison (returns a value < 0, = 0 or > 0)
   int  Cmp(const char *psz) const { return strcmp(c_str(), psz); }
     // same as Cmp() but not case-sensitive
   int  CmpNoCase(const char *psz) const { return Stricmp(c_str(), psz); }
@@ -415,7 +422,7 @@ public:
   // simple sub-string extraction
       // return substring starting at nFirst of length nCount (or till the end
       // if nCount = default value)
-  wxString Mid(size_t nFirst, size_t nCount = STRING_MAXLEN) const;
+  wxString Mid(size_t nFirst, size_t nCount = wxSTRING_MAXLEN) const;
 
     // operator version of Mid()
   wxString  operator()(size_t start, size_t len) const
@@ -563,7 +570,7 @@ public:
     // return the length of the string
   size_t length() const { return Len(); }
     // return the maximum size of the string
-  size_t max_size() const { return STRING_MAXLEN; }
+  size_t max_size() const { return wxSTRING_MAXLEN; }
     // resize the string, filling the space with c if c != 0
   void resize(size_t nSize, char ch = '\0');
     // delete the contents of the string
@@ -733,6 +740,10 @@ public:
 class WXDLLEXPORT wxArrayString
 {
 public:
+  // type of function used by wxArrayString::Sort()
+  typedef int (*CompareFunction)(const wxString& first,
+                                 const wxString& second);
+
   // constructors and destructor
     // default ctor
   wxArrayString();
@@ -785,13 +796,19 @@ public:
     // remove item by index
   void Remove(size_t nIndex);
 
-  // sort array elements
-  void Sort(bool bCase = TRUE, bool bReverse = FALSE);
+  // sorting
+    // sort array elements in alphabetical order (or reversed alphabetical
+    // order if reverseOrder parameter is TRUE)
+  void Sort(bool reverseOrder = FALSE);
+    // sort array elements using specified comparaison function
+  void Sort(CompareFunction compareFunction);
 
 private:
   void    Grow();     // makes array bigger if needed
   void    Free();     // free the string stored
 
+  void    DoSort();   // common part of all Sort() variants
+
   size_t  m_nSize,    // current size of the array
           m_nCount;   // current number of elements