williamr@2: 
williamr@2: #ifndef BOOST_MPL_ITER_FOLD_IF_HPP_INCLUDED
williamr@2: #define BOOST_MPL_ITER_FOLD_IF_HPP_INCLUDED
williamr@2: 
williamr@2: // Copyright Aleksey Gurtovoy 2003-2004
williamr@2: // Copyright Eric Friedman 2003
williamr@2: //
williamr@2: // Distributed under the Boost Software License, Version 1.0. 
williamr@2: // (See accompanying file LICENSE_1_0.txt or copy at 
williamr@2: // http://www.boost.org/LICENSE_1_0.txt)
williamr@2: //
williamr@2: // See http://www.boost.org/libs/mpl for documentation.
williamr@2: 
williamr@2: // $Source: /cvsroot/boost/boost/boost/mpl/iter_fold_if.hpp,v $
williamr@2: // $Date: 2004/09/02 15:40:41 $
williamr@2: // $Revision: 1.7 $
williamr@2: 
williamr@2: #include <boost/mpl/begin_end.hpp>
williamr@2: #include <boost/mpl/logical.hpp>
williamr@2: #include <boost/mpl/always.hpp>
williamr@2: #include <boost/mpl/eval_if.hpp>
williamr@2: #include <boost/mpl/if.hpp>
williamr@2: #include <boost/mpl/pair.hpp>
williamr@2: #include <boost/mpl/apply.hpp>
williamr@2: #include <boost/mpl/aux_/iter_fold_if_impl.hpp>
williamr@2: #include <boost/mpl/aux_/na_spec.hpp>
williamr@2: #include <boost/mpl/aux_/lambda_support.hpp>
williamr@2: #include <boost/mpl/aux_/config/forwarding.hpp>
williamr@2: #include <boost/mpl/aux_/config/workaround.hpp>
williamr@2: 
williamr@2: #include <boost/type_traits/is_same.hpp>
williamr@2: 
williamr@2: namespace boost { namespace mpl {
williamr@2: 
williamr@2: namespace aux {
williamr@2: 
williamr@2: template< typename Predicate, typename LastIterator >
williamr@2: struct iter_fold_if_pred
williamr@2: {
williamr@2:     template< typename State, typename Iterator > struct apply
williamr@2: #if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
williamr@2:         : and_<
williamr@2:               not_< is_same<Iterator,LastIterator> >
williamr@2:             , apply1<Predicate,Iterator>
williamr@2:             >
williamr@2:     {
williamr@2: #else
williamr@2:     {
williamr@2:         typedef and_<
williamr@2:               not_< is_same<Iterator,LastIterator> >
williamr@2:             , apply1<Predicate,Iterator>
williamr@2:             > type;
williamr@2: #endif
williamr@2:     };
williamr@2: };
williamr@2: 
williamr@2: } // namespace aux
williamr@2: 
williamr@2: template<
williamr@2:       typename BOOST_MPL_AUX_NA_PARAM(Sequence)
williamr@2:     , typename BOOST_MPL_AUX_NA_PARAM(State)
williamr@2:     , typename BOOST_MPL_AUX_NA_PARAM(ForwardOp)
williamr@2:     , typename BOOST_MPL_AUX_NA_PARAM(ForwardPredicate)
williamr@2:     , typename BOOST_MPL_AUX_NA_PARAM(BackwardOp)
williamr@2:     , typename BOOST_MPL_AUX_NA_PARAM(BackwardPredicate)
williamr@2:     >
williamr@2: struct iter_fold_if
williamr@2: {
williamr@2: 
williamr@2:     typedef typename begin<Sequence>::type first_;
williamr@2:     typedef typename end<Sequence>::type last_;
williamr@2: 
williamr@2:     typedef typename eval_if<
williamr@2:           is_na<BackwardPredicate>
williamr@2:         , if_< is_na<BackwardOp>, always<false_>, always<true_> >
williamr@2:         , identity<BackwardPredicate>
williamr@2:         >::type backward_pred_;
williamr@2: 
williamr@2: // cwpro8 doesn't like 'cut-off' type here (use typedef instead)
williamr@2: #if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) && !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
williamr@2:     struct result_ :
williamr@2: #else
williamr@2:     typedef
williamr@2: #endif
williamr@2:         aux::iter_fold_if_impl<
williamr@2:           first_
williamr@2:         , State
williamr@2:         , ForwardOp
williamr@2:         , protect< aux::iter_fold_if_pred< ForwardPredicate,last_ > >
williamr@2:         , BackwardOp
williamr@2:         , backward_pred_
williamr@2:         >
williamr@2: #if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) && !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
williamr@2:     { };
williamr@2: #else
williamr@2:     result_;
williamr@2: #endif
williamr@2: 
williamr@2: public:
williamr@2: 
williamr@2:     typedef pair<
williamr@2:           typename result_::state
williamr@2:         , typename result_::iterator
williamr@2:         > type;
williamr@2: 
williamr@2:     BOOST_MPL_AUX_LAMBDA_SUPPORT(
williamr@2:           6
williamr@2:         , iter_fold_if
williamr@2:         , (Sequence,State,ForwardOp,ForwardPredicate,BackwardOp,BackwardPredicate)
williamr@2:         )
williamr@2: };
williamr@2: 
williamr@2: BOOST_MPL_AUX_NA_SPEC(6, iter_fold_if)
williamr@2: 
williamr@2: }}
williamr@2: 
williamr@2: #endif // BOOST_MPL_ITER_FOLD_IF_HPP_INCLUDED