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 {
test_uninitialized_copytest_uninitialized_copy36 test_uninitialized_copy()
37 : stuff( new TestClass[kBufferSize] ), end_of_stuff(stuff + kBufferSize) {
38 gTestController.SetCurrentTestName("uninitialized_copy()");
39 }
40
~test_uninitialized_copytest_uninitialized_copy41 ~test_uninitialized_copy() { delete[] stuff; }
42
operator ()test_uninitialized_copy43 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 {
test_uninitialized_filltest_uninitialized_fill57 test_uninitialized_fill() {
58 gTestController.SetCurrentTestName("uninitialized_fill()");
59 }
60
operator ()test_uninitialized_fill61 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 {
test_uninitialized_fill_ntest_uninitialized_fill_n75 test_uninitialized_fill_n() {
76 gTestController.SetCurrentTestName("uninitialized_fill_n()");
77 }
operator ()test_uninitialized_fill_n78 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
test_algobase()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