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

📄 deque_test.cpp

📁 stl的源码
💻 CPP
字号:
//Has to be first for StackAllocator swap overload to be taken//into account (at least using GCC 4.0.1)#include "stack_allocator.h"#include <deque>#include <algorithm>#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)# include <stdexcept>#endif#include "cppunit/cppunit_proxy.h"#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)using namespace std;#endif//// TestCase class//class DequeTest : public CPPUNIT_NS::TestCase{  CPPUNIT_TEST_SUITE(DequeTest);  CPPUNIT_TEST(deque1);  CPPUNIT_TEST(at);  CPPUNIT_TEST(insert);  CPPUNIT_TEST(erase);  CPPUNIT_TEST(auto_ref);  CPPUNIT_TEST(allocator_with_state);#if defined (STLPORT) && defined (_STLP_NO_MEMBER_TEMPLATES)  CPPUNIT_IGNORE;#endif  CPPUNIT_TEST(optimizations_check);  CPPUNIT_TEST_SUITE_END();protected:  void deque1();  void insert();  void erase();  void at();  void auto_ref();  void allocator_with_state();  void optimizations_check();};CPPUNIT_TEST_SUITE_REGISTRATION(DequeTest);//// tests implementation//void DequeTest::deque1(){  deque<int> d;  d.push_back(4);  d.push_back(9);  d.push_back(16);  d.push_front(1);  CPPUNIT_ASSERT( d[0] == 1 );  CPPUNIT_ASSERT( d[1] == 4 );  CPPUNIT_ASSERT( d[2] == 9 );  CPPUNIT_ASSERT( d[3] == 16 );  d.pop_front();  d[2] = 25;  CPPUNIT_ASSERT( d[0] == 4 );  CPPUNIT_ASSERT( d[1] == 9 );  CPPUNIT_ASSERT( d[2] == 25 );  //Some compile time tests:  deque<int>::iterator dit = d.begin();  deque<int>::const_iterator cdit(d.begin());  CPPUNIT_ASSERT( (dit - cdit) == 0 );  CPPUNIT_ASSERT( (cdit - dit) == 0 );  CPPUNIT_ASSERT( (dit - dit) == 0 );  CPPUNIT_ASSERT( (cdit - cdit) == 0 );  CPPUNIT_ASSERT(!((dit < cdit) || (dit > cdit) || (dit != cdit) || !(dit <= cdit) || !(dit >= cdit)));}void DequeTest::insert(){  deque<int> d;  d.push_back(0);  d.push_back(1);  d.push_back(2);  CPPUNIT_ASSERT( d.size() == 3 );  deque<int>::iterator dit;  //Insertion before begin:  dit = d.insert(d.begin(), 3);  CPPUNIT_ASSERT( dit != d.end() );  CPPUNIT_CHECK( *dit == 3 );  CPPUNIT_ASSERT( d.size() == 4 );  CPPUNIT_ASSERT( d[0] == 3 );  //Insertion after begin:  dit = d.insert(d.begin() + 1, 4);  CPPUNIT_ASSERT( dit != d.end() );  CPPUNIT_CHECK( *dit == 4 );  CPPUNIT_ASSERT( d.size() == 5 );  CPPUNIT_ASSERT( d[1] == 4 );  //Insertion at end:  dit = d.insert(d.end(), 5);  CPPUNIT_ASSERT( dit != d.end() );  CPPUNIT_CHECK( *dit == 5 );  CPPUNIT_ASSERT( d.size() == 6 );  CPPUNIT_ASSERT( d[5] == 5 );  //Insertion before last element:  dit = d.insert(d.end() - 1, 6);  CPPUNIT_ASSERT( dit != d.end() );  CPPUNIT_CHECK( *dit == 6 );  CPPUNIT_ASSERT( d.size() == 7 );  CPPUNIT_ASSERT( d[5] == 6 );  //Insertion of several elements before begin  d.insert(d.begin(), 2, 7);  CPPUNIT_ASSERT( d.size() == 9 );  CPPUNIT_ASSERT( d[0] == 7 );  CPPUNIT_ASSERT( d[1] == 7 );  //Insertion of several elements after begin  //There is more elements to insert than elements before insertion position  d.insert(d.begin() + 1, 2, 8);  CPPUNIT_ASSERT( d.size() == 11 );  CPPUNIT_ASSERT( d[1] == 8 );  CPPUNIT_ASSERT( d[2] == 8 );  //There is less elements to insert than elements before insertion position  d.insert(d.begin() + 3, 2, 9);  CPPUNIT_ASSERT( d.size() == 13 );  CPPUNIT_ASSERT( d[3] == 9 );  CPPUNIT_ASSERT( d[4] == 9 );  //Insertion of several elements at end:  d.insert(d.end(), 2, 10);  CPPUNIT_ASSERT( d.size() == 15 );  CPPUNIT_ASSERT( d[14] == 10 );  CPPUNIT_ASSERT( d[13] == 10 );  //Insertion of several elements before last:  //There is more elements to insert than elements after insertion position  d.insert(d.end() - 1, 2, 11);  CPPUNIT_ASSERT( d.size() == 17 );  CPPUNIT_ASSERT( d[15] == 11 );  CPPUNIT_ASSERT( d[14] == 11 );  //There is less elements to insert than elements after insertion position  d.insert(d.end() - 3, 2, 12);  CPPUNIT_ASSERT( d.size() == 19 );  CPPUNIT_ASSERT( d[15] == 12 );  CPPUNIT_ASSERT( d[14] == 12 );}void DequeTest::at() {  deque<int> d;  deque<int> const& cd = d;  d.push_back(10);  CPPUNIT_ASSERT( d.at(0) == 10 );  d.at(0) = 20;  CPPUNIT_ASSERT( cd.at(0) == 20 );#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)  for (;;) {    try {      d.at(1) = 20;      CPPUNIT_ASSERT(false);    }    catch (out_of_range const&) {      return;    }    catch (...) {      CPPUNIT_ASSERT(false);    }  }#endif}void DequeTest::auto_ref(){  int i;  deque<int> ref;  for (i = 0; i < 5; ++i) {    ref.push_back(i);  }  deque<deque<int> > d_d_int(1, ref);  d_d_int.push_back(d_d_int[0]);  d_d_int.push_back(ref);  d_d_int.push_back(d_d_int[0]);  d_d_int.push_back(d_d_int[0]);  d_d_int.push_back(ref);  for (i = 0; i < 5; ++i) {    CPPUNIT_ASSERT( d_d_int[i] == ref );  }}void DequeTest::allocator_with_state(){  char buf1[1024];  StackAllocator<int> stack1(buf1, buf1 + sizeof(buf1));  char buf2[1024];  StackAllocator<int> stack2(buf2, buf2 + sizeof(buf2));  {    typedef deque<int, StackAllocator<int> > DequeInt;    DequeInt dint1(10, 0, stack1);    DequeInt dint1Cpy(dint1);    DequeInt dint2(10, 1, stack2);    DequeInt dint2Cpy(dint2);    dint1.swap(dint2);    CPPUNIT_ASSERT( dint1.get_allocator().swaped() );    CPPUNIT_ASSERT( dint2.get_allocator().swaped() );    CPPUNIT_ASSERT( dint1 == dint2Cpy );    CPPUNIT_ASSERT( dint2 == dint1Cpy );    CPPUNIT_ASSERT( dint1.get_allocator() == stack2 );    CPPUNIT_ASSERT( dint2.get_allocator() == stack1 );  }  CPPUNIT_ASSERT( stack1.ok() );  CPPUNIT_ASSERT( stack2.ok() );}struct Point {  int x, y;};struct PointEx : public Point {  PointEx() : builtFromBase(false) {}  PointEx(const Point&) : builtFromBase(true) {}  bool builtFromBase;};#if defined (STLPORT)#  if defined (_STLP_USE_NAMESPACES)namespace std {#  endif  _STLP_TEMPLATE_NULL  struct __type_traits<PointEx> {    typedef __false_type has_trivial_default_constructor;    typedef __true_type has_trivial_copy_constructor;    typedef __true_type has_trivial_assignment_operator;    typedef __true_type has_trivial_destructor;    typedef __true_type is_POD_type;  };#  if defined (_STLP_USE_NAMESPACES)}#  endif#endif//This test check that deque implementation do not over optimize//operation as PointEx copy constructor is trivialvoid DequeTest::optimizations_check(){#if !defined (STLPORT) || !defined (_STLP_NO_MEMBER_TEMPLATES)  deque<Point> d1(1);  CPPUNIT_ASSERT( d1.size() == 1 );  deque<PointEx> d2(d1.begin(), d1.end());  CPPUNIT_ASSERT( d2.size() == 1 );  CPPUNIT_ASSERT( d2[0].builtFromBase == true );  d2.insert(d2.end(), d1.begin(), d1.end());  CPPUNIT_ASSERT( d2.size() == 2 );  CPPUNIT_ASSERT( d2[1].builtFromBase == true );#endif}void DequeTest::erase(){  deque<int> dint;  dint.push_back(3);  dint.push_front(2);  dint.push_back(4);  dint.push_front(1);  dint.push_back(5);  dint.push_front(0);  dint.push_back(6);  deque<int>::iterator it(dint.begin() + 1);  CPPUNIT_ASSERT( *it == 1 );  dint.erase(dint.begin());  CPPUNIT_ASSERT( *it == 1 );  it = dint.end() - 2;  CPPUNIT_ASSERT( *it == 5 );  dint.erase(dint.end() - 1);  CPPUNIT_ASSERT( *it == 5 );  dint.push_back(6);  dint.push_front(0);  it = dint.begin() + 2;  CPPUNIT_ASSERT( *it == 2 );  dint.erase(dint.begin(), dint.begin() + 2);  CPPUNIT_ASSERT( *it == 2 );  it = dint.end() - 3;  CPPUNIT_ASSERT( *it == 4 );  dint.erase(dint.end() - 2, dint.end());  CPPUNIT_ASSERT( *it == 4 );}#if (!defined (STLPORT) || \    (!defined (_STLP_USE_PTR_SPECIALIZATIONS) || defined (_STLP_CLASS_PARTIAL_SPECIALIZATION))) && \     (!defined (_MSC_VER) || (_MSC_VER > 1400)) && \     (!defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC_MINOR__ < 3))/* Simple compilation test: Check that nested types like iterator * can be access even if type used to instanciate container is not * yet completely defined. */class IncompleteClass{  deque<IncompleteClass> instances;  typedef deque<IncompleteClass>::size_type size;};#endif

⌨️ 快捷键说明

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