1 /////////////////////////////////////////////////////////////////////////////// 2 /// \file make_expr.hpp 3 /// Contains overloads of make_expr() free function. 4 // 5 // Copyright 2008 Eric Niebler. Distributed under the Boost 6 // Software License, Version 1.0. (See accompanying file 7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 8 9 10 template<typename Tag , typename A0 , typename A1> 11 BOOST_FORCEINLINE 12 typename lazy_disable_if< 13 is_domain<A0> 14 , result_of::make_expr< 15 Tag 16 , const A0 , const A1 17 > 18 >::type const make_expr(const A0 & a0,const A1 & a1)19 make_expr(const A0 &a0 , const A1 &a1) 20 { 21 return proto::detail::make_expr_< 22 Tag 23 , deduce_domain 24 , const A0 , const A1 25 >()(a0 , a1); 26 } 27 28 29 template<typename Tag, typename Domain , typename C0 , typename C1> 30 BOOST_FORCEINLINE 31 typename result_of::make_expr< 32 Tag 33 , Domain 34 , const C0 , const C1 35 >::type const make_expr(const C0 & c0,const C1 & c1)36 make_expr(const C0 &c0 , const C1 &c1) 37 { 38 return proto::detail::make_expr_< 39 Tag 40 , Domain 41 , const C0 , const C1 42 >()(c0 , c1); 43 } 44 45 46 template<typename Tag , typename A0 , typename A1 , typename A2> 47 BOOST_FORCEINLINE 48 typename lazy_disable_if< 49 is_domain<A0> 50 , result_of::make_expr< 51 Tag 52 , const A0 , const A1 , const A2 53 > 54 >::type const make_expr(const A0 & a0,const A1 & a1,const A2 & a2)55 make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2) 56 { 57 return proto::detail::make_expr_< 58 Tag 59 , deduce_domain 60 , const A0 , const A1 , const A2 61 >()(a0 , a1 , a2); 62 } 63 64 65 template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2> 66 BOOST_FORCEINLINE 67 typename result_of::make_expr< 68 Tag 69 , Domain 70 , const C0 , const C1 , const C2 71 >::type const make_expr(const C0 & c0,const C1 & c1,const C2 & c2)72 make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2) 73 { 74 return proto::detail::make_expr_< 75 Tag 76 , Domain 77 , const C0 , const C1 , const C2 78 >()(c0 , c1 , c2); 79 } 80 81 82 template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3> 83 BOOST_FORCEINLINE 84 typename lazy_disable_if< 85 is_domain<A0> 86 , result_of::make_expr< 87 Tag 88 , const A0 , const A1 , const A2 , const A3 89 > 90 >::type const make_expr(const A0 & a0,const A1 & a1,const A2 & a2,const A3 & a3)91 make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3) 92 { 93 return proto::detail::make_expr_< 94 Tag 95 , deduce_domain 96 , const A0 , const A1 , const A2 , const A3 97 >()(a0 , a1 , a2 , a3); 98 } 99 100 101 template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3> 102 BOOST_FORCEINLINE 103 typename result_of::make_expr< 104 Tag 105 , Domain 106 , const C0 , const C1 , const C2 , const C3 107 >::type const make_expr(const C0 & c0,const C1 & c1,const C2 & c2,const C3 & c3)108 make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3) 109 { 110 return proto::detail::make_expr_< 111 Tag 112 , Domain 113 , const C0 , const C1 , const C2 , const C3 114 >()(c0 , c1 , c2 , c3); 115 } 116 117 118 template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 119 BOOST_FORCEINLINE 120 typename lazy_disable_if< 121 is_domain<A0> 122 , result_of::make_expr< 123 Tag 124 , const A0 , const A1 , const A2 , const A3 , const A4 125 > 126 >::type const make_expr(const A0 & a0,const A1 & a1,const A2 & a2,const A3 & a3,const A4 & a4)127 make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3 , const A4 &a4) 128 { 129 return proto::detail::make_expr_< 130 Tag 131 , deduce_domain 132 , const A0 , const A1 , const A2 , const A3 , const A4 133 >()(a0 , a1 , a2 , a3 , a4); 134 } 135 136 137 template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4> 138 BOOST_FORCEINLINE 139 typename result_of::make_expr< 140 Tag 141 , Domain 142 , const C0 , const C1 , const C2 , const C3 , const C4 143 >::type const make_expr(const C0 & c0,const C1 & c1,const C2 & c2,const C3 & c3,const C4 & c4)144 make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3 , const C4 &c4) 145 { 146 return proto::detail::make_expr_< 147 Tag 148 , Domain 149 , const C0 , const C1 , const C2 , const C3 , const C4 150 >()(c0 , c1 , c2 , c3 , c4); 151 } 152 153 154 template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 155 BOOST_FORCEINLINE 156 typename lazy_disable_if< 157 is_domain<A0> 158 , result_of::make_expr< 159 Tag 160 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 161 > 162 >::type const make_expr(const A0 & a0,const A1 & a1,const A2 & a2,const A3 & a3,const A4 & a4,const A5 & a5)163 make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3 , const A4 &a4 , const A5 &a5) 164 { 165 return proto::detail::make_expr_< 166 Tag 167 , deduce_domain 168 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 169 >()(a0 , a1 , a2 , a3 , a4 , a5); 170 } 171 172 173 template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5> 174 BOOST_FORCEINLINE 175 typename result_of::make_expr< 176 Tag 177 , Domain 178 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 179 >::type const make_expr(const C0 & c0,const C1 & c1,const C2 & c2,const C3 & c3,const C4 & c4,const C5 & c5)180 make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3 , const C4 &c4 , const C5 &c5) 181 { 182 return proto::detail::make_expr_< 183 Tag 184 , Domain 185 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 186 >()(c0 , c1 , c2 , c3 , c4 , c5); 187 } 188 189 190 template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 191 BOOST_FORCEINLINE 192 typename lazy_disable_if< 193 is_domain<A0> 194 , result_of::make_expr< 195 Tag 196 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 197 > 198 >::type const make_expr(const A0 & a0,const A1 & a1,const A2 & a2,const A3 & a3,const A4 & a4,const A5 & a5,const A6 & a6)199 make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3 , const A4 &a4 , const A5 &a5 , const A6 &a6) 200 { 201 return proto::detail::make_expr_< 202 Tag 203 , deduce_domain 204 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 205 >()(a0 , a1 , a2 , a3 , a4 , a5 , a6); 206 } 207 208 209 template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6> 210 BOOST_FORCEINLINE 211 typename result_of::make_expr< 212 Tag 213 , Domain 214 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 215 >::type const make_expr(const C0 & c0,const C1 & c1,const C2 & c2,const C3 & c3,const C4 & c4,const C5 & c5,const C6 & c6)216 make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3 , const C4 &c4 , const C5 &c5 , const C6 &c6) 217 { 218 return proto::detail::make_expr_< 219 Tag 220 , Domain 221 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 222 >()(c0 , c1 , c2 , c3 , c4 , c5 , c6); 223 } 224 225 226 template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 227 BOOST_FORCEINLINE 228 typename lazy_disable_if< 229 is_domain<A0> 230 , result_of::make_expr< 231 Tag 232 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 233 > 234 >::type const make_expr(const A0 & a0,const A1 & a1,const A2 & a2,const A3 & a3,const A4 & a4,const A5 & a5,const A6 & a6,const A7 & a7)235 make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3 , const A4 &a4 , const A5 &a5 , const A6 &a6 , const A7 &a7) 236 { 237 return proto::detail::make_expr_< 238 Tag 239 , deduce_domain 240 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 241 >()(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7); 242 } 243 244 245 template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7> 246 BOOST_FORCEINLINE 247 typename result_of::make_expr< 248 Tag 249 , Domain 250 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7 251 >::type const make_expr(const C0 & c0,const C1 & c1,const C2 & c2,const C3 & c3,const C4 & c4,const C5 & c5,const C6 & c6,const C7 & c7)252 make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3 , const C4 &c4 , const C5 &c5 , const C6 &c6 , const C7 &c7) 253 { 254 return proto::detail::make_expr_< 255 Tag 256 , Domain 257 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7 258 >()(c0 , c1 , c2 , c3 , c4 , c5 , c6 , c7); 259 } 260 261 262 template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 263 BOOST_FORCEINLINE 264 typename lazy_disable_if< 265 is_domain<A0> 266 , result_of::make_expr< 267 Tag 268 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8 269 > 270 >::type const make_expr(const A0 & a0,const A1 & a1,const A2 & a2,const A3 & a3,const A4 & a4,const A5 & a5,const A6 & a6,const A7 & a7,const A8 & a8)271 make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3 , const A4 &a4 , const A5 &a5 , const A6 &a6 , const A7 &a7 , const A8 &a8) 272 { 273 return proto::detail::make_expr_< 274 Tag 275 , deduce_domain 276 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8 277 >()(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8); 278 } 279 280 281 template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7 , typename C8> 282 BOOST_FORCEINLINE 283 typename result_of::make_expr< 284 Tag 285 , Domain 286 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7 , const C8 287 >::type const make_expr(const C0 & c0,const C1 & c1,const C2 & c2,const C3 & c3,const C4 & c4,const C5 & c5,const C6 & c6,const C7 & c7,const C8 & c8)288 make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3 , const C4 &c4 , const C5 &c5 , const C6 &c6 , const C7 &c7 , const C8 &c8) 289 { 290 return proto::detail::make_expr_< 291 Tag 292 , Domain 293 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7 , const C8 294 >()(c0 , c1 , c2 , c3 , c4 , c5 , c6 , c7 , c8); 295 } 296 297 298 template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9> 299 BOOST_FORCEINLINE 300 typename lazy_disable_if< 301 is_domain<A0> 302 , result_of::make_expr< 303 Tag 304 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8 , const A9 305 > 306 >::type const make_expr(const A0 & a0,const A1 & a1,const A2 & a2,const A3 & a3,const A4 & a4,const A5 & a5,const A6 & a6,const A7 & a7,const A8 & a8,const A9 & a9)307 make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3 , const A4 &a4 , const A5 &a5 , const A6 &a6 , const A7 &a7 , const A8 &a8 , const A9 &a9) 308 { 309 return proto::detail::make_expr_< 310 Tag 311 , deduce_domain 312 , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8 , const A9 313 >()(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9); 314 } 315 316 317 template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7 , typename C8 , typename C9> 318 BOOST_FORCEINLINE 319 typename result_of::make_expr< 320 Tag 321 , Domain 322 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7 , const C8 , const C9 323 >::type const make_expr(const C0 & c0,const C1 & c1,const C2 & c2,const C3 & c3,const C4 & c4,const C5 & c5,const C6 & c6,const C7 & c7,const C8 & c8,const C9 & c9)324 make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3 , const C4 &c4 , const C5 &c5 , const C6 &c6 , const C7 &c7 , const C8 &c8 , const C9 &c9) 325 { 326 return proto::detail::make_expr_< 327 Tag 328 , Domain 329 , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7 , const C8 , const C9 330 >()(c0 , c1 , c2 , c3 , c4 , c5 , c6 , c7 , c8 , c9); 331 } 332