177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <vector>
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <algorithm>
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "cppunit/cppunit_proxy.h"
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerusing namespace std;
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// TestCase class
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass FindTest : public CPPUNIT_NS::TestCase
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST_SUITE(FindTest);
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(find0);
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(find1);
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(findif0);
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(findif1);
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(find_char);
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST_SUITE_END();
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void find0();
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void find1();
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void findif0();
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void findif1();
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void find_char();
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static bool odd(int a_);
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static bool div_3(int a_);
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerCPPUNIT_TEST_SUITE_REGISTRATION(FindTest);
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// tests implementation
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid FindTest::find0()
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int numbers[10] = { 0, 1, 4, 9, 16, 25, 36, 49, 64 };
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int *location = find((int*)numbers, (int*)numbers + 10, 25);
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT((location - numbers)==5);
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int *out_range = find((int*)numbers, (int*)numbers + 10, 128);
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( out_range == (int *)(numbers + 10) );
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct Key
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int data;
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* This operator should rather be global and commutative
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     but implementing it this way show that STLport used to
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     ask too much from the user code. */
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  bool operator == (int d) const
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return data == d;
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid FindTest::find1()
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int years[] = { 1942, 1952, 1962, 1972, 1982, 1992 };
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const unsigned yearCount = sizeof(years) / sizeof(years[0]);
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int* location = find((int*)years, (int*)years + yearCount, 1972);
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT((location - years)==3);
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid FindTest::findif0()
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int numbers[6] = { 2, 4, 8, 15, 32, 64 };
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int *location = find_if((int*)numbers, (int*)numbers + 6, odd);
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT((location - numbers)==3);
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int numbers_even[6] = { 2, 4, 8, 16, 32, 64 };
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int *out_range = find_if((int*)numbers_even, (int*)numbers_even + 6, odd);
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( out_range == (int *)(numbers_even + 6) );
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    Key keys[10] = { {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} };
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    Key const* k = find(keys + 0, keys + 10, 5);
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( k == keys + 10 );
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid FindTest::findif1()
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef vector <int> IntVec;
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  IntVec v(10);
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for(int i = 0; (size_t)i < v.size(); ++i)
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    v[i] =(i + 1) *(i + 1);
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  IntVec::iterator iter;
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  iter = find_if(v.begin(), v.end(), div_3);
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT((iter - v.begin())==2);
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool FindTest::odd(int a_)
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return (a_ % 2) != 0;
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool FindTest::div_3(int a_)
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return a_ % 3 ? 0 : 1;
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid FindTest::find_char()
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char str[] = "abcdefghij";
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *pstr = (char*)str;
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char* cpstr = (const char*)str;
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t str_size = sizeof(str) / sizeof(char);
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *d = find(pstr, pstr + str_size, 'd');
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( *d == 'd' );
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char *e = find(cpstr, cpstr + str_size, 'e');
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( *e == 'e' );
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char *last = find(pstr, pstr + str_size, 'x');
13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( last == pstr + str_size );
13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char *clast = find(cpstr, cpstr + str_size, 'x');
13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( clast == cpstr + str_size );
13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
136