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