From ddb7ed4a1c3da475aa1fd6036171d4bbba75e722 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Tue, 14 Feb 2012 16:45:40 -0600 Subject: STL advance / distance. Change-Id: I9cdf9459f2970def812b1681897fe7d0cdda37ac Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/669 Tested-by: Jenkins Server Reviewed-by: Douglas R. Gilbert Reviewed-by: Terry J. Opie Reviewed-by: MIKE J. JONES Reviewed-by: A. Patrick Williams III --- src/usr/testcore/lib/stltest.H | 94 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) (limited to 'src/usr/testcore/lib') diff --git a/src/usr/testcore/lib/stltest.H b/src/usr/testcore/lib/stltest.H index 8eca620cd..f2bea98c5 100644 --- a/src/usr/testcore/lib/stltest.H +++ b/src/usr/testcore/lib/stltest.H @@ -27,6 +27,8 @@ #include #include #include +#include +#include class STLTest : public CxxTest::TestSuite { @@ -167,5 +169,97 @@ class STLTest : public CxxTest::TestSuite --i; } } + + + void testAdvance() + { + // Test for a non-random-access iterator, such as list. + std::list list; + + for(int i = 0; i < 100; i++) + list.push_back(i); + + for (int i = 0; i < 100; i++) + { + std::list::iterator itr = list.begin(); + std::advance(itr, i); + if (*itr != i) + { + TS_FAIL("List iterator value mismatch %d:%d.", *itr, i); + } + } + + // Test for a random-access iterator, such as vector. + std::vector vector; + + for (int i = 0; i < 100; i++) + vector.push_back(i); + + for (int i = 0; i < 100; i++) + { + std::vector::iterator itr = vector.begin(); + std::advance(itr, i); + if (*itr != i) + { + TS_FAIL("Vector iterator value mismatch %d:%d.", *itr, i); + } + } + } + + void testDistance() + { + // Test for a non-random-access iterator, such as list. + std::list list; + + for (int i = 0; i < 100; i++) + list.push_back(i); + + for (int i = 0; i < 100; i++) + for (int j = 0; j < 100; j++) + { + // distance isn't defined for non-random-access iterator + // when "first" is greater than "last". + if (i > j) continue; + + std::list::iterator itr_i = list.begin(), + itr_j = list.begin(); + + std::advance(itr_i, i); + std::advance(itr_j, j); + + ssize_t d = std::distance(itr_i, itr_j); + + if (d != (j-i)) + { + TS_FAIL("List distance incorrect %d:%d:%d", + i, j, d); + } + } + + // Test for a random-access iterator, such as vector. + std::vector vector; + + for (int i = 0; i < 100; i++) + vector.push_back(i); + + for (int i = 0; i < 100; i++) + for (int j = 0; j < 100; j++) + { + std::vector::iterator itr_i = vector.begin(), + itr_j = vector.begin(); + + std::advance(itr_i, i); + std::advance(itr_j, j); + + ssize_t d = std::distance(itr_i, itr_j); + + if (d != (j-i)) + { + TS_FAIL("Vector distance incorrect %d:%d:%d", + i, j, d); + } + } + + } }; #endif -- cgit v1.2.1