Fixed input iterator requirements. For a == b a++ == b++ is no longer

required. See 24.1.1/3 for details. (Thomas Witt)


[SVN r13716]
This commit is contained in:
Dave Abrahams
2002-05-07 11:56:08 +00:00
parent fdd1601ba4
commit 3844edc4bf

View File

@ -5,6 +5,10 @@
// test suite for STL concepts such as iterators and containers. // test suite for STL concepts such as iterators and containers.
// //
// Revision History: // 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 // 08 Feb 2001 Fixed bidirectional iterator test so that
// --i is no longer a precondition. // --i is no longer a precondition.
// (Jeremy Siek) // (Jeremy Siek)
@ -74,22 +78,40 @@ void mutable_trivial_iterator_test(const Iterator i, const Iterator j, T val)
template <class Iterator, class T> template <class Iterator, class T>
void input_iterator_test(Iterator i, T v1, T v2) 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 == i1);
assert(i == i2); assert(!(i != i1));
++i1;
++i2;
trivial_iterator_test(i, i1, v2); // I can see no generic way to create an input iterator
trivial_iterator_test(i, i2, v2); // 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? // 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); 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 // borland doesn't allow non-type template parameters
# if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551) # if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
lvalue_test<(boost::is_pointer<Iterator>::value)>::check(i); lvalue_test<(boost::is_pointer<Iterator>::value)>::check(i);