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

Revision 857, 2.7 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    Copyright (c) 2005 Eric Niebler
5
6    Use, modification and distribution is subject to the Boost Software
7    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8    http://www.boost.org/LICENSE_1_0.txt)
9==============================================================================*/
10#if !defined(FUSION_ITERATOR_CONS_ITERATOR_HPP)
11#define FUSION_ITERATOR_CONS_ITERATOR_HPP
12
13#include <boost/mpl/aux_/na_fwd.hpp>
14#include <boost/mpl/iterator_tags.hpp>
15#include <boost/spirit/fusion/iterator/as_fusion_iterator.hpp>
16#include <boost/spirit/fusion/iterator/detail/iterator_base.hpp>
17#include <boost/spirit/fusion/sequence/detail/sequence_base.hpp>
18#include <boost/spirit/fusion/iterator/detail/cons_iterator/deref_traits.hpp>
19#include <boost/spirit/fusion/iterator/detail/cons_iterator/next_traits.hpp>
20#include <boost/spirit/fusion/iterator/detail/cons_iterator/value_traits.hpp>
21
22namespace boost { namespace fusion
23{
24    struct nil;
25
26    struct cons_iterator_tag;
27
28    template <typename Cons = nil>
29    struct cons_iterator : iterator_base<cons_iterator<Cons> >
30    {
31        typedef cons_iterator_tag tag;
32        typedef Cons cons_type;
33        typedef mpl::forward_iterator_tag category;
34
35        #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
36        typedef typename cons_detail::next_traits_impl<cons_iterator>::type next;
37        typedef typename cons_detail::value_traits_impl<cons_iterator>::type type;
38        #endif
39
40        explicit cons_iterator(cons_type& cons_)
41            : cons(cons_) {}
42
43        cons_type& cons;
44    private:
45        cons_iterator& operator=(cons_iterator const&);
46    };
47
48    template <>
49    struct cons_iterator<nil> : iterator_base<cons_iterator<nil> >
50    {
51        typedef cons_iterator_tag tag;
52        typedef nil cons_type;
53        typedef mpl::forward_iterator_tag category;
54
55        #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
56        typedef cons_iterator next;
57        typedef mpl::na type;
58        #endif
59
60        cons_iterator() {}
61        explicit cons_iterator(nil const&) {}
62    };
63
64    template <>
65    struct cons_iterator<nil const> : iterator_base<cons_iterator<nil const> >
66    {
67        typedef cons_iterator_tag tag;
68        typedef nil const cons_type;
69        typedef mpl::forward_iterator_tag category;
70
71        #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
72        typedef cons_iterator next;
73        typedef mpl::na type;
74        #endif
75
76        cons_iterator() {}
77        explicit cons_iterator(nil const&) {}
78    };
79}}
80
81#endif
Note: See TracBrowser for help on using the repository browser.