From: Robin Dunn Date: Wed, 7 Apr 2010 20:32:25 +0000 (+0000) Subject: Add wxVectorSort function for sorting wxVector containers. Closes #11889 X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/38723be1d50facc0176455b69b409dcd457ac07a Add wxVectorSort function for sorting wxVector containers. Closes #11889 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63904 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/vector.h b/include/wx/vector.h index 28230a9ea5..777ee949a5 100644 --- a/include/wx/vector.h +++ b/include/wx/vector.h @@ -18,6 +18,11 @@ #include #define wxVector std::vector +template +inline void wxVectorSort(wxVector& v) +{ + std::sort(v.begin(), v.end()); +} #else // !wxUSE_STL @@ -437,6 +442,40 @@ inline typename wxVector::size_type wxVector::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 +int wxVectorSort_compare(const void* pitem1, const void* pitem2, const void* ) +{ + const T& item1 = *reinterpret_cast(pitem1); + const T& item2 = *reinterpret_cast(pitem2); + + if (item1 < item2) + return -1; + else if (item2 < item1) + return 1; + else + return 0; +} + +} // namespace wxPrivate + + + +template +void wxVectorSort(wxVector& v) +{ + wxQsort(v.begin(), v.size(), sizeof(T), + wxPrivate::wxVectorSort_compare, NULL); +} + + + #endif // wxUSE_STL/!wxUSE_STL #if WXWIN_COMPATIBILITY_2_8 diff --git a/interface/wx/vector.h b/interface/wx/vector.h index 093c7d1ca8..412330d380 100644 --- a/interface/wx/vector.h +++ b/interface/wx/vector.h @@ -20,7 +20,7 @@ @nolibrary @category{containers} - @see @ref overview_container, wxList, wxArray + @see @ref overview_container, wxList, wxArray, wxVectorSort */ template class wxVector @@ -237,3 +237,19 @@ public: size_type size() const; }; + +/** + Sort the contents of a @c wxVector. 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 v; + ... // items are added to the vector v... + wxVectorSort(v); + @endcode + + @see wxVector +*/ +template +void wxVectorSort(wxVector& v); diff --git a/tests/vectors/vectors.cpp b/tests/vectors/vectors.cpp index 4803068aab..1f84c2cece 100644 --- a/tests/vectors/vectors.cpp +++ b/tests/vectors/vectors.cpp @@ -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 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