]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/arrstr.cpp
Better text control non-selection solution
[wxWidgets.git] / src / common / arrstr.cpp
index fe36a74bf8e5883054ef1500a50f5f16936099a5..084196b83ee99a6f3878f5db5f570d8a4cbbc4a3 100644 (file)
 #endif
 
 #include "wx/arrstr.h"
-#include "wx/thread.h" 
+
+#include "wx/beforestd.h"
+#include <algorithm>
+#include <functional>
+#include "wx/afterstd.h"
 
 // ============================================================================
 // ArrayString
@@ -29,7 +33,7 @@
 
 wxArrayString::wxArrayString(size_t sz, const char** a)
 {
-#if !wxUSE_STL
+#if !wxUSE_STD_CONTAINERS
     Init(false);
 #endif
     for (size_t i=0; i < sz; i++)
@@ -38,7 +42,7 @@ wxArrayString::wxArrayString(size_t sz, const char** a)
 
 wxArrayString::wxArrayString(size_t sz, const wchar_t** a)
 {
-#if !wxUSE_STL
+#if !wxUSE_STD_CONTAINERS
     Init(false);
 #endif
     for (size_t i=0; i < sz; i++)
@@ -47,14 +51,14 @@ wxArrayString::wxArrayString(size_t sz, const wchar_t** a)
 
 wxArrayString::wxArrayString(size_t sz, const wxString* a)
 {
-#if !wxUSE_STL
+#if !wxUSE_STD_CONTAINERS
     Init(false);
 #endif
     for (size_t i=0; i < sz; i++)
         Add(a[i]);
 }
 
-#if !wxUSE_STL
+#if !wxUSE_STD_CONTAINERS
 
 // size increment = min(50% of current size, ARRAY_MAXSIZE_INCREMENT)
 #define   ARRAY_MAXSIZE_INCREMENT       4096
@@ -138,7 +142,7 @@ void wxArrayString::Grow(size_t nIncrement)
           pNew[j] = m_pItems[j];
 
       // delete old memory (but do not release the strings!)
-      wxDELETEA(m_pItems);
+      delete [] m_pItems;
 
       m_pItems = pNew;
     }
@@ -163,7 +167,7 @@ void wxArrayString::Clear()
 // dtor
 wxArrayString::~wxArrayString()
 {
-  wxDELETEA(m_pItems);
+  delete [] m_pItems;
 }
 
 void wxArrayString::reserve(size_t nSize)
@@ -202,6 +206,7 @@ void wxArrayString::Shrink()
         pNew[j] = m_pItems[j];
     delete [] m_pItems;
     m_pItems = pNew;
+    m_nSize = m_nCount;
   }
 }
 
@@ -340,6 +345,14 @@ wxArrayString::insert(iterator it, const_iterator first, const_iterator last)
     }
 }
 
+void wxArrayString::resize(size_type n, value_type v)
+{
+  if ( n < m_nCount )
+      m_nCount = n;
+  else if ( n > m_nCount )
+      Add(v, n - m_nCount);
+}
+
 // expand the array
 void wxArrayString::SetCount(size_t count)
 {
@@ -374,85 +387,65 @@ void wxArrayString::Remove(const wxString& sz)
   RemoveAt(iIndex);
 }
 
-void wxArrayString::assign(const_iterator first, const_iterator last)
-{
-    reserve(last - first);
-    for(; first != last; ++first)
-        push_back(*first);
-}
-
 // ----------------------------------------------------------------------------
 // sorting
 // ----------------------------------------------------------------------------
 
