1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <algorithm>
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <cstring>
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <vector>
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <iterator>
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "cppunit/cppunit_proxy.h"
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std;
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TestCase class
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass CopyTest : public CPPUNIT_NS::TestCase
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE(CopyTest);
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(copy_array);
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(copy_volatile);
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(copy_vector);
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(copy_insert);
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(copy_back);
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(copy_back_array);
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE_END();
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected:
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void copy_array();
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void copy_volatile();
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void copy_vector();
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void copy_insert();
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void copy_back();
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void copy_back_array();
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(CopyTest);
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid CopyTest::copy_array()
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char string[23] = "A string to be copied.";
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char result[23];
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  copy(string, string + 23, result);
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(!strncmp(string, result, 23));
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid CopyTest::copy_volatile()
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int a[] = {0, 1, 2, 3, 4, 5};
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_t size = sizeof(a) / sizeof(a[0]);
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    volatile int va[size];
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    copy(a, a + size, va);
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for (size_t i = 0; i != size; ++i) {
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( a[i] == va[i] );
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const int a[] = {0, 1, 2, 3, 4, 5};
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_t size = sizeof(a) / sizeof(a[0]);
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    volatile int va[size];
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    copy(a, a + size, va);
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for (size_t i = 0; i != size; ++i) {
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( a[i] == va[i] );
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Following code can be activated to check that it doesn't compiled
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if 0
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int a[] = {0, 1, 2, 3, 4, 5};
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_t size = sizeof(a) / sizeof(a[0]);
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const volatile int va[size] = {5, 4, 3, 2, 1, 0};
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    copy(a, a + size, va);
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    for (size_t i = 0; i != size; ++i) {
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( a[i] == va[i] );
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid CopyTest::copy_vector()
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> v1(10);
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (int i = 0; (size_t)i < v1.size(); ++i)
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    v1[i] = i;
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> v2(v1.size());
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  copy(v1.begin(), v1.end(), v2.begin());
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( v2 == v1 );
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid CopyTest::copy_insert() {
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> v1(10);
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (int loc = 0; (size_t)loc < v1.size(); ++loc)
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    v1[loc] = loc;
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> v2;
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  insert_iterator<vector<int> > i(v2, v2.begin());
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  copy(v1.begin(), v1.end(), i);
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( v2 == v1 );
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid CopyTest::copy_back()
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> v1(10);
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (int i = 0; (size_t)i < v1.size(); ++i)
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    v1[i] = i;
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> v2(v1.size());
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  copy_backward(v1.begin(), v1.end(), v2.end());
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( v2 == v1 );
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid CopyTest::copy_back_array()
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int numbers[5] = { 1, 2, 3, 4, 5 };
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int result[5];
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  copy_backward(numbers, numbers + 5, (int*)result + 5);
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(result[0]==numbers[0]);
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(result[1]==numbers[1]);
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(result[2]==numbers[2]);
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(result[3]==numbers[3]);
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(result[4]==numbers[4]);
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
130