ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

mvctor_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.