1 /////////////////////////////////////////////////////////////////////////////// 2 /// \file make_gcc_workaround.hpp 3 /// Special workaround code to make the make\<\> transform work on certain 4 /// versions of gcc. 5 // 6 // Copyright 2008 Eric Niebler. Distributed under the Boost 7 // Software License, Version 1.0. (See accompanying file 8 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 10 template<typename Tag, typename Args, long Arity > 11 struct make<proto::expr<Tag, Args, Arity>()> 12 : transform<make<proto::expr<Tag, Args, Arity>()> > 13 { 14 template<typename Expr, typename State, typename Data> 15 struct impl : transform_impl<Expr, State, Data> 16 { 17 typedef proto::expr<Tag, Args, Arity> result_type; 18 BOOST_FORCEINLINE 19 result_type operator ()( 20 typename impl::expr_param e 21 , typename impl::state_param s 22 , typename impl::data_param d 23 ) const 24 { 25 return proto::expr<Tag, Args, Arity>::make( 26 27 ); 28 } 29 }; 30 }; 31 template<typename Tag, typename Args, long Arity > 32 struct make<proto::basic_expr<Tag, Args, Arity>()> 33 : transform<make<proto::basic_expr<Tag, Args, Arity>()> > 34 { 35 template<typename Expr, typename State, typename Data> 36 struct impl : transform_impl<Expr, State, Data> 37 { 38 typedef proto::basic_expr<Tag, Args, Arity> result_type; 39 BOOST_FORCEINLINE 40 result_type operator ()( 41 typename impl::expr_param e 42 , typename impl::state_param s 43 , typename impl::data_param d 44 ) const 45 { 46 return proto::basic_expr<Tag, Args, Arity>::make( 47 48 ); 49 } 50 }; 51 }; 52 53 template<typename Tag, typename Args, long Arity , typename A0> 54 struct make<proto::expr<Tag, Args, Arity>(A0)> 55 : transform<make<proto::expr<Tag, Args, Arity>(A0)> > 56 { 57 template<typename Expr, typename State, typename Data> 58 struct impl : transform_impl<Expr, State, Data> 59 { 60 typedef proto::expr<Tag, Args, Arity> result_type; 61 BOOST_FORCEINLINE 62 result_type operator ()( 63 typename impl::expr_param e 64 , typename impl::state_param s 65 , typename impl::data_param d 66 ) const 67 { 68 return proto::expr<Tag, Args, Arity>::make( 69 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) 70 ); 71 } 72 }; 73 }; 74 template<typename Tag, typename Args, long Arity , typename A0> 75 struct make<proto::basic_expr<Tag, Args, Arity>(A0)> 76 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0)> > 77 { 78 template<typename Expr, typename State, typename Data> 79 struct impl : transform_impl<Expr, State, Data> 80 { 81 typedef proto::basic_expr<Tag, Args, Arity> result_type; 82 BOOST_FORCEINLINE 83 result_type operator ()( 84 typename impl::expr_param e 85 , typename impl::state_param s 86 , typename impl::data_param d 87 ) const 88 { 89 return proto::basic_expr<Tag, Args, Arity>::make( 90 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) 91 ); 92 } 93 }; 94 }; 95 96 template<typename Tag, typename Args, long Arity , typename A0 , typename A1> 97 struct make<proto::expr<Tag, Args, Arity>(A0 , A1)> 98 : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1)> > 99 { 100 template<typename Expr, typename State, typename Data> 101 struct impl : transform_impl<Expr, State, Data> 102 { 103 typedef proto::expr<Tag, Args, Arity> result_type; 104 BOOST_FORCEINLINE 105 result_type operator ()( 106 typename impl::expr_param e 107 , typename impl::state_param s 108 , typename impl::data_param d 109 ) const 110 { 111 return proto::expr<Tag, Args, Arity>::make( 112 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) 113 ); 114 } 115 }; 116 }; 117 template<typename Tag, typename Args, long Arity , typename A0 , typename A1> 118 struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1)> 119 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1)> > 120 { 121 template<typename Expr, typename State, typename Data> 122 struct impl : transform_impl<Expr, State, Data> 123 { 124 typedef proto::basic_expr<Tag, Args, Arity> result_type; 125 BOOST_FORCEINLINE 126 result_type operator ()( 127 typename impl::expr_param e 128 , typename impl::state_param s 129 , typename impl::data_param d 130 ) const 131 { 132 return proto::basic_expr<Tag, Args, Arity>::make( 133 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) 134 ); 135 } 136 }; 137 }; 138 139 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2> 140 struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2)> 141 : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2)> > 142 { 143 template<typename Expr, typename State, typename Data> 144 struct impl : transform_impl<Expr, State, Data> 145 { 146 typedef proto::expr<Tag, Args, Arity> result_type; 147 BOOST_FORCEINLINE 148 result_type operator ()( 149 typename impl::expr_param e 150 , typename impl::state_param s 151 , typename impl::data_param d 152 ) const 153 { 154 return proto::expr<Tag, Args, Arity>::make( 155 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) 156 ); 157 } 158 }; 159 }; 160 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2> 161 struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2)> 162 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2)> > 163 { 164 template<typename Expr, typename State, typename Data> 165 struct impl : transform_impl<Expr, State, Data> 166 { 167 typedef proto::basic_expr<Tag, Args, Arity> result_type; 168 BOOST_FORCEINLINE 169 result_type operator ()( 170 typename impl::expr_param e 171 , typename impl::state_param s 172 , typename impl::data_param d 173 ) const 174 { 175 return proto::basic_expr<Tag, Args, Arity>::make( 176 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) 177 ); 178 } 179 }; 180 }; 181 182 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3> 183 struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)> 184 : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)> > 185 { 186 template<typename Expr, typename State, typename Data> 187 struct impl : transform_impl<Expr, State, Data> 188 { 189 typedef proto::expr<Tag, Args, Arity> result_type; 190 BOOST_FORCEINLINE 191 result_type operator ()( 192 typename impl::expr_param e 193 , typename impl::state_param s 194 , typename impl::data_param d 195 ) const 196 { 197 return proto::expr<Tag, Args, Arity>::make( 198 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) 199 ); 200 } 201 }; 202 }; 203 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3> 204 struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)> 205 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)> > 206 { 207 template<typename Expr, typename State, typename Data> 208 struct impl : transform_impl<Expr, State, Data> 209 { 210 typedef proto::basic_expr<Tag, Args, Arity> result_type; 211 BOOST_FORCEINLINE 212 result_type operator ()( 213 typename impl::expr_param e 214 , typename impl::state_param s 215 , typename impl::data_param d 216 ) const 217 { 218 return proto::basic_expr<Tag, Args, Arity>::make( 219 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) 220 ); 221 } 222 }; 223 }; 224 225 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 226 struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)> 227 : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)> > 228 { 229 template<typename Expr, typename State, typename Data> 230 struct impl : transform_impl<Expr, State, Data> 231 { 232 typedef proto::expr<Tag, Args, Arity> result_type; 233 BOOST_FORCEINLINE 234 result_type operator ()( 235 typename impl::expr_param e 236 , typename impl::state_param s 237 , typename impl::data_param d 238 ) const 239 { 240 return proto::expr<Tag, Args, Arity>::make( 241 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) 242 ); 243 } 244 }; 245 }; 246 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 247 struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)> 248 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)> > 249 { 250 template<typename Expr, typename State, typename Data> 251 struct impl : transform_impl<Expr, State, Data> 252 { 253 typedef proto::basic_expr<Tag, Args, Arity> result_type; 254 BOOST_FORCEINLINE 255 result_type operator ()( 256 typename impl::expr_param e 257 , typename impl::state_param s 258 , typename impl::data_param d 259 ) const 260 { 261 return proto::basic_expr<Tag, Args, Arity>::make( 262 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) 263 ); 264 } 265 }; 266 }; 267 268 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 269 struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)> 270 : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)> > 271 { 272 template<typename Expr, typename State, typename Data> 273 struct impl : transform_impl<Expr, State, Data> 274 { 275 typedef proto::expr<Tag, Args, Arity> result_type; 276 BOOST_FORCEINLINE 277 result_type operator ()( 278 typename impl::expr_param e 279 , typename impl::state_param s 280 , typename impl::data_param d 281 ) const 282 { 283 return proto::expr<Tag, Args, Arity>::make( 284 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) 285 ); 286 } 287 }; 288 }; 289 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 290 struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)> 291 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)> > 292 { 293 template<typename Expr, typename State, typename Data> 294 struct impl : transform_impl<Expr, State, Data> 295 { 296 typedef proto::basic_expr<Tag, Args, Arity> result_type; 297 BOOST_FORCEINLINE 298 result_type operator ()( 299 typename impl::expr_param e 300 , typename impl::state_param s 301 , typename impl::data_param d 302 ) const 303 { 304 return proto::basic_expr<Tag, Args, Arity>::make( 305 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) 306 ); 307 } 308 }; 309 }; 310 311 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 312 struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)> 313 : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)> > 314 { 315 template<typename Expr, typename State, typename Data> 316 struct impl : transform_impl<Expr, State, Data> 317 { 318 typedef proto::expr<Tag, Args, Arity> result_type; 319 BOOST_FORCEINLINE 320 result_type operator ()( 321 typename impl::expr_param e 322 , typename impl::state_param s 323 , typename impl::data_param d 324 ) const 325 { 326 return proto::expr<Tag, Args, Arity>::make( 327 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) 328 ); 329 } 330 }; 331 }; 332 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 333 struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)> 334 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)> > 335 { 336 template<typename Expr, typename State, typename Data> 337 struct impl : transform_impl<Expr, State, Data> 338 { 339 typedef proto::basic_expr<Tag, Args, Arity> result_type; 340 BOOST_FORCEINLINE 341 result_type operator ()( 342 typename impl::expr_param e 343 , typename impl::state_param s 344 , typename impl::data_param d 345 ) const 346 { 347 return proto::basic_expr<Tag, Args, Arity>::make( 348 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) 349 ); 350 } 351 }; 352 }; 353 354 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 355 struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> 356 : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> > 357 { 358 template<typename Expr, typename State, typename Data> 359 struct impl : transform_impl<Expr, State, Data> 360 { 361 typedef proto::expr<Tag, Args, Arity> result_type; 362 BOOST_FORCEINLINE 363 result_type operator ()( 364 typename impl::expr_param e 365 , typename impl::state_param s 366 , typename impl::data_param d 367 ) const 368 { 369 return proto::expr<Tag, Args, Arity>::make( 370 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) 371 ); 372 } 373 }; 374 }; 375 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 376 struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> 377 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> > 378 { 379 template<typename Expr, typename State, typename Data> 380 struct impl : transform_impl<Expr, State, Data> 381 { 382 typedef proto::basic_expr<Tag, Args, Arity> result_type; 383 BOOST_FORCEINLINE 384 result_type operator ()( 385 typename impl::expr_param e 386 , typename impl::state_param s 387 , typename impl::data_param d 388 ) const 389 { 390 return proto::basic_expr<Tag, Args, Arity>::make( 391 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) 392 ); 393 } 394 }; 395 }; 396 397 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 398 struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> 399 : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> > 400 { 401 template<typename Expr, typename State, typename Data> 402 struct impl : transform_impl<Expr, State, Data> 403 { 404 typedef proto::expr<Tag, Args, Arity> result_type; 405 BOOST_FORCEINLINE 406 result_type operator ()( 407 typename impl::expr_param e 408 , typename impl::state_param s 409 , typename impl::data_param d 410 ) const 411 { 412 return proto::expr<Tag, Args, Arity>::make( 413 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) ) 414 ); 415 } 416 }; 417 }; 418 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 419 struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> 420 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> > 421 { 422 template<typename Expr, typename State, typename Data> 423 struct impl : transform_impl<Expr, State, Data> 424 { 425 typedef proto::basic_expr<Tag, Args, Arity> result_type; 426 BOOST_FORCEINLINE 427 result_type operator ()( 428 typename impl::expr_param e 429 , typename impl::state_param s 430 , typename impl::data_param d 431 ) const 432 { 433 return proto::basic_expr<Tag, Args, Arity>::make( 434 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) ) 435 ); 436 } 437 }; 438 }; 439 440 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9> 441 struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> 442 : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> > 443 { 444 template<typename Expr, typename State, typename Data> 445 struct impl : transform_impl<Expr, State, Data> 446 { 447 typedef proto::expr<Tag, Args, Arity> result_type; 448 BOOST_FORCEINLINE 449 result_type operator ()( 450 typename impl::expr_param e 451 , typename impl::state_param s 452 , typename impl::data_param d 453 ) const 454 { 455 return proto::expr<Tag, Args, Arity>::make( 456 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A9>::template impl<Expr, State, Data>()(e, s, d) ) 457 ); 458 } 459 }; 460 }; 461 template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9> 462 struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> 463 : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> > 464 { 465 template<typename Expr, typename State, typename Data> 466 struct impl : transform_impl<Expr, State, Data> 467 { 468 typedef proto::basic_expr<Tag, Args, Arity> result_type; 469 BOOST_FORCEINLINE 470 result_type operator ()( 471 typename impl::expr_param e 472 , typename impl::state_param s 473 , typename impl::data_param d 474 ) const 475 { 476 return proto::basic_expr<Tag, Args, Arity>::make( 477 detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A9>::template impl<Expr, State, Data>()(e, s, d) ) 478 ); 479 } 480 }; 481 }; 482