| #include <vector> |
| #include <deque> |
| |
| #include "mvctor_test.h" |
| |
| #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) |
| using namespace std; |
| #endif |
| |
| size_t MovableStruct::nb_dft_construct_call = 0; |
| size_t MovableStruct::nb_cpy_construct_call = 0; |
| size_t MovableStruct::nb_mv_construct_call = 0; |
| size_t MovableStruct::nb_assignment_call = 0; |
| size_t MovableStruct::nb_destruct_call = 0; |
| |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| # if defined (_STLP_USE_NAMESPACES) |
| namespace std { |
| # endif |
| _STLP_TEMPLATE_NULL |
| struct __move_traits<MovableStruct> { |
| typedef __true_type implemented; |
| typedef __false_type complete; |
| }; |
| # if defined (_STLP_USE_NAMESPACES) |
| } |
| # endif |
| #endif |
| |
| struct CompleteMovableStruct { |
| CompleteMovableStruct() { ++nb_dft_construct_call; } |
| CompleteMovableStruct(CompleteMovableStruct const&) { ++nb_cpy_construct_call; } |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CompleteMovableStruct(__move_source<CompleteMovableStruct>) { ++nb_mv_construct_call; } |
| #endif |
| ~CompleteMovableStruct() { ++nb_destruct_call; } |
| |
| CompleteMovableStruct& operator = (const CompleteMovableStruct&) { |
| ++nb_assignment_call; |
| return *this; |
| } |
| static void reset() { |
| nb_dft_construct_call = nb_cpy_construct_call = nb_mv_construct_call = 0; |
| nb_assignment_call = 0; |
| nb_destruct_call = 0; |
| } |
| |
| static size_t nb_dft_construct_call; |
| static size_t nb_cpy_construct_call; |
| static size_t nb_mv_construct_call; |
| static size_t nb_assignment_call; |
| static size_t nb_destruct_call; |
| |
| //See MovableStruct |
| void* dummy_data[2]; |
| }; |
| |
| size_t CompleteMovableStruct::nb_dft_construct_call = 0; |
| size_t CompleteMovableStruct::nb_cpy_construct_call = 0; |
| size_t CompleteMovableStruct::nb_mv_construct_call = 0; |
| size_t CompleteMovableStruct::nb_assignment_call = 0; |
| size_t CompleteMovableStruct::nb_destruct_call = 0; |
| |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| # if defined (_STLP_USE_NAMESPACES) |
| namespace std { |
| # endif |
| _STLP_TEMPLATE_NULL |
| struct __move_traits<CompleteMovableStruct> { |
| typedef __true_type implemented; |
| typedef __true_type complete; |
| }; |
| # if defined (_STLP_USE_NAMESPACES) |
| } |
| # endif |
| #endif |
| |
| void MoveConstructorTest::move_traits() |
| { |
| move_traits_vec(); |
| move_traits_vec_complete(); |
| move_traits_deq(); |
| move_traits_deq_complete(); |
| } |
| |
| void MoveConstructorTest::move_traits_vec() |
| { |
| { |
| { |
| vector<MovableStruct> vect; |
| vect.push_back(MovableStruct()); |
| vect.push_back(MovableStruct()); |
| vect.push_back(MovableStruct()); |
| vect.push_back(MovableStruct()); |
| |
| // vect contains 4 elements |
| CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 ); |
| #if defined (STLPORT) |
| # if !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 3 ); |
| # else |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 7 ); |
| # endif |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 7 ); |
| #elif !defined (_MSC_VER) |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 7 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 7 ); |
| #else |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 14 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 14 ); |
| #endif |
| CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 ); |
| |
| // Following test violate requirements to sequiences (23.1.1 Table 67) |
| /* |
| vect.insert(vect.begin() + 2, vect.begin(), vect.end()); |
| // vect contains 8 elements |
| CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 8 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 7 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 11 ); |
| */ |
| |
| MovableStruct::reset(); |
| vector<MovableStruct> v2 = vect; |
| CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 0 ); |
| |
| MovableStruct::reset(); |
| vect.insert(vect.begin() + 2, v2.begin(), v2.end() ); |
| |
| // vect contains 8 elements |
| CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 ); |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 4 ); |
| #else |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 8 ); |
| #endif |
| CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 4 ); |
| |
| MovableStruct::reset(); |
| vect.erase(vect.begin(), vect.begin() + 2 ); |
| |
| // vect contains 6 elements |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 6 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 8 ); |
| #else |
| CPPUNIT_ASSERT_EQUAL( MovableStruct::nb_assignment_call, 6 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); |
| #endif |
| |
| MovableStruct::reset(); |
| vect.erase(vect.end() - 2, vect.end()); |
| |
| // vect contains 4 elements |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); |
| |
| MovableStruct::reset(); |
| vect.erase(vect.begin()); |
| |
| // vect contains 3 elements |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 3 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 4 ); |
| #else |
| CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 3 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 1 ); |
| #endif |
| |
| MovableStruct::reset(); |
| } |
| //vect with 3 elements and v2 with 4 elements are now out of scope |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 + 4 ); |
| } |
| } |
| |
| void MoveConstructorTest::move_traits_vec_complete() |
| { |
| { |
| { |
| vector<CompleteMovableStruct> vect; |
| vect.push_back(CompleteMovableStruct()); |
| vect.push_back(CompleteMovableStruct()); |
| vect.push_back(CompleteMovableStruct()); |
| vect.push_back(CompleteMovableStruct()); |
| |
| // vect contains 4 elements |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 ); |
| #if defined (STLPORT) |
| # if !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 3 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); |
| # else |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 7 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 7 ); |
| # endif |
| #elif !defined (_MSC_VER) |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 7 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 7 ); |
| #else |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 14 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 14 ); |
| #endif |
| |
| // Following test violate requirements to sequiences (23.1.1 Table 67) |
| /* |
| vect.insert(vect.begin() + 2, vect.begin(), vect.end()); |
| |
| // vect contains 8 elements |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 8 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 7 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); |
| */ |
| |
| CompleteMovableStruct::reset(); |
| vector<CompleteMovableStruct> v2 = vect; |
| |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 ); |
| |
| CompleteMovableStruct::reset(); |
| vect.insert(vect.begin() + 2, v2.begin(), v2.end()); |
| |
| // vect contains 8 elements |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 ); |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 4 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 ); |
| #else |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 8 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); |
| #endif |
| |
| CompleteMovableStruct::reset(); |
| vect.erase(vect.begin(), vect.begin() + 2); |
| |
| // vect contains 6 elements |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 6 ); |
| #else |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 6 ); |
| #endif |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 ); |
| |
| CompleteMovableStruct::reset(); |
| vect.erase(vect.end() - 2, vect.end()); |
| |
| // vect contains 4 elements |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 ); |
| |
| CompleteMovableStruct::reset(); |
| vect.erase(vect.begin()); |
| |
| // vect contains 3 elements |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 3 ); |
| #else |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 3 ); |
| #endif |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 1 ); |
| |
| CompleteMovableStruct::reset(); |
| } |
| //vect with 3 elements and v2 with 4 elements are now out of scope |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 3 + 4 ); |
| } |
| } |
| |
| void MoveConstructorTest::move_traits_deq() |
| { |
| { |
| MovableStruct::reset(); |
| { |
| deque<MovableStruct> deq; |
| deq.push_back(MovableStruct()); |
| deq.push_back(MovableStruct()); |
| deq.push_back(MovableStruct()); |
| deq.push_back(MovableStruct()); |
| |
| // deq contains 4 elements |
| CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 4 ); |
| |
| // Following test violate requirements to sequiences (23.1.1 Table 67) |
| /* |
| deq.insert(deq.begin() + 2, deq.begin(), deq.end()); |
| // deq contains 8 elements |
| CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 8 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 7 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 11 ); |
| */ |
| |
| MovableStruct::reset(); |
| deque<MovableStruct> d2 = deq; |
| |
| CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 0 ); |
| |
| MovableStruct::reset(); |
| deq.insert(deq.begin() + 2, d2.begin(), d2.end() ); |
| |
| // deq contains 8 elements |
| CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 2 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); |
| #else |
| CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 2 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 0 ); |
| #endif |
| |
| MovableStruct::reset(); |
| deq.erase(deq.begin() + 1, deq.begin() + 3 ); |
| |
| // deq contains 6 elements |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 1 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 ); |
| #else |
| //Following check is highly deque implementation dependant so |
| //it might not always work... |
| CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 1 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); |
| #endif |
| |
| MovableStruct::reset(); |
| deq.erase(deq.end() - 3, deq.end() - 1); |
| |
| // deq contains 4 elements |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 1 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 ); |
| #else |
| CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 1 ); |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); |
| #endif |
| |
| MovableStruct::reset(); |
| deq.erase(deq.begin()); |
| |
| // deq contains 3 elements |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); |
| #else |
| CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 ); |
| #endif |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 1 ); |
| |
| MovableStruct::reset(); |
| } |
| //deq with 3 elements and d2 with 4 elements are now out of scope |
| CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 + 4 ); |
| } |
| } |
| |
| void MoveConstructorTest::move_traits_deq_complete() |
| { |
| { |
| CompleteMovableStruct::reset(); |
| { |
| deque<CompleteMovableStruct> deq; |
| deq.push_back(CompleteMovableStruct()); |
| deq.push_back(CompleteMovableStruct()); |
| deq.push_back(CompleteMovableStruct()); |
| deq.push_back(CompleteMovableStruct()); |
| |
| // deq contains 4 elements |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); |
| |
| // Following test violate requirements to sequiences (23.1.1 Table 67) |
| /* |
| deq.insert(deq.begin() + 2, deq.begin(), deq.end()); |
| |
| // deq contains 8 elements |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 8 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 7 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); |
| */ |
| |
| CompleteMovableStruct::reset(); |
| deque<CompleteMovableStruct> d2 = deq; |
| |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 ); |
| |
| CompleteMovableStruct::reset(); |
| deq.insert(deq.begin() + 2, d2.begin(), d2.end()); |
| |
| // deq contains 8 elements |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 2 ); |
| #else |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 2 ); |
| #endif |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 ); |
| |
| CompleteMovableStruct::reset(); |
| deq.erase(deq.begin() + 1, deq.begin() + 3); |
| |
| // deq contains 6 elements |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 1 ); |
| #else |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 1 ); |
| #endif |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 ); |
| |
| CompleteMovableStruct::reset(); |
| deq.erase(deq.end() - 3, deq.end() - 1); |
| |
| // deq contains 4 elements |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 1 ); |
| #else |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 1 ); |
| #endif |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 ); |
| |
| CompleteMovableStruct::reset(); |
| deq.erase(deq.begin()); |
| |
| // deq contains 3 elements |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 0 ); |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 1 ); |
| |
| CompleteMovableStruct::reset(); |
| } |
| //deq with 3 elements and v2 with 4 elements are now out of scope |
| CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 3 + 4 ); |
| } |
| } |