134 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			134 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/*==============================================================================
							 | 
						||
| 
								 | 
							
								    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 <boost/fusion/support/config.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/bool.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/single_view.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/support/detail/access.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/support/is_view.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/support/category_of.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/support/sequence_base.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/sequence/intrinsic/begin.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/sequence/intrinsic/end.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/view/flatten_view/flatten_view_iterator.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace fusion
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    struct forward_traversal_tag;
							 | 
						||
| 
								 | 
							
								    struct flatten_view_tag;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Sequence>
							 | 
						||
| 
								 | 
							
								    struct flatten_view
							 | 
						||
| 
								 | 
							
								      : sequence_base<flatten_view<Sequence> >
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        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;
							 | 
						||
| 
								 | 
							
								        typedef typename result_of::begin<Sequence>::type first_type;
							 | 
						||
| 
								 | 
							
								        typedef typename result_of::end<Sequence>::type last_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								        explicit flatten_view(Sequence& seq)
							 | 
						||
| 
								 | 
							
								          : seq(seq)
							 | 
						||
| 
								 | 
							
								        {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								        first_type first() const { return fusion::begin(seq); }
							 | 
						||
| 
								 | 
							
								        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								        last_type last() const { return fusion::end(seq); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        typename mpl::if_<traits::is_view<Sequence>, Sequence, Sequence&>::type seq;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								}}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace fusion { namespace extension
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    template<>
							 | 
						||
| 
								 | 
							
								    struct begin_impl<flatten_view_tag>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template<typename Sequence>
							 | 
						||
| 
								 | 
							
								        struct apply
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef typename Sequence::first_type first_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef typename
							 | 
						||
| 
								 | 
							
								                    result_of::begin<
							 | 
						||
| 
								 | 
							
								                        mpl::single_view<
							 | 
						||
| 
								 | 
							
								                            typename Sequence::sequence_type> >::type
							 | 
						||
| 
								 | 
							
								            root_iterator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef
							 | 
						||
| 
								 | 
							
								                detail::seek_descent<root_iterator, first_type>
							 | 
						||
| 
								 | 
							
								            seek_descent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef typename seek_descent::type type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								            static inline
							 | 
						||
| 
								 | 
							
								            type call(Sequence& seq)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return seek_descent::apply(root_iterator(), seq.first());
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<>
							 | 
						||
| 
								 | 
							
								    struct end_impl<flatten_view_tag>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template<typename Sequence>
							 | 
						||
| 
								 | 
							
								        struct apply
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef typename Sequence::last_type last_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef typename
							 | 
						||
| 
								 | 
							
								                    result_of::end<
							 | 
						||
| 
								 | 
							
								                        mpl::single_view<
							 | 
						||
| 
								 | 
							
								                            typename Sequence::sequence_type> >::type
							 | 
						||
| 
								 | 
							
								            type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								            static inline
							 | 
						||
| 
								 | 
							
								            type call(Sequence&)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return type();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<>
							 | 
						||
| 
								 | 
							
								    struct size_impl<flatten_view_tag>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Sequence>
							 | 
						||
| 
								 | 
							
								        struct apply
							 | 
						||
| 
								 | 
							
								          : result_of::distance
							 | 
						||
| 
								 | 
							
								            <
							 | 
						||
| 
								 | 
							
								                typename result_of::begin<Sequence>::type
							 | 
						||
| 
								 | 
							
								              , typename result_of::end<Sequence>::type
							 | 
						||
| 
								 | 
							
								            >
							 | 
						||
| 
								 | 
							
								        {};
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<>
							 | 
						||
| 
								 | 
							
								    struct empty_impl<flatten_view_tag>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Sequence>
							 | 
						||
| 
								 | 
							
								        struct apply
							 | 
						||
| 
								 | 
							
								          : result_of::empty<typename Sequence::sequence_type>
							 | 
						||
| 
								 | 
							
								        {};
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								}}}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |