]> git.donarmstrong.com Git - rsem.git/blob - boost/fusion/iterator/mpl/fusion_iterator.hpp
82889e0806a3bd69a8d967ec2936ec8f0623e517
[rsem.git] / boost / fusion / iterator / mpl / fusion_iterator.hpp
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/iterator/value_of.hpp>
11 #include <boost/fusion/iterator/next.hpp>
12 #include <boost/fusion/iterator/prior.hpp>
13 #include <boost/fusion/iterator/advance.hpp>
14 #include <boost/fusion/iterator/distance.hpp>
15 #include <boost/fusion/support/category_of.hpp>
16 #include <boost/mpl/next_prior.hpp>
17 #include <boost/mpl/advance_fwd.hpp>
18 #include <boost/mpl/distance_fwd.hpp>
19 #include <boost/mpl/iterator_tags.hpp>
20 #include <boost/mpl/eval_if.hpp>
21 #include <boost/type_traits/is_base_of.hpp>
22
23 namespace boost { namespace fusion { namespace detail
24 {
25
26 template<class Category>
27 struct to_mpl_category {
28     typedef typename mpl::eval_if<
29         is_base_of<random_access_traversal_tag, Category>,
30         mpl::random_access_iterator_tag,
31         mpl::eval_if<
32             is_base_of<bidirectional_traversal_tag, Category>,
33             mpl::bidirectional_iterator_tag,
34             mpl::forward_iterator_tag
35         >
36     >::type type;
37 };
38
39 }}}
40
41 namespace boost { namespace mpl
42 {
43     template <typename Iterator>
44     struct fusion_iterator
45     {
46         typedef typename fusion::result_of::value_of<Iterator>::type type;
47         typedef typename fusion::traits::category_of<Iterator>::type fusion_category;
48         typedef typename fusion::detail::to_mpl_category<fusion_category>::type category;
49         typedef Iterator iterator;
50     };
51
52     template <typename Iterator>
53     struct next<fusion_iterator<Iterator> >
54     {
55         typedef fusion_iterator<typename fusion::result_of::next<Iterator>::type> type;
56     };
57
58     template <typename Iterator>
59     struct prior<fusion_iterator<Iterator> >
60     {
61         typedef fusion_iterator<typename fusion::result_of::prior<Iterator>::type> type;
62     };
63
64     template <typename Iterator, typename N>
65     struct advance<fusion_iterator<Iterator>, N>
66     {
67         typedef fusion_iterator<typename fusion::result_of::advance<Iterator, N>::type> type;
68     };
69
70     template <typename First, typename Last>
71     struct distance<fusion_iterator<First>, fusion_iterator<Last> >
72         : fusion::result_of::distance<First, Last>
73     {};
74
75 }}
76
77 #endif
78
79