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