Home | History | Annotate | Download | only in aux_
      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
    211