

// Copyright Aleksey Gurtovoy 2001-2004

// Copyright David Abrahams 2001-2002

//

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

// -- DO NOT modify by hand!



namespace boost { namespace mpl { namespace aux {



template< typename Iterator, typename State >

struct iter_fold_if_null_step

{

    typedef State state;

    typedef Iterator iterator;

};



template< bool >

struct iter_fold_if_step_impl

{

    template<

          typename Iterator

        , typename State

        , typename StateOp

        , typename IteratorOp

        >

    struct result_

    {

        typedef typename apply2< StateOp,State,Iterator >::type state;

        typedef typename IteratorOp::type iterator;

    };

};



template<>

struct iter_fold_if_step_impl<false>

{

    template<

          typename Iterator

        , typename State

        , typename StateOp

        , typename IteratorOp

        >

    struct result_

    {

        typedef State state;

        typedef Iterator iterator;

    };

};



template<

      typename Iterator

    , typename State

    , typename ForwardOp

    , typename Predicate

    >

struct iter_fold_if_forward_step

{

    typedef typename apply2< Predicate,State,Iterator >::type not_last;

    typedef typename iter_fold_if_step_impl<

          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value

        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;



    typedef typename impl_::state state;

    typedef typename impl_::iterator iterator;

};



template<

      typename Iterator

    , typename State

    , typename BackwardOp

    , typename Predicate

    >

struct iter_fold_if_backward_step

{

    typedef typename apply2< Predicate,State,Iterator >::type not_last;

    typedef typename iter_fold_if_step_impl<

          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value

        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;



    typedef typename impl_::state state;

    typedef typename impl_::iterator iterator;

};



template<

      typename Iterator

    , typename State

    , typename ForwardOp

    , typename ForwardPredicate

    , typename BackwardOp

    , typename BackwardPredicate

    >

struct iter_fold_if_impl

{

 private:

    typedef iter_fold_if_null_step< Iterator,State > forward_step0;

    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;

    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;

    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;

    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;

    



    typedef typename if_<

          typename forward_step4::not_last

        , iter_fold_if_impl<

              typename forward_step4::iterator

            , typename forward_step4::state

            , ForwardOp

            , ForwardPredicate

            , BackwardOp

            , BackwardPredicate

            >

        , iter_fold_if_null_step<

              typename forward_step4::iterator

            , typename forward_step4::state

            >

        >::type backward_step4;



    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;

    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;

    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;

    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;

    



 public:

    typedef typename backward_step0::state state;

    typedef typename backward_step4::iterator iterator;

};



}}}

