

// 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_/iter_fold_impl.hpp" header

// -- DO NOT modify by hand!



namespace boost { namespace mpl { namespace aux {



/// forward declaration



template<

      int N

    , typename First

    , typename Last

    , typename State

    , typename ForwardOp

    >

struct iter_fold_impl;



template<

      typename First

    , typename Last

    , typename State

    , typename ForwardOp

    >

struct iter_fold_impl< 0,First,Last,State,ForwardOp >

{

    typedef First iter0;

    typedef State state0;

    typedef state0 state;

    typedef iter0 iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename ForwardOp

    >

struct iter_fold_impl< 1,First,Last,State,ForwardOp >

{

    typedef First iter0;

    typedef State state0;

    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;

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

    



    typedef state1 state;

    typedef iter1 iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename ForwardOp

    >

struct iter_fold_impl< 2,First,Last,State,ForwardOp >

{

    typedef First iter0;

    typedef State state0;

    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;

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

    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;

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

    



    typedef state2 state;

    typedef iter2 iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename ForwardOp

    >

struct iter_fold_impl< 3,First,Last,State,ForwardOp >

{

    typedef First iter0;

    typedef State state0;

    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;

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

    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;

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

    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;

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

    



    typedef state3 state;

    typedef iter3 iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename ForwardOp

    >

struct iter_fold_impl< 4,First,Last,State,ForwardOp >

{

    typedef First iter0;

    typedef State state0;

    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;

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

    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;

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

    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;

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

    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;

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

    



    typedef state4 state;

    typedef iter4 iterator;

};



template<

      int N

    , typename First

    , typename Last

    , typename State

    , typename ForwardOp

    >

struct iter_fold_impl

{

    typedef iter_fold_impl<

          4

        , First

        , Last

        , State

        , ForwardOp

        > chunk_;



    typedef iter_fold_impl<

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

        , typename chunk_::iterator

        , Last

        , typename chunk_::state

        , ForwardOp

        > res_;



    typedef typename res_::state state;

    typedef typename res_::iterator iterator;

};



template<

      typename First

    , typename Last

    , typename State

    , typename ForwardOp

    >

struct iter_fold_impl< -1,First,Last,State,ForwardOp >

    : iter_fold_impl<

          -1

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

        , Last

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

        , ForwardOp

        >

{

};



template<

      typename Last

    , typename State

    , typename ForwardOp

    >

struct iter_fold_impl< -1,Last,Last,State,ForwardOp >

{

    typedef State state;

    typedef Last iterator;

};



}}}

