📄 mvctor_test.cpp
字号:
int pos = 1; while (nb_insert--) { vector<vector<int> > vect_vect(2, vector<int>(10)); vect_vector.insert(vect_vector.begin() + pos, vect_vect.begin(), vect_vect.end()); bufs.insert(bufs.begin() + pos, &vect_vector[pos].front()); bufs.insert(bufs.begin() + pos + 1, &vect_vector[pos + 1].front()); ++pos; } CPPUNIT_ASSERT( vect_vector.size() == 13 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) for (int i = 0; i < 5; ++i) { CPPUNIT_ASSERT( bufs[i] == &vect_vector[i].front() ); CPPUNIT_ASSERT( bufs[11 - i] == &vect_vector[11 - i].front() ); }#endif } //To the back { vector<vector<int> > vect_vector; vector<int*> bufs; vect_vector.assign(3, vector<int>(10)); bufs.push_back(&vect_vector[0].front()); bufs.push_back(&vect_vector[1].front()); bufs.push_back(&vect_vector[2].front()); int nb_insert = 5; //Initialize to 2 to generate a back insertion: int pos = 2; while (nb_insert--) { vector<vector<int> > vect_vect(2, vector<int>(10)); vect_vector.insert(vect_vector.begin() + pos, vect_vect.begin(), vect_vect.end()); bufs.insert(bufs.begin() + pos, &vect_vector[pos].front()); bufs.insert(bufs.begin() + pos + 1, &vect_vector[pos + 1].front()); ++pos; } CPPUNIT_ASSERT( vect_vector.size() == 13 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) for (int i = 0; i < 5; ++i) { CPPUNIT_ASSERT( bufs[i + 1] == &vect_vector[i + 1].front() ); CPPUNIT_ASSERT( bufs[12 - i] == &vect_vector[12 - i].front() ); }#endif } //Check the different erase methods. { vector<vector<int> > vect_vector; vect_vector.assign(20, vector<int>(10)); vector<vector<int> >::iterator vdit(vect_vector.begin()), vditEnd(vect_vector.end()); vector<int*> bufs; for (; vdit != vditEnd; ++vdit) { bufs.push_back(&vdit->front()); } { // This check, repeated after each operation, check the vector consistency: vector<vector<int> >::iterator it = vect_vector.end() - 5; int nb_incr = 0; for (; it != vect_vector.end() && nb_incr <= 6; ++nb_incr, ++it) {} CPPUNIT_ASSERT( nb_incr == 5 ); } { //erase in front: vect_vector.erase(vect_vector.begin() + 2); bufs.erase(bufs.begin() + 2); CPPUNIT_ASSERT( vect_vector.size() == 19 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { vector<vector<int> >::iterator it = vect_vector.end() - 5; int nb_incr = 0; for (; it != vect_vector.end() && nb_incr <= 6; ++nb_incr, ++it) {} CPPUNIT_ASSERT( nb_incr == 5 ); } { //erase in the back: vect_vector.erase(vect_vector.end() - 2); bufs.erase(bufs.end() - 2); CPPUNIT_ASSERT( vect_vector.size() == 18 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { vector<vector<int> >::iterator it = vect_vector.end() - 5; int nb_incr = 0; for (; it != vect_vector.end() && nb_incr < 6; ++nb_incr, ++it) {} CPPUNIT_ASSERT( nb_incr == 5 ); } { //range erase in front vect_vector.erase(vect_vector.begin() + 3, vect_vector.begin() + 5); bufs.erase(bufs.begin() + 3, bufs.begin() + 5); CPPUNIT_ASSERT( vect_vector.size() == 16 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { vector<vector<int> >::iterator it = vect_vector.end() - 5; int nb_incr = 0; for (; it != vect_vector.end() && nb_incr <= 6; ++nb_incr, ++it) {} CPPUNIT_ASSERT( nb_incr == 5 ); } { //range erase in back vect_vector.erase(vect_vector.end() - 5, vect_vector.end() - 3); bufs.erase(bufs.end() - 5, bufs.end() - 3); CPPUNIT_ASSERT( vect_vector.size() == 14 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } } //Check the insert value(s) { vector<vector<int> > vect_vector; vect_vector.assign(20, vector<int>(10)); vector<vector<int> >::iterator vdit(vect_vector.begin()), vditEnd(vect_vector.end()); vector<int*> bufs; for (; vdit != vditEnd; ++vdit) { bufs.push_back(&vdit->front()); } { //2 values in front: vect_vector.insert(vect_vector.begin() + 2, 2, vector<int>(10)); bufs.insert(bufs.begin() + 2, &vect_vector[2].front()); bufs.insert(bufs.begin() + 3, &vect_vector[3].front()); CPPUNIT_ASSERT( vect_vector.size() == 22 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { //2 values in back: vect_vector.insert(vect_vector.end() - 2, 2, vector<int>(10)); bufs.insert(bufs.end() - 2, &vect_vector[20].front()); bufs.insert(bufs.end() - 2, &vect_vector[21].front()); CPPUNIT_ASSERT( vect_vector.size() == 24 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { //1 value in front:#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator ret =#endif vect_vector.insert(vect_vector.begin() + 2, vector<int>(10)); bufs.insert(bufs.begin() + 2, &vect_vector[2].front()); CPPUNIT_ASSERT( vect_vector.size() == 25 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) CPPUNIT_ASSERT( &ret->front() == bufs[2] ); vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { //1 value in back:#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator ret =#endif vect_vector.insert(vect_vector.end() - 2, vector<int>(10)); bufs.insert(bufs.end() - 2, &vect_vector[23].front()); CPPUNIT_ASSERT( vect_vector.size() == 26 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) CPPUNIT_ASSERT( &ret->front() == bufs[23] ); vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } } //The following tests are checking move contructor implementations: const string long_str("long enough string to force dynamic allocation"); { //vector move contructor: vector<vector<string> > vect(10, vector<string>(10, long_str)); vector<string> strs; size_t index = 0; for (;;) { vector<vector<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(it->front()); it->erase(it->begin()); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } } { //deque move contructor:# if !defined (__DMC__) vector<deque<string> > vect(10, deque<string>(10, long_str));# else deque<string> deq_str = deque<string>(10, long_str); vector<deque<string> > vect(10, deq_str);# endif vector<string> strs; size_t index = 0; for (;;) { vector<deque<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(it->front()); it->pop_front(); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } } { //list move contructor: vector<list<string> > vect(10, list<string>(10, long_str)); vector<string> strs; size_t index = 0; for (;;) { vector<list<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(it->front()); it->pop_front(); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } }#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) { //slist move contructor: vector<slist<string> > vect(10, slist<string>(10, long_str)); vector<string> strs; size_t index = 0; while (true) { vector<slist<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(it->front()); it->pop_front(); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } }#endif { //binary tree move contructor: multiset<string> ref; for (size_t i = 0; i < 10; ++i) { ref.insert(long_str); } vector<multiset<string> > vect(10, ref); vector<string> strs; size_t index = 0; for (;;) { vector<multiset<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(*it->begin()); it->erase(it->begin()); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } }#if defined (STLPORT)# if !defined (__DMC__) { //hash container move contructor: unordered_multiset<string> ref; for (size_t i = 0; i < 10; ++i) { ref.insert(long_str); } vector<unordered_multiset<string> > vect(10, ref); vector<string> strs; size_t index = 0; while (true) { vector<unordered_multiset<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(*it->begin()); it->erase(it->begin()); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } }# endif#endif}#if defined (__BORLANDC__)/* Specific Borland test case to show a really weird compiler behavior. */class Standalone{public: //Uncomment following to pass the test //Standalone() {} ~Standalone() {} MovableStruct movableStruct; vector<int> intVector;};void MoveConstructorTest::nb_destructor_calls(){ MovableStruct::reset(); try { Standalone standalone; throw "some exception"; MovableStruct movableStruct; } catch (const char*) { CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 1 ); CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 1 ); }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -