//////////////////////////////////////////////////////////////////////////// // lazy_signature.hpp // // Build signature structs for Phoenix equivalents for FC++ // which are located in lazy_prelude.hpp // // These are not direct equivalents of the Boost FC++ structs. // This file has to be included after lazy_list.hpp // // Implemented so far: // // RTEFH == ReturnTypeEnumFromHelper (used in enum_from, enum_from_to) // RTFD == ReturnTypeFunctionDelay (used in repeat) // RTFFX == ReturnTypeFunctoidFwithX (used in thunk1) // RTFFXY == ReturnTypeFunctoidFwithXandY (used in thunk2) // RTFFXYZ == ReturnTypeFunctoidFwithXandYandZ (used in thunk3) // RTF == ReturnTypeF (used in ptr_to_fun0) // RTFX == ReturnTypeFwithX (used in ptr_to_fun, ptr_to_mem_fun) // RTFXY == ReturnTypeFwithXandY (used in ptr_to_fun, ptr_to_mem_fun) // RTFXYZ == ReturnTypeFwithXandYandZ (used in ptr_to_fun, ptr_to_mem_fun) // RTFWXYZ == ReturnTypeFwithWandXandYandZ (used in ptr_to_fun) // RTFGHX == ReturnTypeFandGandHwithX (used in compose) // RTFGHXY == ReturnTypeFandGandHwithXY (used in compose) // RTFGHXYZ == ReturnTypeFandGandHwithXYZ (used in compose) // RTFGX == ReturnTypeFandGwithX (used in compose) // RTFGXY == ReturnTypeFandGwithXY (used in compose) // RTFGXYZ == ReturnTypeFandGwithXYZ (used in compose) // RTFL == ReturnTypeFunctionList (used in map) // RTAB == ReturnTypeListAListB (used in zip) // RTZAB == ReturnTypeZipListAListB (used in zip_with) // //////////////////////////////////////////////////////////////////////////// /*============================================================================= Copyright (c) 2000-2003 Brian McNamara and Yannis Smaragdakis Copyright (c) 2001-2007 Joel de Guzman Copyright (c) 2015 John Fletcher Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #ifndef BOOST_PHOENIX_FUNCTION_LAZY_SIGNATURE #define BOOST_PHOENIX_FUNCTION_LAZY_SIGNATURE namespace boost { namespace phoenix { namespace impl { //template struct remove_RC; in lazy_operator.hpp // RTEFH == ReturnTypeEnumFromHelper template struct RTEFH { typedef typename UseList::template List::type LType; typedef typename result_of::ListType:: delay_result_type type; }; // RTFD == ReturnTypeFunctionDelay (used in repeat) template struct RTFD { typedef typename remove_RC::type TTT; typedef typename UseList::template List::type LType; typedef typename result_of::ListType:: delay_result_type type; }; // RTFFX == ReturnTypeFunctoidFwithX (used in thunk1) template struct RTFFX { typedef typename remove_RC::type FType; typedef typename remove_RC::type XType; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFFXY == ReturnTypeFunctoidFwithXandY (used in thunk2) template struct RTFFXY { typedef typename remove_RC::type FType; typedef typename remove_RC::type XType; typedef typename remove_RC::type YType; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFFXYZ == ReturnTypeFunctoidFwithXandYandZ (used in thunk3) template struct RTFFXYZ { typedef typename remove_RC::type FType; typedef typename remove_RC::type XType; typedef typename remove_RC::type YType; typedef typename remove_RC::type ZType; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type RType; typedef RType type; }; // RTF == ReturnTypeF (used in ptr_to_fun0) template struct RTF { typedef typename remove_RC::type FType; typedef typename boost::result_of::type FR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFX == ReturnTypeFwithX (used in ptr_to_fun) template struct RTFX { typedef typename remove_RC::type FType; typedef typename remove_RC::type XType; typedef typename boost::result_of::type FR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFXY == ReturnTypeFwithXandY (used in ptr_to_fun) template struct RTFXY { typedef typename remove_RC::type FType; typedef typename remove_RC::type XType; typedef typename remove_RC::type YType; typedef typename boost::result_of::type FR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFXYZ == ReturnTypeFwithXandYandZ (used in ptr_to_fun) template struct RTFXYZ { typedef typename remove_RC::type FType; typedef typename remove_RC::type XType; typedef typename remove_RC::type YType; typedef typename remove_RC::type ZType; typedef typename boost::result_of::type FR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFWXYZ == ReturnTypeFwithWandXandYandZ (used in ptr_to_fun) template struct RTFWXYZ { typedef typename remove_RC::type FType; typedef typename remove_RC::type WType; typedef typename remove_RC::type XType; typedef typename remove_RC::type YType; typedef typename remove_RC::type ZType; typedef typename boost::result_of:: type FR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFGHX == ReturnTypeFandGandHwithX (used in compose) template struct RTFGHX { typedef typename remove_RC::type FType; typedef typename remove_RC::type GType; typedef typename remove_RC::type HType; typedef typename remove_RC::type XType; typedef typename boost::result_of::type GR; typedef typename boost::result_of::type GRR; typedef typename remove_RC::type GRType; typedef typename boost::result_of::type HR; typedef typename boost::result_of::type HRR; typedef typename remove_RC::type HRType; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFGHXY == ReturnTypeFandGandHwithXY (used in compose) template struct RTFGHXY { typedef typename remove_RC::type FType; typedef typename remove_RC::type GType; typedef typename remove_RC::type HType; typedef typename remove_RC::type XType; typedef typename remove_RC::type YType; typedef typename boost::result_of::type GR; typedef typename boost::result_of::type GRR; typedef typename remove_RC::type GRType; typedef typename boost::result_of::type HR; typedef typename boost::result_of::type HRR; typedef typename remove_RC::type HRType; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFGHXYZ == ReturnTypeFandGandHwithXYZ (used in compose) template struct RTFGHXYZ { typedef typename remove_RC::type FType; typedef typename remove_RC::type GType; typedef typename remove_RC::type HType; typedef typename remove_RC::type XType; typedef typename remove_RC::type YType; typedef typename remove_RC::type ZType; typedef typename boost::result_of::type GR; typedef typename boost::result_of::type GRR; typedef typename remove_RC::type GRType; typedef typename boost::result_of::type HR; typedef typename boost::result_of::type HRR; typedef typename remove_RC::type HRType; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFGX == ReturnTypeFandGwithX (used in compose) template struct RTFGX { typedef typename remove_RC::type FType; typedef typename remove_RC::type GType; typedef typename remove_RC::type XType; typedef typename boost::result_of::type GR; typedef typename boost::result_of::type GRR; typedef typename remove_RC::type GRType; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFGXY == ReturnTypeFandGwithXY (used in compose) template struct RTFGXY { typedef typename remove_RC::type FType; typedef typename remove_RC::type GType; typedef typename remove_RC::type XType; typedef typename remove_RC::type YType; typedef typename boost::result_of::type GR; typedef typename boost::result_of::type GRR; typedef typename remove_RC::type GRType; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type RType; typedef RType type; }; // RTFGXYZ == ReturnTypeFandGwithXYZ (used in compose) template struct RTFGXYZ { typedef typename remove_RC::type FType; typedef typename remove_RC::type GType; typedef typename remove_RC::type XType; typedef typename remove_RC::type YType; typedef typename remove_RC::type ZType; typedef typename boost::result_of::type GR; typedef typename boost::result_of::type GRR; typedef typename remove_RC::type GRType; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type RType; typedef RType type; }; // This is the way to make the return type for // map(f,l). It is used four times in the code // so I have made it a separate struct. // RTFL == ReturnTypeFunctionList template struct RTFL { typedef typename remove_RC::type Ftype; typedef typename result_of::ListType::tail_result_type Ttype; typedef typename result_of::ListType::value_type Vtype; // NOTE: FR is the type of the functor. typedef typename boost::result_of::type FR; // NOTE: RR is the type returned, which then needs // reference and const removal. typedef typename boost::result_of::type RR; typedef typename remove_RC::type Rtype; typedef typename boost::remove_reference::type LL; typedef typename LL::template cons_rebind::delay_type type; }; // RTAB == ReturnTypeListAListB template struct RTAB { typedef typename result_of::ListType::tail_result_type LAtype; typedef typename result_of::ListType::tail_result_type LBtype; typedef typename result_of::ListType::value_type VAA; typedef typename boost::remove_const::type VAtype; typedef typename result_of::ListType::value_type VBB; typedef typename boost::remove_const::type VBtype; typedef typename boost::result_of ::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type Rtype; typedef typename boost::remove_reference::type LLA; typedef typename LLA::template cons_rebind::type type; }; // RTZAB == ReturnTypeZipListAListB template struct RTZAB { typedef typename remove_RC::type Ztype; typedef typename result_of::ListType::tail_result_type LAtype; typedef typename result_of::ListType::tail_result_type LBtype; typedef typename result_of::ListType::value_type VAtype; typedef typename result_of::ListType::value_type VBtype; typedef typename boost::result_of::type FR; typedef typename boost::result_of::type RR; typedef typename remove_RC::type Rtype; typedef typename boost::remove_reference::type LLA; typedef typename LLA::template cons_rebind::type type; }; } } } #endif