⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mvctor_test.cpp

📁 stl的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <vector>#include <algorithm>#include <string>#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)#  include <slist>#endif#include <list>#include <deque>#include <set>#if defined (STLPORT)#  include <unordered_set>#endif#include "mvctor_test.h"#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)using namespace std;#  if defined (STLPORT)using namespace std::tr1;#  endif#endifCPPUNIT_TEST_SUITE_REGISTRATION(MoveConstructorTest);//// tests implementation//void MoveConstructorTest::move_construct_test(){  //cout << "vector<vector<int>>";  vector<int> const ref_vec(10, 0);  vector<vector<int> > v_v_ints(1, ref_vec);#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  int *pint = &(v_v_ints.front().front());#endif  size_t cur_capacity = v_v_ints.capacity();  while (v_v_ints.capacity() <= cur_capacity) {    v_v_ints.push_back(ref_vec);  }  //v_v_ints has been resized#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  CPPUNIT_ASSERT((pint == &v_v_ints.front().front()));#endif  //cout << "vector<vector<int>>::erase";  //We need at least 3 elements:  while (v_v_ints.size() < 3) {    v_v_ints.push_back(ref_vec);  }  //We erase the 2nd#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  pint = &v_v_ints[2].front();#endif  v_v_ints.erase(v_v_ints.begin() + 1);#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  CPPUNIT_ASSERT((pint == &v_v_ints[1].front()));#endif  //cout << "vector<string>";  string const ref_str("ref string, big enough to be a dynamic one");  vector<string> vec_strs(1, ref_str);#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  char const* pstr = vec_strs.front().c_str();#endif  cur_capacity = vec_strs.capacity();  while (vec_strs.capacity() <= cur_capacity) {    vec_strs.push_back(ref_str);  }  //vec_str has been resized#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  CPPUNIT_ASSERT((pstr == vec_strs.front().c_str()));#endif  //cout << "vector<string>::erase";  //We need at least 3 elements:  while (vec_strs.size() < 3) {    vec_strs.push_back(ref_str);  }  //We erase the 2nd#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  pstr = vec_strs[2].c_str();#endif  vec_strs.erase(vec_strs.begin() + 1);#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  CPPUNIT_ASSERT((pstr == vec_strs[1].c_str()));#endif  //cout << "swap(vector<int>, vector<int>)";  vector<int> elem1(10, 0), elem2(10, 0);#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  int *p1 = &elem1.front();  int *p2 = &elem2.front();#endif  swap(elem1, elem2);#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)  CPPUNIT_ASSERT(((p1 == &elem2.front()) && (p2 == &elem1.front())));#endif  {    vector<bool> bit_vec(5, true);    bit_vec.insert(bit_vec.end(), 5, false);    vector<vector<bool> > v_v_bits(1, bit_vec);    /*     * This is a STLport specific test as we are using internal implementation     * details to check that the move has been correctly handled. For other     * STL implementation it is only a compile check.     */#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)#  if defined (_STLP_DEBUG)    unsigned int *punit = v_v_bits.front().begin()._M_iterator._M_p;#  else    unsigned int *punit = v_v_bits.front().begin()._M_p;#  endif#endif    cur_capacity = v_v_bits.capacity();    while (v_v_bits.capacity() <= cur_capacity) {      v_v_bits.push_back(bit_vec);    }#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)    //v_v_bits has been resized#  if defined (_STLP_DEBUG)    CPPUNIT_ASSERT( punit == v_v_bits.front().begin()._M_iterator._M_p );#  else    CPPUNIT_ASSERT( punit == v_v_bits.front().begin()._M_p );#  endif#endif  }  // zero: don't like this kind of tests  // because of template test function  // we should find another way to provide  // move constructor testing.../*  standard_test1(list<int>(10));  standard_test1(slist<int>(10));  standard_test1(deque<int>(10));*/  /*  int int_values[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};  set<int> int_set(int_values, int_values + sizeof(in_values) / sizeof(int));  standard_test1(int_set);  multiset<int> int_multiset(int_values, int_values + sizeof(in_values) / sizeof(int));  standard_test1(int_multiset);  */  /*  CheckFullMoveSupport(string());  CheckFullMoveSupport(vector<int>());  CheckFullMoveSupport(deque<int>());  CheckFullMoveSupport(list<int>());  CheckFullMoveSupport(slist<int>());  */}void MoveConstructorTest::deque_test(){  //Check the insert range method.  //To the front:  {#  if !defined (STLPORT) || !defined (_STLP_DEBUG) || !defined (_STLP_NO_MEMBER_TEMPLATES)    deque<vector<int> > vect_deque;    vector<int*> bufs;    vect_deque.assign(3, vector<int>(10));    bufs.push_back(&vect_deque[0].front());    bufs.push_back(&vect_deque[1].front());    bufs.push_back(&vect_deque[2].front());    int nb_insert = 5;    //Initialize to 1 to generate a front insertion:    int pos = 1;    while (nb_insert--) {      vector<vector<int> > vect_vect(2, vector<int>(10));      vect_deque.insert(vect_deque.begin() + pos, vect_vect.begin(), vect_vect.end());      bufs.insert(bufs.begin() + pos, &vect_deque[pos].front());      bufs.insert(bufs.begin() + pos + 1, &vect_deque[pos + 1].front());      ++pos;    }    CPPUNIT_ASSERT( vect_deque.size() == 13 );#    if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)    for (int i = 0; i < 5; ++i) {      CPPUNIT_ASSERT( bufs[i] == &vect_deque[i].front() );      CPPUNIT_ASSERT( bufs[11 - i] == &vect_deque[11 - i].front() );    }#    endif#  endif  }  //To the back  {#  if !defined (STLPORT) || !defined (_STLP_DEBUG) || !defined (_STLP_NO_MEMBER_TEMPLATES)    deque<vector<int> > vect_deque;    vector<int*> bufs;    vect_deque.assign(3, vector<int>(10));    bufs.push_back(&vect_deque[0].front());    bufs.push_back(&vect_deque[1].front());    bufs.push_back(&vect_deque[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_deque.insert(vect_deque.begin() + pos, vect_vect.begin(), vect_vect.end());      bufs.insert(bufs.begin() + pos, &vect_deque[pos].front());      bufs.insert(bufs.begin() + pos + 1, &vect_deque[pos + 1].front());      ++pos;    }    CPPUNIT_ASSERT( vect_deque.size() == 13 );#    if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)    for (int i = 0; i < 5; ++i) {      CPPUNIT_ASSERT( bufs[i + 1] == &vect_deque[i + 1].front() );      CPPUNIT_ASSERT( bufs[12 - i] == &vect_deque[12 - i].front() );    }#    endif#  endif  }  //Check the different erase methods.  {    deque<vector<int> > vect_deque;    vect_deque.assign(20, vector<int>(10));    deque<vector<int> >::iterator vdit(vect_deque.begin()), vditEnd(vect_deque.end());    vector<int*> bufs;    for (; vdit != vditEnd; ++vdit) {      bufs.push_back(&vdit->front());    }    {      // This check, repeated after each operation, check the deque consistency:      deque<vector<int> >::iterator it = vect_deque.end() - 5;      int nb_incr = 0;      for (; it != vect_deque.end() && nb_incr <= 6; ++nb_incr, ++it) {}      CPPUNIT_ASSERT( nb_incr == 5 );    }    {      //erase in front:      vect_deque.erase(vect_deque.begin() + 2);      bufs.erase(bufs.begin() + 2);      CPPUNIT_ASSERT( vect_deque.size() == 19 );      deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end());#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      for (size_t i = 0; dit != ditEnd; ++dit, ++i) {        CPPUNIT_ASSERT( bufs[i] == &dit->front() );      }#endif    }    {      deque<vector<int> >::iterator it = vect_deque.end() - 5;      int nb_incr = 0;      for (; it != vect_deque.end() && nb_incr <= 6; ++nb_incr, ++it) {}      CPPUNIT_ASSERT( nb_incr == 5 );    }    {      //erase in the back:      vect_deque.erase(vect_deque.end() - 2);      bufs.erase(bufs.end() - 2);      CPPUNIT_ASSERT( vect_deque.size() == 18 );      deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end());#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      for (size_t i = 0; dit != ditEnd; ++dit, ++i) {        CPPUNIT_ASSERT( bufs[i] == &dit->front() );      }#endif    }    {      deque<vector<int> >::iterator it = vect_deque.end() - 5;      int nb_incr = 0;      for (; it != vect_deque.end() && nb_incr < 6; ++nb_incr, ++it) {}      CPPUNIT_ASSERT( nb_incr == 5 );    }    {      //range erase in front      vect_deque.erase(vect_deque.begin() + 3, vect_deque.begin() + 5);      bufs.erase(bufs.begin() + 3, bufs.begin() + 5);      CPPUNIT_ASSERT( vect_deque.size() == 16 );      deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end());#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      for (size_t i = 0; dit != ditEnd; ++dit, ++i) {        CPPUNIT_ASSERT( bufs[i] == &dit->front() );      }#endif    }    {      deque<vector<int> >::iterator it = vect_deque.end() - 5;      int nb_incr = 0;      for (; it != vect_deque.end() && nb_incr <= 6; ++nb_incr, ++it) {}      CPPUNIT_ASSERT( nb_incr == 5 );    }    {      //range erase in back      vect_deque.erase(vect_deque.end() - 5, vect_deque.end() - 3);      bufs.erase(bufs.end() - 5, bufs.end() - 3);      CPPUNIT_ASSERT( vect_deque.size() == 14 );      deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end());#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      for (size_t i = 0; dit != ditEnd; ++dit, ++i) {        CPPUNIT_ASSERT( bufs[i] == &dit->front() );      }#endif    }  }  //Check the insert value(s)  {    deque<vector<int> > vect_deque;    vect_deque.assign(20, vector<int>(10));    deque<vector<int> >::iterator vdit(vect_deque.begin()), vditEnd(vect_deque.end());    vector<int*> bufs;    for (; vdit != vditEnd; ++vdit) {      bufs.push_back(&vdit->front());    }    {      //2 values in front:      vect_deque.insert(vect_deque.begin() + 2, 2, vector<int>(10));      bufs.insert(bufs.begin() + 2, &vect_deque[2].front());      bufs.insert(bufs.begin() + 3, &vect_deque[3].front());      CPPUNIT_ASSERT( vect_deque.size() == 22 );      deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end());#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      for (size_t i = 0; dit != ditEnd; ++dit, ++i) {        CPPUNIT_ASSERT( bufs[i] == &dit->front() );      }#endif    }    {      //2 values in back:      vect_deque.insert(vect_deque.end() - 2, 2, vector<int>(10));      bufs.insert(bufs.end() - 2, &vect_deque[20].front());      bufs.insert(bufs.end() - 2, &vect_deque[21].front());      CPPUNIT_ASSERT( vect_deque.size() == 24 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end());      for (size_t i = 0; dit != ditEnd; ++dit, ++i) {        CPPUNIT_ASSERT( bufs[i] == &dit->front() );      }#endif    }    {      //1 value in front:      deque<vector<int> >::iterator ret;      ret = vect_deque.insert(vect_deque.begin() + 2, vector<int>(10));      bufs.insert(bufs.begin() + 2, &vect_deque[2].front());      CPPUNIT_ASSERT( vect_deque.size() == 25 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      CPPUNIT_ASSERT( &ret->front() == bufs[2] );      deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end());      for (size_t i = 0; dit != ditEnd; ++dit, ++i) {        CPPUNIT_ASSERT( bufs[i] == &dit->front() );      }#endif    }    {      //1 value in back:      deque<vector<int> >::iterator ret;      ret = vect_deque.insert(vect_deque.end() - 2, vector<int>(10));      bufs.insert(bufs.end() - 2, &vect_deque[23].front());      CPPUNIT_ASSERT( vect_deque.size() == 26 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      CPPUNIT_ASSERT( &ret->front() == bufs[23] );      deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end());      for (size_t i = 0; dit != ditEnd; ++dit, ++i) {        CPPUNIT_ASSERT( bufs[i] == &dit->front() );      }#endif    }  }}void MoveConstructorTest::vector_test(){  //Check the insert range method.  //To the front:  {    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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -