From 596d5e132a2dee3badcd7bb68264dc37d280af01 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Thu, 18 Oct 2012 20:40:12 +0900 Subject: [PATCH] Specialization for std::pair --- boost/iterator/zip_iterator.hpp | 58 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/boost/iterator/zip_iterator.hpp b/boost/iterator/zip_iterator.hpp index 28785e6..d788e63 100644 --- a/boost/iterator/zip_iterator.hpp +++ b/boost/iterator/zip_iterator.hpp @@ -18,6 +18,7 @@ #include +#include #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; + }; + #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // ETI workaround template <> struct minimum_traversal_category_in_iterator_tuple @@ -204,6 +234,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)); + } + }; } ///////////////////////////////////////////////////////////////////// @@ -260,8 +314,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())); } -- 1.7.9.5