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
 | 
