1 2 #ifndef BOOST_MPL_TRANSFORM_HPP_INCLUDED 3 #define BOOST_MPL_TRANSFORM_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$ 15 // $Date$ 16 // $Revision$ 17 18 #include <boost/mpl/fold.hpp> 19 #include <boost/mpl/reverse_fold.hpp> 20 #include <boost/mpl/pair_view.hpp> 21 #include <boost/mpl/is_sequence.hpp> 22 #include <boost/mpl/eval_if.hpp> 23 #include <boost/mpl/lambda.hpp> 24 #include <boost/mpl/bind.hpp> 25 #include <boost/mpl/or.hpp> 26 #include <boost/mpl/not.hpp> 27 #include <boost/mpl/aux_/na.hpp> 28 #include <boost/mpl/aux_/inserter_algorithm.hpp> 29 30 namespace boost { namespace mpl { 31 32 namespace aux { 33 34 template< 35 typename Seq 36 , typename Op 37 , typename In 38 > 39 struct transform1_impl 40 : fold< 41 Seq 42 , typename In::state 43 , bind2< typename lambda< typename In::operation >::type 44 , _1 45 , bind1< typename lambda<Op>::type, _2> 46 > 47 > 48 { 49 }; 50 51 template< 52 typename Seq 53 , typename Op 54 , typename In 55 > 56 struct reverse_transform1_impl 57 : reverse_fold< 58 Seq 59 , typename In::state 60 , bind2< typename lambda< typename In::operation >::type 61 , _1 62 , bind1< typename lambda<Op>::type, _2> 63 > 64 > 65 { 66 }; 67 68 template< 69 typename Seq1 70 , typename Seq2 71 , typename Op 72 , typename In 73 > 74 struct transform2_impl 75 : fold< 76 pair_view<Seq1,Seq2> 77 , typename In::state 78 , bind2< typename lambda< typename In::operation >::type 79 , _1 80 , bind2< 81 typename lambda<Op>::type 82 , bind1<first<>,_2> 83 , bind1<second<>,_2> 84 > 85 > 86 > 87 { 88 }; 89 90 template< 91 typename Seq1 92 , typename Seq2 93 , typename Op 94 , typename In 95 > 96 struct reverse_transform2_impl 97 : reverse_fold< 98 pair_view<Seq1,Seq2> 99 , typename In::state 100 , bind2< typename lambda< typename In::operation >::type 101 , _1 102 , bind2< typename lambda< Op >::type 103 , bind1<first<>,_2> 104 , bind1<second<>,_2> 105 > 106 > 107 > 108 { 109 }; 110 111 } // namespace aux 112 113 BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(3, transform1) 114 BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(4, transform2) 115 116 #define AUX778076_TRANSFORM_DEF(name) \ 117 template< \ 118 typename BOOST_MPL_AUX_NA_PARAM(Seq1) \ 119 , typename BOOST_MPL_AUX_NA_PARAM(Seq2OrOperation) \ 120 , typename BOOST_MPL_AUX_NA_PARAM(OperationOrInserter) \ 121 , typename BOOST_MPL_AUX_NA_PARAM(Inserter) \ 122 > \ 123 struct name \ 124 { \ 125 typedef typename eval_if< \ 126 or_< \ 127 is_na<OperationOrInserter> \ 128 , is_lambda_expression< Seq2OrOperation > \ 129 , not_< is_sequence<Seq2OrOperation> > \ 130 > \ 131 , name##1<Seq1,Seq2OrOperation,OperationOrInserter> \ 132 , name##2<Seq1,Seq2OrOperation,OperationOrInserter,Inserter> \ 133 >::type type; \ 134 }; \ 135 BOOST_MPL_AUX_NA_SPEC(4, name) \ 136 /**/ 137 138 AUX778076_TRANSFORM_DEF(transform) 139 AUX778076_TRANSFORM_DEF(reverse_transform) 140 141 #undef AUX778076_TRANSFORM_DEF 142 143 }} 144 145 #endif // BOOST_MPL_TRANSFORM_HPP_INCLUDED 146