| #include <cstdio> //size_t and STLport macros |
| |
| #include "cppunit/cppunit_proxy.h" |
| |
| // |
| // TestCase class |
| // |
| class MoveConstructorTest : public CPPUNIT_NS::TestCase |
| { |
| CPPUNIT_TEST_SUITE(MoveConstructorTest); |
| CPPUNIT_TEST(move_construct_test); |
| CPPUNIT_TEST(deque_test); |
| CPPUNIT_TEST(vector_test); |
| CPPUNIT_TEST(move_traits); |
| #if !defined (STLPORT) || defined (_STLP_NO_MOVE_SEMANTIC) || \ |
| defined (_STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) || \ |
| (defined (__BORLANDC__) && (__BORLANDC__ < 0x564)) |
| CPPUNIT_IGNORE; |
| # endif |
| CPPUNIT_TEST(movable_declaration) |
| CPPUNIT_TEST(movable_declaration_assoc) |
| CPPUNIT_TEST(movable_declaration_hash) |
| #if defined (__BORLANDC__) |
| CPPUNIT_STOP_IGNORE; |
| CPPUNIT_TEST(nb_destructor_calls); |
| #endif |
| CPPUNIT_TEST_SUITE_END(); |
| |
| protected: |
| void move_construct_test(); |
| void deque_test(); |
| void vector_test(); |
| void move_traits(); |
| void movable_declaration(); |
| void movable_declaration_assoc(); |
| void movable_declaration_hash(); |
| void nb_destructor_calls(); |
| |
| /* |
| template <class _Container> |
| void standard_test1(_Container const& ref_cont) { |
| vector<_Container> vec_cont(1, ref_cont); |
| typedef typename _Container::value_type value_type; |
| value_type *pvalue = &(*vec_cont.front().begin()); |
| size_t cur_capacity= vec_cont.capacity(); |
| //force reallocation |
| while (cur_capacity == vec_cont.capacity()) { |
| vec_cont.push_back(ref_cont); |
| } |
| bool b=( (pvalue==(&(*vec_cont.front().begin()))) ); |
| CPPUNIT_ASSERT(b); |
| } |
| */ |
| |
| private: |
| void move_traits_vec(); |
| void move_traits_vec_complete(); |
| void move_traits_deq(); |
| void move_traits_deq_complete(); |
| }; |
| |
| struct MovableStruct { |
| MovableStruct() { ++nb_dft_construct_call; } |
| MovableStruct(MovableStruct const&) { ++nb_cpy_construct_call; } |
| #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) |
| # if defined (_STLP_USE_NAMESPACES) |
| MovableStruct(std::__move_source<MovableStruct>) |
| # else |
| MovableStruct(__move_source<MovableStruct>) |
| # endif |
| { ++nb_mv_construct_call; } |
| #endif |
| ~MovableStruct() { ++nb_destruct_call; } |
| |
| MovableStruct& operator = (const MovableStruct&) { |
| ++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; |
| |
| //Dummy data just to control struct sizeof |
| //As node allocator implementation align memory blocks on 2 * sizeof(void*) |
| //we give MovableStruct the same size in order to have expected allocation |
| //and not more |
| void* dummy_data[2]; |
| }; |