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