From be0b65c447c5e2a522850f55b58e3f5697e418f1 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Wed, 9 Apr 2003 16:14:07 +0000 Subject: [PATCH] More fun with iterator adaptors [SVN r1139] --- test/iterator_adaptor_test.cpp | 125 ++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 56 deletions(-) diff --git a/test/iterator_adaptor_test.cpp b/test/iterator_adaptor_test.cpp index c0819b3..bdfa37f 100644 --- a/test/iterator_adaptor_test.cpp +++ b/test/iterator_adaptor_test.cpp @@ -86,23 +86,73 @@ struct my_gen template struct ptr_iterator : boost::iterator_adaptor< - ptr_iterator, - boost::iterator_traits_adaptor > - > + ptr_iterator + , V* + , V + , std::random_access_iterator_tag +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) + , V&, V* +#endif + > { private: - typedef iterator_adaptor super_t; + typedef boost::iterator_adaptor< + ptr_iterator + , V* + , V + , std::random_access_iterator_tag +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) + , V&, V* +#endif + > super_t; + public: ptr_iterator() { } ptr_iterator(V* d) : super_t(d) { } template - ptr_iterator(const ptr_iterator& x) // should assert is_same add_cv add_cv - : super_t(x.base()) { } + ptr_iterator( + const ptr_iterator& x + , typename boost::enable_if_convertible::type* = 0 + ) + : super_t(x.base()) + {} +}; +template +struct fwd_iterator + : boost::iterator_adaptor< + fwd_iterator + , boost::forward_iterator_archetype + > +{ +private: + typedef boost::iterator_adaptor< + fwd_iterator + , boost::forward_iterator_archetype + > super_t; + +public: + fwd_iterator() { } + fwd_iterator(boost::forward_iterator_archetype d) : super_t(d) { } +}; + +template +struct in_iterator + : boost::iterator_adaptor< + in_iterator + , boost::input_iterator_archetype + > +{ +private: + typedef boost::iterator_adaptor< + in_iterator + , boost::input_iterator_archetype + > super_t; + +public: + in_iterator() { } + in_iterator(boost::input_iterator_archetype d) : super_t(d) { } }; int @@ -128,8 +178,7 @@ main() // Test the iterator_traits { // Test computation of defaults - typedef boost::iterator_adaptor > Iter1; + typedef ptr_iterator Iter1; // don't use std::iterator_traits here to avoid VC++ problems BOOST_STATIC_ASSERT((boost::is_same::value)); BOOST_STATIC_ASSERT((boost::is_same::value)); @@ -139,40 +188,18 @@ main() } { // Test computation of default when the Value is const - typedef boost::iterator_adaptor::iterator, - boost::default_iterator_policies, - boost::value_type_is > Iter1; + typedef ptr_iterator Iter1; BOOST_STATIC_ASSERT((boost::is_same::value)); -#if defined(__BORLANDC__) || defined(BOOST_MSVC) && BOOST_MSVC <= 1300 - // We currently don't know how to workaround this bug. - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); -#else BOOST_STATIC_ASSERT((boost::is_same::value)); BOOST_STATIC_ASSERT((boost::is_same::value)); -#endif - } - { - // Test with no defaults - typedef boost::iterator_adaptor, - boost::pointer_is, - boost::value_type_is, - boost::iterator_category_is, - boost::difference_type_is - > Iter1; - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); } + // Test the iterator_adaptor { - boost::iterator_adaptor i(array); + ptr_iterator i(array); boost::random_access_iterator_test(i, N, array); - boost::iterator_adaptor j(array); + ptr_iterator j(array); boost::random_access_iterator_test(j, N, array); boost::const_nonconst_iterator_test(i, ++j); } @@ -180,33 +207,19 @@ main() // check operator-> with a forward iterator { boost::forward_iterator_archetype forward_iter; -#if defined(__BORLANDC__) - typedef boost::iterator_adaptor, - boost::default_iterator_policies, - dummyT, const dummyT&, const dummyT*, - std::forward_iterator_tag, std::ptrdiff_t> adaptor_type; -#else - typedef boost::iterator_adaptor, - boost::default_iterator_policies, - boost::reference_is, - boost::pointer_is , - boost::iterator_category_is, - boost::value_type_is, - boost::difference_type_is - > adaptor_type; -#endif + + typedef fwd_iterator adaptor_type; + adaptor_type i(forward_iter); int zero = 0; if (zero) // don't do this, just make sure it compiles assert((*i).m_x == i->foo()); } + // check operator-> with an input iterator { boost::input_iterator_archetype input_iter; - typedef boost::iterator_adaptor, - boost::default_iterator_policies, - dummyT, const dummyT&, const dummyT*, - std::input_iterator_tag, std::ptrdiff_t> adaptor_type; + typedef in_iterator adaptor_type; adaptor_type i(input_iter); int zero = 0; if (zero) // don't do this, just make sure it compiles