diff --git a/include/boost/iterator/zip_iterator.hpp b/include/boost/iterator/zip_iterator.hpp index 497ba7d..65dd82f 100644 --- a/include/boost/iterator/zip_iterator.hpp +++ b/include/boost/iterator/zip_iterator.hpp @@ -18,6 +18,7 @@ #include +#include // for std::pair #include // for backward compatibility #include @@ -130,6 +131,16 @@ namespace boost { { }; + // Specialization for std::pair + template + struct tuple_of_references > + { + typedef std::pair< + typename iterator_reference::type + , typename iterator_reference::type + > type; + }; + // Metafunction to obtain the minimal traversal tag in a tuple // of iterators. // @@ -148,6 +159,25 @@ namespace boost { >::type type; }; + template + struct minimum_traversal_category_in_iterator_tuple > + { + typedef typename pure_traversal_tag< + typename iterator_traversal::type + >::type iterator1_traversal; + typedef typename pure_traversal_tag< + typename iterator_traversal::type + >::type iterator2_traversal; + + typedef typename minimum_category< + iterator1_traversal + , typename minimum_category< + iterator2_traversal + , random_access_traversal_tag + >::type + >::type type; + }; + /////////////////////////////////////////////////////////////////// // // Class zip_iterator_base @@ -196,6 +226,30 @@ namespace boost { { typedef int type; }; + + template + struct converter + { + template + static reference call(Seq seq) + { + typedef typename fusion::traits::tag_of::type tag; + return fusion::convert(seq); + } + }; + + template + struct converter > + { + typedef std::pair reference; + template + static reference call(Seq seq) + { + return reference( + fusion::at_c<0>(seq) + , fusion::at_c<1>(seq)); + } + }; } ///////////////////////////////////////////////////////////////////// @@ -252,8 +306,8 @@ namespace boost { typename super_t::reference dereference() const { typedef typename super_t::reference reference; - typedef typename fusion::traits::tag_of::type tag; - return fusion::convert(fusion::transform( + typedef detail::converter gen; + return gen::call(fusion::transform( get_iterator_tuple(), detail::dereference_iterator())); }