Add wxVectorSort function for sorting wxVector<T> containers. Closes #11889

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63904 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2010-04-07 20:32:25 +00:00
parent 455bec652a
commit 38723be1d5
3 changed files with 82 additions and 1 deletions

View File

@@ -18,6 +18,11 @@
#include <vector> #include <vector>
#define wxVector std::vector #define wxVector std::vector
template<typename T>
inline void wxVectorSort(wxVector<T>& v)
{
std::sort(v.begin(), v.end());
}
#else // !wxUSE_STL #else // !wxUSE_STL
@@ -437,6 +442,40 @@ inline typename wxVector<T>::size_type wxVector<T>::erase(size_type n)
} }
#endif // WXWIN_COMPATIBILITY_2_8 #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 #endif // wxUSE_STL/!wxUSE_STL
#if WXWIN_COMPATIBILITY_2_8 #if WXWIN_COMPATIBILITY_2_8

View File

@@ -20,7 +20,7 @@
@nolibrary @nolibrary
@category{containers} @category{containers}
@see @ref overview_container, wxList<T>, wxArray<T> @see @ref overview_container, wxList<T>, wxArray<T>, wxVectorSort<T>
*/ */
template<typename T> template<typename T>
class wxVector<T> class wxVector<T>
@@ -237,3 +237,19 @@ public:
size_type size() const; 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);

View File

@@ -84,6 +84,7 @@ private:
CPPUNIT_TEST( NonPODs ); CPPUNIT_TEST( NonPODs );
CPPUNIT_TEST( Resize ); CPPUNIT_TEST( Resize );
CPPUNIT_TEST( Swap ); CPPUNIT_TEST( Swap );
CPPUNIT_TEST( Sort );
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
void PushPopTest(); void PushPopTest();
@@ -94,6 +95,7 @@ private:
void NonPODs(); void NonPODs();
void Resize(); void Resize();
void Swap(); void Swap();
void Sort();
DECLARE_NO_COPY_CLASS(VectorsTestCase) DECLARE_NO_COPY_CLASS(VectorsTestCase)
}; };
@@ -289,3 +291,27 @@ void VectorsTestCase::Swap()
CPPUNIT_ASSERT( v1.empty() ); 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] );
}
}