Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman Chris@16: Copyright (c) 2006 Dan Marsden Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #if !defined(FUSION_ZIP_VIEW_23012006_0813) Chris@16: #define FUSION_ZIP_VIEW_23012006_0813 Chris@16: Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace fusion { Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct all_references Chris@16: : fusion::result_of::equal_to > >::type, typename fusion::result_of::end::type> Chris@16: {}; Chris@16: Chris@16: struct seq_ref_size Chris@16: { Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: static int const high_int = static_cast( Chris@16: (static_cast(~0) >> 1) - 1); Chris@16: Chris@16: typedef typename remove_reference::type SeqClass; Chris@16: Chris@16: typedef typename mpl::eval_if< Chris@16: traits::is_forward, Chris@16: result_of::size, Chris@16: mpl::int_ >::type type; Chris@16: }; Chris@16: Chris@16: // never called, but needed for decltype-based result_of (C++0x) Chris@16: #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@16: template Chris@101: BOOST_FUSION_GPU_ENABLED Chris@16: typename result::type Chris@16: operator()(Seq&&) const; Chris@16: #endif Chris@16: }; Chris@16: Chris@16: struct poly_min Chris@16: { Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef typename remove_reference::type lhs; Chris@16: typedef typename remove_reference::type rhs; Chris@16: typedef typename mpl::min::type type; Chris@16: }; Chris@16: Chris@16: // never called, but needed for decltype-based result_of (C++0x) Chris@16: #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@16: template Chris@101: BOOST_FUSION_GPU_ENABLED Chris@16: typename result::type Chris@16: operator()(Lhs&&, Rhs&&) const; Chris@16: #endif Chris@16: }; Chris@16: Chris@16: template Chris@16: struct min_size Chris@16: { Chris@16: typedef typename result_of::transform::type sizes; Chris@16: typedef typename result_of::fold::type, detail::poly_min>::type type; Chris@16: }; Chris@16: } Chris@16: Chris@16: struct zip_view_tag; Chris@16: struct fusion_sequence_tag; Chris@16: Chris@16: template Chris@16: struct zip_view : sequence_base< zip_view > Chris@16: { Chris@16: typedef typename result_of::remove::type real_sequences; Chris@16: BOOST_MPL_ASSERT((detail::all_references)); Chris@16: typedef typename detail::strictest_traversal::type category; Chris@16: typedef zip_view_tag fusion_tag; Chris@16: typedef fusion_sequence_tag tag; // this gets picked up by MPL Chris@16: typedef mpl::true_ is_view; Chris@16: typedef typename fusion::result_of::as_vector::type sequences; Chris@16: typedef typename detail::min_size::type size; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: zip_view( Chris@16: const Sequences& seqs) Chris@16: : sequences_(seqs) Chris@16: {}; Chris@16: Chris@16: sequences sequences_; Chris@16: }; Chris@16: }} Chris@16: Chris@16: #endif