149 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*=============================================================================
 | |
|     Copyright (c) 2011 Eric Niebler
 | |
| 
 | |
|     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)
 | |
| ==============================================================================*/
 | |
| #if !defined(BOOST_FUSION_SEGMENTED_ITERATOR_SEGMENTED_ITERATOR_HPP_INCLUDED)
 | |
| #define BOOST_FUSION_SEGMENTED_ITERATOR_SEGMENTED_ITERATOR_HPP_INCLUDED
 | |
| 
 | |
| #include <boost/fusion/support/config.hpp>
 | |
| #include <boost/mpl/bool.hpp>
 | |
| #include <boost/fusion/sequence/intrinsic_fwd.hpp>
 | |
| #include <boost/fusion/iterator/iterator_facade.hpp>
 | |
| #include <boost/fusion/iterator/deref.hpp>
 | |
| #include <boost/fusion/iterator/deref_data.hpp>
 | |
| #include <boost/fusion/iterator/key_of.hpp>
 | |
| #include <boost/fusion/iterator/value_of.hpp>
 | |
| #include <boost/fusion/iterator/value_of_data.hpp>
 | |
| #include <boost/fusion/iterator/detail/segmented_equal_to.hpp>
 | |
| 
 | |
| namespace boost { namespace fusion
 | |
| {
 | |
|     struct nil_;
 | |
| 
 | |
|     namespace detail
 | |
|     {
 | |
|         template <typename Stack>
 | |
|         struct segmented_next_impl;
 | |
|     }
 | |
| 
 | |
|     // A segmented iterator wraps a "context", which is a cons list
 | |
|     // of ranges, the frontmost is range over values and the rest
 | |
|     // are ranges over internal segments.
 | |
|     template <typename Context>
 | |
|     struct segmented_iterator
 | |
|       : iterator_facade<segmented_iterator<Context>, forward_traversal_tag>
 | |
|     {
 | |
|         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED explicit segmented_iterator(Context const& ctx)
 | |
|           : context(ctx)
 | |
|         {}
 | |
| 
 | |
|         //auto deref(it)
 | |
|         //{
 | |
|         //  return deref(begin(car(it.context)))
 | |
|         //}
 | |
|         template <typename It>
 | |
|         struct deref
 | |
|         {
 | |
|             typedef
 | |
|                 typename result_of::deref<
 | |
|                     typename It::context_type::car_type::begin_type
 | |
|                 >::type
 | |
|             type;
 | |
| 
 | |
|             BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | |
|             static type call(It const& it)
 | |
|             {
 | |
|                 return *it.context.car.first;
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         //auto deref_data(it)
 | |
|         //{
 | |
|         //  return deref_data(begin(car(it.context)))
 | |
|         //}
 | |
|         template <typename It>
 | |
|         struct deref_data
 | |
|         {
 | |
|             typedef
 | |
|                 typename result_of::deref_data<
 | |
|                     typename It::context_type::car_type::begin_type
 | |
|                 >::type
 | |
|             type;
 | |
| 
 | |
|             BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | |
|             static type call(It const& it)
 | |
|             {
 | |
|                 return fusion::deref_data(it.context.car.first);
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         //auto key_of(it)
 | |
|         //{
 | |
|         //  return key_of(begin(car(it.context)))
 | |
|         //}
 | |
|         template <typename It>
 | |
|         struct key_of
 | |
|           : result_of::key_of<typename It::context_type::car_type::begin_type>
 | |
|         {};
 | |
| 
 | |
|         //auto value_of(it)
 | |
|         //{
 | |
|         //  return value_of(begin(car(it.context)))
 | |
|         //}
 | |
|         template <typename It>
 | |
|         struct value_of
 | |
|           : result_of::value_of<typename It::context_type::car_type::begin_type>
 | |
|         {};
 | |
| 
 | |
|         //auto value_of_data(it)
 | |
|         //{
 | |
|         //  return value_of_data(begin(car(it.context)))
 | |
|         //}
 | |
|         template <typename It>
 | |
|         struct value_of_data
 | |
|           : result_of::value_of_data<typename It::context_type::car_type::begin_type>
 | |
|         {};
 | |
| 
 | |
|         // Compare all the segment iterators in each stack, starting with
 | |
|         // the bottom-most.
 | |
|         template <
 | |
|             typename It1
 | |
|           , typename It2
 | |
|           , int Size1 = It1::context_type::size::value
 | |
|           , int Size2 = It2::context_type::size::value
 | |
|         >
 | |
|         struct equal_to
 | |
|           : mpl::false_
 | |
|         {};
 | |
| 
 | |
|         template <typename It1, typename It2, int Size>
 | |
|         struct equal_to<It1, It2, Size, Size>
 | |
|           : detail::segmented_equal_to<
 | |
|                 typename It1::context_type
 | |
|               , typename It2::context_type
 | |
|             >
 | |
|         {};
 | |
| 
 | |
|         template <typename It>
 | |
|         struct next
 | |
|         {
 | |
|             typedef detail::segmented_next_impl<typename It::context_type> impl;
 | |
|             typedef segmented_iterator<typename impl::type> type;
 | |
| 
 | |
|             BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | |
|             static type call(It const& it)
 | |
|             {
 | |
|                 return type(impl::call(it.context));
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         typedef Context context_type;
 | |
|         context_type context;
 | |
|     };
 | |
| 
 | |
| }}
 | |
| 
 | |
| #endif
 | 
