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