

// Copyright Aleksey Gurtovoy 2000-2004

//

// Distributed under the Boost Software License, Version 1.0. 

// (See accompanying file LICENSE_1_0.txt or copy at 

// http://www.boost.org/LICENSE_1_0.txt)

//



// Preprocessed version of "boost/mpl/aux_/reverse_iter_fold_impl.hpp" header

// -- DO NOT modify by hand!



namespace boost { namespace mpl { namespace aux {



/// forward declaration



template<

      long N

    , typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl;



template<

      typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >

{

    typedef First iter0;

    typedef State fwd_state0;

    typedef fwd_state0 bkwd_state0;

    typedef bkwd_state0 state;

    typedef iter0 iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >

{

    typedef First iter0;

    typedef State fwd_state0;

    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;

    typedef typename mpl::next<iter0>::type iter1;

    



    typedef fwd_state1 bkwd_state1;

    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;

    typedef bkwd_state0 state;

    typedef iter1 iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >

{

    typedef First iter0;

    typedef State fwd_state0;

    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;

    typedef typename mpl::next<iter0>::type iter1;

    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;

    typedef typename mpl::next<iter1>::type iter2;

    



    typedef fwd_state2 bkwd_state2;

    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;

    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;

    



    typedef bkwd_state0 state;

    typedef iter2 iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >

{

    typedef First iter0;

    typedef State fwd_state0;

    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;

    typedef typename mpl::next<iter0>::type iter1;

    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;

    typedef typename mpl::next<iter1>::type iter2;

    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;

    typedef typename mpl::next<iter2>::type iter3;

    



    typedef fwd_state3 bkwd_state3;

    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;

    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;

    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;

    



    typedef bkwd_state0 state;

    typedef iter3 iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >

{

    typedef First iter0;

    typedef State fwd_state0;

    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;

    typedef typename mpl::next<iter0>::type iter1;

    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;

    typedef typename mpl::next<iter1>::type iter2;

    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;

    typedef typename mpl::next<iter2>::type iter3;

    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;

    typedef typename mpl::next<iter3>::type iter4;

    



    typedef fwd_state4 bkwd_state4;

    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;

    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;

    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;

    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;

    



    typedef bkwd_state0 state;

    typedef iter4 iterator;

};



template<

      long N

    , typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl

{

    typedef First iter0;

    typedef State fwd_state0;

    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;

    typedef typename mpl::next<iter0>::type iter1;

    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;

    typedef typename mpl::next<iter1>::type iter2;

    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;

    typedef typename mpl::next<iter2>::type iter3;

    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;

    typedef typename mpl::next<iter3>::type iter4;

    



    typedef reverse_iter_fold_impl<

          ( (N - 4) < 0 ? 0 : N - 4 )

        , iter4

        , Last

        , fwd_state4

        , BackwardOp

        , ForwardOp

        > nested_chunk;



    typedef typename nested_chunk::state bkwd_state4;

    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;

    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;

    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;

    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;

    



    typedef bkwd_state0 state;

    typedef typename nested_chunk::iterator iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >

{

    typedef reverse_iter_fold_impl<

          -1

        , typename mpl::next<First>::type

        , Last

        , typename apply2< ForwardOp,State,First >::type

        , BackwardOp

        , ForwardOp

        > nested_step;



    typedef typename apply2<

          BackwardOp

        , typename nested_step::state

        , First

        >::type state;



    typedef typename nested_step::iterator iterator;

};



template<

      typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >

{

    typedef State state;

    typedef Last iterator;

};



}}}

