source: NonGTP/Boost/boost/mpl/aux_/fold_impl_body.hpp @ 857

Revision 857, 9.2 KB checked in by igarcia, 19 years ago (diff)
Line 
1
2// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
3
4#if !defined(BOOST_PP_IS_ITERATING)
5
6// Copyright Aleksey Gurtovoy 2000-2004
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// $Source: /cvsroot/boost/boost/boost/mpl/aux_/fold_impl_body.hpp,v $
15// $Date: 2004/10/24 08:18:03 $
16// $Revision: 1.8 $
17
18#   include <boost/mpl/limits/unrolling.hpp>
19#   include <boost/mpl/aux_/preprocessor/repeat.hpp>
20#   include <boost/mpl/aux_/config/workaround.hpp>
21#   include <boost/mpl/aux_/config/ctps.hpp>
22#   include <boost/mpl/aux_/nttp_decl.hpp>
23#   include <boost/mpl/aux_/config/eti.hpp>
24
25#   include <boost/preprocessor/iterate.hpp>
26#   include <boost/preprocessor/dec.hpp>
27#   include <boost/preprocessor/cat.hpp>
28
29// local macros, #undef-ined at the end of the header
30
31#   define AUX778076_ITER_FOLD_STEP(unused, i, unused2) \
32    typedef typename apply2< \
33          ForwardOp \
34        , BOOST_PP_CAT(state,i) \
35        , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,i)) \
36        >::type BOOST_PP_CAT(state,BOOST_PP_INC(i)); \
37    typedef typename mpl::next<BOOST_PP_CAT(iter,i)>::type \
38        BOOST_PP_CAT(iter,BOOST_PP_INC(i)); \
39    /**/
40
41#   define AUX778076_FOLD_IMPL_NAME \
42    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_impl) \
43    /**/
44
45#   define AUX778076_FOLD_CHUNK_NAME \
46    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_chunk) \
47    /**/
48
49namespace boost { namespace mpl { namespace aux {
50
51/// forward declaration
52template<
53      BOOST_MPL_AUX_NTTP_DECL(int, N)
54    , typename First
55    , typename Last
56    , typename State
57    , typename ForwardOp
58    >
59struct AUX778076_FOLD_IMPL_NAME;
60
61#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
62
63#   if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)
64
65#   define BOOST_PP_ITERATION_PARAMS_1 \
66    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/fold_impl_body.hpp>))
67#   include BOOST_PP_ITERATE()
68
69// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
70template<
71      BOOST_MPL_AUX_NTTP_DECL(int, N)
72    , typename First
73    , typename Last
74    , typename State
75    , typename ForwardOp
76    >
77struct AUX778076_FOLD_IMPL_NAME
78{
79    typedef AUX778076_FOLD_IMPL_NAME<
80          BOOST_MPL_LIMIT_UNROLLING
81        , First
82        , Last
83        , State
84        , ForwardOp
85        > chunk_;
86
87    typedef AUX778076_FOLD_IMPL_NAME<
88          ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )
89        , typename chunk_::iterator
90        , Last
91        , typename chunk_::state
92        , ForwardOp
93        > res_;
94       
95    typedef typename res_::state state;
96    typedef typename res_::iterator iterator;
97};
98
99// fallback implementation for sequences of unknown size
100template<
101      typename First
102    , typename Last
103    , typename State
104    , typename ForwardOp
105    >
106struct AUX778076_FOLD_IMPL_NAME<-1,First,Last,State,ForwardOp>
107    : AUX778076_FOLD_IMPL_NAME<
108          -1
109        , typename mpl::next<First>::type
110        , Last
111        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
112        , ForwardOp
113        >
114{
115};
116
117template<
118      typename Last
119    , typename State
120    , typename ForwardOp
121    >
122struct AUX778076_FOLD_IMPL_NAME<-1,Last,Last,State,ForwardOp>
123{
124    typedef State state;
125    typedef Last iterator;
126};
127
128#   else // BOOST_WORKAROUND(__BORLANDC__, < 0x600)
129
130// Borland have some serious problems with the unrolled version, so
131// we always use a basic implementation
132template<
133      BOOST_MPL_AUX_NTTP_DECL(int, N)
134    , typename First
135    , typename Last
136    , typename State
137    , typename ForwardOp
138    >
139struct AUX778076_FOLD_IMPL_NAME
140{
141    typedef AUX778076_FOLD_IMPL_NAME<
142          -1
143        , typename mpl::next<First>::type
144        , Last
145        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
146        , ForwardOp
147        > res_;
148
149    typedef typename res_::state state;
150    typedef typename res_::iterator iterator;
151    typedef state type;
152};
153
154template<
155      BOOST_MPL_AUX_NTTP_DECL(int, N)
156     , typename Last
157    , typename State
158    , typename ForwardOp
159    >
160struct AUX778076_FOLD_IMPL_NAME<N,Last,Last,State,ForwardOp >
161{
162    typedef State state;
163    typedef Last iterator;
164    typedef state type;
165};
166
167#   endif // BOOST_WORKAROUND(__BORLANDC__, < 0x600)
168 
169#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
170
171template< BOOST_MPL_AUX_NTTP_DECL(int, N) >
172struct AUX778076_FOLD_CHUNK_NAME;
173
174#   define BOOST_PP_ITERATION_PARAMS_1 \
175    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/fold_impl_body.hpp>))
176#   include BOOST_PP_ITERATE()
177
178// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
179template< BOOST_MPL_AUX_NTTP_DECL(int, N) >
180struct AUX778076_FOLD_CHUNK_NAME
181{
182    template<
183          typename First
184        , typename Last
185        , typename State
186        , typename ForwardOp
187        >
188    struct result_
189    {
190        typedef AUX778076_FOLD_IMPL_NAME<
191              BOOST_MPL_LIMIT_UNROLLING
192            , First
193            , Last
194            , State
195            , ForwardOp
196            > chunk_;
197
198        typedef AUX778076_FOLD_IMPL_NAME<
199              ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )
200            , typename chunk_::iterator
201            , Last
202            , typename chunk_::state
203            , ForwardOp
204            > res_;
205
206        typedef typename res_::state state;
207        typedef typename res_::iterator iterator;
208    };
209};
210
211// fallback implementation for sequences of unknown size
212template<
213      typename First
214    , typename Last
215    , typename State
216    , typename ForwardOp
217    >
218struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step);
219
220template<
221      typename Last
222    , typename State
223    >
224struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)
225{
226    typedef Last iterator;
227    typedef State state;
228};
229
230template<>
231struct AUX778076_FOLD_CHUNK_NAME<-1>
232{
233    template<
234          typename First
235        , typename Last
236        , typename State
237        , typename ForwardOp
238        >
239    struct result_
240    {
241        typedef typename if_<
242              typename is_same<First,Last>::type
243            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)<Last,State>
244            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)<First,Last,State,ForwardOp>
245            >::type res_;
246
247        typedef typename res_::state state;
248        typedef typename res_::iterator iterator;
249    };
250
251#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
252    /// ETI workaround
253    template<> struct result_<int,int,int,int>
254    {
255        typedef int state;
256        typedef int iterator;
257    };
258#endif
259};
260
261template<
262      typename First
263    , typename Last
264    , typename State
265    , typename ForwardOp
266    >
267struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)
268{
269    // can't inherit here - it breaks MSVC 7.0
270    typedef AUX778076_FOLD_CHUNK_NAME<-1>::template result_<
271          typename mpl::next<First>::type
272        , Last
273        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
274        , ForwardOp
275        > chunk_;
276
277    typedef typename chunk_::state state;
278    typedef typename chunk_::iterator iterator;
279};
280
281template<
282      BOOST_MPL_AUX_NTTP_DECL(int, N)
283    , typename First
284    , typename Last
285    , typename State
286    , typename ForwardOp
287    >
288struct AUX778076_FOLD_IMPL_NAME
289    : AUX778076_FOLD_CHUNK_NAME<N>
290        ::template result_<First,Last,State,ForwardOp>
291{
292};
293
294#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
295
296}}}
297
298#   undef AUX778076_FOLD_IMPL_NAME
299#   undef AUX778076_FOLD_CHUNK_NAME
300#   undef AUX778076_ITER_FOLD_STEP
301
302#undef AUX778076_FOLD_IMPL_OP
303#undef AUX778076_FOLD_IMPL_NAME_PREFIX
304
305///// iteration
306
307#else
308
309#   define n_ BOOST_PP_FRAME_ITERATION(1)
310
311#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
312
313template<
314      typename First
315    , typename Last
316    , typename State
317    , typename ForwardOp
318    >
319struct AUX778076_FOLD_IMPL_NAME<n_,First,Last,State,ForwardOp>
320{
321    typedef First iter0;
322    typedef State state0;
323
324    BOOST_MPL_PP_REPEAT(n_, AUX778076_ITER_FOLD_STEP, unused)
325
326    typedef BOOST_PP_CAT(state,n_) state;
327    typedef BOOST_PP_CAT(iter,n_) iterator;
328};
329
330#else
331
332template<> struct AUX778076_FOLD_CHUNK_NAME<n_>
333{
334    template<
335          typename First
336        , typename Last
337        , typename State
338        , typename ForwardOp
339        >
340    struct result_
341    {
342        typedef First iter0;
343        typedef State state0;
344
345        BOOST_MPL_PP_REPEAT(n_, AUX778076_ITER_FOLD_STEP, unused)
346
347        typedef BOOST_PP_CAT(state,n_) state;
348        typedef BOOST_PP_CAT(iter,n_) iterator;
349    };
350
351#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
352    /// ETI workaround
353    template<> struct result_<int,int,int,int>
354    {
355        typedef int state;
356        typedef int iterator;
357    };
358#endif
359};
360
361#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
362
363#   undef n_
364
365#endif // BOOST_PP_IS_ITERATING
Note: See TracBrowser for help on using the repository browser.