PageRenderTime 26ms CodeModel.GetById 10ms app.highlight 13ms RepoModel.GetById 1ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/mpl/aux_/fold_impl_body.hpp

http://hadesmem.googlecode.com/
C++ Header | 365 lines | 281 code | 58 blank | 26 comment | 2 complexity | de1cb535e863c4b66d0829e75cea260a MD5 | raw file
  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// $Id: fold_impl_body.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
 15// $Date: 2008-10-11 17:19:02 +1100 (Sat, 11 Oct 2008) $
 16// $Revision: 49267 $
 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