222 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			222 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/*=============================================================================
							 | 
						||
| 
								 | 
							
								    Copyright (c) 2001-2011 Joel de Guzman
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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(FUSION_BOOST_TUPLE_ITERATOR_09262006_1851)
							 | 
						||
| 
								 | 
							
								#define FUSION_BOOST_TUPLE_ITERATOR_09262006_1851
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/support/config.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/iterator/iterator_facade.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/type_traits/is_const.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/type_traits/add_const.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/identity.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/if.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/eval_if.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/or.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/plus.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/int.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/apply.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/tuple/tuple.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace fusion
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    struct forward_traversal_tag;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace detail
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename T>
							 | 
						||
| 
								 | 
							
								        struct boost_tuple_is_empty : mpl::false_ {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <>
							 | 
						||
| 
								 | 
							
								        struct boost_tuple_is_empty<tuples::null_type> : mpl::true_ {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <>
							 | 
						||
| 
								 | 
							
								        struct boost_tuple_is_empty<tuples::null_type const> : mpl::true_ {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <>
							 | 
						||
| 
								 | 
							
								        struct boost_tuple_is_empty<tuples::tuple<> > : mpl::true_ {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <>
							 | 
						||
| 
								 | 
							
								        struct boost_tuple_is_empty<tuples::tuple<> const> : mpl::true_ {};
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Cons>
							 | 
						||
| 
								 | 
							
								    struct boost_tuple_iterator_identity;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Cons = tuples::null_type>
							 | 
						||
| 
								 | 
							
								    struct boost_tuple_iterator
							 | 
						||
| 
								 | 
							
								        : iterator_facade<boost_tuple_iterator<Cons>, forward_traversal_tag>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        typedef Cons cons_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        typedef boost_tuple_iterator_identity<
							 | 
						||
| 
								 | 
							
								            typename add_const<Cons>::type> identity;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								        explicit boost_tuple_iterator(Cons& in_cons)
							 | 
						||
| 
								 | 
							
								            : cons(in_cons) {}
							 | 
						||
| 
								 | 
							
								        Cons& cons;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename Iterator>
							 | 
						||
| 
								 | 
							
								        struct value_of : mpl::identity<typename Iterator::cons_type::head_type> {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename Iterator>
							 | 
						||
| 
								 | 
							
								        struct deref
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef typename value_of<Iterator>::type element;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef typename
							 | 
						||
| 
								 | 
							
								                mpl::if_<
							 | 
						||
| 
								 | 
							
								                    is_const<typename Iterator::cons_type>
							 | 
						||
| 
								 | 
							
								                  , typename tuples::access_traits<element>::const_type
							 | 
						||
| 
								 | 
							
								                  , typename tuples::access_traits<element>::non_const_type
							 | 
						||
| 
								 | 
							
								                >::type
							 | 
						||
| 
								 | 
							
								            type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								            static type
							 | 
						||
| 
								 | 
							
								            call(Iterator const& iter)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return iter.cons.get_head();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename Iterator>
							 | 
						||
| 
								 | 
							
								        struct next
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef typename Iterator::cons_type cons_type;
							 | 
						||
| 
								 | 
							
								            typedef typename cons_type::tail_type tail_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef boost_tuple_iterator<
							 | 
						||
| 
								 | 
							
								                typename mpl::eval_if<
							 | 
						||
| 
								 | 
							
								                    is_const<cons_type>
							 | 
						||
| 
								 | 
							
								                  , add_const<tail_type>
							 | 
						||
| 
								 | 
							
								                  , mpl::identity<tail_type>
							 | 
						||
| 
								 | 
							
								                >::type>
							 | 
						||
| 
								 | 
							
								            type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								            static type
							 | 
						||
| 
								 | 
							
								            call(Iterator const& iter)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return type(iter.cons.get_tail());
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename I1, typename I2>
							 | 
						||
| 
								 | 
							
								        struct distance;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // detail
							 | 
						||
| 
								 | 
							
								        template <typename I1, typename I2>
							 | 
						||
| 
								 | 
							
								        struct lazy_next_distance
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef
							 | 
						||
| 
								 | 
							
								                typename mpl::plus<
							 | 
						||
| 
								 | 
							
								                    mpl::int_<1>,
							 | 
						||
| 
								 | 
							
								                    typename distance<
							 | 
						||
| 
								 | 
							
								                        typename next<I1>::type,
							 | 
						||
| 
								 | 
							
								                        I2
							 | 
						||
| 
								 | 
							
								                    >::type
							 | 
						||
| 
								 | 
							
								                >::type type;
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename I1, typename I2>
							 | 
						||
| 
								 | 
							
								        struct distance
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef typename mpl::eval_if<
							 | 
						||
| 
								 | 
							
								                boost::is_same<I1, I2>,
							 | 
						||
| 
								 | 
							
								                mpl::int_<0>,
							 | 
						||
| 
								 | 
							
								                lazy_next_distance<I1, I2>
							 | 
						||
| 
								 | 
							
								            >::type type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								            static type
							 | 
						||
| 
								 | 
							
								            call(I1 const&, I2 const&)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return type();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename I1, typename I2>
							 | 
						||
| 
								 | 
							
								        struct equal_to
							 | 
						||
| 
								 | 
							
								            : is_same<typename I1::identity, typename I2::identity>
							 | 
						||
| 
								 | 
							
								        {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private:
							 | 
						||
| 
								 | 
							
								        // silence MSVC warning C4512: assignment operator could not be generated
							 | 
						||
| 
								 | 
							
								        boost_tuple_iterator& operator= (boost_tuple_iterator const&);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Null>
							 | 
						||
| 
								 | 
							
								    struct boost_tuple_null_iterator
							 | 
						||
| 
								 | 
							
								        : iterator_facade<boost_tuple_iterator<Null>, forward_traversal_tag>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        typedef Null cons_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        typedef boost_tuple_iterator_identity<
							 | 
						||
| 
								 | 
							
								            typename add_const<Null>::type> identity;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename I1, typename I2>
							 | 
						||
| 
								 | 
							
								        struct equal_to
							 | 
						||
| 
								 | 
							
								            : mpl::or_<
							 | 
						||
| 
								 | 
							
								                is_same<I1, I2>
							 | 
						||
| 
								 | 
							
								              , mpl::and_<
							 | 
						||
| 
								 | 
							
								                    detail::boost_tuple_is_empty<typename I1::cons_type>
							 | 
						||
| 
								 | 
							
								                  , detail::boost_tuple_is_empty<typename I2::cons_type>
							 | 
						||
| 
								 | 
							
								                >
							 | 
						||
| 
								 | 
							
								            >
							 | 
						||
| 
								 | 
							
								        {};
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <>
							 | 
						||
| 
								 | 
							
								    struct boost_tuple_iterator<tuples::null_type>
							 | 
						||
| 
								 | 
							
								        : boost_tuple_null_iterator<tuples::null_type>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Cons>
							 | 
						||
| 
								 | 
							
								        BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								        explicit boost_tuple_iterator(Cons const&) {}
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <>
							 | 
						||
| 
								 | 
							
								    struct boost_tuple_iterator<tuples::null_type const>
							 | 
						||
| 
								 | 
							
								        : boost_tuple_null_iterator<tuples::null_type const>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Cons>
							 | 
						||
| 
								 | 
							
								        BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								        explicit boost_tuple_iterator(Cons const&) {}
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <>
							 | 
						||
| 
								 | 
							
								    struct boost_tuple_iterator<tuples::tuple<> >
							 | 
						||
| 
								 | 
							
								        : boost_tuple_null_iterator<tuples::tuple<> >
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Cons>
							 | 
						||
| 
								 | 
							
								        BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								        explicit boost_tuple_iterator(Cons const&) {}
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <>
							 | 
						||
| 
								 | 
							
								    struct boost_tuple_iterator<tuples::tuple<> const>
							 | 
						||
| 
								 | 
							
								        : boost_tuple_null_iterator<tuples::tuple<> const>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Cons>
							 | 
						||
| 
								 | 
							
								        BOOST_FUSION_GPU_ENABLED
							 | 
						||
| 
								 | 
							
								        explicit boost_tuple_iterator(Cons const&) {}
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								}}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
							 | 
						||
| 
								 | 
							
								namespace std
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    template <typename Cons>
							 | 
						||
| 
								 | 
							
								    struct iterator_traits< ::boost::fusion::boost_tuple_iterator<Cons> >
							 | 
						||
| 
								 | 
							
								    { };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |