Blame boost/mpl/iter_fold_if.hpp

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