Home | History | Annotate | Download | only in mpl
      1 
      2 #ifndef BOOST_MPL_REMOVE_IF_HPP_INCLUDED
      3 #define BOOST_MPL_REMOVE_IF_HPP_INCLUDED
      4 
      5 // Copyright Aleksey Gurtovoy 2000-2004
      6 // Copyright David Abrahams 2003-2004
      7 //
      8 // Distributed under the Boost Software License, Version 1.0.
      9 // (See accompanying file LICENSE_1_0.txt or copy at
     10 // http://www.boost.org/LICENSE_1_0.txt)
     11 //
     12 // See http://www.boost.org/libs/mpl for documentation.
     13 
     14 // $Id: remove_if.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
     15 // $Date: 2008-10-10 23:19:02 -0700 (Fri, 10 Oct 2008) $
     16 // $Revision: 49267 $
     17 
     18 #include <boost/mpl/fold.hpp>
     19 #include <boost/mpl/reverse_fold.hpp>
     20 #include <boost/mpl/eval_if.hpp>
     21 #include <boost/mpl/identity.hpp>
     22 #include <boost/mpl/protect.hpp>
     23 #include <boost/mpl/lambda.hpp>
     24 #include <boost/mpl/apply.hpp>
     25 #include <boost/mpl/aux_/inserter_algorithm.hpp>
     26 
     27 namespace boost { namespace mpl {
     28 
     29 namespace aux {
     30 
     31 template< typename Pred, typename InsertOp > struct remove_if_helper
     32 {
     33     template< typename Sequence, typename U > struct apply
     34     {
     35         typedef typename eval_if<
     36               typename apply1<Pred,U>::type
     37             , identity<Sequence>
     38             , apply2<InsertOp,Sequence,U>
     39             >::type type;
     40     };
     41 };
     42 
     43 template<
     44       typename Sequence
     45     , typename Predicate
     46     , typename Inserter
     47     >
     48 struct remove_if_impl
     49     : fold<
     50           Sequence
     51         , typename Inserter::state
     52         , protect< aux::remove_if_helper<
     53               typename lambda<Predicate>::type
     54             , typename Inserter::operation
     55             > >
     56         >
     57 {
     58 };
     59 
     60 template<
     61       typename Sequence
     62     , typename Predicate
     63     , typename Inserter
     64     >
     65 struct reverse_remove_if_impl
     66     : reverse_fold<
     67           Sequence
     68         , typename Inserter::state
     69         , protect< aux::remove_if_helper<
     70               typename lambda<Predicate>::type
     71             , typename Inserter::operation
     72             > >
     73         >
     74 {
     75 };
     76 
     77 } // namespace aux
     78 
     79 BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(3, remove_if)
     80 
     81 }}
     82 
     83 #endif // BOOST_MPL_REMOVE_IF_HPP_INCLUDED
     84