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