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
 |