Chris@16
|
1
|
Chris@16
|
2 #ifndef BOOST_MPL_SET_AUX_ITERATOR_HPP_INCLUDED
|
Chris@16
|
3 #define BOOST_MPL_SET_AUX_ITERATOR_HPP_INCLUDED
|
Chris@16
|
4
|
Chris@16
|
5 // Copyright Aleksey Gurtovoy 2003-2007
|
Chris@16
|
6 // Copyright David Abrahams 2003-2004
|
Chris@16
|
7 //
|
Chris@16
|
8 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
9 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
10 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
11 //
|
Chris@16
|
12 // See http://www.boost.org/libs/mpl for documentation.
|
Chris@16
|
13
|
Chris@101
|
14 // $Id$
|
Chris@101
|
15 // $Date$
|
Chris@101
|
16 // $Revision$
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/mpl/set/aux_/set0.hpp>
|
Chris@16
|
19 #include <boost/mpl/has_key.hpp>
|
Chris@16
|
20 #include <boost/mpl/iterator_tags.hpp>
|
Chris@16
|
21 #include <boost/mpl/next.hpp>
|
Chris@16
|
22 #include <boost/mpl/eval_if.hpp>
|
Chris@16
|
23 #include <boost/mpl/if.hpp>
|
Chris@16
|
24 #include <boost/mpl/identity.hpp>
|
Chris@16
|
25 #include <boost/mpl/aux_/config/ctps.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 namespace boost { namespace mpl {
|
Chris@16
|
28
|
Chris@16
|
29 // used by 's_iter_get'
|
Chris@16
|
30 template< typename Set, typename Tail > struct s_iter;
|
Chris@16
|
31
|
Chris@16
|
32 template< typename Set, typename Tail > struct s_iter_get
|
Chris@16
|
33 : eval_if<
|
Chris@16
|
34 has_key< Set,typename Tail::item_type_ >
|
Chris@16
|
35 , identity< s_iter<Set,Tail> >
|
Chris@16
|
36 , next< s_iter<Set,Tail> >
|
Chris@16
|
37 >
|
Chris@16
|
38 {
|
Chris@16
|
39 };
|
Chris@16
|
40
|
Chris@16
|
41 template< typename Set, typename Tail > struct s_iter_impl
|
Chris@16
|
42 {
|
Chris@16
|
43 typedef Tail tail_;
|
Chris@16
|
44 typedef forward_iterator_tag category;
|
Chris@16
|
45 typedef typename Tail::item_type_ type;
|
Chris@16
|
46
|
Chris@16
|
47 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
Chris@16
|
48 typedef typename s_iter_get< Set,typename Tail::base >::type next;
|
Chris@16
|
49 #endif
|
Chris@16
|
50 };
|
Chris@16
|
51
|
Chris@16
|
52 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
Chris@16
|
53
|
Chris@16
|
54 template< typename Set, typename Tail >
|
Chris@16
|
55 struct next< s_iter<Set,Tail> >
|
Chris@16
|
56 : s_iter_get< Set,typename Tail::base >
|
Chris@16
|
57 {
|
Chris@16
|
58 };
|
Chris@16
|
59
|
Chris@16
|
60 template< typename Set >
|
Chris@16
|
61 struct next< s_iter<Set,set0<> > >
|
Chris@16
|
62 {
|
Chris@16
|
63 typedef s_iter<Set,set0<> > type;
|
Chris@16
|
64 };
|
Chris@16
|
65
|
Chris@16
|
66 template< typename Set, typename Tail > struct s_iter
|
Chris@16
|
67 : s_iter_impl<Set,Tail>
|
Chris@16
|
68 {
|
Chris@16
|
69 };
|
Chris@16
|
70
|
Chris@16
|
71 template< typename Set > struct s_iter<Set, set0<> >
|
Chris@16
|
72 {
|
Chris@16
|
73 typedef forward_iterator_tag category;
|
Chris@16
|
74 };
|
Chris@16
|
75
|
Chris@16
|
76 #else
|
Chris@16
|
77
|
Chris@16
|
78 template< typename Set >
|
Chris@16
|
79 struct s_end_iter
|
Chris@16
|
80 {
|
Chris@16
|
81 typedef forward_iterator_tag category;
|
Chris@16
|
82 typedef s_iter<Set,set0<> > next;
|
Chris@16
|
83 };
|
Chris@16
|
84
|
Chris@16
|
85 template< typename Set, typename Tail > struct s_iter
|
Chris@16
|
86 : if_<
|
Chris@16
|
87 is_same< Tail,set0<> >
|
Chris@16
|
88 , s_end_iter<Set>
|
Chris@16
|
89 , s_iter_impl<Set,Tail>
|
Chris@16
|
90 >::type
|
Chris@16
|
91 {
|
Chris@16
|
92 };
|
Chris@16
|
93
|
Chris@16
|
94 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
Chris@16
|
95
|
Chris@16
|
96 }}
|
Chris@16
|
97
|
Chris@16
|
98 #endif // BOOST_MPL_SET_AUX_ITERATOR_HPP_INCLUDED
|