Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmvctor_test.cpp
Go to the documentation of this file.
00001 #include <vector> 00002 #include <algorithm> 00003 #include <string> 00004 #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 00005 # include <slist> 00006 #endif 00007 #include <list> 00008 #include <deque> 00009 #include <set> 00010 #if defined (STLPORT) 00011 # include <unordered_set> 00012 #endif 00013 00014 #include "mvctor_test.h" 00015 00016 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 00017 using namespace std; 00018 # if defined (STLPORT) 00019 using namespace std::tr1; 00020 # endif 00021 #endif 00022 00023 CPPUNIT_TEST_SUITE_REGISTRATION(MoveConstructorTest); 00024 00025 // 00026 // tests implementation 00027 // 00028 void MoveConstructorTest::move_construct_test() 00029 { 00030 //cout << "vector<vector<int>>"; 00031 vector<int> const ref_vec(10, 0); 00032 vector<vector<int> > v_v_ints(1, ref_vec); 00033 00034 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00035 int *pint = &(v_v_ints.front().front()); 00036 #endif 00037 00038 size_t cur_capacity = v_v_ints.capacity(); 00039 while (v_v_ints.capacity() <= cur_capacity) { 00040 v_v_ints.push_back(ref_vec); 00041 } 00042 00043 //v_v_ints has been resized 00044 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00045 CPPUNIT_ASSERT((pint == &v_v_ints.front().front())); 00046 #endif 00047 00048 //cout << "vector<vector<int>>::erase"; 00049 //We need at least 3 elements: 00050 while (v_v_ints.size() < 3) { 00051 v_v_ints.push_back(ref_vec); 00052 } 00053 00054 //We erase the 2nd 00055 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00056 pint = &v_v_ints[2].front(); 00057 #endif 00058 v_v_ints.erase(v_v_ints.begin() + 1); 00059 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00060 CPPUNIT_ASSERT((pint == &v_v_ints[1].front())); 00061 #endif 00062 00063 //cout << "vector<string>"; 00064 string const ref_str("ref string, big enough to be a dynamic one"); 00065 vector<string> vec_strs(1, ref_str); 00066 00067 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00068 char const* pstr = vec_strs.front().c_str(); 00069 #endif 00070 cur_capacity = vec_strs.capacity(); 00071 while (vec_strs.capacity() <= cur_capacity) { 00072 vec_strs.push_back(ref_str); 00073 } 00074 00075 //vec_str has been resized 00076 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00077 CPPUNIT_ASSERT((pstr == vec_strs.front().c_str())); 00078 #endif 00079 00080 //cout << "vector<string>::erase"; 00081 //We need at least 3 elements: 00082 while (vec_strs.size() < 3) { 00083 vec_strs.push_back(ref_str); 00084 } 00085 00086 //We erase the 2nd 00087 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00088 pstr = vec_strs[2].c_str(); 00089 #endif 00090 vec_strs.erase(vec_strs.begin() + 1); 00091 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00092 CPPUNIT_ASSERT((pstr == vec_strs[1].c_str())); 00093 #endif 00094 00095 //cout << "swap(vector<int>, vector<int>)"; 00096 vector<int> elem1(10, 0), elem2(10, 0); 00097 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00098 int *p1 = &elem1.front(); 00099 int *p2 = &elem2.front(); 00100 #endif 00101 swap(elem1, elem2); 00102 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00103 CPPUNIT_ASSERT(((p1 == &elem2.front()) && (p2 == &elem1.front()))); 00104 #endif 00105 00106 { 00107 vector<bool> bit_vec(5, true); 00108 bit_vec.insert(bit_vec.end(), 5, false); 00109 vector<vector<bool> > v_v_bits(1, bit_vec); 00110 00111 /* 00112 * This is a STLport specific test as we are using internal implementation 00113 * details to check that the move has been correctly handled. For other 00114 * STL implementation it is only a compile check. 00115 */ 00116 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00117 # if defined (_STLP_DEBUG) 00118 unsigned int *punit = v_v_bits.front().begin()._M_iterator._M_p; 00119 # else 00120 unsigned int *punit = v_v_bits.front().begin()._M_p; 00121 # endif 00122 #endif 00123 00124 cur_capacity = v_v_bits.capacity(); 00125 while (v_v_bits.capacity() <= cur_capacity) { 00126 v_v_bits.push_back(bit_vec); 00127 } 00128 00129 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00130 //v_v_bits has been resized 00131 # if defined (_STLP_DEBUG) 00132 CPPUNIT_ASSERT( punit == v_v_bits.front().begin()._M_iterator._M_p ); 00133 # else 00134 CPPUNIT_ASSERT( punit == v_v_bits.front().begin()._M_p ); 00135 # endif 00136 #endif 00137 } 00138 00139 // zero: don't like this kind of tests 00140 // because of template test function 00141 // we should find another way to provide 00142 // move constructor testing... 00143 00144 /* 00145 standard_test1(list<int>(10)); 00146 00147 00148 standard_test1(slist<int>(10)); 00149 00150 standard_test1(deque<int>(10)); 00151 */ 00152 00153 /* 00154 int int_values[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 00155 00156 set<int> int_set(int_values, int_values + sizeof(in_values) / sizeof(int)); 00157 standard_test1(int_set); 00158 00159 multiset<int> int_multiset(int_values, int_values + sizeof(in_values) / sizeof(int)); 00160 standard_test1(int_multiset); 00161 */ 00162 00163 /* 00164 CheckFullMoveSupport(string()); 00165 CheckFullMoveSupport(vector<int>()); 00166 CheckFullMoveSupport(deque<int>()); 00167 CheckFullMoveSupport(list<int>()); 00168 CheckFullMoveSupport(slist<int>()); 00169 */ 00170 } 00171 00172 void MoveConstructorTest::deque_test() 00173 { 00174 //Check the insert range method. 00175 //To the front: 00176 { 00177 # if !defined (STLPORT) || !defined (_STLP_DEBUG) || !defined (_STLP_NO_MEMBER_TEMPLATES) 00178 deque<vector<int> > vect_deque; 00179 vector<int*> bufs; 00180 vect_deque.assign(3, vector<int>(10)); 00181 bufs.push_back(&vect_deque[0].front()); 00182 bufs.push_back(&vect_deque[1].front()); 00183 bufs.push_back(&vect_deque[2].front()); 00184 00185 int nb_insert = 5; 00186 //Initialize to 1 to generate a front insertion: 00187 int pos = 1; 00188 while (nb_insert--) { 00189 vector<vector<int> > vect_vect(2, vector<int>(10)); 00190 vect_deque.insert(vect_deque.begin() + pos, vect_vect.begin(), vect_vect.end()); 00191 bufs.insert(bufs.begin() + pos, &vect_deque[pos].front()); 00192 bufs.insert(bufs.begin() + pos + 1, &vect_deque[pos + 1].front()); 00193 ++pos; 00194 } 00195 CPPUNIT_ASSERT( vect_deque.size() == 13 ); 00196 # if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00197 for (int i = 0; i < 5; ++i) { 00198 CPPUNIT_ASSERT( bufs[i] == &vect_deque[i].front() ); 00199 CPPUNIT_ASSERT( bufs[11 - i] == &vect_deque[11 - i].front() ); 00200 } 00201 # endif 00202 # endif 00203 } 00204 00205 //To the back 00206 { 00207 # if !defined (STLPORT) || !defined (_STLP_DEBUG) || !defined (_STLP_NO_MEMBER_TEMPLATES) 00208 deque<vector<int> > vect_deque; 00209 vector<int*> bufs; 00210 vect_deque.assign(3, vector<int>(10)); 00211 bufs.push_back(&vect_deque[0].front()); 00212 bufs.push_back(&vect_deque[1].front()); 00213 bufs.push_back(&vect_deque[2].front()); 00214 00215 int nb_insert = 5; 00216 //Initialize to 2 to generate a back insertion: 00217 int pos = 2; 00218 while (nb_insert--) { 00219 vector<vector<int> > vect_vect(2, vector<int>(10)); 00220 vect_deque.insert(vect_deque.begin() + pos, vect_vect.begin(), vect_vect.end()); 00221 bufs.insert(bufs.begin() + pos, &vect_deque[pos].front()); 00222 bufs.insert(bufs.begin() + pos + 1, &vect_deque[pos + 1].front()); 00223 ++pos; 00224 } 00225 CPPUNIT_ASSERT( vect_deque.size() == 13 ); 00226 # if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00227 for (int i = 0; i < 5; ++i) { 00228 CPPUNIT_ASSERT( bufs[i + 1] == &vect_deque[i + 1].front() ); 00229 CPPUNIT_ASSERT( bufs[12 - i] == &vect_deque[12 - i].front() ); 00230 } 00231 # endif 00232 # endif 00233 } 00234 00235 //Check the different erase methods. 00236 { 00237 deque<vector<int> > vect_deque; 00238 vect_deque.assign(20, vector<int>(10)); 00239 deque<vector<int> >::iterator vdit(vect_deque.begin()), vditEnd(vect_deque.end()); 00240 vector<int*> bufs; 00241 for (; vdit != vditEnd; ++vdit) { 00242 bufs.push_back(&vdit->front()); 00243 } 00244 00245 { 00246 // This check, repeated after each operation, check the deque consistency: 00247 deque<vector<int> >::iterator it = vect_deque.end() - 5; 00248 int nb_incr = 0; 00249 for (; it != vect_deque.end() && nb_incr <= 6; ++nb_incr, ++it) {} 00250 CPPUNIT_ASSERT( nb_incr == 5 ); 00251 } 00252 00253 { 00254 //erase in front: 00255 vect_deque.erase(vect_deque.begin() + 2); 00256 bufs.erase(bufs.begin() + 2); 00257 CPPUNIT_ASSERT( vect_deque.size() == 19 ); 00258 deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); 00259 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00260 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00261 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00262 } 00263 #endif 00264 } 00265 00266 { 00267 deque<vector<int> >::iterator it = vect_deque.end() - 5; 00268 int nb_incr = 0; 00269 for (; it != vect_deque.end() && nb_incr <= 6; ++nb_incr, ++it) {} 00270 CPPUNIT_ASSERT( nb_incr == 5 ); 00271 } 00272 00273 { 00274 //erase in the back: 00275 vect_deque.erase(vect_deque.end() - 2); 00276 bufs.erase(bufs.end() - 2); 00277 CPPUNIT_ASSERT( vect_deque.size() == 18 ); 00278 deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); 00279 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00280 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00281 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00282 } 00283 #endif 00284 } 00285 00286 { 00287 deque<vector<int> >::iterator it = vect_deque.end() - 5; 00288 int nb_incr = 0; 00289 for (; it != vect_deque.end() && nb_incr < 6; ++nb_incr, ++it) {} 00290 CPPUNIT_ASSERT( nb_incr == 5 ); 00291 } 00292 00293 { 00294 //range erase in front 00295 vect_deque.erase(vect_deque.begin() + 3, vect_deque.begin() + 5); 00296 bufs.erase(bufs.begin() + 3, bufs.begin() + 5); 00297 CPPUNIT_ASSERT( vect_deque.size() == 16 ); 00298 deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); 00299 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00300 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00301 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00302 } 00303 #endif 00304 } 00305 00306 { 00307 deque<vector<int> >::iterator it = vect_deque.end() - 5; 00308 int nb_incr = 0; 00309 for (; it != vect_deque.end() && nb_incr <= 6; ++nb_incr, ++it) {} 00310 CPPUNIT_ASSERT( nb_incr == 5 ); 00311 } 00312 00313 { 00314 //range erase in back 00315 vect_deque.erase(vect_deque.end() - 5, vect_deque.end() - 3); 00316 bufs.erase(bufs.end() - 5, bufs.end() - 3); 00317 CPPUNIT_ASSERT( vect_deque.size() == 14 ); 00318 deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); 00319 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00320 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00321 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00322 } 00323 #endif 00324 } 00325 } 00326 00327 //Check the insert value(s) 00328 { 00329 deque<vector<int> > vect_deque; 00330 vect_deque.assign(20, vector<int>(10)); 00331 deque<vector<int> >::iterator vdit(vect_deque.begin()), vditEnd(vect_deque.end()); 00332 vector<int*> bufs; 00333 for (; vdit != vditEnd; ++vdit) { 00334 bufs.push_back(&vdit->front()); 00335 } 00336 00337 { 00338 //2 values in front: 00339 vect_deque.insert(vect_deque.begin() + 2, 2, vector<int>(10)); 00340 bufs.insert(bufs.begin() + 2, &vect_deque[2].front()); 00341 bufs.insert(bufs.begin() + 3, &vect_deque[3].front()); 00342 CPPUNIT_ASSERT( vect_deque.size() == 22 ); 00343 deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); 00344 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00345 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00346 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00347 } 00348 #endif 00349 } 00350 00351 { 00352 //2 values in back: 00353 vect_deque.insert(vect_deque.end() - 2, 2, vector<int>(10)); 00354 bufs.insert(bufs.end() - 2, &vect_deque[20].front()); 00355 bufs.insert(bufs.end() - 2, &vect_deque[21].front()); 00356 CPPUNIT_ASSERT( vect_deque.size() == 24 ); 00357 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00358 deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); 00359 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00360 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00361 } 00362 #endif 00363 } 00364 00365 { 00366 //1 value in front: 00367 deque<vector<int> >::iterator ret; 00368 ret = vect_deque.insert(vect_deque.begin() + 2, vector<int>(10)); 00369 bufs.insert(bufs.begin() + 2, &vect_deque[2].front()); 00370 CPPUNIT_ASSERT( vect_deque.size() == 25 ); 00371 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00372 CPPUNIT_ASSERT( &ret->front() == bufs[2] ); 00373 deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); 00374 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00375 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00376 } 00377 #endif 00378 } 00379 00380 { 00381 //1 value in back: 00382 deque<vector<int> >::iterator ret; 00383 ret = vect_deque.insert(vect_deque.end() - 2, vector<int>(10)); 00384 bufs.insert(bufs.end() - 2, &vect_deque[23].front()); 00385 CPPUNIT_ASSERT( vect_deque.size() == 26 ); 00386 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00387 CPPUNIT_ASSERT( &ret->front() == bufs[23] ); 00388 deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); 00389 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00390 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00391 } 00392 #endif 00393 } 00394 } 00395 } 00396 00397 void MoveConstructorTest::vector_test() 00398 { 00399 //Check the insert range method. 00400 //To the front: 00401 { 00402 vector<vector<int> > vect_vector; 00403 vector<int*> bufs; 00404 vect_vector.assign(3, vector<int>(10)); 00405 bufs.push_back(&vect_vector[0].front()); 00406 bufs.push_back(&vect_vector[1].front()); 00407 bufs.push_back(&vect_vector[2].front()); 00408 00409 int nb_insert = 5; 00410 int pos = 1; 00411 while (nb_insert--) { 00412 vector<vector<int> > vect_vect(2, vector<int>(10)); 00413 vect_vector.insert(vect_vector.begin() + pos, vect_vect.begin(), vect_vect.end()); 00414 bufs.insert(bufs.begin() + pos, &vect_vector[pos].front()); 00415 bufs.insert(bufs.begin() + pos + 1, &vect_vector[pos + 1].front()); 00416 ++pos; 00417 } 00418 CPPUNIT_ASSERT( vect_vector.size() == 13 ); 00419 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00420 for (int i = 0; i < 5; ++i) { 00421 CPPUNIT_ASSERT( bufs[i] == &vect_vector[i].front() ); 00422 CPPUNIT_ASSERT( bufs[11 - i] == &vect_vector[11 - i].front() ); 00423 } 00424 #endif 00425 } 00426 00427 //To the back 00428 { 00429 vector<vector<int> > vect_vector; 00430 vector<int*> bufs; 00431 vect_vector.assign(3, vector<int>(10)); 00432 bufs.push_back(&vect_vector[0].front()); 00433 bufs.push_back(&vect_vector[1].front()); 00434 bufs.push_back(&vect_vector[2].front()); 00435 00436 int nb_insert = 5; 00437 //Initialize to 2 to generate a back insertion: 00438 int pos = 2; 00439 while (nb_insert--) { 00440 vector<vector<int> > vect_vect(2, vector<int>(10)); 00441 vect_vector.insert(vect_vector.begin() + pos, vect_vect.begin(), vect_vect.end()); 00442 bufs.insert(bufs.begin() + pos, &vect_vector[pos].front()); 00443 bufs.insert(bufs.begin() + pos + 1, &vect_vector[pos + 1].front()); 00444 ++pos; 00445 } 00446 CPPUNIT_ASSERT( vect_vector.size() == 13 ); 00447 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00448 for (int i = 0; i < 5; ++i) { 00449 CPPUNIT_ASSERT( bufs[i + 1] == &vect_vector[i + 1].front() ); 00450 CPPUNIT_ASSERT( bufs[12 - i] == &vect_vector[12 - i].front() ); 00451 } 00452 #endif 00453 } 00454 00455 //Check the different erase methods. 00456 { 00457 vector<vector<int> > vect_vector; 00458 vect_vector.assign(20, vector<int>(10)); 00459 vector<vector<int> >::iterator vdit(vect_vector.begin()), vditEnd(vect_vector.end()); 00460 vector<int*> bufs; 00461 for (; vdit != vditEnd; ++vdit) { 00462 bufs.push_back(&vdit->front()); 00463 } 00464 00465 { 00466 // This check, repeated after each operation, check the vector consistency: 00467 vector<vector<int> >::iterator it = vect_vector.end() - 5; 00468 int nb_incr = 0; 00469 for (; it != vect_vector.end() && nb_incr <= 6; ++nb_incr, ++it) {} 00470 CPPUNIT_ASSERT( nb_incr == 5 ); 00471 } 00472 00473 { 00474 //erase in front: 00475 vect_vector.erase(vect_vector.begin() + 2); 00476 bufs.erase(bufs.begin() + 2); 00477 CPPUNIT_ASSERT( vect_vector.size() == 19 ); 00478 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00479 vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); 00480 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00481 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00482 } 00483 #endif 00484 } 00485 00486 { 00487 vector<vector<int> >::iterator it = vect_vector.end() - 5; 00488 int nb_incr = 0; 00489 for (; it != vect_vector.end() && nb_incr <= 6; ++nb_incr, ++it) {} 00490 CPPUNIT_ASSERT( nb_incr == 5 ); 00491 } 00492 00493 { 00494 //erase in the back: 00495 vect_vector.erase(vect_vector.end() - 2); 00496 bufs.erase(bufs.end() - 2); 00497 CPPUNIT_ASSERT( vect_vector.size() == 18 ); 00498 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00499 vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); 00500 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00501 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00502 } 00503 #endif 00504 } 00505 00506 { 00507 vector<vector<int> >::iterator it = vect_vector.end() - 5; 00508 int nb_incr = 0; 00509 for (; it != vect_vector.end() && nb_incr < 6; ++nb_incr, ++it) {} 00510 CPPUNIT_ASSERT( nb_incr == 5 ); 00511 } 00512 00513 { 00514 //range erase in front 00515 vect_vector.erase(vect_vector.begin() + 3, vect_vector.begin() + 5); 00516 bufs.erase(bufs.begin() + 3, bufs.begin() + 5); 00517 CPPUNIT_ASSERT( vect_vector.size() == 16 ); 00518 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00519 vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); 00520 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00521 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00522 } 00523 #endif 00524 } 00525 00526 { 00527 vector<vector<int> >::iterator it = vect_vector.end() - 5; 00528 int nb_incr = 0; 00529 for (; it != vect_vector.end() && nb_incr <= 6; ++nb_incr, ++it) {} 00530 CPPUNIT_ASSERT( nb_incr == 5 ); 00531 } 00532 00533 { 00534 //range erase in back 00535 vect_vector.erase(vect_vector.end() - 5, vect_vector.end() - 3); 00536 bufs.erase(bufs.end() - 5, bufs.end() - 3); 00537 CPPUNIT_ASSERT( vect_vector.size() == 14 ); 00538 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00539 vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); 00540 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00541 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00542 } 00543 #endif 00544 } 00545 } 00546 00547 //Check the insert value(s) 00548 { 00549 vector<vector<int> > vect_vector; 00550 vect_vector.assign(20, vector<int>(10)); 00551 vector<vector<int> >::iterator vdit(vect_vector.begin()), vditEnd(vect_vector.end()); 00552 vector<int*> bufs; 00553 for (; vdit != vditEnd; ++vdit) { 00554 bufs.push_back(&vdit->front()); 00555 } 00556 00557 { 00558 //2 values in front: 00559 vect_vector.insert(vect_vector.begin() + 2, 2, vector<int>(10)); 00560 bufs.insert(bufs.begin() + 2, &vect_vector[2].front()); 00561 bufs.insert(bufs.begin() + 3, &vect_vector[3].front()); 00562 CPPUNIT_ASSERT( vect_vector.size() == 22 ); 00563 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00564 vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); 00565 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00566 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00567 } 00568 #endif 00569 } 00570 00571 { 00572 //2 values in back: 00573 vect_vector.insert(vect_vector.end() - 2, 2, vector<int>(10)); 00574 bufs.insert(bufs.end() - 2, &vect_vector[20].front()); 00575 bufs.insert(bufs.end() - 2, &vect_vector[21].front()); 00576 CPPUNIT_ASSERT( vect_vector.size() == 24 ); 00577 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00578 vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); 00579 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00580 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00581 } 00582 #endif 00583 } 00584 00585 { 00586 //1 value in front: 00587 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00588 vector<vector<int> >::iterator ret = 00589 #endif 00590 vect_vector.insert(vect_vector.begin() + 2, vector<int>(10)); 00591 bufs.insert(bufs.begin() + 2, &vect_vector[2].front()); 00592 CPPUNIT_ASSERT( vect_vector.size() == 25 ); 00593 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00594 CPPUNIT_ASSERT( &ret->front() == bufs[2] ); 00595 vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); 00596 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00597 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00598 } 00599 #endif 00600 } 00601 00602 { 00603 //1 value in back: 00604 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00605 vector<vector<int> >::iterator ret = 00606 #endif 00607 vect_vector.insert(vect_vector.end() - 2, vector<int>(10)); 00608 bufs.insert(bufs.end() - 2, &vect_vector[23].front()); 00609 CPPUNIT_ASSERT( vect_vector.size() == 26 ); 00610 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00611 CPPUNIT_ASSERT( &ret->front() == bufs[23] ); 00612 vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); 00613 for (size_t i = 0; dit != ditEnd; ++dit, ++i) { 00614 CPPUNIT_ASSERT( bufs[i] == &dit->front() ); 00615 } 00616 #endif 00617 } 00618 } 00619 00620 //The following tests are checking move contructor implementations: 00621 const string long_str("long enough string to force dynamic allocation"); 00622 { 00623 //vector move contructor: 00624 vector<vector<string> > vect(10, vector<string>(10, long_str)); 00625 vector<string> strs; 00626 size_t index = 0; 00627 for (;;) { 00628 vector<vector<string> >::iterator it(vect.begin()); 00629 advance(it, index % vect.size()); 00630 strs.push_back(it->front()); 00631 it->erase(it->begin()); 00632 if (it->empty()) { 00633 vect.erase(it); 00634 if (vect.empty()) 00635 break; 00636 } 00637 index += 3; 00638 } 00639 CPPUNIT_ASSERT( strs.size() == 10 * 10 ); 00640 vector<string>::iterator it(strs.begin()), itEnd(strs.end()); 00641 for (; it != itEnd; ++it) { 00642 CPPUNIT_ASSERT( *it == long_str ); 00643 } 00644 } 00645 00646 { 00647 //deque move contructor: 00648 # if !defined (__DMC__) 00649 vector<deque<string> > vect(10, deque<string>(10, long_str)); 00650 # else 00651 deque<string> deq_str = deque<string>(10, long_str); 00652 vector<deque<string> > vect(10, deq_str); 00653 # endif 00654 vector<string> strs; 00655 size_t index = 0; 00656 for (;;) { 00657 vector<deque<string> >::iterator it(vect.begin()); 00658 advance(it, index % vect.size()); 00659 strs.push_back(it->front()); 00660 it->pop_front(); 00661 if (it->empty()) { 00662 vect.erase(it); 00663 if (vect.empty()) 00664 break; 00665 } 00666 index += 3; 00667 } 00668 CPPUNIT_ASSERT( strs.size() == 10 * 10 ); 00669 vector<string>::iterator it(strs.begin()), itEnd(strs.end()); 00670 for (; it != itEnd; ++it) { 00671 CPPUNIT_ASSERT( *it == long_str ); 00672 } 00673 } 00674 00675 { 00676 //list move contructor: 00677 vector<list<string> > vect(10, list<string>(10, long_str)); 00678 vector<string> strs; 00679 size_t index = 0; 00680 for (;;) { 00681 vector<list<string> >::iterator it(vect.begin()); 00682 advance(it, index % vect.size()); 00683 strs.push_back(it->front()); 00684 it->pop_front(); 00685 if (it->empty()) { 00686 vect.erase(it); 00687 if (vect.empty()) 00688 break; 00689 } 00690 index += 3; 00691 } 00692 CPPUNIT_ASSERT( strs.size() == 10 * 10 ); 00693 vector<string>::iterator it(strs.begin()), itEnd(strs.end()); 00694 for (; it != itEnd; ++it) { 00695 CPPUNIT_ASSERT( *it == long_str ); 00696 } 00697 } 00698 00699 #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 00700 { 00701 //slist move contructor: 00702 vector<slist<string> > vect(10, slist<string>(10, long_str)); 00703 vector<string> strs; 00704 size_t index = 0; 00705 while (true) { 00706 vector<slist<string> >::iterator it(vect.begin()); 00707 advance(it, index % vect.size()); 00708 strs.push_back(it->front()); 00709 it->pop_front(); 00710 if (it->empty()) { 00711 vect.erase(it); 00712 if (vect.empty()) 00713 break; 00714 } 00715 index += 3; 00716 } 00717 CPPUNIT_ASSERT( strs.size() == 10 * 10 ); 00718 vector<string>::iterator it(strs.begin()), itEnd(strs.end()); 00719 for (; it != itEnd; ++it) { 00720 CPPUNIT_ASSERT( *it == long_str ); 00721 } 00722 } 00723 #endif 00724 00725 { 00726 //binary tree move contructor: 00727 multiset<string> ref; 00728 for (size_t i = 0; i < 10; ++i) { 00729 ref.insert(long_str); 00730 } 00731 vector<multiset<string> > vect(10, ref); 00732 vector<string> strs; 00733 size_t index = 0; 00734 for (;;) { 00735 vector<multiset<string> >::iterator it(vect.begin()); 00736 advance(it, index % vect.size()); 00737 strs.push_back(*it->begin()); 00738 it->erase(it->begin()); 00739 if (it->empty()) { 00740 vect.erase(it); 00741 if (vect.empty()) 00742 break; 00743 } 00744 index += 3; 00745 } 00746 CPPUNIT_ASSERT( strs.size() == 10 * 10 ); 00747 vector<string>::iterator it(strs.begin()), itEnd(strs.end()); 00748 for (; it != itEnd; ++it) { 00749 CPPUNIT_ASSERT( *it == long_str ); 00750 } 00751 } 00752 00753 #if defined (STLPORT) 00754 # if !defined (__DMC__) 00755 { 00756 //hash container move contructor: 00757 unordered_multiset<string> ref; 00758 for (size_t i = 0; i < 10; ++i) { 00759 ref.insert(long_str); 00760 } 00761 vector<unordered_multiset<string> > vect(10, ref); 00762 vector<string> strs; 00763 size_t index = 0; 00764 while (true) { 00765 vector<unordered_multiset<string> >::iterator it(vect.begin()); 00766 advance(it, index % vect.size()); 00767 strs.push_back(*it->begin()); 00768 it->erase(it->begin()); 00769 if (it->empty()) { 00770 vect.erase(it); 00771 if (vect.empty()) 00772 break; 00773 } 00774 index += 3; 00775 } 00776 CPPUNIT_ASSERT( strs.size() == 10 * 10 ); 00777 vector<string>::iterator it(strs.begin()), itEnd(strs.end()); 00778 for (; it != itEnd; ++it) { 00779 CPPUNIT_ASSERT( *it == long_str ); 00780 } 00781 } 00782 # endif 00783 #endif 00784 } 00785 00786 #if defined (__BORLANDC__) 00787 /* Specific Borland test case to show a really weird compiler behavior. 00788 */ 00789 class Standalone 00790 { 00791 public: 00792 //Uncomment following to pass the test 00793 //Standalone() {} 00794 ~Standalone() {} 00795 00796 MovableStruct movableStruct; 00797 vector<int> intVector; 00798 }; 00799 00800 void MoveConstructorTest::nb_destructor_calls() 00801 { 00802 MovableStruct::reset(); 00803 00804 try 00805 { 00806 Standalone standalone; 00807 throw "some exception"; 00808 MovableStruct movableStruct; 00809 } 00810 catch (const char*) 00811 { 00812 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 1 ); 00813 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 1 ); 00814 } 00815 } 00816 #endif Generated on Fri May 25 2012 04:34:03 for ReactOS by
1.7.6.1
|