176 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*=============================================================================
 | |
|     Copyright (c) 2005-2013 Joel de Guzman
 | |
|     Copyright (c) 2005-2006 Dan Marsden
 | |
| 
 | |
|     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_MAP_ITERATOR_02042013_0835)
 | |
| #define BOOST_FUSION_MAP_ITERATOR_02042013_0835
 | |
| 
 | |
| #include <boost/fusion/support/config.hpp>
 | |
| #include <boost/fusion/iterator/iterator_facade.hpp>
 | |
| #include <boost/mpl/minus.hpp>
 | |
| #include <boost/mpl/equal_to.hpp>
 | |
| #include <boost/mpl/if.hpp>
 | |
| #include <boost/utility/declval.hpp>
 | |
| #include <boost/type_traits/is_const.hpp>
 | |
| #include <boost/type_traits/add_const.hpp>
 | |
| 
 | |
| namespace boost { namespace fusion
 | |
| {
 | |
|     struct random_access_traversal_tag;
 | |
| 
 | |
|     template <typename Seq, int Pos>
 | |
|     struct map_iterator
 | |
|         : iterator_facade<
 | |
|             map_iterator<Seq, Pos>
 | |
|           , typename Seq::category>
 | |
|     {
 | |
|         typedef Seq sequence;
 | |
|         typedef mpl::int_<Pos> index;
 | |
| 
 | |
|         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | |
|         map_iterator(Seq& seq)
 | |
|             : seq_(seq)
 | |
|         {}
 | |
| 
 | |
|         template<typename Iterator>
 | |
|         struct value_of
 | |
|         {
 | |
|             typedef typename Iterator::sequence sequence;
 | |
|             typedef typename Iterator::index index;
 | |
|             typedef
 | |
|                 decltype(boost::declval<sequence>().get_val(index()))
 | |
|             type;
 | |
|         };
 | |
| 
 | |
|         template<typename Iterator>
 | |
|         struct value_of_data
 | |
|         {
 | |
|             typedef typename Iterator::sequence sequence;
 | |
|             typedef typename Iterator::index index;
 | |
|             typedef
 | |
|                 decltype(boost::declval<sequence>().get_val(index()).second)
 | |
|             type;
 | |
|         };
 | |
| 
 | |
|         template<typename Iterator>
 | |
|         struct key_of
 | |
|         {
 | |
|             typedef typename Iterator::sequence sequence;
 | |
|             typedef typename Iterator::index index;
 | |
|             typedef decltype(boost::declval<sequence>().get_key(index())) key_identity_type;
 | |
|             typedef typename key_identity_type::type type;
 | |
|         };
 | |
| 
 | |
|         template<typename Iterator>
 | |
|         struct deref
 | |
|         {
 | |
|             typedef typename Iterator::sequence sequence;
 | |
|             typedef typename Iterator::index index;
 | |
|             typedef
 | |
|                 decltype(boost::declval<sequence>().get(index()))
 | |
|             type;
 | |
| 
 | |
|             BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | |
|             static type
 | |
|             call(Iterator const& it)
 | |
|             {
 | |
|                 return it.seq_.get(typename Iterator::index());
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         template<typename Iterator>
 | |
|         struct deref_data
 | |
|         {
 | |
|             typedef typename Iterator::sequence sequence;
 | |
|             typedef typename Iterator::index index;
 | |
| 
 | |
|             typedef decltype(boost::declval<sequence>().get(index()).second) second_type_;
 | |
| 
 | |
|             typedef typename
 | |
|                 mpl::if_<
 | |
|                     is_const<sequence>
 | |
|                   , typename add_const<second_type_>::type
 | |
|                   , second_type_
 | |
|                 >::type
 | |
|             second_type;
 | |
| 
 | |
|             typedef typename add_reference<second_type>::type type;
 | |
| 
 | |
|             BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | |
|             static type
 | |
|             call(Iterator const& it)
 | |
|             {
 | |
|                 return it.seq_.get(typename Iterator::index()).second;
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         template <typename Iterator, typename N>
 | |
|         struct advance
 | |
|         {
 | |
|             typedef typename Iterator::index index;
 | |
|             typedef typename Iterator::sequence sequence;
 | |
|             typedef map_iterator<sequence, index::value + N::value> type;
 | |
| 
 | |
|             BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | |
|             static type
 | |
|             call(Iterator const& i)
 | |
|             {
 | |
|                 return type(i.seq_);
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         template<typename Iterator>
 | |
|         struct next
 | |
|             : advance<Iterator, mpl::int_<1> >
 | |
|         {};
 | |
| 
 | |
|         template<typename Iterator>
 | |
|         struct prior
 | |
|             : advance<Iterator, mpl::int_<-1> >
 | |
|         {};
 | |
| 
 | |
|         template <typename I1, typename I2>
 | |
|         struct distance
 | |
|         {
 | |
|             typedef typename
 | |
|                 mpl::minus<
 | |
|                     typename I2::index, typename I1::index
 | |
|                 >::type
 | |
|             type;
 | |
| 
 | |
|             BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | |
|             static type
 | |
|             call(I1 const&, I2 const&)
 | |
|             {
 | |
|                 return type();
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         template<typename I1, typename I2>
 | |
|         struct equal_to
 | |
|             : mpl::equal_to<typename I1::index, typename I2::index>
 | |
|         {};
 | |
| 
 | |
|         Seq& seq_;
 | |
| 
 | |
|     private:
 | |
|         // silence MSVC warning C4512: assignment operator could not be generated
 | |
|         map_iterator& operator= (map_iterator const&);
 | |
|     };
 | |
| 
 | |
| }}
 | |
| 
 | |
| #ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
 | |
| namespace std
 | |
| {
 | |
|     template <typename Seq, int Pos>
 | |
|     struct iterator_traits< ::boost::fusion::map_iterator<Seq, Pos> >
 | |
|     { };
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 | 
