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
32enum { kBufferSize = 100 };
33
34struct 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
50private:
51    TestClass * stuff;
52    TestClass * end_of_stuff;
53};
54
55struct 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    }
69private:
70    TestClass testValue;
71};
72
73struct 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    }
86private:
87    TestClass testValue;
88};
89
90void 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