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

uninitialized_test.cpp
Go to the documentation of this file.
00001 #include <memory>
00002 #include <vector>
00003 #include <list>
00004 
00005 #include "cppunit/cppunit_proxy.h"
00006 
00007 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
00008 using namespace std;
00009 #endif
00010 
00011 //
00012 // TestCase class
00013 //
00014 class UninitializedTest : public CPPUNIT_NS::TestCase
00015 {
00016   CPPUNIT_TEST_SUITE(UninitializedTest);
00017   CPPUNIT_TEST(copy_test);
00018   //CPPUNIT_TEST(fill_test);
00019   //CPPUNIT_TEST(fill_n_test);
00020   CPPUNIT_TEST_SUITE_END();
00021 
00022 protected:
00023   void copy_test();
00024   void fill_test();
00025   void fill_n_test();
00026 };
00027 
00028 CPPUNIT_TEST_SUITE_REGISTRATION(UninitializedTest);
00029 
00030 struct NotTrivialCopyStruct {
00031   NotTrivialCopyStruct() : member(0) {}
00032   NotTrivialCopyStruct(NotTrivialCopyStruct const&) : member(1) {}
00033 
00034   int member;
00035 };
00036 
00037 struct TrivialCopyStruct {
00038   TrivialCopyStruct() : member(0) {}
00039   TrivialCopyStruct(TrivialCopyStruct const&) : member(1) {}
00040 
00041   int member;
00042 };
00043 
00044 struct TrivialInitStruct {
00045   TrivialInitStruct()
00046   { ++nbConstructorCalls; }
00047 
00048   static size_t nbConstructorCalls;
00049 };
00050 
00051 size_t TrivialInitStruct::nbConstructorCalls = 0;
00052 
00053 #if defined (STLPORT)
00054 #  if defined (_STLP_USE_NAMESPACES)
00055 namespace std {
00056 #  endif
00057   _STLP_TEMPLATE_NULL
00058   struct __type_traits<TrivialCopyStruct> {
00059      typedef __false_type has_trivial_default_constructor;
00060      //This is a wrong declaration just to check that internaly a simple memcpy is called:
00061      typedef __true_type has_trivial_copy_constructor;
00062      typedef __true_type has_trivial_assignment_operator;
00063      typedef __true_type has_trivial_destructor;
00064      typedef __false_type is_POD_type;
00065   };
00066 
00067   _STLP_TEMPLATE_NULL
00068   struct __type_traits<TrivialInitStruct> {
00069      //This is a wrong declaration just to check that internaly no initialization is done:
00070      typedef __true_type has_trivial_default_constructor;
00071      typedef __true_type has_trivial_copy_constructor;
00072      typedef __true_type has_trivial_assignment_operator;
00073      typedef __true_type has_trivial_destructor;
00074      typedef __false_type is_POD_type;
00075   };
00076 #  if defined (_STLP_USE_NAMESPACES)
00077 }
00078 #  endif
00079 #endif
00080 
00081 struct base {};
00082 struct derived : public base {};
00083 
00084 //
00085 // tests implementation
00086 //
00087 void UninitializedTest::copy_test()
00088 {
00089   {
00090     //Random iterators
00091     {
00092       vector<NotTrivialCopyStruct> src(10);
00093       vector<NotTrivialCopyStruct> dst(10);
00094       uninitialized_copy(src.begin(), src.end(), dst.begin());
00095       vector<NotTrivialCopyStruct>::const_iterator it(dst.begin()), end(dst.end());
00096       for (; it != end; ++it) {
00097         CPPUNIT_ASSERT( (*it).member == 1 );
00098       }
00099     }
00100     {
00103       size_t const count = 10;
00104       TrivialCopyStruct src[count];
00105       TrivialCopyStruct dst[count];
00106 
00107       TrivialCopyStruct* it = src + 0;
00108       TrivialCopyStruct* end = src + count;
00109       for (; it != end; ++it) {
00110         (*it).member = 0;
00111       }
00112 
00113       uninitialized_copy(src+0, src+count, dst+0);
00114       for (it = dst+0, end = dst+count; it != end; ++it) {
00115 #if defined (STLPORT)
00116         /* If the member is 1, it means that library has not found any
00117         optimization oportunity and called the regular copy-ctor instead. */
00118         CPPUNIT_ASSERT( (*it).member == 0 );
00119 #else
00120         CPPUNIT_ASSERT( (*it).member == 1 );
00121 #endif
00122       }
00123     }
00124   }
00125 
00126   {
00127     //Bidirectional iterator
00128     {
00129       vector<NotTrivialCopyStruct> src(10);
00130       list<NotTrivialCopyStruct> dst(10);
00131 
00132       list<NotTrivialCopyStruct>::iterator it(dst.begin()), end(dst.end());
00133       for (; it != end; ++it) {
00134         (*it).member = -1;
00135       }
00136 
00137       uninitialized_copy(src.begin(), src.end(), dst.begin());
00138 
00139       for (it = dst.begin(); it != end; ++it) {
00140         CPPUNIT_ASSERT( (*it).member == 1 );
00141       }
00142     }
00143 
00144     {
00145       list<NotTrivialCopyStruct> src(10);
00146       vector<NotTrivialCopyStruct> dst(10);
00147 
00148       vector<NotTrivialCopyStruct>::iterator it(dst.begin()), end(dst.end());
00149       for (; it != end; ++it) {
00150         (*it).member = -1;
00151       }
00152 
00153       uninitialized_copy(src.begin(), src.end(), dst.begin());
00154 
00155       for (it = dst.begin(); it != end; ++it) {
00156         CPPUNIT_ASSERT( (*it).member == 1 );
00157       }
00158     }
00159   }
00160 
00161   {
00162     //Using containers of native types:
00163 #if !defined (STLPORT) || !defined (_STLP_NO_MEMBER_TEMPLATES)
00164     {
00165       vector<int> src;
00166       int i;
00167       for (i = -5; i < 6; ++i) {
00168         src.push_back(i);
00169       }
00170 
00171       //Building a vector result in a uninitialized_copy call internally
00172       vector<unsigned int> dst(src.begin(), src.end());
00173       vector<unsigned int>::const_iterator it(dst.begin());
00174       for (i = -5; i < 6; ++i, ++it) {
00175         CPPUNIT_ASSERT( *it == (unsigned int)i );
00176       }
00177     }
00178 
00179     {
00180       vector<char> src;
00181       char i;
00182       for (i = -5; i < 6; ++i) {
00183         src.push_back(i);
00184       }
00185 
00186       //Building a vector result in a uninitialized_copy call internally
00187       vector<unsigned int> dst(src.begin(), src.end());
00188       vector<unsigned int>::const_iterator it(dst.begin());
00189       for (i = -5; i < 6; ++i, ++it) {
00190         CPPUNIT_ASSERT( *it == (unsigned int)i );
00191       }
00192     }
00193 
00194     {
00195       vector<int> src;
00196       int i;
00197       for (i = -5; i < 6; ++i) {
00198         src.push_back(i);
00199       }
00200 
00201       //Building a vector result in a uninitialized_copy call internally
00202       vector<float> dst(src.begin(), src.end());
00203       vector<float>::const_iterator it(dst.begin());
00204       for (i = -5; i < 6; ++i, ++it) {
00205         CPPUNIT_ASSERT( *it == (float)i );
00206       }
00207     }
00208 
00209     {
00210       vector<vector<float>*> src(10);
00211       vector<vector<float>*> dst(src.begin(), src.end());
00212     }
00213 
00214     {
00215       derived d;
00216       //base *pb = &d;
00217       derived *pd = &d;
00218       //base **ppb = &pd;
00219       vector<derived*> src(10, pd);
00220       vector<base*> dst(src.begin(), src.end());
00221       vector<base*>::iterator it(dst.begin()), end(dst.end());
00222       for (; it != end; ++it) {
00223         CPPUNIT_ASSERT( (*it) == pd );
00224       }
00225     }
00226 #endif
00227   }
00228 
00229   {
00230     //Vector initialization:
00231     vector<TrivialInitStruct> vect(10);
00232     //Just 1 constructor call for the default value:
00233     CPPUNIT_ASSERT( TrivialInitStruct::nbConstructorCalls == 1  );
00234   }
00235 }
00236 
00237 /*
00238 void UninitializedTest::fill_test()
00239 {
00240 }
00241 
00242 void UninitializedTest::fill_n_test()
00243 {
00244 }
00245 */

Generated on Sun May 27 2012 04:35:53 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.