1 2 // Copyright Aleksey Gurtovoy 2000-2004 3 // 4 // Distributed under the Boost Software License, Version 1.0. 5 // (See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 // 8 9 // *Preprocessed* version of the main "lambda_no_ctps.hpp" header 10 // -- DO NOT modify by hand! 11 12 namespace boost { namespace mpl { 13 14 namespace aux { 15 16 template< 17 bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false 18 , bool C5 = false 19 > 20 struct lambda_or 21 : true_ 22 { 23 }; 24 25 template<> 26 struct lambda_or< false,false,false,false,false > 27 : false_ 28 { 29 }; 30 31 template< typename Arity > struct lambda_impl 32 { 33 template< typename T, typename Tag, typename Protect > struct result_ 34 { 35 typedef T type; 36 typedef is_placeholder<T> is_le; 37 }; 38 }; 39 40 template<> struct lambda_impl< int_<1> > 41 { 42 template< typename F, typename Tag, typename Protect > struct result_ 43 { 44 typedef lambda< typename F::arg1, Tag, false_ > l1; 45 typedef typename l1::is_le is_le1; 46 typedef aux::lambda_or< 47 BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value 48 > is_le; 49 50 typedef bind1< 51 typename F::rebind 52 , typename l1::type 53 > bind_; 54 55 typedef typename if_< 56 is_le 57 , if_< Protect, mpl::protect<bind_>, bind_ > 58 , identity<F> 59 >::type type_; 60 61 typedef typename type_::type type; 62 }; 63 }; 64 65 template<> struct lambda_impl< int_<2> > 66 { 67 template< typename F, typename Tag, typename Protect > struct result_ 68 { 69 typedef lambda< typename F::arg1, Tag, false_ > l1; 70 typedef lambda< typename F::arg2, Tag, false_ > l2; 71 72 typedef typename l1::is_le is_le1; 73 typedef typename l2::is_le is_le2; 74 75 76 typedef aux::lambda_or< 77 BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value 78 > is_le; 79 80 typedef bind2< 81 typename F::rebind 82 , typename l1::type, typename l2::type 83 > bind_; 84 85 typedef typename if_< 86 is_le 87 , if_< Protect, mpl::protect<bind_>, bind_ > 88 , identity<F> 89 >::type type_; 90 91 typedef typename type_::type type; 92 }; 93 }; 94 95 template<> struct lambda_impl< int_<3> > 96 { 97 template< typename F, typename Tag, typename Protect > struct result_ 98 { 99 typedef lambda< typename F::arg1, Tag, false_ > l1; 100 typedef lambda< typename F::arg2, Tag, false_ > l2; 101 typedef lambda< typename F::arg3, Tag, false_ > l3; 102 103 typedef typename l1::is_le is_le1; 104 typedef typename l2::is_le is_le2; 105 typedef typename l3::is_le is_le3; 106 107 108 typedef aux::lambda_or< 109 BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value 110 > is_le; 111 112 typedef bind3< 113 typename F::rebind 114 , typename l1::type, typename l2::type, typename l3::type 115 > bind_; 116 117 typedef typename if_< 118 is_le 119 , if_< Protect, mpl::protect<bind_>, bind_ > 120 , identity<F> 121 >::type type_; 122 123 typedef typename type_::type type; 124 }; 125 }; 126 127 template<> struct lambda_impl< int_<4> > 128 { 129 template< typename F, typename Tag, typename Protect > struct result_ 130 { 131 typedef lambda< typename F::arg1, Tag, false_ > l1; 132 typedef lambda< typename F::arg2, Tag, false_ > l2; 133 typedef lambda< typename F::arg3, Tag, false_ > l3; 134 typedef lambda< typename F::arg4, Tag, false_ > l4; 135 136 typedef typename l1::is_le is_le1; 137 typedef typename l2::is_le is_le2; 138 typedef typename l3::is_le is_le3; 139 typedef typename l4::is_le is_le4; 140 141 142 typedef aux::lambda_or< 143 BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value 144 > is_le; 145 146 typedef bind4< 147 typename F::rebind 148 , typename l1::type, typename l2::type, typename l3::type 149 , typename l4::type 150 > bind_; 151 152 typedef typename if_< 153 is_le 154 , if_< Protect, mpl::protect<bind_>, bind_ > 155 , identity<F> 156 >::type type_; 157 158 typedef typename type_::type type; 159 }; 160 }; 161 162 template<> struct lambda_impl< int_<5> > 163 { 164 template< typename F, typename Tag, typename Protect > struct result_ 165 { 166 typedef lambda< typename F::arg1, Tag, false_ > l1; 167 typedef lambda< typename F::arg2, Tag, false_ > l2; 168 typedef lambda< typename F::arg3, Tag, false_ > l3; 169 typedef lambda< typename F::arg4, Tag, false_ > l4; 170 typedef lambda< typename F::arg5, Tag, false_ > l5; 171 172 typedef typename l1::is_le is_le1; 173 typedef typename l2::is_le is_le2; 174 typedef typename l3::is_le is_le3; 175 typedef typename l4::is_le is_le4; 176 typedef typename l5::is_le is_le5; 177 178 179 typedef aux::lambda_or< 180 BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value 181 > is_le; 182 183 typedef bind5< 184 typename F::rebind 185 , typename l1::type, typename l2::type, typename l3::type 186 , typename l4::type, typename l5::type 187 > bind_; 188 189 typedef typename if_< 190 is_le 191 , if_< Protect, mpl::protect<bind_>, bind_ > 192 , identity<F> 193 >::type type_; 194 195 typedef typename type_::type type; 196 }; 197 }; 198 199 } // namespace aux 200 201 template< 202 typename T 203 , typename Tag 204 , typename Protect 205 > 206 struct lambda 207 { 208 /// Metafunction forwarding confuses MSVC 6.x 209 typedef typename aux::template_arity<T>::type arity_; 210 typedef typename aux::lambda_impl<arity_> 211 ::template result_< T,Tag,Protect > l_; 212 213 typedef typename l_::type type; 214 typedef typename l_::is_le is_le; 215 BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect)) 216 }; 217 218 BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda) 219 220 template< 221 typename T 222 > 223 struct is_lambda_expression 224 : lambda<T>::is_le 225 { 226 }; 227 228 }} 229 230