From ee9f140fae4ca7608e802ce55278eaa0a4ddfef2 Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Thu, 8 Feb 2001 03:07:33 +0000 Subject: [PATCH] Removed all pair generator's except for projection and some const adaptor generators. Added make_xxx_iterator() helper functions for remaining iterator adaptors. Removed some traits template parameters where they where no longer needed thanks to detail::iterator_traits. Moved some of the compile-time logic into enums for EDG compatibility. [SVN r9024] --- include/boost/iterator_adaptors.hpp | 296 +++++++++++++++------------- 1 file changed, 162 insertions(+), 134 deletions(-) diff --git a/include/boost/iterator_adaptors.hpp b/include/boost/iterator_adaptors.hpp index 47d4001..3ab25fb 100644 --- a/include/boost/iterator_adaptors.hpp +++ b/include/boost/iterator_adaptors.hpp @@ -12,7 +12,20 @@ // // Revision History: -// 07 Feb 2001 +// 07 Feb 2001 Jeremy Siek +// Removed all pair generator's except for projection and +// some const adaptor generators. +// +// Added make_xxx_iterator() helper functions for remaining +// iterator adaptors. +// +// Removed some traits template parameters where they +// where no longer needed thanks to detail::iterator_traits. +// +// Moved some of the compile-time logic into enums for +// EDG compatibility. +// +// 07 Feb 2001 David Abrahams // Removed iterator_adaptor_pair_generator and // reverse_iterator_pair_generator (more such culling to come) // @@ -24,7 +37,7 @@ // // Fixed naming convention of non-template parameter names // -// 06 Feb 2001 +// 06 Feb 2001 David Abrahams // Produce operator-> proxy objects for InputIterators // // Added static assertions to do some basic concept checks @@ -321,10 +334,9 @@ namespace detail { typedef typename Traits::iterator_category category; typedef operator_arrow_proxy proxy; typedef typename Traits::pointer pointer; - typedef typename boost::detail::if_true<( - boost::is_convertible::value - & !boost::is_convertible::value - )>::template + enum { is_input_iter = boost::is_convertible::value + & !boost::is_convertible::value }; + typedef typename boost::detail::if_true<(is_input_iter)>::template then< proxy, // else @@ -382,14 +394,19 @@ public: typedef typename Traits::iterator_category iterator_category; typedef Iterator iterator_type; + enum { is_input_or_output_iter = + boost::is_convertible::value + || boost::is_convertible::value }; + // Iterators should satisfy one of the known categories - BOOST_STATIC_ASSERT((boost::is_convertible::value - || boost::is_convertible::value)); + BOOST_STATIC_ASSERT(is_input_or_output_iter); // Iterators >= ForwardIterator must produce real references. - BOOST_STATIC_ASSERT((!boost::is_convertible::value - || boost::is_same::value - || boost::is_same::value)); + enum { forward_iter_with_real_reference = + (!boost::is_convertible::value + || boost::is_same::value + || boost::is_same::value) }; + BOOST_STATIC_ASSERT(forward_iter_with_real_reference); iterator_adaptor() { } @@ -566,30 +583,22 @@ struct transform_iterator_policies : public default_iterator_policies AdaptableUnaryFunction m_f; }; -template -struct transform_iterator_traits { - typedef typename AdaptableUnaryFunction::result_type value_type; - typedef value_type reference; - typedef value_type* pointer; - typedef typename IteratorTraits::difference_type difference_type; - typedef std::input_iterator_tag iterator_category; -}; - -template - > -struct transform_iterator_generator +template +class transform_iterator_generator { - typedef transform_iterator_traits - transform_traits; + typedef typename boost::detail::iterator_traits::difference_type + difference_type; + typedef typename AdaptableUnaryFunction::result_type value_type; +public: + typedef boost::iterator transform_traits; typedef iterator_adaptor, transform_traits> type; }; template -typename transform_iterator_generator::type +inline typename transform_iterator_generator::type make_transform_iterator( const Iterator& base, const AdaptableUnaryFunction& f = AdaptableUnaryFunction()) @@ -620,52 +629,44 @@ struct indirect_iterator_policies : public default_iterator_policies { return **x; } }; -template ::value_type, - class InnerTraits = boost::detail::iterator_traits, - class OuterTraits = boost::detail::iterator_traits // never needed (?) - > -struct indirect_traits -{ - typedef typename OuterTraits::difference_type difference_type; - typedef typename InnerTraits::value_type value_type; - typedef typename InnerTraits::pointer pointer; - typedef typename InnerTraits::reference reference; - typedef typename OuterTraits::iterator_category iterator_category; -}; - template mutable indirect iterator; Immutable -> immutable indirect iterator class InnerIterator = typename boost::detail::iterator_traits::value_type, - class InnerTraits = boost::detail::iterator_traits, - class OuterTraits = boost::detail::iterator_traits // never needed (?) - > -struct indirect_iterator_generator + class InnerTraits = boost::detail::iterator_traits + > +class indirect_iterator_generator { - typedef iterator_adaptor - > type; + typedef boost::detail::iterator_traits OuterTraits; + typedef typename OuterTraits::difference_type difference_type; + typedef typename OuterTraits::iterator_category iterator_category; + + typedef typename InnerTraits::value_type value_type; + typedef typename InnerTraits::pointer pointer; + typedef typename InnerTraits::reference reference; +public: + typedef boost::iterator indirect_traits; + typedef iterator_adaptor type; }; -template , - class InnerIterator = typename boost::detail::iterator_traits::value_type, - class InnerTraits = boost::detail::iterator_traits, - class OuterTraits = boost::detail::iterator_traits // never needed (?) - > -struct indirect_iterator_pair_generator +template +inline typename indirect_iterator_generator::type +make_indirect_iterator(OuterIterator outer, InnerIterator, InnerTraits) { - typedef iterator_adaptor, - indirect_iterator_policies> iterator; - - typedef iterator_adaptor, - indirect_iterator_policies> const_iterator; -}; + typedef typename indirect_iterator_generator + ::type result_t; + return result_t(outer); +} + +#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) +template +inline typename indirect_iterator_generator::type +make_indirect_iterator(OuterIterator outer) +{ + typedef typename indirect_iterator_generator + ::type result_t; + return result_t(outer); +} +#endif //============================================================================= @@ -712,14 +713,23 @@ struct reverse_iterator_generator Traits> type; }; -template - > -struct const_reverse_iterator_generator +template +inline typename reverse_iterator_generator::type +make_reverse_iterator(Iterator iter, Traits) { - typedef iterator_adaptor type; -}; + typedef typename reverse_iterator_generator::type result_t; + return result_t(iter); +} + +#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) +template +inline typename reverse_iterator_generator::type +make_reverse_iterator(Iterator iter) +{ + typedef typename reverse_iterator_generator::type result_t; + return result_t(iter); +} +#endif //============================================================================= // Projection Iterators Adaptor @@ -738,101 +748,119 @@ struct projection_iterator_policies : public default_iterator_policies AdaptableUnaryFunction m_f; }; -template -struct projection_iterator_traits { +template +class projection_iterator_generator { + typedef boost::detail::iterator_traits Traits; typedef typename AdaptableUnaryFunction::result_type value_type; - typedef value_type& reference; - typedef value_type* pointer; - typedef typename Traits::difference_type difference_type; - typedef typename Traits::iterator_category iterator_category; -}; - -template -struct const_projection_iterator_traits { - typedef typename AdaptableUnaryFunction::result_type value_type; - typedef value_type const& reference; - typedef value_type const* pointer; - typedef typename Traits::difference_type difference_type; - typedef typename Traits::iterator_category iterator_category; -}; - -template - > -struct projection_iterator_generator { - typedef projection_iterator_traits + typedef boost::iterator projection_traits; +public: typedef iterator_adaptor, + projection_iterator_policies, projection_traits> type; }; -template - > -struct const_projection_iterator_generator { - typedef const_projection_iterator_traits projection_traits; +template +class const_projection_iterator_generator { + typedef boost::detail::iterator_traits Traits; + typedef typename AdaptableUnaryFunction::result_type value_type; + typedef boost::iterator + projection_traits; +public: typedef iterator_adaptor, + projection_iterator_policies, projection_traits> type; }; -template , - class ConstTraits = boost::detail::iterator_traits - > +template struct projection_iterator_pair_generator { - typedef projection_iterator_traits - projection_traits; - typedef const_projection_iterator_traits const_projection_traits; - typedef iterator_adaptor, - projection_traits> iterator; - typedef iterator_adaptor, - const_projection_traits > const_iterator; + typedef typename projection_iterator_generator::type iterator; + typedef typename const_projection_iterator_generator::type const_iterator; }; + +template +inline typename projection_iterator_generator::type +make_projection_iterator(Iterator iter, AdaptableUnaryFunction f) +{ + typedef typename projection_iterator_generator::type result_t; + return result_t(iter, f); +} + +template +inline typename const_projection_iterator_generator::type +make_const_projection_iterator(Iterator iter, AdaptableUnaryFunction f) +{ + typedef typename const_projection_iterator_generator::type result_t; + return result_t(iter, f); +} + //============================================================================= // Filter Iterator Adaptor - template - class filter_iterator_policies : public default_iterator_policies { - public: +template +class filter_iterator_policies : public default_iterator_policies { +public: filter_iterator_policies() { } filter_iterator_policies(const Predicate& p, const Iterator& end) - : m_predicate(p), m_end(end) { } + : m_predicate(p), m_end(end) { } void initialize(Iterator& x) { - advance(x); + advance(x); } // dwa 2/4/01 - The Iter template argument neccessary for compatibility with // a MWCW bug workaround template void increment(Iter& x) { - ++x; - advance(x); + ++x; + advance(x); } - private: +private: void advance(Iterator& iter) { - while (m_end != iter && !m_predicate(*iter)) - ++iter; + while (m_end != iter && !m_predicate(*iter)) + ++iter; } Predicate m_predicate; Iterator m_end; - }; - - template - > - class filter_iterator_generator { +}; + +template + > +class filter_iterator_generator { typedef filter_iterator_policies Policies; - public: +public: + typedef filter_iterator_policies policies_type; typedef iterator_adaptor type; - }; +}; + + +template +inline typename filter_iterator_generator::type +make_filter_iterator(Iterator first, Iterator last, Predicate p, Traits) +{ + typedef filter_iterator_generator Gen; + typedef typename Gen::policies_type policies_t; + typedef typename Gen::type result_t; + return result_t(first, policies_t(p, last)); +} + +#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) +template +inline typename filter_iterator_generator::type +make_filter_iterator(Iterator first, Iterator last, Predicate p) +{ + typedef filter_iterator_generator Gen; + typedef typename Gen::policies_type policies_t; + typedef typename Gen::type result_t; + return result_t(first, policies_t(p, last)); +} +#endif } // namespace boost