/*============================================================================= 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_STD_TUPLE_ITERATOR_09112011_1905) #define FUSION_STD_TUPLE_ITERATOR_09112011_1905 #include #include #include #include #include #include #include #include namespace boost { namespace fusion { struct random_access_traversal_tag; template struct std_tuple_iterator_identity; template struct std_tuple_iterator : iterator_facade< std_tuple_iterator , random_access_traversal_tag> { typedef Tuple tuple_type; static int const index = Index; typedef std_tuple_iterator_identity< typename add_const::type, Index> identity; explicit std_tuple_iterator(Tuple& tuple) : tuple(tuple) {} Tuple& tuple; template struct value_of : std::tuple_element::type> {}; template struct deref { typedef value_of element; typedef typename mpl::eval_if< is_const , fusion::detail::cref_result , fusion::detail::ref_result >::type type; static type call(Iterator const& iter) { return std::get(iter.tuple); } }; template struct advance { static int const index = Iterator::index; typedef typename Iterator::tuple_type tuple_type; typedef std_tuple_iterator type; static type call(Iterator const& i) { return type(i.tuple); } }; template struct next : advance> {}; template struct prior : advance> {}; template struct equal_to : is_same {}; template struct distance { typedef mpl::int_ type; static type call(First const&, Last const&) { return type(); } }; }; }} #endif