4 #include "mvctor_test.h"
6 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
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;
16 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
17 # if defined (_STLP_USE_NAMESPACES)
21 struct __move_traits
<MovableStruct
> {
22 typedef __true_type implemented
;
23 typedef __false_type complete
;
25 # if defined (_STLP_USE_NAMESPACES)
30 struct CompleteMovableStruct
{
31 CompleteMovableStruct() { ++nb_dft_construct_call
; }
32 CompleteMovableStruct(CompleteMovableStruct
const&) { ++nb_cpy_construct_call
; }
33 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
34 CompleteMovableStruct(__move_source
<CompleteMovableStruct
>) { ++nb_mv_construct_call
; }
36 ~CompleteMovableStruct() { ++nb_destruct_call
; }
38 CompleteMovableStruct
& operator = (const CompleteMovableStruct
&) {
43 nb_dft_construct_call
= nb_cpy_construct_call
= nb_mv_construct_call
= 0;
44 nb_assignment_call
= 0;
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
;
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;
64 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
65 # if defined (_STLP_USE_NAMESPACES)
69 struct __move_traits
<CompleteMovableStruct
> {
70 typedef __true_type implemented
;
71 typedef __true_type complete
;
73 # if defined (_STLP_USE_NAMESPACES)
78 void MoveConstructorTest::move_traits()
81 move_traits_vec_complete();
83 move_traits_deq_complete();
86 void MoveConstructorTest::move_traits_vec()
90 vector
<MovableStruct
> vect
;
91 vect
.push_back(MovableStruct());
92 vect
.push_back(MovableStruct());
93 vect
.push_back(MovableStruct());
94 vect
.push_back(MovableStruct());
96 // vect contains 4 elements
97 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call
== 4 );
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 );
103 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call
== 7 );
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 );
110 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call
== 14 );
111 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 14 );
113 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call
== 0 );
115 // Following test violate requirements to sequiences (23.1.1 Table 67)
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 );
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 );
133 MovableStruct::reset();
134 vect
.insert(vect
.begin() + 2, v2
.begin(), v2
.end() );
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 );
142 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call
== 8 );
144 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call
== 0 );
145 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 4 );
147 MovableStruct::reset();
148 vect
.erase(vect
.begin(), vect
.begin() + 2 );
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 );
155 CPPUNIT_ASSERT_EQUAL( MovableStruct::nb_assignment_call
, 6 );
156 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 2 );
159 MovableStruct::reset();
160 vect
.erase(vect
.end() - 2, vect
.end());
162 // vect contains 4 elements
163 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call
== 0 );
164 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 2 );
166 MovableStruct::reset();
167 vect
.erase(vect
.begin());
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 );
174 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call
== 3 );
175 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 1 );
178 MovableStruct::reset();
180 //vect with 3 elements and v2 with 4 elements are now out of scope
181 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 3 + 4 );
185 void MoveConstructorTest::move_traits_vec_complete()
189 vector
<CompleteMovableStruct
> vect
;
190 vect
.push_back(CompleteMovableStruct());
191 vect
.push_back(CompleteMovableStruct());
192 vect
.push_back(CompleteMovableStruct());
193 vect
.push_back(CompleteMovableStruct());
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 );
203 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call
== 7 );
204 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 7 );
206 #elif !defined (_MSC_VER)
207 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call
== 7 );
208 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 7 );
210 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call
== 14 );
211 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 14 );
214 // Following test violate requirements to sequiences (23.1.1 Table 67)
216 vect.insert(vect.begin() + 2, vect.begin(), vect.end());
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 );
225 CompleteMovableStruct::reset();
226 vector
<CompleteMovableStruct
> v2
= vect
;
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 );
233 CompleteMovableStruct::reset();
234 vect
.insert(vect
.begin() + 2, v2
.begin(), v2
.end());
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 );
243 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call
== 8 );
244 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 4 );
247 CompleteMovableStruct::reset();
248 vect
.erase(vect
.begin(), vect
.begin() + 2);
250 // vect contains 6 elements
251 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
252 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call
== 6 );
254 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call
== 6 );
256 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 2 );
258 CompleteMovableStruct::reset();
259 vect
.erase(vect
.end() - 2, vect
.end());
261 // vect contains 4 elements
262 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call
== 0 );
263 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 2 );
265 CompleteMovableStruct::reset();
266 vect
.erase(vect
.begin());
268 // vect contains 3 elements
269 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
270 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call
== 3 );
272 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call
== 3 );
274 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 1 );
276 CompleteMovableStruct::reset();
278 //vect with 3 elements and v2 with 4 elements are now out of scope
279 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 3 + 4 );
283 void MoveConstructorTest::move_traits_deq()
286 MovableStruct::reset();
288 deque
<MovableStruct
> deq
;
289 deq
.push_back(MovableStruct());
290 deq
.push_back(MovableStruct());
291 deq
.push_back(MovableStruct());
292 deq
.push_back(MovableStruct());
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 );
300 // Following test violate requirements to sequiences (23.1.1 Table 67)
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 );
310 MovableStruct::reset();
311 deque
<MovableStruct
> d2
= deq
;
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 );
318 MovableStruct::reset();
319 deq
.insert(deq
.begin() + 2, d2
.begin(), d2
.end() );
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 );
328 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call
== 2 );
329 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 0 );
332 MovableStruct::reset();
333 deq
.erase(deq
.begin() + 1, deq
.begin() + 3 );
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 );
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 );
346 MovableStruct::reset();
347 deq
.erase(deq
.end() - 3, deq
.end() - 1);
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 );
354 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call
== 1 );
355 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 2 );
358 MovableStruct::reset();
359 deq
.erase(deq
.begin());
361 // deq contains 3 elements
362 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
363 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call
== 0 );
365 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call
== 0 );
367 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 1 );
369 MovableStruct::reset();
371 //deq with 3 elements and d2 with 4 elements are now out of scope
372 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call
== 3 + 4 );
376 void MoveConstructorTest::move_traits_deq_complete()
379 CompleteMovableStruct::reset();
381 deque
<CompleteMovableStruct
> deq
;
382 deq
.push_back(CompleteMovableStruct());
383 deq
.push_back(CompleteMovableStruct());
384 deq
.push_back(CompleteMovableStruct());
385 deq
.push_back(CompleteMovableStruct());
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 );
393 // Following test violate requirements to sequiences (23.1.1 Table 67)
395 deq.insert(deq.begin() + 2, deq.begin(), deq.end());
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 );
404 CompleteMovableStruct::reset();
405 deque
<CompleteMovableStruct
> d2
= deq
;
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 );
412 CompleteMovableStruct::reset();
413 deq
.insert(deq
.begin() + 2, d2
.begin(), d2
.end());
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 );
421 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call
== 2 );
423 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 0 );
425 CompleteMovableStruct::reset();
426 deq
.erase(deq
.begin() + 1, deq
.begin() + 3);
428 // deq contains 6 elements
429 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
430 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call
== 1 );
432 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call
== 1 );
434 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 2 );
436 CompleteMovableStruct::reset();
437 deq
.erase(deq
.end() - 3, deq
.end() - 1);
439 // deq contains 4 elements
440 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)
441 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call
== 1 );
443 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call
== 1 );
445 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 2 );
447 CompleteMovableStruct::reset();
448 deq
.erase(deq
.begin());
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 );
455 CompleteMovableStruct::reset();
457 //deq with 3 elements and v2 with 4 elements are now out of scope
458 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call
== 3 + 4 );