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