| #include <vector> |
| #include <list> |
| #include <algorithm> |
| #include <numeric> |
| |
| #include "iota.h" |
| #include "cppunit/cppunit_proxy.h" |
| |
| #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) |
| using namespace std; |
| #endif |
| |
| // |
| // TestCase class |
| // |
| class IterTest : public CPPUNIT_NS::TestCase |
| { |
| CPPUNIT_TEST_SUITE(IterTest); |
| CPPUNIT_TEST(iter1); |
| CPPUNIT_TEST(iter3); |
| CPPUNIT_TEST(iter4); |
| CPPUNIT_TEST(iterswp0); |
| CPPUNIT_TEST(iterswp1); |
| CPPUNIT_TEST(iterswp2); |
| CPPUNIT_TEST(iterswp3); |
| CPPUNIT_TEST_SUITE_END(); |
| |
| protected: |
| void iter1(); |
| void iter3(); |
| void iter4(); |
| void iterswp0(); |
| void iterswp1(); |
| void iterswp2(); |
| void iterswp3(); |
| }; |
| |
| CPPUNIT_TEST_SUITE_REGISTRATION(IterTest); |
| |
| // |
| // tests implementation |
| // |
| void IterTest::iter1() |
| { |
| vector<const char*> v; // Vector of character strings. |
| v.push_back("zippy"); // First element. |
| v.push_back("motorboy"); // Second element. |
| typedef vector<const char*> vec; |
| unsigned counter = 0; |
| for (vec::iterator i = v.begin(); i != v.end(); ++i, ++counter) { |
| switch (counter) { |
| case 0: |
| CPPUNIT_ASSERT(!strcmp(*i, "zippy")); |
| break; |
| case 1: |
| CPPUNIT_ASSERT(!strcmp(*i, "motorboy")); |
| break; |
| default: |
| CPPUNIT_FAIL; |
| } |
| } |
| } |
| void IterTest::iter3() |
| { |
| typedef vector<const char*> Vec; |
| Vec v; // Vector of character strings. |
| v.push_back("zippy"); // First element. |
| v.push_back("motorboy"); // Second element. |
| Vec::reverse_iterator it; |
| unsigned counter = 0; |
| for (it = v.rbegin(); it != v.rend(); ++it, ++counter) { |
| switch (counter) { |
| case 1: |
| CPPUNIT_ASSERT(!strcmp(*it, "zippy")); |
| break; |
| case 0: |
| CPPUNIT_ASSERT(!strcmp(*it, "motorboy")); |
| break; |
| default: |
| CPPUNIT_FAIL; |
| } |
| } |
| } |
| void IterTest::iter4() |
| { |
| vector<int> v; // Empty vector of integers. |
| v.push_back(1); |
| v.push_back(2); |
| v.push_back(3); |
| // Position immediately after last item. |
| vector<int>::iterator i = v.end(); |
| // Move back one and then access. |
| CPPUNIT_ASSERT((*--i)==3); |
| i -= 2; // Jump back two items. |
| CPPUNIT_ASSERT((*i)==1); |
| } |
| void IterTest::iterswp0() |
| { |
| int numbers[6] = { 0, 1, 2, 3, 4, 5 }; |
| |
| iter_swap(numbers, numbers + 3); |
| |
| CPPUNIT_ASSERT(numbers[0]==3); |
| CPPUNIT_ASSERT(numbers[1]==1); |
| CPPUNIT_ASSERT(numbers[2]==2); |
| CPPUNIT_ASSERT(numbers[3]==0); |
| CPPUNIT_ASSERT(numbers[4]==4); |
| CPPUNIT_ASSERT(numbers[5]==5); |
| |
| } |
| void IterTest::iterswp1() |
| { |
| vector<int> v1(6); |
| __iota(v1.begin(), v1.end(), 0); |
| iter_swap( v1.begin(), v1.begin() + 3 ); |
| |
| CPPUNIT_ASSERT(v1[0]==3); |
| CPPUNIT_ASSERT(v1[1]==1); |
| CPPUNIT_ASSERT(v1[2]==2); |
| CPPUNIT_ASSERT(v1[3]==0); |
| CPPUNIT_ASSERT(v1[4]==4); |
| CPPUNIT_ASSERT(v1[5]==5); |
| } |
| void IterTest::iterswp2() |
| { |
| vector<bool> boolVector; |
| |
| boolVector.push_back( true ); |
| boolVector.push_back( false ); |
| |
| vector<bool>::iterator i1 = boolVector.begin(); |
| vector<bool>::iterator i2 = boolVector.begin(); |
| ++i2; |
| |
| bool v0 = *i1; |
| bool v1 = *i2; |
| |
| iter_swap( i1, i2 ); |
| |
| CPPUNIT_ASSERT(( *i1 == v1 && *i2 == v0 )); |
| } |
| |
| |
| void IterTest::iterswp3() |
| { |
| vector<int> vvref(10, 10); |
| vector<int> lvref(10, 20); |
| |
| vector<vector<int> > vvints(4, vvref); |
| list<vector<int> > lvints(4, lvref); |
| |
| iter_swap(vvints.begin(), lvints.begin()); |
| CPPUNIT_CHECK( vvints.front() == lvref ); |
| CPPUNIT_CHECK( lvints.front() == vvref ); |
| |
| //const vector<vector<int> > &cvvints = vvints; |
| //iter_swap(cvvints.begin(), lvints.begin()); |
| //iter_swap(lvints.begin(), cvvints.begin()); |
| |
| #if defined (STLPORT) && defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) |
| int *pvvint = &vvints.front().front(); |
| int *plvint = &lvints.front().front(); |
| |
| iter_swap(vvints.begin(), lvints.begin()); |
| //Check that elements have been swaped: |
| CPPUNIT_CHECK( pvvint == &lvints.front().front() ); |
| CPPUNIT_CHECK( plvint == &vvints.front().front() ); |
| #endif |
| } |