1a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include <cstdio> //size_t and STLport macros 2a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 3a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include "cppunit/cppunit_proxy.h" 4a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 5a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner// 6a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner// TestCase class 7a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner// 8a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerclass MoveConstructorTest : public CPPUNIT_NS::TestCase 9a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{ 10a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST_SUITE(MoveConstructorTest); 11a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST(move_construct_test); 12a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST(deque_test); 13a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST(vector_test); 14a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST(move_traits); 15a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_NO_MOVE_SEMANTIC) || \ 16a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner defined (_STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) || \ 17a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner (defined (__BORLANDC__) && (__BORLANDC__ < 0x564)) 18a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_IGNORE; 19a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner# endif 20a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST(movable_declaration) 21a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST(movable_declaration_assoc) 22a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST(movable_declaration_hash) 23a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (__BORLANDC__) 24a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_STOP_IGNORE; 25a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST(nb_destructor_calls); 26a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif 27a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_TEST_SUITE_END(); 28a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 29a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerprotected: 30a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void move_construct_test(); 31a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void deque_test(); 32a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void vector_test(); 33a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void move_traits(); 34a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void movable_declaration(); 35a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void movable_declaration_assoc(); 36a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void movable_declaration_hash(); 37a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void nb_destructor_calls(); 38a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 39a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner /* 40a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner template <class _Container> 41a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void standard_test1(_Container const& ref_cont) { 42a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner vector<_Container> vec_cont(1, ref_cont); 43a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner typedef typename _Container::value_type value_type; 44a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner value_type *pvalue = &(*vec_cont.front().begin()); 45a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner size_t cur_capacity= vec_cont.capacity(); 46a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner //force reallocation 47a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner while (cur_capacity == vec_cont.capacity()) { 48a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner vec_cont.push_back(ref_cont); 49a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner } 50a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner bool b=( (pvalue==(&(*vec_cont.front().begin()))) ); 51a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner CPPUNIT_ASSERT(b); 52a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner } 53a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner */ 54a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 55a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerprivate: 56a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void move_traits_vec(); 57a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void move_traits_vec_complete(); 58a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void move_traits_deq(); 59a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void move_traits_deq_complete(); 60a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}; 61a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 62a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerstruct MovableStruct { 63a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner MovableStruct() { ++nb_dft_construct_call; } 64a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner MovableStruct(MovableStruct const&) { ++nb_cpy_construct_call; } 65a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 66a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner# if defined (_STLP_USE_NAMESPACES) 67a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner MovableStruct(std::__move_source<MovableStruct>) 68a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner# else 69a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner MovableStruct(__move_source<MovableStruct>) 70a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner# endif 71a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner { ++nb_mv_construct_call; } 72a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif 73a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner ~MovableStruct() { ++nb_destruct_call; } 74a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 75a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner MovableStruct& operator = (const MovableStruct&) { 76a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner ++nb_assignment_call; 77a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner return *this; 78a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner } 79a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 80a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner static void reset() { 81a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner nb_dft_construct_call = nb_cpy_construct_call = nb_mv_construct_call = 0; 82a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner nb_assignment_call = 0; 83a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner nb_destruct_call = 0; 84a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner } 85a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 86a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner static size_t nb_dft_construct_call; 87a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner static size_t nb_cpy_construct_call; 88a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner static size_t nb_mv_construct_call; 89a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner static size_t nb_assignment_call; 90a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner static size_t nb_destruct_call; 91a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner 92a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner //Dummy data just to control struct sizeof 93a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner //As node allocator implementation align memory blocks on 2 * sizeof(void*) 94a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner //we give MovableStruct the same size in order to have expected allocation 95a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner //and not more 96a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner void* dummy_data[2]; 97a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}; 98