Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman 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_JOINT_VIEW_07162005_0140) Chris@16: #define FUSION_JOINT_VIEW_07162005_0140 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: #include Chris@16: Chris@16: namespace boost { namespace fusion Chris@16: { Chris@16: struct joint_view_tag; Chris@16: struct forward_traversal_tag; Chris@16: struct fusion_sequence_tag; Chris@16: Chris@16: template Chris@16: struct joint_view : sequence_base > Chris@16: { Chris@16: typedef joint_view_tag fusion_tag; Chris@16: typedef fusion_sequence_tag tag; // this gets picked up by MPL Chris@16: typedef typename Chris@16: mpl::eval_if< Chris@16: mpl::and_< Chris@16: traits::is_associative Chris@16: , traits::is_associative Chris@16: > Chris@16: , mpl::inherit2 Chris@16: , mpl::identity Chris@16: >::type Chris@16: category; Chris@16: typedef mpl::true_ is_view; Chris@16: Chris@16: typedef typename result_of::begin::type first_type; Chris@16: typedef typename result_of::end::type last_type; Chris@16: typedef typename result_of::begin::type concat_type; Chris@16: typedef typename result_of::end::type concat_last_type; Chris@16: typedef typename mpl::int_< Chris@16: result_of::size::value + result_of::size::value> Chris@16: size; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: joint_view(Sequence1& in_seq1, Sequence2& in_seq2) Chris@16: : seq1(in_seq1) Chris@16: , seq2(in_seq2) Chris@16: {} Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: first_type first() const { return fusion::begin(seq1); } Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: concat_type concat() const { return fusion::begin(seq2); } Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: concat_last_type concat_last() const { return fusion::end(seq2); } Chris@16: Chris@16: private: Chris@16: // silence MSVC warning C4512: assignment operator could not be generated Chris@16: joint_view& operator= (joint_view const&); Chris@16: Chris@16: typename mpl::if_, Sequence1, Sequence1&>::type seq1; Chris@16: typename mpl::if_, Sequence2, Sequence2&>::type seq2; Chris@16: }; Chris@16: }} Chris@16: Chris@16: #endif Chris@16: Chris@16: