157 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*=============================================================================
 | 
						|
    Copyright (c) 2009 Christopher Schmidt
 | 
						|
 | 
						|
    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_ITERATOR_BASIC_ITERATOR_HPP
 | 
						|
#define BOOST_FUSION_ITERATOR_BASIC_ITERATOR_HPP
 | 
						|
 | 
						|
#include <boost/fusion/support/config.hpp>
 | 
						|
#include <boost/fusion/iterator/iterator_facade.hpp>
 | 
						|
 | 
						|
#include <boost/mpl/and.hpp>
 | 
						|
#include <boost/mpl/equal_to.hpp>
 | 
						|
#include <boost/mpl/minus.hpp>
 | 
						|
#include <boost/mpl/int.hpp>
 | 
						|
#include <boost/type_traits/is_same.hpp>
 | 
						|
#include <boost/type_traits/remove_const.hpp>
 | 
						|
 | 
						|
namespace boost { namespace fusion
 | 
						|
{
 | 
						|
    namespace extension
 | 
						|
    {
 | 
						|
        template <typename>
 | 
						|
        struct value_of_impl;
 | 
						|
 | 
						|
        template <typename>
 | 
						|
        struct deref_impl;
 | 
						|
 | 
						|
        template <typename>
 | 
						|
        struct value_of_data_impl;
 | 
						|
 | 
						|
        template <typename>
 | 
						|
        struct key_of_impl;
 | 
						|
 | 
						|
        template <typename>
 | 
						|
        struct deref_data_impl;
 | 
						|
    }
 | 
						|
 | 
						|
    template<typename Tag, typename Category, typename Seq, int Index>
 | 
						|
    struct basic_iterator
 | 
						|
      : iterator_facade<basic_iterator<Tag, Category, Seq, Index>, Category>
 | 
						|
    {
 | 
						|
        typedef mpl::int_<Index> index;
 | 
						|
        typedef Seq seq_type;
 | 
						|
 | 
						|
        template <typename It>
 | 
						|
        struct value_of
 | 
						|
          : extension::value_of_impl<Tag>::template apply<It>
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename It>
 | 
						|
        struct deref
 | 
						|
          : extension::deref_impl<Tag>::template apply<It>
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename It>
 | 
						|
        struct value_of_data
 | 
						|
          : extension::value_of_data_impl<Tag>::template apply<It>
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename It>
 | 
						|
        struct key_of
 | 
						|
          : extension::key_of_impl<Tag>::template apply<It>
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename It>
 | 
						|
        struct deref_data
 | 
						|
          : extension::deref_data_impl<Tag>::template apply<It>
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename It, typename N>
 | 
						|
        struct advance
 | 
						|
        {
 | 
						|
            typedef
 | 
						|
                basic_iterator<Tag, Category, Seq, Index + N::value>
 | 
						|
            type;
 | 
						|
 | 
						|
            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | 
						|
            static type
 | 
						|
            call(It const& it)
 | 
						|
            {
 | 
						|
                return type(*it.seq,0);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        template <typename It>
 | 
						|
        struct next
 | 
						|
          : advance<It, mpl::int_<1> >
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename It>
 | 
						|
        struct prior
 | 
						|
          : advance<It, mpl::int_<-1> >
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename It1, typename It2>
 | 
						|
        struct distance
 | 
						|
        {
 | 
						|
            typedef mpl::minus<typename It2::index, typename It1::index> type;
 | 
						|
 | 
						|
            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | 
						|
            static
 | 
						|
            type
 | 
						|
            call(It1 const&, It2 const&)
 | 
						|
            {
 | 
						|
                return type();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        template <typename It1, typename It2>
 | 
						|
        struct equal_to
 | 
						|
          : mpl::and_<
 | 
						|
                is_same<
 | 
						|
                    typename remove_const<typename It1::seq_type>::type
 | 
						|
                  , typename remove_const<typename It2::seq_type>::type
 | 
						|
                >
 | 
						|
              , mpl::equal_to<typename It1::index,typename It2::index>
 | 
						|
            >
 | 
						|
        {};
 | 
						|
 | 
						|
        template<typename OtherSeq>
 | 
						|
        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | 
						|
        basic_iterator(basic_iterator<Tag,Category,OtherSeq,Index> const& it)
 | 
						|
          : seq(it.seq)
 | 
						|
        {}
 | 
						|
 | 
						|
        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | 
						|
        basic_iterator(Seq& in_seq, int)
 | 
						|
          : seq(&in_seq)
 | 
						|
        {}
 | 
						|
 | 
						|
        template<typename OtherSeq>
 | 
						|
        BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | 
						|
        basic_iterator&
 | 
						|
        operator=(basic_iterator<Tag,Category,OtherSeq,Index> const& it)
 | 
						|
        {
 | 
						|
            seq=it.seq;
 | 
						|
            return *this;
 | 
						|
        }
 | 
						|
 | 
						|
        Seq* seq;
 | 
						|
    };
 | 
						|
}}
 | 
						|
 | 
						|
#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
 | 
						|
namespace std
 | 
						|
{
 | 
						|
    template <typename Tag, typename Category, typename Seq, int Index>
 | 
						|
    struct iterator_traits< ::boost::fusion::basic_iterator<Tag, Category, Seq, Index> >
 | 
						|
    { };
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif
 |