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