First public contribution.
5 #include "cppunit/cppunit_proxy.h"
7 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
14 class UninitializedTest : public CPPUNIT_NS::TestCase
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();
28 CPPUNIT_TEST_SUITE_REGISTRATION(UninitializedTest);
30 struct NotTrivialCopyStruct {
31 NotTrivialCopyStruct() : member(0) {}
32 NotTrivialCopyStruct(NotTrivialCopyStruct const&) : member(1) {}
37 struct TrivialCopyStruct {
38 TrivialCopyStruct() : member(0) {}
39 TrivialCopyStruct(TrivialCopyStruct const&) : member(1) {}
44 struct TrivialInitStruct {
46 { ++nbConstructorCalls; }
48 static size_t nbConstructorCalls;
51 size_t TrivialInitStruct::nbConstructorCalls = 0;
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;
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;
79 struct derived : public base {};
82 // tests implementation
84 void UninitializedTest::copy_test()
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 );
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];
104 TrivialCopyStruct* it = src + 0;
105 TrivialCopyStruct* end = src + count;
106 for (; it != end; ++it) {
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 );
117 CPPUNIT_ASSERT( (*it).member == 1 );
124 //Bidirectional iterator
126 vector<NotTrivialCopyStruct> src(10);
127 list<NotTrivialCopyStruct> dst(10);
129 list<NotTrivialCopyStruct>::iterator it(dst.begin()), end(dst.end());
130 for (; it != end; ++it) {
134 uninitialized_copy(src.begin(), src.end(), dst.begin());
136 for (it = dst.begin(); it != end; ++it) {
137 CPPUNIT_ASSERT( (*it).member == 1 );
142 list<NotTrivialCopyStruct> src(10);
143 vector<NotTrivialCopyStruct> dst(10);
145 vector<NotTrivialCopyStruct>::iterator it(dst.begin()), end(dst.end());
146 for (; it != end; ++it) {
150 uninitialized_copy(src.begin(), src.end(), dst.begin());
152 for (it = dst.begin(); it != end; ++it) {
153 CPPUNIT_ASSERT( (*it).member == 1 );
159 //Using containers of native types:
160 #if !defined (STLPORT) || !defined (_STLP_NO_MEMBER_TEMPLATES)
164 for (i = -5; i < 6; ++i) {
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 );
179 for (i = -5; i < 6; ++i) {
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 );
194 for (i = -5; i < 6; ++i) {
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 );
207 vector<vector<float>*> src(10);
208 vector<vector<float>*> dst(src.begin(), src.end());
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 );
227 //Vector initialization:
228 vector<TrivialInitStruct> vect(10);
229 //Just 1 constructor call for the default value:
230 CPPUNIT_ASSERT( TrivialInitStruct::nbConstructorCalls == 1 );
235 void UninitializedTest::fill_test()
239 void UninitializedTest::fill_n_test()