177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <vector> 277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <numeric> 377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <algorithm> 477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "cppunit/cppunit_proxy.h" 677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerusing namespace std; 977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// TestCase class 1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass AdjTest : public CPPUNIT_NS::TestCase 1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST_SUITE(AdjTest); 1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(adjfind0); 1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(adjfind1); 1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(adjfind2); 2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(adjdiff0); 2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(adjdiff1); 2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(adjdiff2); 2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST_SUITE_END(); 2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected: 2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void adjfind0(); 2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void adjfind1(); 2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void adjfind2(); 2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void adjdiff0(); 3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void adjdiff1(); 3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void adjdiff2(); 3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static int equal_length(const char* v1_, const char* v2_); 3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static int mult(int a_, int b_); 3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerCPPUNIT_TEST_SUITE_REGISTRATION(AdjTest); 3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// tests implementation 4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid AdjTest::adjfind0() 4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int numbers1 [5] = { 1, 2, 4, 8, 16 }; 4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int numbers2 [5] = { 5, 3, 2, 1, 1 }; 4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int* location = adjacent_find((int*)numbers1, (int*)numbers1 + 5); 4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(location == numbers1 + 5); // no adj so loc should be _last 4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner location = adjacent_find((int*)numbers2, (int*)numbers2 + 5); 5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(location != numbers2 + 5); // adj location off should be 3 (first 1) 5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT((location - numbers2)==3); 5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid AdjTest::adjfind1() 5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef vector<int> IntVector; 5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner IntVector v(10); 5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (int i = 0; (size_t)i < v.size(); ++i) 5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner v[i] = i; 5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner IntVector::iterator location; 6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner location = adjacent_find(v.begin(), v.end()); 6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(location == v.end()); 6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner v[6] = 7; 6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner location = adjacent_find(v.begin(), v.end()); 6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(location != v.end()); 6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid AdjTest::adjfind2() 6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef vector <const char*> CStrVector; 6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const char* names[] = { "Brett", "Graham", "Jack", "Mike", "Todd" }; 7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const int nameCount = sizeof(names)/sizeof(names[0]); 7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CStrVector v(nameCount); 7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for(int i = 0; i < nameCount; i++) 7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner v[i] = names[i]; 7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CStrVector::iterator location; 7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner location = adjacent_find(v.begin(), v.end(), equal_length); 7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(location != v.end()); 8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint AdjTest::equal_length(const char* v1_, const char* v2_) 8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return ::strlen(v1_) == ::strlen(v2_); 8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid AdjTest::adjdiff0() 8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int numbers[5] = { 1, 2, 4, 8, 16 }; 8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int difference[5]; 8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner adjacent_difference(numbers, numbers + 5, (int*)difference); 9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(difference[0]==1); 9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(difference[1]==1); 9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(difference[2]==2); 9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(difference[3]==4); 9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(difference[4]==8); 9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid AdjTest::adjdiff1() 9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector <int> v(10); 9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for(int i = 0; (size_t)i < v.size(); ++i) 10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner v[i] = i * i; 10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector<int> result(v.size()); 10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner adjacent_difference(v.begin(), v.end(), result.begin()); 10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[0]==0) 10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[1]==1) 10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[2]==3) 10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[3]==5) 10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[4]==7) 10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[5]==9) 10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[6]==11) 11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[7]==13) 11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[8]==15) 11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[9]==17) 11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid AdjTest::adjdiff2() 11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector <int> v(10); 11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (int i = 0; (size_t)i < v.size(); ++i) 11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner v[i] = i + 1; 11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector <int> result(v.size()); 12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner adjacent_difference(v.begin(), v.end(), result.begin(), mult); 12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[0]==1) 12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[1]==2) 12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[2]==6) 12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[3]==12) 12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[4]==20) 12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[5]==30) 12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[6]==42) 12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[7]==56) 12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[8]==72) 13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT(result[9]==90) 13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint AdjTest::mult(int a_, int b_) 13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return a_ * b_; 13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 136