diff --git a/include/boost/fusion/sequence/view/zip_view/detail/end_impl.hpp b/include/boost/fusion/sequence/view/zip_view/detail/end_impl.hpp index c6a10e9e..95735da8 100644 --- a/include/boost/fusion/sequence/view/zip_view/detail/end_impl.hpp +++ b/include/boost/fusion/sequence/view/zip_view/detail/end_impl.hpp @@ -9,12 +9,17 @@ #if !defined(FUSION_END_IMPL_20060123_2208) #define FUSION_END_IMPL_20060123_2208 -#include #include +#include +#include +#include +#include +#include #include #include #include #include +#include namespace boost { namespace fusion { @@ -22,29 +27,30 @@ namespace boost { namespace fusion { namespace detail { - struct poly_end + template + struct endpoints { template struct result - : result_of::end::type> { - BOOST_MPL_ASSERT((is_reference)); + typedef typename remove_reference::type Seq; + typedef typename result_of::begin::type begin; + typedef typename result_of::advance::type type; }; template typename result::type operator()(Seq& seq) const { - return fusion::end(seq); + return fusion::advance(fusion::begin(seq)); } template typename result::type - operator()(Seq const& seq) const + operator()(Seq const& seq) { - return fusion::end(seq); + return fusion::advance(fusion::begin(seq)); } - }; } @@ -60,19 +66,16 @@ namespace boost { namespace fusion { struct apply { typedef zip_view_iterator< - typename result_of::transform::type, + typename result_of::transform >::type, typename Sequence::category> type; static type call(Sequence& sequence) { return type( - fusion::transform(sequence.sequences_, detail::poly_end())); + fusion::transform(sequence.sequences_, detail::endpoints())); } }; - - - }; } }} diff --git a/include/boost/fusion/sequence/view/zip_view/detail/size_impl.hpp b/include/boost/fusion/sequence/view/zip_view/detail/size_impl.hpp index 692c9d3f..d6d576f2 100644 --- a/include/boost/fusion/sequence/view/zip_view/detail/size_impl.hpp +++ b/include/boost/fusion/sequence/view/zip_view/detail/size_impl.hpp @@ -9,38 +9,9 @@ #if !defined(FUSION_SIZE_IMPL_20060124_0800) #define FUSION_SIZE_IMPL_20060124_0800 -#include -#include -#include -#include -#include -#include -#include -#include -#include - namespace boost { namespace fusion { struct zip_view_tag; - struct random_access_iterator_tag; - - namespace detail - { - template - struct zip_view_size - { - typedef result_of::find_if< - typename Sequence::sequences, - is_same >, random_access_iterator_tag> > finder; - - typedef typename remove_reference::type>, - result_of::value_at_c, - result_of::deref >::type>::type best_sequence; - - typedef typename fusion::result_of::size type; - }; - } namespace extension { @@ -55,7 +26,7 @@ namespace boost { namespace fusion { { template struct apply - : detail::zip_view_size::type + : Sequence::size {}; }; } diff --git a/include/boost/fusion/sequence/view/zip_view/zip_view.hpp b/include/boost/fusion/sequence/view/zip_view/zip_view.hpp index 5448ab95..ef9d6a8c 100644 --- a/include/boost/fusion/sequence/view/zip_view/zip_view.hpp +++ b/include/boost/fusion/sequence/view/zip_view/zip_view.hpp @@ -44,22 +44,28 @@ namespace boost { namespace fusion { : fusion::result_of::equal_to > >::type, typename fusion::result_of::end::type> {}; - template - struct all_same_size_impl + struct seq_ref_size { - typedef mpl::transform_view > > sizes; - typedef typename mpl::at_c::type first_size; - typedef mpl::iterator_range< - typename mpl::next::type>::type, - typename mpl::end::type> remainder; - typedef typename mpl::find_if > >::type found_difference; - typedef typename is_same::type>::type type; + template + struct result + : result_of::size::type> + {}; + }; + + struct poly_min + { + template + struct result + : mpl::min + {}; }; template - struct all_same_size - : all_same_size_impl::type - {}; + struct min_size + { + typedef typename result_of::transform::type sizes; + typedef typename result_of::fold::type, detail::poly_min>::type type; + }; } struct zip_view_tag; @@ -69,12 +75,12 @@ namespace boost { namespace fusion { struct zip_view : sequence_base< zip_view > { BOOST_MPL_ASSERT((detail::all_references)); - BOOST_MPL_ASSERT((detail::all_same_size)); typedef typename detail::strictest_traversal::type category; typedef zip_view_tag fusion_tag; typedef fusion_sequence_tag tag; // this gets picked up by MPL typedef mpl::true_ is_view; typedef typename fusion::result_of::as_vector::type sequences; + typedef typename detail::min_size::type size; zip_view( const Sequences& seqs)