]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxVectorSort function for sorting wxVector<T> containers. Closes #11889
authorRobin Dunn <robin@alldunn.com>
Wed, 7 Apr 2010 20:32:25 +0000 (20:32 +0000)
committerRobin Dunn <robin@alldunn.com>
Wed, 7 Apr 2010 20:32:25 +0000 (20:32 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63904 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/vector.h
interface/wx/vector.h
tests/vectors/vectors.cpp

index 28230a9ea5c2d609836f9f8ccb890a9cbb2e556b..777ee949a5acba60e18865b401bbebaa4c1818a7 100644 (file)
 
 #include <vector>
 #define wxVector std::vector
+template<typename T>
+inline void wxVectorSort(wxVector<T>& v)
+{
+    std::sort(v.begin(), v.end());
+}
 
 #else // !wxUSE_STL
 
@@ -437,6 +442,40 @@ inline typename wxVector<T>::size_type wxVector<T>::erase(size_type n)
 }
 #endif // WXWIN_COMPATIBILITY_2_8
 
+
+
+namespace wxPrivate
+{
+    // This function is a helper for the wxVectorSort function, and should
+    // not be used directly in user's code.
+
+template<typename T>
+int wxVectorSort_compare(const void* pitem1, const void* pitem2, const void* )
+{
+    const T& item1 = *reinterpret_cast<const T*>(pitem1);
+    const T& item2 = *reinterpret_cast<const T*>(pitem2);
+
+    if (item1 < item2)
+        return -1;
+    else if (item2 < item1)
+        return 1;
+    else
+        return 0;
+}
+
+}  // namespace wxPrivate
+
+
+
+template<typename T>
+void wxVectorSort(wxVector<T>& v)
+{
+    wxQsort(v.begin(), v.size(), sizeof(T),
+            wxPrivate::wxVectorSort_compare<T>, NULL);
+}
+
+
+
 #endif // wxUSE_STL/!wxUSE_STL
 
 #if WXWIN_COMPATIBILITY_2_8
index 093c7d1ca804e2e81a05593e1cd2f78209b3b655..412330d380710f9acd9e965d574b2619f77dfe76 100644 (file)
@@ -20,7 +20,7 @@
     @nolibrary
     @category{containers}
 
-    @see @ref overview_container, wxList<T>, wxArray<T>
+    @see @ref overview_container, wxList<T>, wxArray<T>, wxVectorSort<T>
 */
 template<typename T>
 class wxVector<T>
@@ -237,3 +237,19 @@ public:
     size_type size() const;
 };
 
+
+/**
+   Sort the contents of a @c wxVector<T>.  In a STL build this function will
+   be defined as a thin wrapper around std::sort.  To be sortable the
+   contained type must support the less-than operator.
+
+   @code
+   wxVector<SomeClass> v;
+   ... // items are added to the vector v...
+   wxVectorSort(v);
+   @endcode
+      
+   @see wxVector<T>
+*/
+template<typename T>
+void wxVectorSort(wxVector<T>& v);
index 4803068aab8f4478c244b6c1467b17d87c516772..1f84c2cecef6acd743a39e5a8160700451c214c7 100644 (file)
@@ -84,6 +84,7 @@ private:
         CPPUNIT_TEST( NonPODs );
         CPPUNIT_TEST( Resize );
         CPPUNIT_TEST( Swap );
+        CPPUNIT_TEST( Sort );
     CPPUNIT_TEST_SUITE_END();
 
     void PushPopTest();
@@ -94,6 +95,7 @@ private:
     void NonPODs();
     void Resize();
     void Swap();
+    void Sort();
 
     DECLARE_NO_COPY_CLASS(VectorsTestCase)
 };
@@ -289,3 +291,27 @@ void VectorsTestCase::Swap()
     CPPUNIT_ASSERT( v1.empty() );
 }
 
+
+void VectorsTestCase::Sort()
+{
+    size_t  idx;
+    wxVector<int> v;
+
+    v.push_back(5);
+    v.push_back(7);
+    v.push_back(2);
+    v.push_back(9);
+    v.push_back(4);
+    v.push_back(1);
+    v.push_back(3);
+    v.push_back(8);
+    v.push_back(0);
+    v.push_back(6);
+
+    wxVectorSort(v);
+
+    for (idx=1; idx<v.size(); idx++)
+    {
+        CPPUNIT_ASSERT( v[idx-1] <= v[idx] );
+    }
+}