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 williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include 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 > williamr@2: , apply1 williamr@2: > williamr@2: { williamr@2: #else williamr@2: { williamr@2: typedef and_< williamr@2: not_< is_same > williamr@2: , apply1 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::type first_; williamr@2: typedef typename end::type last_; williamr@2: williamr@2: typedef typename eval_if< williamr@2: is_na williamr@2: , if_< is_na, always, always > williamr@2: , identity 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