From de057da47ef1e020893aa272dfce73721d2bb936 Mon Sep 17 00:00:00 2001 From: Thomas Witt Date: Fri, 25 Apr 2003 23:40:15 +0000 Subject: [PATCH] Added projection support. [SVN r1198] --- include/boost/iterator/transform_iterator.hpp | 59 +++++++++++++++---- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/include/boost/iterator/transform_iterator.hpp b/include/boost/iterator/transform_iterator.hpp index 8b0d0c9..c86e1a9 100644 --- a/include/boost/iterator/transform_iterator.hpp +++ b/include/boost/iterator/transform_iterator.hpp @@ -12,6 +12,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace boost { @@ -22,19 +27,41 @@ namespace boost { // Given the transform iterator's transformation and iterator, this // is the type used as its traits. - template + template struct transform_iterator_base { - typedef iterator_adaptor< - transform_iterator - , Iterator - , typename AdaptableUnaryFunction::result_type - , iterator_tag< - readable_iterator_tag - , typename traversal_category::type - > - , typename AdaptableUnaryFunction::result_type - > type; + private: + typedef typename UnaryFunction::result_type result_type; + + typedef typename remove_reference< result_type >::type cv_value_type; + typedef typename remove_cv< cv_value_type >::type value_type; + + typedef typename mpl::if_< + is_reference< result_type > + , typename mpl::if_< + is_const< cv_value_type > + , readable_lvalue_iterator_tag + , writable_lvalue_iterator_tag + >::type + , readable_iterator_tag + >::type maximum_access_tag; + + typedef typename minimum_category< + maximum_access_tag + , typename access_category::type + >::type access_category; + + public: + typedef iterator_adaptor< + transform_iterator + , Iterator + , cv_value_type + , iterator_tag< + access_category + , typename traversal_category::type + > + , result_type + > type; }; } @@ -65,14 +92,20 @@ namespace boost { return m_f; } private: - typename super_t::value_type dereference() const - { return m_f(super_t::dereference()); } + typename super_t::reference dereference() const + { return m_f(*this->base()); } // Probably should be the initial base class so it can be // optimized away via EBO if it is an empty class. AdaptableUnaryFunction m_f; }; + template + transform_iterator make_transform_iterator(Iterator it, UnaryFunction fun) + { + return transform_iterator(it, fun); + } + } // namespace boost #endif // BOOST_TRANSFORM_ITERATOR_23022003THW_HPP