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