make_expr.hpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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. template<typename Tag , typename A0 , typename A1>
  9. BOOST_FORCEINLINE
  10. typename lazy_disable_if<
  11. is_domain<A0>
  12. , result_of::make_expr<
  13. Tag
  14. , const A0 , const A1
  15. >
  16. >::type const
  17. make_expr(const A0 &a0 , const A1 &a1)
  18. {
  19. return proto::detail::make_expr_<
  20. Tag
  21. , deduce_domain
  22. , const A0 , const A1
  23. >()(a0 , a1);
  24. }
  25. template<typename Tag, typename Domain , typename C0 , typename C1>
  26. BOOST_FORCEINLINE
  27. typename result_of::make_expr<
  28. Tag
  29. , Domain
  30. , const C0 , const C1
  31. >::type const
  32. make_expr(const C0 &c0 , const C1 &c1)
  33. {
  34. return proto::detail::make_expr_<
  35. Tag
  36. , Domain
  37. , const C0 , const C1
  38. >()(c0 , c1);
  39. }
  40. template<typename Tag , typename A0 , typename A1 , typename A2>
  41. BOOST_FORCEINLINE
  42. typename lazy_disable_if<
  43. is_domain<A0>
  44. , result_of::make_expr<
  45. Tag
  46. , const A0 , const A1 , const A2
  47. >
  48. >::type const
  49. make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2)
  50. {
  51. return proto::detail::make_expr_<
  52. Tag
  53. , deduce_domain
  54. , const A0 , const A1 , const A2
  55. >()(a0 , a1 , a2);
  56. }
  57. template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2>
  58. BOOST_FORCEINLINE
  59. typename result_of::make_expr<
  60. Tag
  61. , Domain
  62. , const C0 , const C1 , const C2
  63. >::type const
  64. make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2)
  65. {
  66. return proto::detail::make_expr_<
  67. Tag
  68. , Domain
  69. , const C0 , const C1 , const C2
  70. >()(c0 , c1 , c2);
  71. }
  72. template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3>
  73. BOOST_FORCEINLINE
  74. typename lazy_disable_if<
  75. is_domain<A0>
  76. , result_of::make_expr<
  77. Tag
  78. , const A0 , const A1 , const A2 , const A3
  79. >
  80. >::type const
  81. make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3)
  82. {
  83. return proto::detail::make_expr_<
  84. Tag
  85. , deduce_domain
  86. , const A0 , const A1 , const A2 , const A3
  87. >()(a0 , a1 , a2 , a3);
  88. }
  89. template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3>
  90. BOOST_FORCEINLINE
  91. typename result_of::make_expr<
  92. Tag
  93. , Domain
  94. , const C0 , const C1 , const C2 , const C3
  95. >::type const
  96. make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3)
  97. {
  98. return proto::detail::make_expr_<
  99. Tag
  100. , Domain
  101. , const C0 , const C1 , const C2 , const C3
  102. >()(c0 , c1 , c2 , c3);
  103. }
  104. template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  105. BOOST_FORCEINLINE
  106. typename lazy_disable_if<
  107. is_domain<A0>
  108. , result_of::make_expr<
  109. Tag
  110. , const A0 , const A1 , const A2 , const A3 , const A4
  111. >
  112. >::type const
  113. make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3 , const A4 &a4)
  114. {
  115. return proto::detail::make_expr_<
  116. Tag
  117. , deduce_domain
  118. , const A0 , const A1 , const A2 , const A3 , const A4
  119. >()(a0 , a1 , a2 , a3 , a4);
  120. }
  121. template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4>
  122. BOOST_FORCEINLINE
  123. typename result_of::make_expr<
  124. Tag
  125. , Domain
  126. , const C0 , const C1 , const C2 , const C3 , const C4
  127. >::type const
  128. make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3 , const C4 &c4)
  129. {
  130. return proto::detail::make_expr_<
  131. Tag
  132. , Domain
  133. , const C0 , const C1 , const C2 , const C3 , const C4
  134. >()(c0 , c1 , c2 , c3 , c4);
  135. }
  136. template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  137. BOOST_FORCEINLINE
  138. typename lazy_disable_if<
  139. is_domain<A0>
  140. , result_of::make_expr<
  141. Tag
  142. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5
  143. >
  144. >::type const
  145. make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3 , const A4 &a4 , const A5 &a5)
  146. {
  147. return proto::detail::make_expr_<
  148. Tag
  149. , deduce_domain
  150. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5
  151. >()(a0 , a1 , a2 , a3 , a4 , a5);
  152. }
  153. template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5>
  154. BOOST_FORCEINLINE
  155. typename result_of::make_expr<
  156. Tag
  157. , Domain
  158. , const C0 , const C1 , const C2 , const C3 , const C4 , const C5
  159. >::type const
  160. make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3 , const C4 &c4 , const C5 &c5)
  161. {
  162. return proto::detail::make_expr_<
  163. Tag
  164. , Domain
  165. , const C0 , const C1 , const C2 , const C3 , const C4 , const C5
  166. >()(c0 , c1 , c2 , c3 , c4 , c5);
  167. }
  168. template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  169. BOOST_FORCEINLINE
  170. typename lazy_disable_if<
  171. is_domain<A0>
  172. , result_of::make_expr<
  173. Tag
  174. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6
  175. >
  176. >::type const
  177. make_expr(const A0 &a0 , const A1 &a1 , const A2 &a2 , const A3 &a3 , const A4 &a4 , const A5 &a5 , const A6 &a6)
  178. {
  179. return proto::detail::make_expr_<
  180. Tag
  181. , deduce_domain
  182. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6
  183. >()(a0 , a1 , a2 , a3 , a4 , a5 , a6);
  184. }
  185. template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6>
  186. BOOST_FORCEINLINE
  187. typename result_of::make_expr<
  188. Tag
  189. , Domain
  190. , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6
  191. >::type const
  192. make_expr(const C0 &c0 , const C1 &c1 , const C2 &c2 , const C3 &c3 , const C4 &c4 , const C5 &c5 , const C6 &c6)
  193. {
  194. return proto::detail::make_expr_<
  195. Tag
  196. , Domain
  197. , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6
  198. >()(c0 , c1 , c2 , c3 , c4 , c5 , c6);
  199. }
  200. template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  201. BOOST_FORCEINLINE
  202. typename lazy_disable_if<
  203. is_domain<A0>
  204. , result_of::make_expr<
  205. Tag
  206. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7
  207. >
  208. >::type const
  209. 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)
  210. {
  211. return proto::detail::make_expr_<
  212. Tag
  213. , deduce_domain
  214. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7
  215. >()(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
  216. }
  217. template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7>
  218. BOOST_FORCEINLINE
  219. typename result_of::make_expr<
  220. Tag
  221. , Domain
  222. , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7
  223. >::type const
  224. 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)
  225. {
  226. return proto::detail::make_expr_<
  227. Tag
  228. , Domain
  229. , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7
  230. >()(c0 , c1 , c2 , c3 , c4 , c5 , c6 , c7);
  231. }
  232. template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  233. BOOST_FORCEINLINE
  234. typename lazy_disable_if<
  235. is_domain<A0>
  236. , result_of::make_expr<
  237. Tag
  238. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8
  239. >
  240. >::type const
  241. 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)
  242. {
  243. return proto::detail::make_expr_<
  244. Tag
  245. , deduce_domain
  246. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8
  247. >()(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
  248. }
  249. template<typename Tag, typename Domain , typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7 , typename C8>
  250. BOOST_FORCEINLINE
  251. typename result_of::make_expr<
  252. Tag
  253. , Domain
  254. , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7 , const C8
  255. >::type const
  256. 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)
  257. {
  258. return proto::detail::make_expr_<
  259. Tag
  260. , Domain
  261. , const C0 , const C1 , const C2 , const C3 , const C4 , const C5 , const C6 , const C7 , const C8
  262. >()(c0 , c1 , c2 , c3 , c4 , c5 , c6 , c7 , c8);
  263. }
  264. template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  265. BOOST_FORCEINLINE
  266. typename lazy_disable_if<
  267. is_domain<A0>
  268. , result_of::make_expr<
  269. Tag
  270. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8 , const A9
  271. >
  272. >::type const
  273. 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)
  274. {
  275. return proto::detail::make_expr_<
  276. Tag
  277. , deduce_domain
  278. , const A0 , const A1 , const A2 , const A3 , const A4 , const A5 , const A6 , const A7 , const A8 , const A9
  279. >()(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
  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 , typename C9>
  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 , const C9
  287. >::type const
  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 , const C9 &c9)
  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 , const C9
  294. >()(c0 , c1 , c2 , c3 , c4 , c5 , c6 , c7 , c8 , c9);
  295. }