/*============================================================================= 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 #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace fusion { struct forward_traversal_tag; namespace detail { template struct boost_tuple_is_empty : mpl::false_ {}; template <> struct boost_tuple_is_empty : mpl::true_ {}; template <> struct boost_tuple_is_empty : mpl::true_ {}; template <> struct boost_tuple_is_empty > : mpl::true_ {}; template <> struct boost_tuple_is_empty const> : mpl::true_ {}; } template struct boost_tuple_iterator_identity; template struct boost_tuple_iterator : iterator_facade, forward_traversal_tag> { typedef Cons cons_type; typedef boost_tuple_iterator_identity< typename add_const::type> identity; BOOST_FUSION_GPU_ENABLED explicit boost_tuple_iterator(Cons& in_cons) : cons(in_cons) {} Cons& cons; template struct value_of : mpl::identity {}; template struct deref { typedef typename value_of::type element; typedef typename mpl::if_< is_const , typename tuples::access_traits::const_type , typename tuples::access_traits::non_const_type >::type type; BOOST_FUSION_GPU_ENABLED static type call(Iterator const& iter) { return iter.cons.get_head(); } }; template 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 , add_const , mpl::identity >::type> type; BOOST_FUSION_GPU_ENABLED static type call(Iterator const& iter) { return type(iter.cons.get_tail()); } }; template struct distance; // detail template struct lazy_next_distance { typedef typename mpl::plus< mpl::int_<1>, typename distance< typename next::type, I2 >::type >::type type; }; template struct distance { typedef typename mpl::eval_if< boost::is_same, mpl::int_<0>, lazy_next_distance >::type type; BOOST_FUSION_GPU_ENABLED static type call(I1 const&, I2 const&) { return type(); } }; template struct equal_to : is_same {}; private: // silence MSVC warning C4512: assignment operator could not be generated boost_tuple_iterator& operator= (boost_tuple_iterator const&); }; template struct boost_tuple_null_iterator : iterator_facade, forward_traversal_tag> { typedef Null cons_type; typedef boost_tuple_iterator_identity< typename add_const::type> identity; template struct equal_to : mpl::or_< is_same , mpl::and_< detail::boost_tuple_is_empty , detail::boost_tuple_is_empty > > {}; }; template <> struct boost_tuple_iterator : boost_tuple_null_iterator { template BOOST_FUSION_GPU_ENABLED explicit boost_tuple_iterator(Cons const&) {} }; template <> struct boost_tuple_iterator : boost_tuple_null_iterator { template BOOST_FUSION_GPU_ENABLED explicit boost_tuple_iterator(Cons const&) {} }; template <> struct boost_tuple_iterator > : boost_tuple_null_iterator > { template BOOST_FUSION_GPU_ENABLED explicit boost_tuple_iterator(Cons const&) {} }; template <> struct boost_tuple_iterator const> : boost_tuple_null_iterator const> { template BOOST_FUSION_GPU_ENABLED explicit boost_tuple_iterator(Cons const&) {} }; }} #ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408 namespace std { template struct iterator_traits< ::boost::fusion::boost_tuple_iterator > { }; } #endif #endif