/*============================================================================= 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 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 : iterator_facade, forward_traversal_tag> { typedef Cons cons_type; 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; 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; 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; static type call(I1 const&, I2 const&) { return type(); } }; 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; 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 explicit boost_tuple_iterator(Cons const&) {} }; template <> struct boost_tuple_iterator : boost_tuple_null_iterator { template explicit boost_tuple_iterator(Cons const&) {} }; template <> struct boost_tuple_iterator > : boost_tuple_null_iterator > { template explicit boost_tuple_iterator(Cons const&) {} }; template <> struct boost_tuple_iterator const> : boost_tuple_null_iterator const> { template explicit boost_tuple_iterator(Cons const&) {} }; }} #endif