os/ossrv/genericopenlibs/cppstdlib/stl/test/unit/uninitialized_test.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 #include <memory>
     2 #include <vector>
     3 #include <list>
     4 
     5 #include "cppunit/cppunit_proxy.h"
     6 
     7 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
     8 using namespace std;
     9 #endif
    10 
    11 //
    12 // TestCase class
    13 //
    14 class UninitializedTest : public CPPUNIT_NS::TestCase
    15 {
    16   CPPUNIT_TEST_SUITE(UninitializedTest);
    17   CPPUNIT_TEST(copy_test);
    18   //CPPUNIT_TEST(fill_test);
    19   //CPPUNIT_TEST(fill_n_test);
    20   CPPUNIT_TEST_SUITE_END();
    21 
    22 protected:
    23   void copy_test();
    24   void fill_test();
    25   void fill_n_test();
    26 };
    27 
    28 CPPUNIT_TEST_SUITE_REGISTRATION(UninitializedTest);
    29 
    30 struct NotTrivialCopyStruct {
    31   NotTrivialCopyStruct() : member(0) {}
    32   NotTrivialCopyStruct(NotTrivialCopyStruct const&) : member(1) {}
    33 
    34   int member;
    35 };
    36 
    37 struct TrivialCopyStruct {
    38   TrivialCopyStruct() : member(0) {}
    39   TrivialCopyStruct(TrivialCopyStruct const&) : member(1) {}
    40 
    41   int member;
    42 };
    43 
    44 struct TrivialInitStruct {
    45   TrivialInitStruct()
    46   { ++nbConstructorCalls; }
    47 
    48   static size_t nbConstructorCalls;
    49 };
    50 
    51 size_t TrivialInitStruct::nbConstructorCalls = 0;
    52 
    53 #if defined (STLPORT)
    54 namespace std
    55 {
    56   _STLP_TEMPLATE_NULL
    57   struct __type_traits<TrivialCopyStruct> {
    58      typedef __false_type has_trivial_default_constructor;
    59      //This is a wrong declaration just to check that internaly a simple memcpy is called:
    60      typedef __true_type has_trivial_copy_constructor;
    61      typedef __true_type has_trivial_assignment_operator;
    62      typedef __true_type has_trivial_destructor;
    63      typedef __false_type is_POD_type;
    64   };
    65 
    66   _STLP_TEMPLATE_NULL
    67   struct __type_traits<TrivialInitStruct> {
    68      //This is a wrong declaration just to check that internaly no initialization is done:
    69      typedef __true_type has_trivial_default_constructor;
    70      typedef __true_type has_trivial_copy_constructor;
    71      typedef __true_type has_trivial_assignment_operator;
    72      typedef __true_type has_trivial_destructor;
    73      typedef __false_type is_POD_type;
    74   };
    75 }
    76 #endif
    77 
    78 struct base {};
    79 struct derived : public base {};
    80 
    81 //
    82 // tests implementation
    83 //
    84 void UninitializedTest::copy_test()
    85 {
    86   {
    87     //Random iterators
    88     {
    89       vector<NotTrivialCopyStruct> src(10);
    90       vector<NotTrivialCopyStruct> dst(10);
    91       uninitialized_copy(src.begin(), src.end(), dst.begin());
    92       vector<NotTrivialCopyStruct>::const_iterator it(dst.begin()), end(dst.end());
    93       for (; it != end; ++it) {
    94         CPPUNIT_ASSERT( (*it).member == 1 );
    95       }
    96     }
    97     {
    98       /** Note: we use static arrays here so the iterators are always
    99       pointers, even in debug mode. */
   100       size_t const count = 10;
   101       TrivialCopyStruct src[count];
   102       TrivialCopyStruct dst[count];
   103 
   104       TrivialCopyStruct* it = src + 0;
   105       TrivialCopyStruct* end = src + count;
   106       for (; it != end; ++it) {
   107         (*it).member = 0;
   108       }
   109 
   110       uninitialized_copy(src+0, src+count, dst+0);
   111       for (it = dst+0, end = dst+count; it != end; ++it) {
   112 #if defined (STLPORT)
   113         /* If the member is 1, it means that library has not found any
   114         optimization oportunity and called the regular copy-ctor instead. */
   115         CPPUNIT_ASSERT( (*it).member == 0 );
   116 #else
   117         CPPUNIT_ASSERT( (*it).member == 1 );
   118 #endif
   119       }
   120     }
   121   }
   122 
   123   {
   124     //Bidirectional iterator
   125     {
   126       vector<NotTrivialCopyStruct> src(10);
   127       list<NotTrivialCopyStruct> dst(10);
   128 
   129       list<NotTrivialCopyStruct>::iterator it(dst.begin()), end(dst.end());
   130       for (; it != end; ++it) {
   131         (*it).member = -1;
   132       }
   133 
   134       uninitialized_copy(src.begin(), src.end(), dst.begin());
   135 
   136       for (it = dst.begin(); it != end; ++it) {
   137         CPPUNIT_ASSERT( (*it).member == 1 );
   138       }
   139     }
   140 
   141     {
   142       list<NotTrivialCopyStruct> src(10);
   143       vector<NotTrivialCopyStruct> dst(10);
   144 
   145       vector<NotTrivialCopyStruct>::iterator it(dst.begin()), end(dst.end());
   146       for (; it != end; ++it) {
   147         (*it).member = -1;
   148       }
   149 
   150       uninitialized_copy(src.begin(), src.end(), dst.begin());
   151 
   152       for (it = dst.begin(); it != end; ++it) {
   153         CPPUNIT_ASSERT( (*it).member == 1 );
   154       }
   155     }
   156   }
   157 
   158   {
   159     //Using containers of native types:
   160 #if !defined (STLPORT) || !defined (_STLP_NO_MEMBER_TEMPLATES)
   161     {
   162       vector<int> src;
   163       int i;
   164       for (i = -5; i < 6; ++i) {
   165         src.push_back(i);
   166       }
   167 
   168       //Building a vector result in a uninitialized_copy call internally
   169       vector<unsigned int> dst(src.begin(), src.end());
   170       vector<unsigned int>::const_iterator it(dst.begin());
   171       for (i = -5; i < 6; ++i, ++it) {
   172         CPPUNIT_ASSERT( *it == (unsigned int)i );
   173       }
   174     }
   175 
   176     {
   177       vector<char> src;
   178       char i;
   179       for (i = -5; i < 6; ++i) {
   180         src.push_back(i);
   181       }
   182 
   183       //Building a vector result in a uninitialized_copy call internally
   184       vector<unsigned int> dst(src.begin(), src.end());
   185       vector<unsigned int>::const_iterator it(dst.begin());
   186       for (i = -5; i < 6; ++i, ++it) {
   187         CPPUNIT_ASSERT( *it == (unsigned int)i );
   188       }
   189     }
   190 
   191     {
   192       vector<int> src;
   193       int i;
   194       for (i = -5; i < 6; ++i) {
   195         src.push_back(i);
   196       }
   197 
   198       //Building a vector result in a uninitialized_copy call internally
   199       vector<float> dst(src.begin(), src.end());
   200       vector<float>::const_iterator it(dst.begin());
   201       for (i = -5; i < 6; ++i, ++it) {
   202         CPPUNIT_ASSERT( *it == (float)i );
   203       }
   204     }
   205 
   206     {
   207       vector<vector<float>*> src(10);
   208       vector<vector<float>*> dst(src.begin(), src.end());
   209     }
   210 
   211     {
   212       derived d;
   213       //base *pb = &d;
   214       derived *pd = &d;
   215       //base **ppb = &pd;
   216       vector<derived*> src(10, pd);
   217       vector<base*> dst(src.begin(), src.end());
   218       vector<base*>::iterator it(dst.begin()), end(dst.end());
   219       for (; it != end; ++it) {
   220         CPPUNIT_ASSERT( (*it) == pd );
   221       }
   222     }
   223 #endif
   224   }
   225 
   226   {
   227     //Vector initialization:
   228     vector<TrivialInitStruct> vect(10);
   229     //Just 1 constructor call for the default value:
   230     CPPUNIT_ASSERT( TrivialInitStruct::nbConstructorCalls == 1  );
   231   }
   232 }
   233 
   234 /*
   235 void UninitializedTest::fill_test()
   236 {
   237 }
   238 
   239 void UninitializedTest::fill_n_test()
   240 {
   241 }
   242 */