• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <vector>
2 #include <deque>
3 
4 #include "mvctor_test.h"
5 
6 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
7 using namespace std;
8 #endif
9 
10 size_t MovableStruct::nb_dft_construct_call = 0;
11 size_t MovableStruct::nb_cpy_construct_call = 0;
12 size_t MovableStruct::nb_mv_construct_call = 0;
13 size_t MovableStruct::nb_assignment_call = 0;
14 size_t MovableStruct::nb_destruct_call = 0;
15 
16 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
17 #  if defined (_STLP_USE_NAMESPACES)
18 namespace std {
19 #  endif
20   _STLP_TEMPLATE_NULL
21   struct __move_traits<MovableStruct> {
22     typedef __true_type implemented;
23     typedef __false_type complete;
24   };
25 #  if defined (_STLP_USE_NAMESPACES)
26 }
27 #  endif
28 #endif
29 
30 struct CompleteMovableStruct {
CompleteMovableStructCompleteMovableStruct31   CompleteMovableStruct() { ++nb_dft_construct_call; }
CompleteMovableStructCompleteMovableStruct32   CompleteMovableStruct(CompleteMovableStruct const&) { ++nb_cpy_construct_call; }
33 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
CompleteMovableStructCompleteMovableStruct34   CompleteMovableStruct(__move_source<CompleteMovableStruct>) { ++nb_mv_construct_call; }
35 #endif
~CompleteMovableStructCompleteMovableStruct36   ~CompleteMovableStruct() { ++nb_destruct_call; }
37 
operator =CompleteMovableStruct38   CompleteMovableStruct& operator = (const CompleteMovableStruct&) {
39     ++nb_assignment_call;
40     return *this;
41   }
resetCompleteMovableStruct42   static void reset() {
43     nb_dft_construct_call = nb_cpy_construct_call = nb_mv_construct_call = 0;
44     nb_assignment_call = 0;
45     nb_destruct_call = 0;
46   }
47 
48   static size_t nb_dft_construct_call;
49   static size_t nb_cpy_construct_call;
50   static size_t nb_mv_construct_call;
51   static size_t nb_assignment_call;
52   static size_t nb_destruct_call;
53 
54   //See MovableStruct
55   void* dummy_data[2];
56 };
57 
58 size_t CompleteMovableStruct::nb_dft_construct_call = 0;
59 size_t CompleteMovableStruct::nb_cpy_construct_call = 0;
60 size_t CompleteMovableStruct::nb_mv_construct_call = 0;
61 size_t CompleteMovableStruct::nb_assignment_call = 0;
62 size_t CompleteMovableStruct::nb_destruct_call = 0;
63 
64 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
65 #  if defined (_STLP_USE_NAMESPACES)
66 namespace std {
67 #  endif
68   _STLP_TEMPLATE_NULL
69   struct __move_traits<CompleteMovableStruct> {
70     typedef __true_type implemented;
71     typedef __true_type complete;
72   };
73 #  if defined (_STLP_USE_NAMESPACES)
74 }
75 #  endif
76 #endif
77 
move_traits()78 void MoveConstructorTest::move_traits()
79 {
80   move_traits_vec();
81   move_traits_vec_complete();
82   move_traits_deq();
83   move_traits_deq_complete();
84 }
85 
move_traits_vec()86 void MoveConstructorTest::move_traits_vec()
87 {
88   {
89     {
90       vector<MovableStruct> vect;
91       vect.push_back(MovableStruct());
92       vect.push_back(MovableStruct());
93       vect.push_back(MovableStruct());
94       vect.push_back(MovableStruct());
95 
96       // vect contains 4 elements
97       CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 );
98 #if defined (STLPORT)
99 #  if !defined (_STLP_NO_MOVE_SEMANTIC)
100       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 );
101       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 3 );
102 #  else
103       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 7 );
104 #  endif
105       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 7 );
106 #elif !defined (_MSC_VER)
107       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 7 );
108       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 7 );
109 #else
110       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 14 );
111       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 14 );
112 #endif
113       CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 );
114 
115       // Following test violate requirements to sequiences (23.1.1 Table 67)
116       /*
117       vect.insert(vect.begin() + 2, vect.begin(), vect.end());
118       // vect contains 8 elements
119       CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 );
120       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 8 );
121       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 7 );
122       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 11 );
123       */
124 
125       MovableStruct::reset();
126       vector<MovableStruct> v2 = vect;
127       CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 );
128       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 );
129       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 );
130       CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 );
131       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 0 );
132 
133       MovableStruct::reset();
134       vect.insert(vect.begin() + 2, v2.begin(), v2.end() );
135 
136       // vect contains 8 elements
137       CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 );
138 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
139       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 );
140       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 4 );
141 #else
142       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 8 );
143 #endif
144       CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 );
145       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 4 );
146 
147       MovableStruct::reset();
148       vect.erase(vect.begin(), vect.begin() + 2 );
149 
150       // vect contains 6 elements
151 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
152       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 6 );
153       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 8 );
154 #else
155       CPPUNIT_ASSERT_EQUAL( MovableStruct::nb_assignment_call, 6 );
156       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 );
157 #endif
158 
159       MovableStruct::reset();
160       vect.erase(vect.end() - 2, vect.end());
161 
162       // vect contains 4 elements
163       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 );
164       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 );
165 
166       MovableStruct::reset();
167       vect.erase(vect.begin());
168 
169       // vect contains 3 elements
170 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
171       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 3 );
172       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 4 );
173 #else
174       CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 3 );
175       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 1 );
176 #endif
177 
178       MovableStruct::reset();
179     }
180     //vect with 3 elements and v2 with 4 elements are now out of scope
181     CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 + 4 );
182   }
183 }
184 
move_traits_vec_complete()185 void MoveConstructorTest::move_traits_vec_complete()
186 {
187   {
188     {
189       vector<CompleteMovableStruct> vect;
190       vect.push_back(CompleteMovableStruct());
191       vect.push_back(CompleteMovableStruct());
192       vect.push_back(CompleteMovableStruct());
193       vect.push_back(CompleteMovableStruct());
194 
195       // vect contains 4 elements
196       CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 );
197 #if defined (STLPORT)
198 #  if !defined (_STLP_NO_MOVE_SEMANTIC)
199       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 );
200       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 3 );
201       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 );
202 #  else
203       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 7 );
204       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 7 );
205 #  endif
206 #elif !defined (_MSC_VER)
207       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 7 );
208       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 7 );
209 #else
210       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 14 );
211       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 14 );
212 #endif
213 
214       // Following test violate requirements to sequiences (23.1.1 Table 67)
215       /*
216       vect.insert(vect.begin() + 2, vect.begin(), vect.end());
217 
218       // vect contains 8 elements
219       CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 );
220       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 8 );
221       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 7 );
222       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 );
223       */
224 
225       CompleteMovableStruct::reset();
226       vector<CompleteMovableStruct> v2 = vect;
227 
228       CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 );
229       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 );
230       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 );
231       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 );
232 
233       CompleteMovableStruct::reset();
234       vect.insert(vect.begin() + 2, v2.begin(), v2.end());
235 
236       // vect contains 8 elements
237       CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 );
238 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
239       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 );
240       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 4 );
241       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 );
242 #else
243       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 8 );
244       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 );
245 #endif
246 
247       CompleteMovableStruct::reset();
248       vect.erase(vect.begin(), vect.begin() + 2);
249 
250       // vect contains 6 elements
251 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
252       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 6 );
253 #else
254       CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 6 );
255 #endif
256       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 );
257 
258       CompleteMovableStruct::reset();
259       vect.erase(vect.end() - 2, vect.end());
260 
261       // vect contains 4 elements
262       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 );
263       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 );
264 
265       CompleteMovableStruct::reset();
266       vect.erase(vect.begin());
267 
268       // vect contains 3 elements
269 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
270       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 3 );
271 #else
272       CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 3 );
273 #endif
274       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 1 );
275 
276       CompleteMovableStruct::reset();
277     }
278     //vect with 3 elements and v2 with 4 elements are now out of scope
279     CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 3 + 4 );
280   }
281 }
282 
move_traits_deq()283 void MoveConstructorTest::move_traits_deq()
284 {
285   {
286     MovableStruct::reset();
287     {
288       deque<MovableStruct> deq;
289       deq.push_back(MovableStruct());
290       deq.push_back(MovableStruct());
291       deq.push_back(MovableStruct());
292       deq.push_back(MovableStruct());
293 
294       // deq contains 4 elements
295       CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 );
296       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 );
297       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 );
298       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 4 );
299 
300       // Following test violate requirements to sequiences (23.1.1 Table 67)
301       /*
302       deq.insert(deq.begin() + 2, deq.begin(), deq.end());
303       // deq contains 8 elements
304       CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 );
305       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 8 );
306       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 7 );
307       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 11 );
308       */
309 
310       MovableStruct::reset();
311       deque<MovableStruct> d2 = deq;
312 
313       CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 );
314       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 );
315       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 );
316       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 0 );
317 
318       MovableStruct::reset();
319       deq.insert(deq.begin() + 2, d2.begin(), d2.end() );
320 
321       // deq contains 8 elements
322       CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 );
323       CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 );
324 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
325       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 2 );
326       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 );
327 #else
328       CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 2 );
329       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 0 );
330 #endif
331 
332       MovableStruct::reset();
333       deq.erase(deq.begin() + 1, deq.begin() + 3 );
334 
335       // deq contains 6 elements
336 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
337       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 1 );
338       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 );
339 #else
340       //Following check is highly deque implementation dependant so
341       //it might not always work...
342       CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 1 );
343       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 );
344 #endif
345 
346       MovableStruct::reset();
347       deq.erase(deq.end() - 3, deq.end() - 1);
348 
349       // deq contains 4 elements
350 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
351       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 1 );
352       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 );
353 #else
354       CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 1 );
355       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 );
356 #endif
357 
358       MovableStruct::reset();
359       deq.erase(deq.begin());
360 
361       // deq contains 3 elements
362 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
363       CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 );
364 #else
365       CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 );
366 #endif
367       CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 1 );
368 
369       MovableStruct::reset();
370     }
371     //deq with 3 elements and d2 with 4 elements are now out of scope
372     CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 + 4 );
373   }
374 }
375 
move_traits_deq_complete()376 void MoveConstructorTest::move_traits_deq_complete()
377 {
378   {
379     CompleteMovableStruct::reset();
380     {
381       deque<CompleteMovableStruct> deq;
382       deq.push_back(CompleteMovableStruct());
383       deq.push_back(CompleteMovableStruct());
384       deq.push_back(CompleteMovableStruct());
385       deq.push_back(CompleteMovableStruct());
386 
387       // deq contains 4 elements
388       CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 );
389       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 );
390       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 );
391       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 );
392 
393       // Following test violate requirements to sequiences (23.1.1 Table 67)
394       /*
395       deq.insert(deq.begin() + 2, deq.begin(), deq.end());
396 
397       // deq contains 8 elements
398       CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 );
399       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 8 );
400       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 7 );
401       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 );
402       */
403 
404       CompleteMovableStruct::reset();
405       deque<CompleteMovableStruct> d2 = deq;
406 
407       CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 );
408       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 );
409       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 );
410       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 );
411 
412       CompleteMovableStruct::reset();
413       deq.insert(deq.begin() + 2, d2.begin(), d2.end());
414 
415       // deq contains 8 elements
416       CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 );
417       CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 );
418 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
419       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 2 );
420 #else
421       CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 2 );
422 #endif
423       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 );
424 
425       CompleteMovableStruct::reset();
426       deq.erase(deq.begin() + 1, deq.begin() + 3);
427 
428       // deq contains 6 elements
429 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
430       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 1 );
431 #else
432       CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 1 );
433 #endif
434       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 );
435 
436       CompleteMovableStruct::reset();
437       deq.erase(deq.end() - 3, deq.end() - 1);
438 
439       // deq contains 4 elements
440 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
441       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 1 );
442 #else
443       CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 1 );
444 #endif
445       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 );
446 
447       CompleteMovableStruct::reset();
448       deq.erase(deq.begin());
449 
450       // deq contains 3 elements
451       CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 );
452       CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 0 );
453       CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 1 );
454 
455       CompleteMovableStruct::reset();
456     }
457     //deq with 3 elements and v2 with 4 elements are now out of scope
458     CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 3 + 4 );
459   }
460 }
461