1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <vector> 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <algorithm> 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "cppunit/cppunit_proxy.h" 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std; 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TestCase class 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass FindTest : public CPPUNIT_NS::TestCase 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE(FindTest); 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(find0); 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(find1); 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(findif0); 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(findif1); 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(find_char); 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE_END(); 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected: 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void find0(); 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void find1(); 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void findif0(); 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void findif1(); 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void find_char(); 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static bool odd(int a_); 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static bool div_3(int a_); 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(FindTest); 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FindTest::find0() 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int numbers[10] = { 0, 1, 4, 9, 16, 25, 36, 49, 64 }; 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int *location = find((int*)numbers, (int*)numbers + 10, 25); 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT((location - numbers)==5); 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int *out_range = find((int*)numbers, (int*)numbers + 10, 128); 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out_range == (int *)(numbers + 10) ); 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct Key 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int data; 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* This operator should rather be global and commutative 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott but implementing it this way show that STLport used to 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ask too much from the user code. */ 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott bool operator == (int d) const 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return data == d; 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FindTest::find1() 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int years[] = { 1942, 1952, 1962, 1972, 1982, 1992 }; 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const unsigned yearCount = sizeof(years) / sizeof(years[0]); 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int* location = find((int*)years, (int*)years + yearCount, 1972); 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT((location - years)==3); 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FindTest::findif0() 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int numbers[6] = { 2, 4, 8, 15, 32, 64 }; 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int *location = find_if((int*)numbers, (int*)numbers + 6, odd); 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT((location - numbers)==3); 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int numbers_even[6] = { 2, 4, 8, 16, 32, 64 }; 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int *out_range = find_if((int*)numbers_even, (int*)numbers_even + 6, odd); 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out_range == (int *)(numbers_even + 6) ); 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Key keys[10] = { {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} }; 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Key const* k = find(keys + 0, keys + 10, 5); 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( k == keys + 10 ); 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FindTest::findif1() 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef vector <int> IntVec; 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott IntVec v(10); 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for(int i = 0; (size_t)i < v.size(); ++i) 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v[i] =(i + 1) *(i + 1); 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott IntVec::iterator iter; 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott iter = find_if(v.begin(), v.end(), div_3); 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT((iter - v.begin())==2); 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool FindTest::odd(int a_) 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return (a_ % 2) != 0; 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool FindTest::div_3(int a_) 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return a_ % 3 ? 0 : 1; 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FindTest::find_char() 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char str[] = "abcdefghij"; 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char *pstr = (char*)str; 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* cpstr = (const char*)str; 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t str_size = sizeof(str) / sizeof(char); 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char *d = find(pstr, pstr + str_size, 'd'); 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( *d == 'd' ); 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char *e = find(cpstr, cpstr + str_size, 'e'); 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( *e == 'e' ); 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char *last = find(pstr, pstr + str_size, 'x'); 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( last == pstr + str_size ); 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char *clast = find(cpstr, cpstr + str_size, 'x'); 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( clast == cpstr + str_size ); 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 136