diff --git a/alib2std/test-src/extensions/VectorTest.cpp b/alib2std/test-src/extensions/VectorTest.cpp index ad2fc793e720987ef746144df981fc3d30b8f167..2857ae9cafdb75b81c8215072471b1d536594395 100644 --- a/alib2std/test-src/extensions/VectorTest.cpp +++ b/alib2std/test-src/extensions/VectorTest.cpp @@ -1,6 +1,7 @@ #include "VectorTest.h" #include <alib/vector> #include <alib/type_traits> +#include <alib/algorithm> CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( VectorTest, "bits" ); CPPUNIT_TEST_SUITE_REGISTRATION( VectorTest ); @@ -17,6 +18,21 @@ void VectorTest::testProperties() { const ext::vector<int>& constData = data; CPPUNIT_ASSERT((std::is_same<decltype(constData[0]), const int&>::value)); + + int moves; + int copies; + + ext::vector < Moveable > vec; + vec.push_back ( Moveable ( moves, copies ) ); + vec.push_back ( Moveable ( moves, copies ) ); + vec.push_back ( Moveable ( moves, copies ) ); + vec.push_back ( Moveable ( moves, copies ) ); + + vec.erase ( ext::unique ( vec.begin ( ), vec.end ( ), [ ] ( const Moveable &, const Moveable & ) { return true; } ), vec.end ( ) ); + + CPPUNIT_ASSERT ( vec.size ( ) == 1 ); + + CPPUNIT_ASSERT(copies == 0); } void VectorTest::testVectorBool() { diff --git a/alib2std/test-src/extensions/VectorTest.h b/alib2std/test-src/extensions/VectorTest.h index dc4291e6cd78995284b7d3a6175236069f083a93..825fe7480cff0584f481ec3c03d9afababb03543 100644 --- a/alib2std/test-src/extensions/VectorTest.h +++ b/alib2std/test-src/extensions/VectorTest.h @@ -15,6 +15,40 @@ class VectorTest : public CppUnit::TestFixture CPPUNIT_TEST( testVectorBool5 ); CPPUNIT_TEST_SUITE_END(); +public: +class Moveable { + int& m_moves; + int& m_copies; + +public: + Moveable(int& moves, int& copies) : m_moves(moves), m_copies(copies) { + m_moves = 0; + m_copies = 0; + } + + Moveable(const Moveable& src) : m_moves(src.m_moves), m_copies(src.m_copies) { + m_copies++; + } + + Moveable(Moveable&& src) : m_moves(src.m_moves), m_copies(src.m_copies) { + m_moves++; + } + + Moveable & operator = ( const Moveable & ) { + m_copies ++; + return * this; + } + + Moveable & operator = ( Moveable && ) { + m_moves ++; + return * this; + } + + bool operator<(const Moveable&) const { + return false; + } +}; + public: void setUp(); void tearDown();