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