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:
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user