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

📄 uninitialized_test.cpp

📁 stl的源码
💻 CPP
字号:
#include <memory>#include <vector>#include <list>#include "cppunit/cppunit_proxy.h"#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)using namespace std;#endif//// TestCase class//class UninitializedTest : public CPPUNIT_NS::TestCase{  CPPUNIT_TEST_SUITE(UninitializedTest);  CPPUNIT_TEST(copy_test);  //CPPUNIT_TEST(fill_test);  //CPPUNIT_TEST(fill_n_test);  CPPUNIT_TEST_SUITE_END();protected:  void copy_test();  void fill_test();  void fill_n_test();};CPPUNIT_TEST_SUITE_REGISTRATION(UninitializedTest);struct NotTrivialCopyStruct {  NotTrivialCopyStruct() : member(0) {}  NotTrivialCopyStruct(NotTrivialCopyStruct const&) : member(1) {}  int member;};struct TrivialCopyStruct {  TrivialCopyStruct() : member(0) {}  TrivialCopyStruct(TrivialCopyStruct const&) : member(1) {}  int member;};struct TrivialInitStruct {  TrivialInitStruct()  { ++nbConstructorCalls; }  static size_t nbConstructorCalls;};size_t TrivialInitStruct::nbConstructorCalls = 0;#if defined (STLPORT)#  if defined (_STLP_USE_NAMESPACES)namespace std {#  endif  _STLP_TEMPLATE_NULL  struct __type_traits<TrivialCopyStruct> {     typedef __false_type has_trivial_default_constructor;     //This is a wrong declaration just to check that internaly a simple memcpy is called:     typedef __true_type has_trivial_copy_constructor;     typedef __true_type has_trivial_assignment_operator;     typedef __true_type has_trivial_destructor;     typedef __false_type is_POD_type;  };  _STLP_TEMPLATE_NULL  struct __type_traits<TrivialInitStruct> {     //This is a wrong declaration just to check that internaly no initialization is done:     typedef __true_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 __false_type is_POD_type;  };#  if defined (_STLP_USE_NAMESPACES)}#  endif#endifstruct base {};struct derived : public base {};//// tests implementation//void UninitializedTest::copy_test(){  {    //Random iterators    {      vector<NotTrivialCopyStruct> src(10);      vector<NotTrivialCopyStruct> dst(10);      uninitialized_copy(src.begin(), src.end(), dst.begin());      vector<NotTrivialCopyStruct>::const_iterator it(dst.begin()), end(dst.end());      for (; it != end; ++it) {        CPPUNIT_ASSERT( (*it).member == 1 );      }    }    {      /** Note: we use static arrays here so the iterators are always      pointers, even in debug mode. */      size_t const count = 10;      TrivialCopyStruct src[count];      TrivialCopyStruct dst[count];      TrivialCopyStruct* it = src + 0;      TrivialCopyStruct* end = src + count;      for (; it != end; ++it) {        (*it).member = 0;      }      uninitialized_copy(src+0, src+count, dst+0);      for (it = dst+0, end = dst+count; it != end; ++it) {#if defined (STLPORT)        /* If the member is 1, it means that library has not found any        optimization oportunity and called the regular copy-ctor instead. */        CPPUNIT_ASSERT( (*it).member == 0 );#else        CPPUNIT_ASSERT( (*it).member == 1 );#endif      }    }  }  {    //Bidirectional iterator    {      vector<NotTrivialCopyStruct> src(10);      list<NotTrivialCopyStruct> dst(10);      list<NotTrivialCopyStruct>::iterator it(dst.begin()), end(dst.end());      for (; it != end; ++it) {        (*it).member = -1;      }      uninitialized_copy(src.begin(), src.end(), dst.begin());      for (it = dst.begin(); it != end; ++it) {        CPPUNIT_ASSERT( (*it).member == 1 );      }    }    {      list<NotTrivialCopyStruct> src(10);      vector<NotTrivialCopyStruct> dst(10);      vector<NotTrivialCopyStruct>::iterator it(dst.begin()), end(dst.end());      for (; it != end; ++it) {        (*it).member = -1;      }      uninitialized_copy(src.begin(), src.end(), dst.begin());      for (it = dst.begin(); it != end; ++it) {        CPPUNIT_ASSERT( (*it).member == 1 );      }    }  }  {    //Using containers of native types:#if !defined (STLPORT) || !defined (_STLP_NO_MEMBER_TEMPLATES)    {      vector<int> src;      int i;      for (i = -5; i < 6; ++i) {        src.push_back(i);      }      //Building a vector result in a uninitialized_copy call internally      vector<unsigned int> dst(src.begin(), src.end());      vector<unsigned int>::const_iterator it(dst.begin());      for (i = -5; i < 6; ++i, ++it) {        CPPUNIT_ASSERT( *it == (unsigned int)i );      }    }    {      vector<char> src;      char i;      for (i = -5; i < 6; ++i) {        src.push_back(i);      }      //Building a vector result in a uninitialized_copy call internally      vector<unsigned int> dst(src.begin(), src.end());      vector<unsigned int>::const_iterator it(dst.begin());      for (i = -5; i < 6; ++i, ++it) {        CPPUNIT_ASSERT( *it == (unsigned int)i );      }    }    {      vector<int> src;      int i;      for (i = -5; i < 6; ++i) {        src.push_back(i);      }      //Building a vector result in a uninitialized_copy call internally      vector<float> dst(src.begin(), src.end());      vector<float>::const_iterator it(dst.begin());      for (i = -5; i < 6; ++i, ++it) {        CPPUNIT_ASSERT( *it == (float)i );      }    }    {      vector<vector<float>*> src(10);      vector<vector<float>*> dst(src.begin(), src.end());    }    {      derived d;      //base *pb = &d;      derived *pd = &d;      //base **ppb = &pd;      vector<derived*> src(10, pd);      vector<base*> dst(src.begin(), src.end());      vector<base*>::iterator it(dst.begin()), end(dst.end());      for (; it != end; ++it) {        CPPUNIT_ASSERT( (*it) == pd );      }    }#endif  }  {    //Vector initialization:    vector<TrivialInitStruct> vect(10);    //Just 1 constructor call for the default value:    CPPUNIT_ASSERT( TrivialInitStruct::nbConstructorCalls == 1  );  }}/*void UninitializedTest::fill_test(){}void UninitializedTest::fill_n_test(){}*/

⌨️ 快捷键说明

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