

// 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< long N >

struct reverse_iter_fold_chunk;



template<> struct reverse_iter_fold_chunk<0>

{

    template<

          typename First

        , typename Last

        , typename State

        , typename BackwardOp

        , typename ForwardOp

        >

    struct result_

    {

        typedef First iter0;

        typedef State fwd_state0;

        typedef fwd_state0 bkwd_state0;

        typedef bkwd_state0 state;

        typedef iter0 iterator;

    };

};



template<> struct reverse_iter_fold_chunk<1>

{

    template<

          typename First

        , typename Last

        , typename State

        , typename BackwardOp

        , typename ForwardOp

        >

    struct result_

    {

        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<> struct reverse_iter_fold_chunk<2>

{

    template<

          typename First

        , typename Last

        , typename State

        , typename BackwardOp

        , typename ForwardOp

        >

    struct result_

    {

        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<> struct reverse_iter_fold_chunk<3>

{

    template<

          typename First

        , typename Last

        , typename State

        , typename BackwardOp

        , typename ForwardOp

        >

    struct result_

    {

        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<> struct reverse_iter_fold_chunk<4>

{

    template<

          typename First

        , typename Last

        , typename State

        , typename BackwardOp

        , typename ForwardOp

        >

    struct result_

    {

        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 >

struct reverse_iter_fold_chunk

{

    template<

          typename First

        , typename Last

        , typename State

        , typename BackwardOp

        , typename ForwardOp

        >

    struct result_

    {

        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_step;



template<

      typename Last

    , typename State

    >

struct reverse_iter_fold_null_step

{

    typedef Last iterator;

    typedef State state;

};



template<>

struct reverse_iter_fold_chunk< -1 >

{

    template<

          typename First

        , typename Last

        , typename State

        , typename BackwardOp

        , typename ForwardOp

        >

    struct result_

    {

        typedef typename if_<

              typename is_same< First,Last >::type

            , reverse_iter_fold_null_step< Last,State >

            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >

            >::type res_;



        typedef typename res_::state state;

        typedef typename res_::iterator iterator;

    };

};



template<

      typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_step

{

    typedef reverse_iter_fold_chunk< -1 >::template result_<

          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<

      long N

    , typename First

    , typename Last

    , typename State

    , typename BackwardOp

    , typename ForwardOp

    >

struct reverse_iter_fold_impl

    : reverse_iter_fold_chunk<N>

        ::template result_< First,Last,State,BackwardOp,ForwardOp >

{

};



}}}

