1 ////////////////////////////////////////////////////////////////////////////
4 // Build signature structs for Phoenix equivalents for FC++
5 // which are located in lazy_prelude.hpp
7 // These are not direct equivalents of the Boost FC++ structs.
8 // This file has to be included after lazy_list.hpp
10 // Implemented so far:
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)
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
38 Distributed under the Boost Software License, Version 1.0. (See accompanying
39 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
40 ==============================================================================*/
42 #ifndef BOOST_PHOENIX_FUNCTION_LAZY_SIGNATURE
43 #define BOOST_PHOENIX_FUNCTION_LAZY_SIGNATURE
51 //template <class T> struct remove_RC; in lazy_operator.hpp
53 // RTEFH == ReturnTypeEnumFromHelper
57 typedef typename UseList::template List<T>::type LType;
58 typedef typename result_of::ListType<LType>::
59 delay_result_type type;
62 // RTFD == ReturnTypeFunctionDelay (used in repeat)
65 typedef typename remove_RC<T>::type TTT;
66 typedef typename UseList::template List<TTT>::type LType;
67 typedef typename result_of::ListType<LType>::
68 delay_result_type type;
72 // RTFFX == ReturnTypeFunctoidFwithX (used in thunk1)
73 template <class F,class X>
75 typedef typename remove_RC<F>::type FType;
76 typedef typename remove_RC<X>::type XType;
77 typedef typename boost::result_of<FType(XType)>::type FR;
78 typedef typename boost::result_of<FR()>::type RR;
79 typedef typename remove_RC<RR>::type RType;
83 // RTFFXY == ReturnTypeFunctoidFwithXandY (used in thunk2)
84 template <class F,class X,class Y>
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 boost::result_of<FType(XType,YType)>::type FR;
90 typedef typename boost::result_of<FR()>::type RR;
91 typedef typename remove_RC<RR>::type RType;
95 // RTFFXYZ == ReturnTypeFunctoidFwithXandYandZ (used in thunk3)
96 template <class F,class X,class Y,class Z>
98 typedef typename remove_RC<F>::type FType;
99 typedef typename remove_RC<X>::type XType;
100 typedef typename remove_RC<Y>::type YType;
101 typedef typename remove_RC<Z>::type ZType;
102 typedef typename boost::result_of<FType(XType,YType,ZType)>::type FR;
103 typedef typename boost::result_of<FR()>::type RR;
104 typedef typename remove_RC<RR>::type RType;
108 // RTF == ReturnTypeF (used in ptr_to_fun0)
111 typedef typename remove_RC<F>::type FType;
112 typedef typename boost::result_of<FType()>::type FR;
113 typedef typename remove_RC<FR>::type RType;
117 // RTFX == ReturnTypeFwithX (used in ptr_to_fun)
118 template <class F,class X>
120 typedef typename remove_RC<F>::type FType;
121 typedef typename remove_RC<X>::type XType;
122 typedef typename boost::result_of<FType(XType)>::type FR;
123 typedef typename remove_RC<FR>::type RType;
127 // RTFXY == ReturnTypeFwithXandY (used in ptr_to_fun)
128 template <class F,class X,class Y>
130 typedef typename remove_RC<F>::type FType;
131 typedef typename remove_RC<X>::type XType;
132 typedef typename remove_RC<Y>::type YType;
133 typedef typename boost::result_of<FType(XType,YType)>::type FR;
134 typedef typename remove_RC<FR>::type RType;
138 // RTFXYZ == ReturnTypeFwithXandYandZ (used in ptr_to_fun)
139 template <class F,class X,class Y,class Z>
141 typedef typename remove_RC<F>::type FType;
142 typedef typename remove_RC<X>::type XType;
143 typedef typename remove_RC<Y>::type YType;
144 typedef typename remove_RC<Z>::type ZType;
145 typedef typename boost::result_of<FType(XType,YType,ZType)>::type FR;
146 typedef typename remove_RC<FR>::type RType;
150 // RTFWXYZ == ReturnTypeFwithWandXandYandZ (used in ptr_to_fun)
151 template <class F,class W,class X,class Y,class Z>
153 typedef typename remove_RC<F>::type FType;
154 typedef typename remove_RC<W>::type WType;
155 typedef typename remove_RC<X>::type XType;
156 typedef typename remove_RC<Y>::type YType;
157 typedef typename remove_RC<Z>::type ZType;
158 typedef typename boost::result_of<FType(WType,XType,YType,ZType)>::
160 typedef typename remove_RC<FR>::type RType;
164 // RTFGHX == ReturnTypeFandGandHwithX (used in compose)
165 template <class F,class G,class H,class X>
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 boost::result_of<GType(XType)>::type GR;
172 typedef typename boost::result_of<GR()>::type GRR;
173 typedef typename remove_RC<GRR>::type GRType;
174 typedef typename boost::result_of<HType(XType)>::type HR;
175 typedef typename boost::result_of<HR()>::type HRR;
176 typedef typename remove_RC<HRR>::type HRType;
177 typedef typename boost::result_of<FType(GRType,HRType)>::type FR;
178 typedef typename boost::result_of<FR()>::type RR;
179 typedef typename remove_RC<RR>::type RType;
183 // RTFGHXY == ReturnTypeFandGandHwithXY (used in compose)
184 template <class F,class G,class H,class X,class Y>
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 boost::result_of<GType(XType,YType)>::type GR;
192 typedef typename boost::result_of<GR()>::type GRR;
193 typedef typename remove_RC<GRR>::type GRType;
194 typedef typename boost::result_of<HType(XType,YType)>::type HR;
195 typedef typename boost::result_of<HR()>::type HRR;
196 typedef typename remove_RC<HRR>::type HRType;
197 typedef typename boost::result_of<FType(GRType,HRType)>::type FR;
198 typedef typename boost::result_of<FR()>::type RR;
199 typedef typename remove_RC<RR>::type RType;
203 // RTFGHXYZ == ReturnTypeFandGandHwithXYZ (used in compose)
204 template <class F,class G,class H,class X,class Y,class Z>
206 typedef typename remove_RC<F>::type FType;
207 typedef typename remove_RC<G>::type GType;
208 typedef typename remove_RC<H>::type HType;
209 typedef typename remove_RC<X>::type XType;
210 typedef typename remove_RC<Y>::type YType;
211 typedef typename remove_RC<Z>::type ZType;
212 typedef typename boost::result_of<GType(XType,YType,ZType)>::type GR;
213 typedef typename boost::result_of<GR()>::type GRR;
214 typedef typename remove_RC<GRR>::type GRType;
215 typedef typename boost::result_of<HType(XType,YType,ZType)>::type HR;
216 typedef typename boost::result_of<HR()>::type HRR;
217 typedef typename remove_RC<HRR>::type HRType;
218 typedef typename boost::result_of<FType(GRType,HRType)>::type FR;
219 typedef typename boost::result_of<FR()>::type RR;
220 typedef typename remove_RC<RR>::type RType;
224 // RTFGX == ReturnTypeFandGwithX (used in compose)
225 template <class F,class G,class X>
227 typedef typename remove_RC<F>::type FType;
228 typedef typename remove_RC<G>::type GType;
229 typedef typename remove_RC<X>::type XType;
230 typedef typename boost::result_of<GType(XType)>::type GR;
231 typedef typename boost::result_of<GR()>::type GRR;
232 typedef typename remove_RC<GRR>::type GRType;
233 typedef typename boost::result_of<FType(GRType)>::type FR;
234 typedef typename boost::result_of<FR()>::type RR;
235 typedef typename remove_RC<RR>::type RType;
239 // RTFGXY == ReturnTypeFandGwithXY (used in compose)
240 template <class F,class G,class X,class Y>
242 typedef typename remove_RC<F>::type FType;
243 typedef typename remove_RC<G>::type GType;
244 typedef typename remove_RC<X>::type XType;
245 typedef typename remove_RC<Y>::type YType;
246 typedef typename boost::result_of<GType(XType,YType)>::type GR;
247 typedef typename boost::result_of<GR()>::type GRR;
248 typedef typename remove_RC<GRR>::type GRType;
249 typedef typename boost::result_of<FType(GRType)>::type FR;
250 typedef typename boost::result_of<FR()>::type RR;
251 typedef typename remove_RC<RR>::type RType;
255 // RTFGXYZ == ReturnTypeFandGwithXYZ (used in compose)
256 template <class F,class G,class X,class Y,class Z>
258 typedef typename remove_RC<F>::type FType;
259 typedef typename remove_RC<G>::type GType;
260 typedef typename remove_RC<X>::type XType;
261 typedef typename remove_RC<Y>::type YType;
262 typedef typename remove_RC<Z>::type ZType;
263 typedef typename boost::result_of<GType(XType,YType,ZType)>::type GR;
264 typedef typename boost::result_of<GR()>::type GRR;
265 typedef typename remove_RC<GRR>::type GRType;
266 typedef typename boost::result_of<FType(GRType)>::type FR;
267 typedef typename boost::result_of<FR()>::type RR;
268 typedef typename remove_RC<RR>::type RType;
272 // This is the way to make the return type for
273 // map(f,l). It is used four times in the code
274 // so I have made it a separate struct.
275 // RTFL == ReturnTypeFunctionList
276 template <class F,class L>
278 typedef typename remove_RC<F>::type Ftype;
279 typedef typename result_of::ListType<L>::tail_result_type
281 typedef typename result_of::ListType<L>::value_type Vtype;
282 // NOTE: FR is the type of the functor.
283 typedef typename boost::result_of<Ftype(Vtype)>::type FR;
284 // NOTE: RR is the type returned, which then needs
285 // reference and const removal.
286 typedef typename boost::result_of<FR()>::type RR;
287 typedef typename remove_RC<RR>::type Rtype;
288 typedef typename boost::remove_reference<L>::type LL;
289 typedef typename LL::template cons_rebind<Rtype>::delay_type
293 // RTAB == ReturnTypeListAListB
294 template <typename LA, typename LB>
296 typedef typename result_of::ListType<LA>::tail_result_type
298 typedef typename result_of::ListType<LB>::tail_result_type
300 typedef typename result_of::ListType<LA>::value_type VAA;
301 typedef typename boost::remove_const<VAA>::type VAtype;
302 typedef typename result_of::ListType<LB>::value_type VBB;
303 typedef typename boost::remove_const<VBB>::type VBtype;
304 typedef typename boost::result_of<Make_pair(VAtype,VBtype)>
306 typedef typename boost::result_of<FR()>::type RR;
307 typedef typename remove_RC<RR>::type Rtype;
308 typedef typename boost::remove_reference<LA>::type LLA;
309 typedef typename LLA::template cons_rebind<Rtype>::type type;
313 // RTZAB == ReturnTypeZipListAListB
314 template <typename Z, typename LA, typename LB>
316 typedef typename remove_RC<Z>::type Ztype;
317 typedef typename result_of::ListType<LA>::tail_result_type
319 typedef typename result_of::ListType<LB>::tail_result_type
321 typedef typename result_of::ListType<LA>::value_type VAtype;
322 typedef typename result_of::ListType<LB>::value_type VBtype;
323 typedef typename boost::result_of<Ztype(VAtype,VBtype)>::type
325 typedef typename boost::result_of<FR()>::type RR;
326 typedef typename remove_RC<RR>::type Rtype;
327 typedef typename boost::remove_reference<LA>::type LLA;
328 typedef typename LLA::template cons_rebind<Rtype>::type type;