/*////////////////////////////////////////////////////////////////////////////// Copyright (c) 2013 Jamboree Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) //////////////////////////////////////////////////////////////////////////////*/ #ifndef BOOST_FUSION_FLATTEN_VIEW_HPP_INCLUDED #define BOOST_FUSION_FLATTEN_VIEW_HPP_INCLUDED #include #include #include #include #include #include #include #include #include #include namespace boost { namespace fusion { struct forward_traversal_tag; struct flatten_view_tag; template struct flatten_view : sequence_base > { typedef flatten_view_tag fusion_tag; typedef fusion_sequence_tag tag; // this gets picked up by MPL typedef mpl::true_ is_view; typedef forward_traversal_tag category; typedef Sequence sequence_type; explicit flatten_view(Sequence& seq) : seq(seq) {} typename mpl::if_, Sequence, Sequence&>::type seq; }; }} namespace boost { namespace fusion { namespace detail { struct wrap_flatten { template struct result; template struct result { typedef typename remove_reference::type value_type; typedef typename mpl::if_, flatten_view, single_view >::type type; }; template typename result::type operator()(T& elem) const { return typename result::type(elem); } }; }}} namespace boost { namespace fusion { namespace extension { template <> struct is_segmented_impl { template struct apply : mpl::true_ {}; }; template <> struct segments_impl { template struct apply { typedef transform_view type; static inline type call(Sequence &seq) { return type(seq.seq, detail::wrap_flatten()); } }; }; }}} #endif