1 /*============================================================================= 2 Copyright (c) 2001-2011 Joel de Guzman 3 4 Distributed under the Boost Software License, Version 1.0. (See accompanying 5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 ==============================================================================*/ 7 #if !defined(FUSION_FUSION_ITERATOR_10012005_1551) 8 #define FUSION_FUSION_ITERATOR_10012005_1551 9 10 #include <boost/fusion/support/config.hpp> 11 #include <boost/fusion/iterator/value_of.hpp> 12 #include <boost/fusion/iterator/next.hpp> 13 #include <boost/fusion/iterator/prior.hpp> 14 #include <boost/fusion/iterator/advance.hpp> 15 #include <boost/fusion/iterator/distance.hpp> 16 #include <boost/fusion/support/category_of.hpp> 17 #include <boost/mpl/next_prior.hpp> 18 #include <boost/mpl/advance_fwd.hpp> 19 #include <boost/mpl/distance_fwd.hpp> 20 #include <boost/mpl/iterator_tags.hpp> 21 #include <boost/mpl/eval_if.hpp> 22 #include <boost/type_traits/is_base_of.hpp> 23 24 namespace boost { namespace fusion { namespace detail 25 { 26 27 template<class Category> 28 struct to_mpl_category { 29 typedef typename mpl::eval_if< 30 is_base_of<random_access_traversal_tag, Category>, 31 mpl::random_access_iterator_tag, 32 mpl::eval_if< 33 is_base_of<bidirectional_traversal_tag, Category>, 34 mpl::bidirectional_iterator_tag, 35 mpl::forward_iterator_tag 36 > 37 >::type type; 38 }; 39 40 }}} 41 42 namespace boost { namespace mpl 43 { 44 template <typename Iterator> 45 struct fusion_iterator 46 { 47 typedef typename fusion::result_of::value_of<Iterator>::type type; 48 typedef typename fusion::traits::category_of<Iterator>::type fusion_category; 49 typedef typename fusion::detail::to_mpl_category<fusion_category>::type category; 50 typedef Iterator iterator; 51 }; 52 53 template <typename Iterator> 54 struct next<fusion_iterator<Iterator> > 55 { 56 typedef fusion_iterator<typename fusion::result_of::next<Iterator>::type> type; 57 }; 58 59 template <typename Iterator> 60 struct prior<fusion_iterator<Iterator> > 61 { 62 typedef fusion_iterator<typename fusion::result_of::prior<Iterator>::type> type; 63 }; 64 65 template <typename Iterator, typename N> 66 struct advance<fusion_iterator<Iterator>, N> 67 { 68 typedef fusion_iterator<typename fusion::result_of::advance<Iterator, N>::type> type; 69 }; 70 71 template <typename First, typename Last> 72 struct distance<fusion_iterator<First>, fusion_iterator<Last> > 73 : fusion::result_of::distance<First, Last> 74 {}; 75 76 }} 77 78 #endif 79 80 81