From 3844edc4bffc63dd2561a4324c392a1ca7de90ec Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Tue, 7 May 2002 11:56:08 +0000 Subject: [PATCH] Fixed input iterator requirements. For a == b a++ == b++ is no longer required. See 24.1.1/3 for details. (Thomas Witt) [SVN r13716] --- include/boost/pending/iterator_tests.hpp | 65 +++++++++++++++++++----- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/include/boost/pending/iterator_tests.hpp b/include/boost/pending/iterator_tests.hpp index c3c3601..88e1c05 100644 --- a/include/boost/pending/iterator_tests.hpp +++ b/include/boost/pending/iterator_tests.hpp @@ -5,6 +5,10 @@ // test suite for STL concepts such as iterators and containers. // // Revision History: +// 28 Apr 2002 Fixed input iterator requirements. +// For a == b a++ == b++ is no longer required. +// See 24.1.1/3 for details. +// (Thomas Witt) // 08 Feb 2001 Fixed bidirectional iterator test so that // --i is no longer a precondition. // (Jeremy Siek) @@ -74,22 +78,40 @@ void mutable_trivial_iterator_test(const Iterator i, const Iterator j, T val) template void input_iterator_test(Iterator i, T v1, T v2) { - Iterator i1 = i, i2 = i; + Iterator i1(i); - assert(i == i1++); - assert(i != ++i2); - - trivial_iterator_test(i, i1, v1); - trivial_iterator_test(i, i2, v1); - - ++i; assert(i == i1); - assert(i == i2); - ++i1; - ++i2; + assert(!(i != i1)); - trivial_iterator_test(i, i1, v2); - trivial_iterator_test(i, i2, v2); + // I can see no generic way to create an input iterator + // that is in the domain of== of i and != i. + // The following works for istream_iterator but is not + // guaranteed to work for arbitrary input iterators. + // + // Iterator i2; + // + // assert(i != i2); + // assert(!(i == i2)); + + assert(*i1 == v1); + assert(*i == v1); + + // we cannot test for equivalence of (void)++i & (void)i++ + // as i is only guaranteed to be single pass. + assert(*i++ == v1); + + i1 = i; + + assert(i == i1); + assert(!(i != i1)); + + assert(*i1 == v2); + assert(*i == v2); + + // i is dereferencable, so it must be incrementable. + ++i; + + // how to test for operator-> ? } // how to test output iterator? @@ -124,6 +146,23 @@ void forward_iterator_test(Iterator i, T v1, T v2) { input_iterator_test(i, v1, v2); + Iterator i1 = i, i2 = i; + + assert(i == i1++); + assert(i != ++i2); + + trivial_iterator_test(i, i1, v1); + trivial_iterator_test(i, i2, v1); + + ++i; + assert(i == i1); + assert(i == i2); + ++i1; + ++i2; + + trivial_iterator_test(i, i1, v2); + trivial_iterator_test(i, i2, v2); + // borland doesn't allow non-type template parameters # if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551) lvalue_test<(boost::is_pointer::value)>::check(i);