Chris@102: /*////////////////////////////////////////////////////////////////////////////// Chris@102: Copyright (c) 2013 Jamboree Chris@102: Chris@102: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@102: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: //////////////////////////////////////////////////////////////////////////////*/ Chris@102: #ifndef BOOST_FUSION_FLATTEN_VIEW_HPP_INCLUDED Chris@102: #define BOOST_FUSION_FLATTEN_VIEW_HPP_INCLUDED Chris@102: Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: Chris@102: namespace boost { namespace fusion Chris@102: { Chris@102: struct forward_traversal_tag; Chris@102: struct flatten_view_tag; Chris@102: Chris@102: template Chris@102: struct flatten_view Chris@102: : sequence_base > Chris@102: { Chris@102: typedef flatten_view_tag fusion_tag; Chris@102: typedef fusion_sequence_tag tag; // this gets picked up by MPL Chris@102: typedef mpl::true_ is_view; Chris@102: typedef forward_traversal_tag category; Chris@102: Chris@102: typedef Sequence sequence_type; Chris@102: typedef typename result_of::begin::type first_type; Chris@102: typedef typename result_of::end::type last_type; Chris@102: Chris@102: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@102: explicit flatten_view(Sequence& seq) Chris@102: : seq(seq) Chris@102: {} Chris@102: Chris@102: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@102: first_type first() const { return fusion::begin(seq); } Chris@102: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@102: last_type last() const { return fusion::end(seq); } Chris@102: Chris@102: typename mpl::if_, Sequence, Sequence&>::type seq; Chris@102: }; Chris@102: }} Chris@102: Chris@102: namespace boost { namespace fusion { namespace extension Chris@102: { Chris@102: template<> Chris@102: struct begin_impl Chris@102: { Chris@102: template Chris@102: struct apply Chris@102: { Chris@102: typedef typename Sequence::first_type first_type; Chris@102: Chris@102: typedef typename Chris@102: result_of::begin< Chris@102: mpl::single_view< Chris@102: typename Sequence::sequence_type> >::type Chris@102: root_iterator; Chris@102: Chris@102: typedef Chris@102: detail::seek_descent Chris@102: seek_descent; Chris@102: Chris@102: typedef typename seek_descent::type type; Chris@102: Chris@102: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@102: static inline Chris@102: type call(Sequence& seq) Chris@102: { Chris@102: return seek_descent::apply(root_iterator(), seq.first()); Chris@102: } Chris@102: }; Chris@102: }; Chris@102: Chris@102: template<> Chris@102: struct end_impl Chris@102: { Chris@102: template Chris@102: struct apply Chris@102: { Chris@102: typedef typename Sequence::last_type last_type; Chris@102: Chris@102: typedef typename Chris@102: result_of::end< Chris@102: mpl::single_view< Chris@102: typename Sequence::sequence_type> >::type Chris@102: type; Chris@102: Chris@102: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@102: static inline Chris@102: type call(Sequence&) Chris@102: { Chris@102: return type(); Chris@102: } Chris@102: }; Chris@102: }; Chris@102: Chris@102: template<> Chris@102: struct size_impl Chris@102: { Chris@102: template Chris@102: struct apply Chris@102: : result_of::distance Chris@102: < Chris@102: typename result_of::begin::type Chris@102: , typename result_of::end::type Chris@102: > Chris@102: {}; Chris@102: }; Chris@102: Chris@102: template<> Chris@102: struct empty_impl Chris@102: { Chris@102: template Chris@102: struct apply Chris@102: : result_of::empty Chris@102: {}; Chris@102: }; Chris@102: }}} Chris@102: Chris@102: Chris@102: #endif