source: NonGTP/Boost/boost/spirit/fusion/iterator/tuple_iterator.hpp @ 857

Revision 857, 3.3 KB checked in by igarcia, 18 years ago (diff)
Line 
1/*=============================================================================
2    Copyright (c) 2003 Joel de Guzman
3    Copyright (c) 2004 Peder Holt
4
5    Use, modification and distribution is subject to the Boost Software
6    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7    http://www.boost.org/LICENSE_1_0.txt)
8==============================================================================*/
9#if !defined(FUSION_ITERATOR_TUPLE_ITERATOR_HPP)
10#define FUSION_ITERATOR_TUPLE_ITERATOR_HPP
11
12#include <boost/mpl/int.hpp>
13#include <boost/mpl/eval_if.hpp>
14#include <boost/spirit/fusion/iterator/detail/iterator_base.hpp>
15#include <boost/spirit/fusion/iterator/detail/tuple_iterator/deref_traits.hpp>
16#include <boost/spirit/fusion/iterator/detail/tuple_iterator/value_traits.hpp>
17#include <boost/spirit/fusion/iterator/detail/tuple_iterator/next_traits.hpp>
18#include <boost/spirit/fusion/iterator/detail/tuple_iterator/prior_traits.hpp>
19#include <boost/spirit/fusion/iterator/detail/tuple_iterator/equal_to_traits.hpp>
20#include <boost/spirit/fusion/sequence/detail/tuple_begin_end_traits.hpp>
21#include <boost/mpl/eval_if.hpp>
22#include <boost/mpl/less.hpp>
23#include <boost/mpl/identity.hpp>
24
25namespace boost { namespace fusion
26{
27    struct tuple_iterator_tag;
28    struct void_t;
29
30    template <int N, typename Tuple>
31    struct tuple_iterator;
32
33    template <int N, typename Tuple>
34    struct tuple_iterator_base : iterator_base<tuple_iterator<N, Tuple> >
35    {
36        typedef FUSION_INT(N) index;
37        typedef Tuple tuple;
38        typedef tuple_iterator_tag tag;
39        typedef tuple_iterator<N, Tuple> self_type;
40    };
41
42    template <int N, typename Tuple>
43    struct tuple_iterator : tuple_iterator_base<N,Tuple>
44    {
45        typedef typename tuple_iterator_base<N,Tuple>::tuple tuple;
46        typedef typename tuple_iterator_base<N,Tuple>::index index;
47        typedef typename
48            mpl::eval_if<
49                mpl::less<index, typename Tuple::size>
50              , detail::tuple_iterator_next_traits_impl<tuple_iterator_base<N,Tuple> >
51              , mpl::identity<void_t>
52            >::type
53        next;
54
55        typedef typename
56            mpl::eval_if<
57                mpl::less<index, typename Tuple::size>
58              , detail::tuple_iterator_value_traits_impl<tuple_iterator_base<N,Tuple> >
59              , mpl::identity<void_t>
60            >::type
61        type;
62
63#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
64        tuple_iterator(tuple_iterator const& i);
65#else
66        template <int N2, typename Tuple2>
67        tuple_iterator(tuple_iterator<N2, Tuple2> const& i)
68        : t(static_cast<tuple&>(i.get_tuple())) {}
69#endif
70        tuple_iterator(tuple& t);
71
72        tuple&
73        get_tuple() const;
74    private:
75
76        tuple& t;
77    };
78
79#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
80    template <int N, typename Tuple>
81    tuple_iterator<N,Tuple>::tuple_iterator(tuple_iterator const& i)
82    : t(static_cast<tuple&>(i.get_tuple())) {}
83#endif
84
85    template <int N, typename Tuple>
86    tuple_iterator<N,Tuple>::tuple_iterator(tuple& t)
87    : t(t) {}
88
89    template <int N, typename Tuple>
90    typename tuple_iterator<N,Tuple>::tuple&
91    tuple_iterator<N,Tuple>::get_tuple() const
92    {
93        return t;
94    }
95}}
96
97#endif
Note: See TracBrowser for help on using the repository browser.