]> git.donarmstrong.com Git - rsem.git/blob - boost/mpl/aux_/iter_fold_if_impl.hpp
Updated boost to v1.55.0
[rsem.git] / boost / mpl / aux_ / iter_fold_if_impl.hpp
1
2 #ifndef BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED
3 #define BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED
4
5 // Copyright Aleksey Gurtovoy 2001-2004
6 // Copyright David Abrahams 2001-2002
7 //
8 // Distributed under the Boost Software License, Version 1.0. 
9 // (See accompanying file LICENSE_1_0.txt or copy at 
10 // http://www.boost.org/LICENSE_1_0.txt)
11 //
12 // See http://www.boost.org/libs/mpl for documentation.
13
14 // $Id: iter_fold_if_impl.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
15 // $Date: 2008-10-10 23:19:02 -0700 (Fri, 10 Oct 2008) $
16 // $Revision: 49267 $
17
18 #if !defined(BOOST_MPL_PREPROCESSING_MODE)
19 #   include <boost/mpl/identity.hpp>
20 #   include <boost/mpl/next.hpp>
21 #   include <boost/mpl/if.hpp>
22 #   include <boost/mpl/apply.hpp>
23 #   include <boost/mpl/aux_/value_wknd.hpp>
24 #endif
25
26 #include <boost/mpl/aux_/config/use_preprocessed.hpp>
27
28 #if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
29     && !defined(BOOST_MPL_PREPROCESSING_MODE)
30
31 #   define BOOST_MPL_PREPROCESSED_HEADER iter_fold_if_impl.hpp
32 #   include <boost/mpl/aux_/include_preprocessed.hpp>
33
34 #else
35
36 #   include <boost/mpl/limits/unrolling.hpp>
37 #   include <boost/preprocessor/arithmetic/sub.hpp>
38 #   include <boost/preprocessor/repeat.hpp>
39 #   include <boost/preprocessor/inc.hpp>
40 #   include <boost/preprocessor/dec.hpp>
41 #   include <boost/preprocessor/cat.hpp>
42
43 namespace boost { namespace mpl { namespace aux {
44
45 template< typename Iterator, typename State >
46 struct iter_fold_if_null_step
47 {
48     typedef State state;
49     typedef Iterator iterator;
50 };
51
52 template< bool >
53 struct iter_fold_if_step_impl
54 {
55     template<
56           typename Iterator
57         , typename State
58         , typename StateOp
59         , typename IteratorOp
60         >
61     struct result_
62     {
63         typedef typename apply2<StateOp,State,Iterator>::type state;
64         typedef typename IteratorOp::type iterator;
65     };
66 };
67
68 template<>
69 struct iter_fold_if_step_impl<false>
70 {
71     template<
72           typename Iterator
73         , typename State
74         , typename StateOp
75         , typename IteratorOp
76         >
77     struct result_
78     {
79         typedef State state;
80         typedef Iterator iterator;
81     };
82 };
83
84 // agurt, 25/jun/02: MSVC 6.5 workaround, had to get rid of inheritance 
85 // here and in 'iter_fold_if_backward_step', because sometimes it interfered 
86 // with the "early template instantiation bug" in _really_ ugly ways
87 template<
88       typename Iterator
89     , typename State
90     , typename ForwardOp
91     , typename Predicate
92     >
93 struct iter_fold_if_forward_step
94 {
95     typedef typename apply2<Predicate,State,Iterator>::type not_last;
96     typedef typename iter_fold_if_step_impl<
97           BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
98         >::template result_< Iterator,State,ForwardOp,mpl::next<Iterator> > impl_;
99
100     typedef typename impl_::state state;
101     typedef typename impl_::iterator iterator;
102 };
103
104 template<
105       typename Iterator
106     , typename State
107     , typename BackwardOp
108     , typename Predicate
109     >
110 struct iter_fold_if_backward_step
111 {
112     typedef typename apply2<Predicate,State,Iterator>::type not_last;
113     typedef typename iter_fold_if_step_impl<
114           BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
115         >::template result_< Iterator,State,BackwardOp,identity<Iterator> > impl_;
116
117     typedef typename impl_::state state;
118     typedef typename impl_::iterator iterator;
119 };
120
121
122 // local macros, #undef-ined at the end of the header
123
124 #   define AUX_ITER_FOLD_FORWARD_STEP(unused, i, unused2) \
125     typedef iter_fold_if_forward_step< \
126           typename BOOST_PP_CAT(forward_step,i)::iterator \
127         , typename BOOST_PP_CAT(forward_step,i)::state \
128         , ForwardOp \
129         , ForwardPredicate \
130         > BOOST_PP_CAT(forward_step, BOOST_PP_INC(i)); \
131     /**/
132
133 #   define AUX_ITER_FOLD_BACKWARD_STEP_FUNC(i) \
134     typedef iter_fold_if_backward_step< \
135           typename BOOST_PP_CAT(forward_step,BOOST_PP_DEC(i))::iterator \
136         , typename BOOST_PP_CAT(backward_step,i)::state \
137         , BackwardOp \
138         , BackwardPredicate \
139         > BOOST_PP_CAT(backward_step,BOOST_PP_DEC(i)); \
140     /**/
141
142 #   define AUX_ITER_FOLD_BACKWARD_STEP(unused, i, unused2) \
143     AUX_ITER_FOLD_BACKWARD_STEP_FUNC( \
144         BOOST_PP_SUB_D(1,BOOST_MPL_LIMIT_UNROLLING,i) \
145         ) \
146     /**/
147
148 #   define AUX_LAST_FORWARD_STEP \
149     BOOST_PP_CAT(forward_step, BOOST_MPL_LIMIT_UNROLLING) \
150     /**/
151
152 #   define AUX_LAST_BACKWARD_STEP \
153     BOOST_PP_CAT(backward_step, BOOST_MPL_LIMIT_UNROLLING) \
154     /**/
155
156 template<
157       typename Iterator
158     , typename State
159     , typename ForwardOp
160     , typename ForwardPredicate
161     , typename BackwardOp
162     , typename BackwardPredicate
163     >
164 struct iter_fold_if_impl
165 {
166  private:
167     typedef iter_fold_if_null_step<Iterator,State> forward_step0;
168     BOOST_PP_REPEAT(
169           BOOST_MPL_LIMIT_UNROLLING
170         , AUX_ITER_FOLD_FORWARD_STEP
171         , unused
172         )
173     
174     typedef typename if_<
175           typename AUX_LAST_FORWARD_STEP::not_last
176         , iter_fold_if_impl<
177               typename AUX_LAST_FORWARD_STEP::iterator
178             , typename AUX_LAST_FORWARD_STEP::state
179             , ForwardOp
180             , ForwardPredicate
181             , BackwardOp
182             , BackwardPredicate
183             >
184         , iter_fold_if_null_step<
185               typename AUX_LAST_FORWARD_STEP::iterator
186             , typename AUX_LAST_FORWARD_STEP::state
187             >
188         >::type AUX_LAST_BACKWARD_STEP;
189
190     BOOST_PP_REPEAT(
191           BOOST_MPL_LIMIT_UNROLLING
192         , AUX_ITER_FOLD_BACKWARD_STEP
193         , unused
194         )
195
196  public:
197     typedef typename backward_step0::state state;
198     typedef typename AUX_LAST_BACKWARD_STEP::iterator iterator;
199 };
200
201 #   undef AUX_LAST_BACKWARD_STEP
202 #   undef AUX_LAST_FORWARD_STEP
203 #   undef AUX_ITER_FOLD_BACKWARD_STEP
204 #   undef AUX_ITER_FOLD_BACKWARD_STEP_FUNC
205 #   undef AUX_ITER_FOLD_FORWARD_STEP
206
207 }}}
208
209 #endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
210 #endif // BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED