1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <vector>
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <list>
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <algorithm>
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <numeric>
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "iota.h"
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "cppunit/cppunit_proxy.h"
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std;
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TestCase class
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass IterTest : public CPPUNIT_NS::TestCase
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE(IterTest);
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(iter1);
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(iter3);
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(iter4);
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(iterswp0);
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(iterswp1);
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(iterswp2);
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(iterswp3);
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE_END();
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected:
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void iter1();
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void iter3();
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void iter4();
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void iterswp0();
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void iterswp1();
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void iterswp2();
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void iterswp3();
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(IterTest);
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid IterTest::iter1()
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<const char*> v; // Vector of character strings.
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  v.push_back("zippy"); // First element.
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  v.push_back("motorboy"); // Second element.
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef vector<const char*> vec;
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  unsigned counter = 0;
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (vec::iterator i = v.begin(); i != v.end(); ++i, ++counter) {
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    switch (counter) {
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      case 0:
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        CPPUNIT_ASSERT(!strcmp(*i, "zippy"));
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        break;
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      case 1:
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        CPPUNIT_ASSERT(!strcmp(*i, "motorboy"));
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        break;
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      default:
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        CPPUNIT_FAIL;
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid IterTest::iter3()
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef vector<const char*> Vec;
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  Vec v; // Vector of character strings.
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  v.push_back("zippy"); // First element.
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  v.push_back("motorboy"); // Second element.
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  Vec::reverse_iterator it;
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  unsigned counter = 0;
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (it = v.rbegin(); it != v.rend(); ++it, ++counter) {
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    switch (counter) {
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      case 1:
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        CPPUNIT_ASSERT(!strcmp(*it, "zippy"));
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        break;
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      case 0:
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        CPPUNIT_ASSERT(!strcmp(*it, "motorboy"));
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        break;
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      default:
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        CPPUNIT_FAIL;
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid IterTest::iter4()
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> v; // Empty vector of integers.
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  v.push_back(1);
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  v.push_back(2);
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  v.push_back(3);
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Position immediately after last item.
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int>::iterator i = v.end();
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Move back one and then access.
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT((*--i)==3);
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  i -= 2; // Jump back two items.
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT((*i)==1);
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid IterTest::iterswp0()
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int numbers[6] = { 0, 1, 2, 3, 4, 5 };
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  iter_swap(numbers, numbers + 3);
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(numbers[0]==3);
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(numbers[1]==1);
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(numbers[2]==2);
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(numbers[3]==0);
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(numbers[4]==4);
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(numbers[5]==5);
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid IterTest::iterswp1()
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> v1(6);
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __iota(v1.begin(), v1.end(), 0);
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  iter_swap( v1.begin(), v1.begin() + 3 );
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(v1[0]==3);
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(v1[1]==1);
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(v1[2]==2);
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(v1[3]==0);
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(v1[4]==4);
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(v1[5]==5);
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid IterTest::iterswp2()
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<bool> boolVector;
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  boolVector.push_back( true );
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  boolVector.push_back( false );
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<bool>::iterator i1 = boolVector.begin();
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<bool>::iterator i2 = boolVector.begin();
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ++i2;
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  bool v0 = *i1;
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  bool v1 = *i2;
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  iter_swap( i1, i2 );
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(( *i1 == v1 && *i2 == v0 ));
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid IterTest::iterswp3()
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> vvref(10, 10);
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<int> lvref(10, 20);
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  vector<vector<int> > vvints(4, vvref);
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  list<vector<int> > lvints(4, lvref);
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  iter_swap(vvints.begin(), lvints.begin());
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_CHECK( vvints.front() == lvref );
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_CHECK( lvints.front() == vvref );
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //const vector<vector<int> > &cvvints = vvints;
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //iter_swap(cvvints.begin(), lvints.begin());
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //iter_swap(lvints.begin(), cvvints.begin());
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int *pvvint = &vvints.front().front();
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int *plvint = &lvints.front().front();
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  iter_swap(vvints.begin(), lvints.begin());
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //Check that elements have been swaped:
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_CHECK( pvvint == &lvints.front().front() );
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_CHECK( plvint == &vvints.front().front() );
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
170