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