From 0bada0a914907fbfc6ef85c241a6a2570cab4633 Mon Sep 17 00:00:00 2001 From: Thomas Witt Date: Thu, 29 May 2003 17:11:11 +0000 Subject: [PATCH] Made filter_iterator bidirectional. [SVN r1288] --- include/boost/iterator/filter_iterator.hpp | 7 ++++++- test/filter_iterator_test.cpp | 16 +++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/include/boost/iterator/filter_iterator.hpp b/include/boost/iterator/filter_iterator.hpp index b8a53bf..ae46fba 100644 --- a/include/boost/iterator/filter_iterator.hpp +++ b/include/boost/iterator/filter_iterator.hpp @@ -23,7 +23,7 @@ namespace boost typedef iterator_tag< typename access_category::type , typename minimum_category< - forward_traversal_tag + bidirectional_traversal_tag , typename traversal_category::type >::type > type; @@ -80,6 +80,11 @@ namespace boost satisfy_predicate(); } + void decrement() + { + while(!this->m_predicate(*--(this->base_reference()))){}; + } + void satisfy_predicate() { while (this->base() != this->m_end && !this->m_predicate(*this->base())) diff --git a/test/filter_iterator_test.cpp b/test/filter_iterator_test.cpp index 0cdad99..16cd894 100644 --- a/test/filter_iterator_test.cpp +++ b/test/filter_iterator_test.cpp @@ -40,15 +40,13 @@ int main() typedef boost::filter_iterator filter_iter; - boost::forward_iterator_test( + boost::bidirectional_readable_iterator_test( filter_iter(one_or_four(), array, array+N) , dummyT(1), dummyT(4)); - // Filter iterators can't be bidirectional, since we didn't choose - // to store the beginning of the range. BOOST_STATIC_ASSERT(( !boost::detail::is_tag< - boost::bidirectional_traversal_tag + boost::random_access_traversal_tag , boost::traversal_category::type >::value )); @@ -60,15 +58,15 @@ int main() // is broken ;-( std::deque array2; std::copy(array+0, array+N, std::back_inserter(array2)); - boost::forward_iterator_test( + boost::bidirectional_readable_iterator_test( boost::make_filter_iterator(one_or_four(), array2.begin(), array2.end()), dummyT(1), dummyT(4)); - boost::forward_iterator_test( + boost::bidirectional_readable_iterator_test( boost::make_filter_iterator(one_or_four(), array2.begin(), array2.end()), dummyT(1), dummyT(4)); - boost::forward_iterator_test( + boost::bidirectional_readable_iterator_test( boost::make_filter_iterator( one_or_four() , boost::make_reverse_iterator(array2.end()) @@ -76,11 +74,11 @@ int main() ), dummyT(4), dummyT(1)); - boost::forward_iterator_test( + boost::bidirectional_readable_iterator_test( filter_iter(array+0, array+N), dummyT(1), dummyT(4)); - boost::forward_iterator_test( + boost::bidirectional_readable_iterator_test( filter_iter(one_or_four(), array, array + N), dummyT(1), dummyT(4));