Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenuninitialized_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
1.7.6.1
|