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