-// we can only sort one array at a time with the quick-sort based
-// implementation
-#if wxUSE_THREADS
-  // need a critical section to protect access to gs_compareFunction and
-  // gs_sortAscending variables
-  static wxCriticalSection gs_critsectStringSort;
-#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
-extern "C" int wxC_CALLING_CONV     // LINKAGEMODE
-wxStringCompareFunction(const void *first, const void *second)
+// we need an adaptor as our predicates use qsort() convention and so return
+// negative, null or positive value depending on whether the first item is less
+// than, equal to or greater than the other one while we need a real boolean
+// predicate now that we use std::sort()
+struct wxSortPredicateAdaptor
 {
-  wxString *strFirst = (wxString *)first;
-  wxString *strSecond = (wxString *)second;
+    wxSortPredicateAdaptor(wxArrayString::CompareFunction compareFunction)
+        : m_compareFunction(compareFunction)
+    {
+    }
 
-  if ( gs_compareFunction ) {
-    return gs_compareFunction(*strFirst, *strSecond);
-  }
-  else {
-    // maybe we should use wxStrcoll
-    int result = strFirst->Cmp(*strSecond);
+    bool operator()(const wxString& first, const wxString& second) const
+    {
+        return (*m_compareFunction)(first, second) < 0;
+    }
 
-    return gs_sortAscending ? result : -result;
-  }
-}
+    wxArrayString::CompareFunction m_compareFunction;
+};
 
-// sort array elements using passed comparaison function
 void wxArrayString::Sort(CompareFunction compareFunction)
 {
-  wxCRIT_SECT_LOCKER(lockCmpFunc, gs_critsectStringSort);
-
-  wxASSERT( !gs_compareFunction );  // must have been reset to NULL
-  gs_compareFunction = compareFunction;
+    wxCHECK_RET( !m_autoSort, wxT("can't use this method with sorted arrays") );
 
-  DoSort();
-
-  // reset it to NULL so that Sort(bool) will work the next time
-  gs_compareFunction = NULL;
+    std::sort(m_pItems, m_pItems + m_nCount,
+                wxSortPredicateAdaptor(compareFunction));
 }
 
-extern "C"
+struct wxSortPredicateAdaptor2
 {
-    typedef int (wxC_CALLING_CONV * wxStringCompareFn)(const void *first,
-                                                       const void *second);
-}
+    wxSortPredicateAdaptor2(wxArrayString::CompareFunction2 compareFunction)
+        : m_compareFunction(compareFunction)
+    {
+    }
+
+    bool operator()(const wxString& first, const wxString& second) const
+    {
+        return (*m_compareFunction)(const_cast<wxString *>(&first),
+                                    const_cast<wxString *>(&second)) < 0;
+    }
+
+    wxArrayString::CompareFunction2 m_compareFunction;
+};
 
 void wxArrayString::Sort(CompareFunction2 compareFunction)
 {
-  qsort(m_pItems, m_nCount, sizeof(wxString), (wxStringCompareFn)compareFunction);
+    std::sort(m_pItems, m_pItems + m_nCount,
+                wxSortPredicateAdaptor2(compareFunction));
 }
 
 void wxArrayString::Sort(bool reverseOrder)
 {
-  Sort(reverseOrder ? wxStringSortDescending : wxStringSortAscending);
-}
-
-void wxArrayString::DoSort()
-{
-  wxCHECK_RET( !m_autoSort, wxT("can't use this method with sorted arrays") );
-
-  qsort(m_pItems, m_nCount, sizeof(wxString), wxStringCompareFunction);
+    if ( reverseOrder )
+        std::sort(m_pItems, m_pItems + m_nCount, std::greater<wxString>());
+    else // normal sort
+        std::sort(m_pItems, m_pItems + m_nCount);
 }
 
 bool wxArrayString::operator==(const wxArrayString& a) const
@@ -469,19 +462,7 @@ bool wxArrayString::operator==(const wxArrayString& a) const
     return true;
 }
 
-#endif // !wxUSE_STL
-
-int wxCMPFUNC_CONV wxStringSortAscending(wxString* s1, wxString* s2)
-{
-    return  s1->Cmp(*s2);
-}
-
-int wxCMPFUNC_CONV wxStringSortDescending(wxString* s1, wxString* s2)
-{
-    return -s1->Cmp(*s2);
-}
-
-
+#endif // !wxUSE_STD_CONTAINERS
 
 // ===========================================================================
 // wxJoin and wxSplit