lazy_signature.hpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. ////////////////////////////////////////////////////////////////////////////
  2. // lazy_signature.hpp
  3. //
  4. // Build signature structs for Phoenix equivalents for FC++
  5. // which are located in lazy_prelude.hpp
  6. //
  7. // These are not direct equivalents of the Boost FC++ structs.
  8. // This file has to be included after lazy_list.hpp
  9. //
  10. // Implemented so far:
  11. //
  12. // RTEFH == ReturnTypeEnumFromHelper (used in enum_from, enum_from_to)
  13. // RTFD == ReturnTypeFunctionDelay (used in repeat)
  14. // RTFFX == ReturnTypeFunctoidFwithX (used in thunk1)
  15. // RTFFXY == ReturnTypeFunctoidFwithXandY (used in thunk2)
  16. // RTFFXYZ == ReturnTypeFunctoidFwithXandYandZ (used in thunk3)
  17. // RTF == ReturnTypeF (used in ptr_to_fun0)
  18. // RTFX == ReturnTypeFwithX (used in ptr_to_fun, ptr_to_mem_fun)
  19. // RTFXY == ReturnTypeFwithXandY (used in ptr_to_fun, ptr_to_mem_fun)
  20. // RTFXYZ == ReturnTypeFwithXandYandZ (used in ptr_to_fun, ptr_to_mem_fun)
  21. // RTFWXYZ == ReturnTypeFwithWandXandYandZ (used in ptr_to_fun)
  22. // RTFGHX == ReturnTypeFandGandHwithX (used in compose)
  23. // RTFGHXY == ReturnTypeFandGandHwithXY (used in compose)
  24. // RTFGHXYZ == ReturnTypeFandGandHwithXYZ (used in compose)
  25. // RTFGX == ReturnTypeFandGwithX (used in compose)
  26. // RTFGXY == ReturnTypeFandGwithXY (used in compose)
  27. // RTFGXYZ == ReturnTypeFandGwithXYZ (used in compose)
  28. // RTFL == ReturnTypeFunctionList (used in map)
  29. // RTAB == ReturnTypeListAListB (used in zip)
  30. // RTZAB == ReturnTypeZipListAListB (used in zip_with)
  31. //
  32. ////////////////////////////////////////////////////////////////////////////
  33. /*=============================================================================
  34. Copyright (c) 2000-2003 Brian McNamara and Yannis Smaragdakis
  35. Copyright (c) 2001-2007 Joel de Guzman
  36. Copyright (c) 2015 John Fletcher
  37. Distributed under the Boost Software License, Version 1.0. (See accompanying
  38. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  39. ==============================================================================*/
  40. #ifndef BOOST_PHOENIX_FUNCTION_LAZY_SIGNATURE
  41. #define BOOST_PHOENIX_FUNCTION_LAZY_SIGNATURE
  42. namespace boost {
  43. namespace phoenix {
  44. namespace impl {
  45. //template <class T> struct remove_RC; in lazy_operator.hpp
  46. // RTEFH == ReturnTypeEnumFromHelper
  47. template <class T>
  48. struct RTEFH
  49. {
  50. typedef typename UseList::template List<T>::type LType;
  51. typedef typename result_of::ListType<LType>::
  52. delay_result_type type;
  53. };
  54. // RTFD == ReturnTypeFunctionDelay (used in repeat)
  55. template <class T>
  56. struct RTFD {
  57. typedef typename remove_RC<T>::type TTT;
  58. typedef typename UseList::template List<TTT>::type LType;
  59. typedef typename result_of::ListType<LType>::
  60. delay_result_type type;
  61. };
  62. // RTFFX == ReturnTypeFunctoidFwithX (used in thunk1)
  63. template <class F,class X>
  64. struct RTFFX {
  65. typedef typename remove_RC<F>::type FType;
  66. typedef typename remove_RC<X>::type XType;
  67. typedef typename boost::result_of<FType(XType)>::type FR;
  68. typedef typename boost::result_of<FR()>::type RR;
  69. typedef typename remove_RC<RR>::type RType;
  70. typedef RType type;
  71. };
  72. // RTFFXY == ReturnTypeFunctoidFwithXandY (used in thunk2)
  73. template <class F,class X,class Y>
  74. struct RTFFXY {
  75. typedef typename remove_RC<F>::type FType;
  76. typedef typename remove_RC<X>::type XType;
  77. typedef typename remove_RC<Y>::type YType;
  78. typedef typename boost::result_of<FType(XType,YType)>::type FR;
  79. typedef typename boost::result_of<FR()>::type RR;
  80. typedef typename remove_RC<RR>::type RType;
  81. typedef RType type;
  82. };
  83. // RTFFXYZ == ReturnTypeFunctoidFwithXandYandZ (used in thunk3)
  84. template <class F,class X,class Y,class Z>
  85. struct RTFFXYZ {
  86. typedef typename remove_RC<F>::type FType;
  87. typedef typename remove_RC<X>::type XType;
  88. typedef typename remove_RC<Y>::type YType;
  89. typedef typename remove_RC<Z>::type ZType;
  90. typedef typename boost::result_of<FType(XType,YType,ZType)>::type FR;
  91. typedef typename boost::result_of<FR()>::type RR;
  92. typedef typename remove_RC<RR>::type RType;
  93. typedef RType type;
  94. };
  95. // RTF == ReturnTypeF (used in ptr_to_fun0)
  96. template <class F>
  97. struct RTF {
  98. typedef typename remove_RC<F>::type FType;
  99. typedef typename boost::result_of<FType()>::type FR;
  100. typedef typename remove_RC<FR>::type RType;
  101. typedef RType type;
  102. };
  103. // RTFX == ReturnTypeFwithX (used in ptr_to_fun)
  104. template <class F,class X>
  105. struct RTFX {
  106. typedef typename remove_RC<F>::type FType;
  107. typedef typename remove_RC<X>::type XType;
  108. typedef typename boost::result_of<FType(XType)>::type FR;
  109. typedef typename remove_RC<FR>::type RType;
  110. typedef RType type;
  111. };
  112. // RTFXY == ReturnTypeFwithXandY (used in ptr_to_fun)
  113. template <class F,class X,class Y>
  114. struct RTFXY {
  115. typedef typename remove_RC<F>::type FType;
  116. typedef typename remove_RC<X>::type XType;
  117. typedef typename remove_RC<Y>::type YType;
  118. typedef typename boost::result_of<FType(XType,YType)>::type FR;
  119. typedef typename remove_RC<FR>::type RType;
  120. typedef RType type;
  121. };
  122. // RTFXYZ == ReturnTypeFwithXandYandZ (used in ptr_to_fun)
  123. template <class F,class X,class Y,class Z>
  124. struct RTFXYZ {
  125. typedef typename remove_RC<F>::type FType;
  126. typedef typename remove_RC<X>::type XType;
  127. typedef typename remove_RC<Y>::type YType;
  128. typedef typename remove_RC<Z>::type ZType;
  129. typedef typename boost::result_of<FType(XType,YType,ZType)>::type FR;
  130. typedef typename remove_RC<FR>::type RType;
  131. typedef RType type;
  132. };
  133. // RTFWXYZ == ReturnTypeFwithWandXandYandZ (used in ptr_to_fun)
  134. template <class F,class W,class X,class Y,class Z>
  135. struct RTFWXYZ {
  136. typedef typename remove_RC<F>::type FType;
  137. typedef typename remove_RC<W>::type WType;
  138. typedef typename remove_RC<X>::type XType;
  139. typedef typename remove_RC<Y>::type YType;
  140. typedef typename remove_RC<Z>::type ZType;
  141. typedef typename boost::result_of<FType(WType,XType,YType,ZType)>::
  142. type FR;
  143. typedef typename remove_RC<FR>::type RType;
  144. typedef RType type;
  145. };
  146. // RTFGHX == ReturnTypeFandGandHwithX (used in compose)
  147. template <class F,class G,class H,class X>
  148. struct RTFGHX {
  149. typedef typename remove_RC<F>::type FType;
  150. typedef typename remove_RC<G>::type GType;
  151. typedef typename remove_RC<H>::type HType;
  152. typedef typename remove_RC<X>::type XType;
  153. typedef typename boost::result_of<GType(XType)>::type GR;
  154. typedef typename boost::result_of<GR()>::type GRR;
  155. typedef typename remove_RC<GRR>::type GRType;
  156. typedef typename boost::result_of<HType(XType)>::type HR;
  157. typedef typename boost::result_of<HR()>::type HRR;
  158. typedef typename remove_RC<HRR>::type HRType;
  159. typedef typename boost::result_of<FType(GRType,HRType)>::type FR;
  160. typedef typename boost::result_of<FR()>::type RR;
  161. typedef typename remove_RC<RR>::type RType;
  162. typedef RType type;
  163. };
  164. // RTFGHXY == ReturnTypeFandGandHwithXY (used in compose)
  165. template <class F,class G,class H,class X,class Y>
  166. struct RTFGHXY {
  167. typedef typename remove_RC<F>::type FType;
  168. typedef typename remove_RC<G>::type GType;
  169. typedef typename remove_RC<H>::type HType;
  170. typedef typename remove_RC<X>::type XType;
  171. typedef typename remove_RC<Y>::type YType;
  172. typedef typename boost::result_of<GType(XType,YType)>::type GR;
  173. typedef typename boost::result_of<GR()>::type GRR;
  174. typedef typename remove_RC<GRR>::type GRType;
  175. typedef typename boost::result_of<HType(XType,YType)>::type HR;
  176. typedef typename boost::result_of<HR()>::type HRR;
  177. typedef typename remove_RC<HRR>::type HRType;
  178. typedef typename boost::result_of<FType(GRType,HRType)>::type FR;
  179. typedef typename boost::result_of<FR()>::type RR;
  180. typedef typename remove_RC<RR>::type RType;
  181. typedef RType type;
  182. };
  183. // RTFGHXYZ == ReturnTypeFandGandHwithXYZ (used in compose)
  184. template <class F,class G,class H,class X,class Y,class Z>
  185. struct RTFGHXYZ {
  186. typedef typename remove_RC<F>::type FType;
  187. typedef typename remove_RC<G>::type GType;
  188. typedef typename remove_RC<H>::type HType;
  189. typedef typename remove_RC<X>::type XType;
  190. typedef typename remove_RC<Y>::type YType;
  191. typedef typename remove_RC<Z>::type ZType;
  192. typedef typename boost::result_of<GType(XType,YType,ZType)>::type GR;
  193. typedef typename boost::result_of<GR()>::type GRR;
  194. typedef typename remove_RC<GRR>::type GRType;
  195. typedef typename boost::result_of<HType(XType,YType,ZType)>::type HR;
  196. typedef typename boost::result_of<HR()>::type HRR;
  197. typedef typename remove_RC<HRR>::type HRType;
  198. typedef typename boost::result_of<FType(GRType,HRType)>::type FR;
  199. typedef typename boost::result_of<FR()>::type RR;
  200. typedef typename remove_RC<RR>::type RType;
  201. typedef RType type;
  202. };
  203. // RTFGX == ReturnTypeFandGwithX (used in compose)
  204. template <class F,class G,class X>
  205. struct RTFGX {
  206. typedef typename remove_RC<F>::type FType;
  207. typedef typename remove_RC<G>::type GType;
  208. typedef typename remove_RC<X>::type XType;
  209. typedef typename boost::result_of<GType(XType)>::type GR;
  210. typedef typename boost::result_of<GR()>::type GRR;
  211. typedef typename remove_RC<GRR>::type GRType;
  212. typedef typename boost::result_of<FType(GRType)>::type FR;
  213. typedef typename boost::result_of<FR()>::type RR;
  214. typedef typename remove_RC<RR>::type RType;
  215. typedef RType type;
  216. };
  217. // RTFGXY == ReturnTypeFandGwithXY (used in compose)
  218. template <class F,class G,class X,class Y>
  219. struct RTFGXY {
  220. typedef typename remove_RC<F>::type FType;
  221. typedef typename remove_RC<G>::type GType;
  222. typedef typename remove_RC<X>::type XType;
  223. typedef typename remove_RC<Y>::type YType;
  224. typedef typename boost::result_of<GType(XType,YType)>::type GR;
  225. typedef typename boost::result_of<GR()>::type GRR;
  226. typedef typename remove_RC<GRR>::type GRType;
  227. typedef typename boost::result_of<FType(GRType)>::type FR;
  228. typedef typename boost::result_of<FR()>::type RR;
  229. typedef typename remove_RC<RR>::type RType;
  230. typedef RType type;
  231. };
  232. // RTFGXYZ == ReturnTypeFandGwithXYZ (used in compose)
  233. template <class F,class G,class X,class Y,class Z>
  234. struct RTFGXYZ {
  235. typedef typename remove_RC<F>::type FType;
  236. typedef typename remove_RC<G>::type GType;
  237. typedef typename remove_RC<X>::type XType;
  238. typedef typename remove_RC<Y>::type YType;
  239. typedef typename remove_RC<Z>::type ZType;
  240. typedef typename boost::result_of<GType(XType,YType,ZType)>::type GR;
  241. typedef typename boost::result_of<GR()>::type GRR;
  242. typedef typename remove_RC<GRR>::type GRType;
  243. typedef typename boost::result_of<FType(GRType)>::type FR;
  244. typedef typename boost::result_of<FR()>::type RR;
  245. typedef typename remove_RC<RR>::type RType;
  246. typedef RType type;
  247. };
  248. // This is the way to make the return type for
  249. // map(f,l). It is used four times in the code
  250. // so I have made it a separate struct.
  251. // RTFL == ReturnTypeFunctionList
  252. template <class F,class L>
  253. struct RTFL {
  254. typedef typename remove_RC<F>::type Ftype;
  255. typedef typename result_of::ListType<L>::tail_result_type
  256. Ttype;
  257. typedef typename result_of::ListType<L>::value_type Vtype;
  258. // NOTE: FR is the type of the functor.
  259. typedef typename boost::result_of<Ftype(Vtype)>::type FR;
  260. // NOTE: RR is the type returned, which then needs
  261. // reference and const removal.
  262. typedef typename boost::result_of<FR()>::type RR;
  263. typedef typename remove_RC<RR>::type Rtype;
  264. typedef typename boost::remove_reference<L>::type LL;
  265. typedef typename LL::template cons_rebind<Rtype>::delay_type
  266. type;
  267. };
  268. // RTAB == ReturnTypeListAListB
  269. template <typename LA, typename LB>
  270. struct RTAB {
  271. typedef typename result_of::ListType<LA>::tail_result_type
  272. LAtype;
  273. typedef typename result_of::ListType<LB>::tail_result_type
  274. LBtype;
  275. typedef typename result_of::ListType<LA>::value_type VAA;
  276. typedef typename boost::remove_const<VAA>::type VAtype;
  277. typedef typename result_of::ListType<LB>::value_type VBB;
  278. typedef typename boost::remove_const<VBB>::type VBtype;
  279. typedef typename boost::result_of<Make_pair(VAtype,VBtype)>
  280. ::type FR;
  281. typedef typename boost::result_of<FR()>::type RR;
  282. typedef typename remove_RC<RR>::type Rtype;
  283. typedef typename boost::remove_reference<LA>::type LLA;
  284. typedef typename LLA::template cons_rebind<Rtype>::type type;
  285. };
  286. // RTZAB == ReturnTypeZipListAListB
  287. template <typename Z, typename LA, typename LB>
  288. struct RTZAB {
  289. typedef typename remove_RC<Z>::type Ztype;
  290. typedef typename result_of::ListType<LA>::tail_result_type
  291. LAtype;
  292. typedef typename result_of::ListType<LB>::tail_result_type
  293. LBtype;
  294. typedef typename result_of::ListType<LA>::value_type VAtype;
  295. typedef typename result_of::ListType<LB>::value_type VBtype;
  296. typedef typename boost::result_of<Ztype(VAtype,VBtype)>::type
  297. FR;
  298. typedef typename boost::result_of<FR()>::type RR;
  299. typedef typename remove_RC<RR>::type Rtype;
  300. typedef typename boost::remove_reference<LA>::type LLA;
  301. typedef typename LLA::template cons_rebind<Rtype>::type type;
  302. };
  303. }
  304. }
  305. }
  306. #endif