]> git.saurik.com Git - wxWidgets.git/commitdiff
wxArrayString::Sort() implemented
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 9 Feb 1999 16:52:19 +0000 (16:52 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 9 Feb 1999 16:52:19 +0000 (16:52 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1655 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/string.h
src/common/string.cpp

index 593b80c603398e472bbc0bc9fd1c3f8e8a0f6ba6..d2b6a60a8512149e20d1da770a8653cbe51901e0 100644 (file)
@@ -410,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); }
@@ -740,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();
@@ -792,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
 
index 3ba5ee9ab579562629c00c81673e6868798c1987..06bb55f9c30953ff72033610af3b01f8f41adc0b 100644 (file)
@@ -10,7 +10,7 @@
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation "string.h"
+  #pragma implementation "string.h"
 #endif
 
 /*
@@ -28,7 +28,7 @@
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+  #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
@@ -42,7 +42,7 @@
 #include <stdlib.h>
 
 #ifdef __SALFORDC__
-#include <clib.h>
+  #include <clib.h>
 #endif
 
 #if wxUSE_WCSRTOMBS
@@ -1448,10 +1448,78 @@ void wxArrayString::Remove(const char *sz)
   Remove(iIndex);
 }
 
+// ----------------------------------------------------------------------------
+// sorting
+// ----------------------------------------------------------------------------
+
+// we can only sort one array at a time with the quick-sort based
+// implementation
+#if wxUSE_THREADS
+  #include <wx/thread.h>
+
+  // need a critical section to protect access to gs_compareFunction and
+  // gs_sortAscending variables
+  static wxCriticalSection gs_critsectStringSort;
+
+  // call this before the value of the global sort vars is changed/after
+  // you're finished with them
+  #define START_SORT()     gs_critsectStringSort.Enter()
+  #define END_SORT()       gs_critsectStringSort.Leave()
+#else // !threads
+  #define START_SORT()
+  #define END_SORT()
+#endif // wxUSE_THREADS
+
+// function to use for string comparaison
+static wxArrayString::CompareFunction gs_compareFunction = NULL;
+
+// if we don't use the compare function, this flag tells us if we sort the
+// array in ascending or descending order
+static bool gs_sortAscending = TRUE;
+
+// function which is called by quick sort
+static int wxStringCompareFunction(const void *first, const void *second)
+{
+  wxString *strFirst = (wxString *)first;
+  wxString *strSecond = (wxString *)second;
+
+  if ( gs_compareFunction )
+    return gs_compareFunction(*strFirst, *strSecond);
+  else {
+    int result = strcmp(strFirst->c_str(), strSecond->c_str());
+
+    return gs_sortAscending ? result : -result;
+  }
+}
+
 // sort array elements using passed comparaison function
+void wxArrayString::Sort(CompareFunction compareFunction)
+{
+  START_SORT();
+
+  wxASSERT( !gs_compareFunction );  // must have been reset to NULL
+  gs_compareFunction = compareFunction;
+
+  DoSort();
+
+  END_SORT();
+}
+
+void wxArrayString::Sort(bool reverseOrder)
+{
+  START_SORT();
+
+  wxASSERT( !gs_compareFunction );  // must have been reset to NULL
+  gs_sortAscending = !reverseOrder;
+
+  DoSort();
+
+  END_SORT();
+}
 
-void wxArrayString::Sort(bool WXUNUSED(bCase), bool WXUNUSED(bReverse) )
+void wxArrayString::DoSort()
 {
-  //@@@@ TO DO
-  //qsort(m_pItems, m_nCount, sizeof(char *), fCmp);
+  // just sort the pointers using qsort() - of course it only works because
+  // wxString() *is* a pointer to its data
+  qsort(m_pItems, m_nCount, sizeof(char *), wxStringCompareFunction);
 }