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