177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <algorithm>
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <cstring>
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <vector>
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <iterator>
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "cppunit/cppunit_proxy.h"
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerusing namespace std;
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// TestCase class
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass CopyTest : public CPPUNIT_NS::TestCase
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST_SUITE(CopyTest);
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(copy_array);
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(copy_volatile);
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(copy_vector);
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(copy_insert);
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(copy_back);
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(copy_back_array);
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST_SUITE_END();
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void copy_array();
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void copy_volatile();
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void copy_vector();
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void copy_insert();
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void copy_back();
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void copy_back_array();
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerCPPUNIT_TEST_SUITE_REGISTRATION(CopyTest);
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// tests implementation
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid CopyTest::copy_array()
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char string[23] = "A string to be copied.";
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char result[23];
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  copy(string, string + 23, result);
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(!strncmp(string, result, 23));
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid CopyTest::copy_volatile()
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int a[] = {0, 1, 2, 3, 4, 5};
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    const size_t size = sizeof(a) / sizeof(a[0]);
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    volatile int va[size];
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    copy(a, a + size, va);
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    for (size_t i = 0; i != size; ++i) {
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CPPUNIT_ASSERT( a[i] == va[i] );
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    const int a[] = {0, 1, 2, 3, 4, 5};
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    const size_t size = sizeof(a) / sizeof(a[0]);
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    volatile int va[size];
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    copy(a, a + size, va);
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    for (size_t i = 0; i != size; ++i) {
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CPPUNIT_ASSERT( a[i] == va[i] );
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Following code can be activated to check that it doesn't compiled
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if 0
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int a[] = {0, 1, 2, 3, 4, 5};
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    const size_t size = sizeof(a) / sizeof(a[0]);
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    const volatile int va[size] = {5, 4, 3, 2, 1, 0};
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    copy(a, a + size, va);
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    for (size_t i = 0; i != size; ++i) {
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CPPUNIT_ASSERT( a[i] == va[i] );
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid CopyTest::copy_vector()
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  vector<int> v1(10);
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (int i = 0; (size_t)i < v1.size(); ++i)
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    v1[i] = i;
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  vector<int> v2(v1.size());
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  copy(v1.begin(), v1.end(), v2.begin());
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( v2 == v1 );
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid CopyTest::copy_insert() {
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  vector<int> v1(10);
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (int loc = 0; (size_t)loc < v1.size(); ++loc)
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    v1[loc] = loc;
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  vector<int> v2;
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  insert_iterator<vector<int> > i(v2, v2.begin());
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  copy(v1.begin(), v1.end(), i);
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( v2 == v1 );
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid CopyTest::copy_back()
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  vector<int> v1(10);
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (int i = 0; (size_t)i < v1.size(); ++i)
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    v1[i] = i;
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  vector<int> v2(v1.size());
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  copy_backward(v1.begin(), v1.end(), v2.end());
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( v2 == v1 );
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid CopyTest::copy_back_array()
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int numbers[5] = { 1, 2, 3, 4, 5 };
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int result[5];
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  copy_backward(numbers, numbers + 5, (int*)result + 5);
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(result[0]==numbers[0]);
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(result[1]==numbers[1]);
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(result[2]==numbers[2]);
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(result[3]==numbers[3]);
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(result[4]==numbers[4]);
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
130