Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmvctor_traits_test.cpp
Go to the documentation of this file.
00001 #include <vector> 00002 #include <deque> 00003 00004 #include "mvctor_test.h" 00005 00006 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 00007 using namespace std; 00008 #endif 00009 00010 size_t MovableStruct::nb_dft_construct_call = 0; 00011 size_t MovableStruct::nb_cpy_construct_call = 0; 00012 size_t MovableStruct::nb_mv_construct_call = 0; 00013 size_t MovableStruct::nb_assignment_call = 0; 00014 size_t MovableStruct::nb_destruct_call = 0; 00015 00016 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00017 # if defined (_STLP_USE_NAMESPACES) 00018 namespace std { 00019 # endif 00020 _STLP_TEMPLATE_NULL 00021 struct __move_traits<MovableStruct> { 00022 typedef __true_type implemented; 00023 typedef __false_type complete; 00024 }; 00025 # if defined (_STLP_USE_NAMESPACES) 00026 } 00027 # endif 00028 #endif 00029 00030 struct CompleteMovableStruct { 00031 CompleteMovableStruct() { ++nb_dft_construct_call; } 00032 CompleteMovableStruct(CompleteMovableStruct const&) { ++nb_cpy_construct_call; } 00033 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00034 CompleteMovableStruct(__move_source<CompleteMovableStruct>) { ++nb_mv_construct_call; } 00035 #endif 00036 ~CompleteMovableStruct() { ++nb_destruct_call; } 00037 00038 CompleteMovableStruct& operator = (const CompleteMovableStruct&) { 00039 ++nb_assignment_call; 00040 return *this; 00041 } 00042 static void reset() { 00043 nb_dft_construct_call = nb_cpy_construct_call = nb_mv_construct_call = 0; 00044 nb_assignment_call = 0; 00045 nb_destruct_call = 0; 00046 } 00047 00048 static size_t nb_dft_construct_call; 00049 static size_t nb_cpy_construct_call; 00050 static size_t nb_mv_construct_call; 00051 static size_t nb_assignment_call; 00052 static size_t nb_destruct_call; 00053 00054 //See MovableStruct 00055 void* dummy_data[2]; 00056 }; 00057 00058 size_t CompleteMovableStruct::nb_dft_construct_call = 0; 00059 size_t CompleteMovableStruct::nb_cpy_construct_call = 0; 00060 size_t CompleteMovableStruct::nb_mv_construct_call = 0; 00061 size_t CompleteMovableStruct::nb_assignment_call = 0; 00062 size_t CompleteMovableStruct::nb_destruct_call = 0; 00063 00064 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00065 # if defined (_STLP_USE_NAMESPACES) 00066 namespace std { 00067 # endif 00068 _STLP_TEMPLATE_NULL 00069 struct __move_traits<CompleteMovableStruct> { 00070 typedef __true_type implemented; 00071 typedef __true_type complete; 00072 }; 00073 # if defined (_STLP_USE_NAMESPACES) 00074 } 00075 # endif 00076 #endif 00077 00078 void MoveConstructorTest::move_traits() 00079 { 00080 move_traits_vec(); 00081 move_traits_vec_complete(); 00082 move_traits_deq(); 00083 move_traits_deq_complete(); 00084 } 00085 00086 void MoveConstructorTest::move_traits_vec() 00087 { 00088 { 00089 { 00090 vector<MovableStruct> vect; 00091 vect.push_back(MovableStruct()); 00092 vect.push_back(MovableStruct()); 00093 vect.push_back(MovableStruct()); 00094 vect.push_back(MovableStruct()); 00095 00096 // vect contains 4 elements 00097 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 ); 00098 #if defined (STLPORT) 00099 # if !defined (_STLP_NO_MOVE_SEMANTIC) 00100 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); 00101 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 3 ); 00102 # else 00103 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 7 ); 00104 # endif 00105 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 7 ); 00106 #elif !defined (_MSC_VER) 00107 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 7 ); 00108 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 7 ); 00109 #else 00110 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 14 ); 00111 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 14 ); 00112 #endif 00113 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 ); 00114 00115 // Following test violate requirements to sequiences (23.1.1 Table 67) 00116 /* 00117 vect.insert(vect.begin() + 2, vect.begin(), vect.end()); 00118 // vect contains 8 elements 00119 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 ); 00120 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 8 ); 00121 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 7 ); 00122 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 11 ); 00123 */ 00124 00125 MovableStruct::reset(); 00126 vector<MovableStruct> v2 = vect; 00127 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 ); 00128 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); 00129 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); 00130 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 ); 00131 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 0 ); 00132 00133 MovableStruct::reset(); 00134 vect.insert(vect.begin() + 2, v2.begin(), v2.end() ); 00135 00136 // vect contains 8 elements 00137 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 ); 00138 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00139 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); 00140 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 4 ); 00141 #else 00142 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 8 ); 00143 #endif 00144 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 ); 00145 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 4 ); 00146 00147 MovableStruct::reset(); 00148 vect.erase(vect.begin(), vect.begin() + 2 ); 00149 00150 // vect contains 6 elements 00151 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00152 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 6 ); 00153 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 8 ); 00154 #else 00155 CPPUNIT_ASSERT_EQUAL( MovableStruct::nb_assignment_call, 6 ); 00156 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); 00157 #endif 00158 00159 MovableStruct::reset(); 00160 vect.erase(vect.end() - 2, vect.end()); 00161 00162 // vect contains 4 elements 00163 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); 00164 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); 00165 00166 MovableStruct::reset(); 00167 vect.erase(vect.begin()); 00168 00169 // vect contains 3 elements 00170 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00171 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 3 ); 00172 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 4 ); 00173 #else 00174 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 3 ); 00175 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 1 ); 00176 #endif 00177 00178 MovableStruct::reset(); 00179 } 00180 //vect with 3 elements and v2 with 4 elements are now out of scope 00181 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 + 4 ); 00182 } 00183 } 00184 00185 void MoveConstructorTest::move_traits_vec_complete() 00186 { 00187 { 00188 { 00189 vector<CompleteMovableStruct> vect; 00190 vect.push_back(CompleteMovableStruct()); 00191 vect.push_back(CompleteMovableStruct()); 00192 vect.push_back(CompleteMovableStruct()); 00193 vect.push_back(CompleteMovableStruct()); 00194 00195 // vect contains 4 elements 00196 CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 ); 00197 #if defined (STLPORT) 00198 # if !defined (_STLP_NO_MOVE_SEMANTIC) 00199 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); 00200 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 3 ); 00201 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); 00202 # else 00203 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 7 ); 00204 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 7 ); 00205 # endif 00206 #elif !defined (_MSC_VER) 00207 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 7 ); 00208 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 7 ); 00209 #else 00210 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 14 ); 00211 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 14 ); 00212 #endif 00213 00214 // Following test violate requirements to sequiences (23.1.1 Table 67) 00215 /* 00216 vect.insert(vect.begin() + 2, vect.begin(), vect.end()); 00217 00218 // vect contains 8 elements 00219 CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 ); 00220 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 8 ); 00221 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 7 ); 00222 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); 00223 */ 00224 00225 CompleteMovableStruct::reset(); 00226 vector<CompleteMovableStruct> v2 = vect; 00227 00228 CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 ); 00229 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); 00230 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); 00231 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 ); 00232 00233 CompleteMovableStruct::reset(); 00234 vect.insert(vect.begin() + 2, v2.begin(), v2.end()); 00235 00236 // vect contains 8 elements 00237 CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 ); 00238 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00239 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); 00240 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 4 ); 00241 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 ); 00242 #else 00243 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 8 ); 00244 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); 00245 #endif 00246 00247 CompleteMovableStruct::reset(); 00248 vect.erase(vect.begin(), vect.begin() + 2); 00249 00250 // vect contains 6 elements 00251 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00252 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 6 ); 00253 #else 00254 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 6 ); 00255 #endif 00256 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 ); 00257 00258 CompleteMovableStruct::reset(); 00259 vect.erase(vect.end() - 2, vect.end()); 00260 00261 // vect contains 4 elements 00262 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); 00263 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 ); 00264 00265 CompleteMovableStruct::reset(); 00266 vect.erase(vect.begin()); 00267 00268 // vect contains 3 elements 00269 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00270 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 3 ); 00271 #else 00272 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 3 ); 00273 #endif 00274 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 1 ); 00275 00276 CompleteMovableStruct::reset(); 00277 } 00278 //vect with 3 elements and v2 with 4 elements are now out of scope 00279 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 3 + 4 ); 00280 } 00281 } 00282 00283 void MoveConstructorTest::move_traits_deq() 00284 { 00285 { 00286 MovableStruct::reset(); 00287 { 00288 deque<MovableStruct> deq; 00289 deq.push_back(MovableStruct()); 00290 deq.push_back(MovableStruct()); 00291 deq.push_back(MovableStruct()); 00292 deq.push_back(MovableStruct()); 00293 00294 // deq contains 4 elements 00295 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 ); 00296 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); 00297 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); 00298 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 4 ); 00299 00300 // Following test violate requirements to sequiences (23.1.1 Table 67) 00301 /* 00302 deq.insert(deq.begin() + 2, deq.begin(), deq.end()); 00303 // deq contains 8 elements 00304 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 4 ); 00305 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 8 ); 00306 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 7 ); 00307 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 11 ); 00308 */ 00309 00310 MovableStruct::reset(); 00311 deque<MovableStruct> d2 = deq; 00312 00313 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 ); 00314 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); 00315 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); 00316 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 0 ); 00317 00318 MovableStruct::reset(); 00319 deq.insert(deq.begin() + 2, d2.begin(), d2.end() ); 00320 00321 // deq contains 8 elements 00322 CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 0 ); 00323 CPPUNIT_ASSERT( MovableStruct::nb_cpy_construct_call == 4 ); 00324 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00325 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 2 ); 00326 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); 00327 #else 00328 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 2 ); 00329 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 0 ); 00330 #endif 00331 00332 MovableStruct::reset(); 00333 deq.erase(deq.begin() + 1, deq.begin() + 3 ); 00334 00335 // deq contains 6 elements 00336 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00337 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 1 ); 00338 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 ); 00339 #else 00340 //Following check is highly deque implementation dependant so 00341 //it might not always work... 00342 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 1 ); 00343 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); 00344 #endif 00345 00346 MovableStruct::reset(); 00347 deq.erase(deq.end() - 3, deq.end() - 1); 00348 00349 // deq contains 4 elements 00350 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00351 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 1 ); 00352 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 ); 00353 #else 00354 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 1 ); 00355 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 2 ); 00356 #endif 00357 00358 MovableStruct::reset(); 00359 deq.erase(deq.begin()); 00360 00361 // deq contains 3 elements 00362 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00363 CPPUNIT_ASSERT( MovableStruct::nb_mv_construct_call == 0 ); 00364 #else 00365 CPPUNIT_ASSERT( MovableStruct::nb_assignment_call == 0 ); 00366 #endif 00367 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 1 ); 00368 00369 MovableStruct::reset(); 00370 } 00371 //deq with 3 elements and d2 with 4 elements are now out of scope 00372 CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 3 + 4 ); 00373 } 00374 } 00375 00376 void MoveConstructorTest::move_traits_deq_complete() 00377 { 00378 { 00379 CompleteMovableStruct::reset(); 00380 { 00381 deque<CompleteMovableStruct> deq; 00382 deq.push_back(CompleteMovableStruct()); 00383 deq.push_back(CompleteMovableStruct()); 00384 deq.push_back(CompleteMovableStruct()); 00385 deq.push_back(CompleteMovableStruct()); 00386 00387 // deq contains 4 elements 00388 CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 ); 00389 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); 00390 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); 00391 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); 00392 00393 // Following test violate requirements to sequiences (23.1.1 Table 67) 00394 /* 00395 deq.insert(deq.begin() + 2, deq.begin(), deq.end()); 00396 00397 // deq contains 8 elements 00398 CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 4 ); 00399 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 8 ); 00400 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 7 ); 00401 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 4 ); 00402 */ 00403 00404 CompleteMovableStruct::reset(); 00405 deque<CompleteMovableStruct> d2 = deq; 00406 00407 CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 ); 00408 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); 00409 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); 00410 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 ); 00411 00412 CompleteMovableStruct::reset(); 00413 deq.insert(deq.begin() + 2, d2.begin(), d2.end()); 00414 00415 // deq contains 8 elements 00416 CPPUNIT_ASSERT( CompleteMovableStruct::nb_dft_construct_call == 0 ); 00417 CPPUNIT_ASSERT( CompleteMovableStruct::nb_cpy_construct_call == 4 ); 00418 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00419 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 2 ); 00420 #else 00421 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 2 ); 00422 #endif 00423 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 0 ); 00424 00425 CompleteMovableStruct::reset(); 00426 deq.erase(deq.begin() + 1, deq.begin() + 3); 00427 00428 // deq contains 6 elements 00429 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00430 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 1 ); 00431 #else 00432 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 1 ); 00433 #endif 00434 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 ); 00435 00436 CompleteMovableStruct::reset(); 00437 deq.erase(deq.end() - 3, deq.end() - 1); 00438 00439 // deq contains 4 elements 00440 #if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) 00441 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 1 ); 00442 #else 00443 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 1 ); 00444 #endif 00445 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 2 ); 00446 00447 CompleteMovableStruct::reset(); 00448 deq.erase(deq.begin()); 00449 00450 // deq contains 3 elements 00451 CPPUNIT_ASSERT( CompleteMovableStruct::nb_mv_construct_call == 0 ); 00452 CPPUNIT_ASSERT( CompleteMovableStruct::nb_assignment_call == 0 ); 00453 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 1 ); 00454 00455 CompleteMovableStruct::reset(); 00456 } 00457 //deq with 3 elements and v2 with 4 elements are now out of scope 00458 CPPUNIT_ASSERT( CompleteMovableStruct::nb_destruct_call == 3 + 4 ); 00459 } 00460 } Generated on Sun May 27 2012 04:35:38 for ReactOS by
1.7.6.1
|