1 /*********************************************************************************** 2 test_algobase.cpp 3 4 * Copyright (c) 1997 5 * Mark of the Unicorn, Inc. 6 * 7 * Permission to use, copy, modify, distribute and sell this software 8 * and its documentation for any purpose is hereby granted without fee, 9 * provided that the above copyright notice appear in all copies and 10 * that both that copyright notice and this permission notice appear 11 * in supporting documentation. Mark of the Unicorn makes no 12 * representations about the suitability of this software for any 13 * purpose. It is provided "as is" without express or implied warranty. 14 15 ***********************************************************************************/ 16 17 # include "Prefix.h" 18 # if defined (EH_NEW_HEADERS) 19 # ifdef __SUNPRO_CC 20 # include <stdio.h> 21 # endif 22 #include <algorithm> 23 # else 24 #include <algo.h> 25 # endif 26 #include "Tests.h" 27 #include "LeakCheck.h" 28 #include "TestClass.h" 29 30 // EH_USE_STD 31 32 enum { kBufferSize = 100 }; 33 34 struct test_uninitialized_copy 35 { 36 test_uninitialized_copy() 37 : stuff( new TestClass[kBufferSize] ), end_of_stuff(stuff + kBufferSize) { 38 gTestController.SetCurrentTestName("uninitialized_copy()"); 39 } 40 41 ~test_uninitialized_copy() { delete[] stuff; } 42 43 void operator()( TestClass* buffer ) const 44 { 45 EH_STD::uninitialized_copy((TestClass*)stuff, (TestClass*)end_of_stuff, buffer ); 46 EH_ASSERT( EH_STD::equal( (TestClass*)stuff, (TestClass*)end_of_stuff, buffer ) ); 47 stl_destroy( buffer, buffer+kBufferSize ); 48 } 49 50 private: 51 TestClass * stuff; 52 TestClass * end_of_stuff; 53 }; 54 55 struct test_uninitialized_fill 56 { 57 test_uninitialized_fill() { 58 gTestController.SetCurrentTestName("uninitialized_fill()"); 59 } 60 61 void operator()( TestClass* buffer ) const 62 { 63 TestClass* buf_end = buffer + kBufferSize; 64 EH_STD::uninitialized_fill( buffer, buf_end, testValue ); 65 for ( EH_CSTD::size_t i = 0; i < kBufferSize; i++ ) 66 EH_ASSERT( buffer[i] == testValue ); 67 stl_destroy( buffer, buf_end ); 68 } 69 private: 70 TestClass testValue; 71 }; 72 73 struct test_uninitialized_fill_n 74 { 75 test_uninitialized_fill_n() { 76 gTestController.SetCurrentTestName("uninitialized_fill_n()"); 77 } 78 void operator()( TestClass* buffer ) const 79 { 80 TestClass* end = buffer + kBufferSize; 81 EH_STD::uninitialized_fill_n( buffer, (EH_CSTD::size_t)kBufferSize, testValue ); 82 for ( EH_CSTD::size_t i = 0; i < kBufferSize; i++ ) 83 EH_ASSERT( buffer[i] == testValue ); 84 stl_destroy( buffer, end ); 85 } 86 private: 87 TestClass testValue; 88 }; 89 90 void test_algobase() 91 { 92 // force alignment 93 double arr[ sizeof(TestClass) * kBufferSize ]; 94 TestClass* c = (TestClass*)arr; 95 WeakCheck( c, test_uninitialized_copy() ); 96 WeakCheck( c, test_uninitialized_fill() ); 97 WeakCheck( c, test_uninitialized_fill_n() ); 98 } 99