1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <list>
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <slist>
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <deque>
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <vector>
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <algorithm>
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <functional>
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <map>
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <string>
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "cppunit/cppunit_proxy.h"
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std;
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TestCase class
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass AlgTest : public CPPUNIT_NS::TestCase
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE(AlgTest);
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(min_max);
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(count_test);
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(sort_test);
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(search_n_test);
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(find_first_of_test);
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(find_first_of_nsc_test);
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE_END();
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected:
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void min_max();
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void count_test();
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void sort_test();
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void search_n_test();
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void find_first_of_test();
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void find_first_of_nsc_test();
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(AlgTest);
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid AlgTest::min_max()
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int i = min(4, 7);
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( i == 4 );
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char c = max('a', 'z');
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( c == 'z' );
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  c = min('a', 'z', greater<char>());
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( c == 'z' );
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  i = max(4, 7, greater<int>());
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( i == 4 );
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid AlgTest::count_test()
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int i[] = { 1, 4, 2, 8, 2, 2 };
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int n = count(i, i + 6, 2);
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(n==3);
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_ANACHRONISMS)
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    n = 0;
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    count(i, i + 6, 2, n);
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(n==3);
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> i;
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    i.push_back(1);
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    i.push_back(4);
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    i.push_back(2);
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    i.push_back(8);
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    i.push_back(2);
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    i.push_back(2);
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int n = count(i.begin(), i.end(), 2);
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(n==3);
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_ANACHRONISMS)
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    n = 0;
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    count(i.begin(), i.end(), 2, n);
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(n==3);
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid AlgTest::sort_test()
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> years;
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    years.push_back(1962);
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    years.push_back(1992);
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    years.push_back(2001);
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    years.push_back(1999);
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    sort(years.begin(), years.end());
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(years[0]==1962);
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(years[1]==1992);
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(years[2]==1999);
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(years[3]==2001);
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    deque<int> years;
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    years.push_back(1962);
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    years.push_back(1992);
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    years.push_back(2001);
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    years.push_back(1999);
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    sort(years.begin(), years.end()); // <-- changed!
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(years[0]==1962);
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(years[1]==1992);
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(years[2]==1999);
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(years[3]==2001);
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define ARRAY_SIZE(arr) sizeof(arr) / sizeof(arr[0])
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid AlgTest::search_n_test()
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int ints[] = {0, 1, 2, 3, 3, 4, 4, 4, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5};
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //search_n
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //Forward iterator
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    slist<int> slint(ints, ints + ARRAY_SIZE(ints));
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    slist<int>::iterator slit = search_n(slint.begin(), slint.end(), 2, 2);
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( slit != slint.end() );
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(slit++) == 2 );
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *slit == 2 );
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //Bidirectionnal iterator
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    list<int> lint(ints, ints + ARRAY_SIZE(ints));
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    list<int>::iterator lit = search_n(lint.begin(), lint.end(), 3, 3);
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( lit != lint.end() );
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(lit++) == 3 );
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(lit++) == 3 );
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *lit == 3 );
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //Random access iterator
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    deque<int> dint(ints, ints + ARRAY_SIZE(ints));
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    deque<int>::iterator dit = search_n(dint.begin(), dint.end(), 4, 4);
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( dit != dint.end() );
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(dit++) == 4 );
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(dit++) == 4 );
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(dit++) == 4 );
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *dit == 4 );
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //search_n with predicate
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //Forward iterator
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    slist<int> slint(ints, ints + ARRAY_SIZE(ints));
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    slist<int>::iterator slit = search_n(slint.begin(), slint.end(), 2, 1, greater<int>());
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( slit != slint.end() );
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(slit++) > 1 );
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *slit > 2 );
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //Bidirectionnal iterator
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    list<int> lint(ints, ints + ARRAY_SIZE(ints));
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    list<int>::iterator lit = search_n(lint.begin(), lint.end(), 3, 2, greater<int>());
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( lit != lint.end() );
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(lit++) > 2 );
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(lit++) > 2 );
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *lit > 2 );
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //Random access iterator
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    deque<int> dint(ints, ints + ARRAY_SIZE(ints));
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    deque<int>::iterator dit = search_n(dint.begin(), dint.end(), 4, 3, greater<int>());
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( dit != dint.end() );
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(dit++) > 3 );
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(dit++) > 3 );
187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *(dit++) > 3 );
188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *dit > 3 );
189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // test for bug reported by Jim Xochellis
192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int array[] = {0, 0, 1, 0, 1, 1};
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int* array_end = array + sizeof(array) / sizeof(*array);
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT(search_n(array, array_end, 3, 1) == array_end);
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // test for bug with counter == 1, reported by Timmie Smith
199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int array[] = {0, 1, 2, 3, 4, 5};
201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int* array_end = array + sizeof(array) / sizeof(*array);
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( search_n(array, array_end, 1, 1, equal_to<int>() ) == &array[1] );
203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct MyIntComparable {
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  MyIntComparable(int val) : _val(val) {}
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  bool operator == (const MyIntComparable& other) const
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _val == other._val; }
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate:
212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int _val;
213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid AlgTest::find_first_of_test()
216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  slist<int> intsl;
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  intsl.push_front(1);
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  intsl.push_front(2);
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> intv;
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(0);
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(1);
226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(2);
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(3);
228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int>::iterator first;
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    first = find_first_of(intv.begin(), intv.end(), intsl.begin(), intsl.end());
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( first != intv.end() );
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *first == 1 );
233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> intv;
236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(3);
237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(2);
238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(1);
239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(0);
240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int>::iterator first;
242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    first = find_first_of(intv.begin(), intv.end(), intsl.begin(), intsl.end());
243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( first != intv.end() );
244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *first == 2 );
245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  list<int> intl;
249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  intl.push_front(1);
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  intl.push_front(2);
251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> intv;
254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(0);
255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(1);
256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(2);
257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(3);
258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int>::iterator first;
260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    first = find_first_of(intv.begin(), intv.end(), intl.begin(), intl.end());
261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( first != intv.end() );
262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *first == 1 );
263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> intv;
266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(3);
267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(2);
268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(1);
269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(0);
270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int>::iterator first;
272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    first = find_first_of(intv.begin(), intv.end(), intl.begin(), intl.end());
273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( first != intv.end() );
274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *first == 2 );
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    char chars[] = {1, 2};
278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> intv;
280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(0);
281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(1);
282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(2);
283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(3);
284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int>::iterator first;
286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    first = find_first_of(intv.begin(), intv.end(), chars, chars + sizeof(chars));
287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( first != intv.end() );
288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *first == 1 );
289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    unsigned char chars[] = {1, 2, 255};
292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> intv;
294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(-10);
295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(1029);
296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(255);
297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(4);
298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int>::iterator first;
300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    first = find_first_of(intv.begin(), intv.end(), chars, chars + sizeof(chars));
301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( first != intv.end() );
302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *first == 255 );
303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    signed char chars[] = {93, 2, -101, 13};
306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> intv;
308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(-10);
309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(1029);
310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(-2035);
311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(-101);
312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(4);
313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int>::iterator first;
315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    first = find_first_of(intv.begin(), intv.end(), chars, chars + sizeof(chars));
316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( first != intv.end() );
317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *first == -101 );
318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    char chars[] = {1, 2};
321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<MyIntComparable> intv;
323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(0);
324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(1);
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(2);
326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intv.push_back(3);
327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<MyIntComparable>::iterator first;
329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    first = find_first_of(intv.begin(), intv.end(), chars, chars + sizeof(chars));
330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( first != intv.end() );
331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( *first == 1 );
332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef pair<int, string> Pair;
336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct ValueFinder :
338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    public binary_function<const Pair&, const string&, bool>
339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    bool operator () ( const Pair &p, const string& value ) const
341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      { return p.second == value; }
342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid AlgTest::find_first_of_nsc_test()
345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Non-symmetrical comparator
347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  map<int, string> m;
349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<string> values;
350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m[1] = "one";
352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m[4] = "four";
353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m[10] = "ten";
354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  m[20] = "twenty";
355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  values.push_back( "four" );
357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  values.push_back( "ten" );
358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
359e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  map<int, string>::iterator i = find_first_of(m.begin(), m.end(), values.begin(), values.end(), ValueFinder());
360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( i != m.end() );
362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( i->first == 4 || i->first == 10 );
363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT( i->second == "four" || i->second == "ten" );
364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
365