1 /*============================================================================= 2 Copyright (c) 2011 Thomas Heller 3 4 Distributed under the Boost Software License, Version 1.0. (See accompanying 5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 ==============================================================================*/ 7 8 9 10 11 12 13 14 template <typename F, typename A0> 15 struct has_phx2_result<F, A0> 16 : mpl::eval_if< 17 has_result_type<F> 18 , mpl::false_ 19 , has_phx2_result_impl<typename F::template result<F(A0)> > 20 >::type 21 {}; 22 template <typename F, typename A0> 23 struct phx2_result<F, A0> 24 { 25 typedef typename F::template result<A0>::type type; 26 }; 27 template <typename F, typename A0> 28 struct phx2_result<F, A0 &> 29 { 30 typedef typename F::template result<A0>::type type; 31 }; 32 template <typename F, typename A0> 33 struct phx2_result<F, A0 const&> 34 { 35 typedef typename F::template result<A0>::type type; 36 }; 37 38 39 40 41 42 43 44 template <typename F, typename A0 , typename A1> 45 struct has_phx2_result<F, A0 , A1> 46 : mpl::eval_if< 47 has_result_type<F> 48 , mpl::false_ 49 , has_phx2_result_impl<typename F::template result<F(A0 , A1)> > 50 >::type 51 {}; 52 template <typename F, typename A0 , typename A1> 53 struct phx2_result<F, A0 , A1> 54 { 55 typedef typename F::template result<A0 , A1>::type type; 56 }; 57 template <typename F, typename A0 , typename A1> 58 struct phx2_result<F, A0 & , A1 &> 59 { 60 typedef typename F::template result<A0 , A1>::type type; 61 }; 62 template <typename F, typename A0 , typename A1> 63 struct phx2_result<F, A0 const& , A1 const&> 64 { 65 typedef typename F::template result<A0 , A1>::type type; 66 }; 67 68 69 70 71 72 73 74 template <typename F, typename A0 , typename A1 , typename A2> 75 struct has_phx2_result<F, A0 , A1 , A2> 76 : mpl::eval_if< 77 has_result_type<F> 78 , mpl::false_ 79 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2)> > 80 >::type 81 {}; 82 template <typename F, typename A0 , typename A1 , typename A2> 83 struct phx2_result<F, A0 , A1 , A2> 84 { 85 typedef typename F::template result<A0 , A1 , A2>::type type; 86 }; 87 template <typename F, typename A0 , typename A1 , typename A2> 88 struct phx2_result<F, A0 & , A1 & , A2 &> 89 { 90 typedef typename F::template result<A0 , A1 , A2>::type type; 91 }; 92 template <typename F, typename A0 , typename A1 , typename A2> 93 struct phx2_result<F, A0 const& , A1 const& , A2 const&> 94 { 95 typedef typename F::template result<A0 , A1 , A2>::type type; 96 }; 97 98 99 100 101 102 103 104 template <typename F, typename A0 , typename A1 , typename A2 , typename A3> 105 struct has_phx2_result<F, A0 , A1 , A2 , A3> 106 : mpl::eval_if< 107 has_result_type<F> 108 , mpl::false_ 109 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3)> > 110 >::type 111 {}; 112 template <typename F, typename A0 , typename A1 , typename A2 , typename A3> 113 struct phx2_result<F, A0 , A1 , A2 , A3> 114 { 115 typedef typename F::template result<A0 , A1 , A2 , A3>::type type; 116 }; 117 template <typename F, typename A0 , typename A1 , typename A2 , typename A3> 118 struct phx2_result<F, A0 & , A1 & , A2 & , A3 &> 119 { 120 typedef typename F::template result<A0 , A1 , A2 , A3>::type type; 121 }; 122 template <typename F, typename A0 , typename A1 , typename A2 , typename A3> 123 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const&> 124 { 125 typedef typename F::template result<A0 , A1 , A2 , A3>::type type; 126 }; 127 128 129 130 131 132 133 134 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 135 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4> 136 : mpl::eval_if< 137 has_result_type<F> 138 , mpl::false_ 139 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4)> > 140 >::type 141 {}; 142 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 143 struct phx2_result<F, A0 , A1 , A2 , A3 , A4> 144 { 145 typedef typename F::template result<A0 , A1 , A2 , A3 , A4>::type type; 146 }; 147 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 148 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 &> 149 { 150 typedef typename F::template result<A0 , A1 , A2 , A3 , A4>::type type; 151 }; 152 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 153 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const&> 154 { 155 typedef typename F::template result<A0 , A1 , A2 , A3 , A4>::type type; 156 }; 157 158 159 160 161 162 163 164 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 165 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5> 166 : mpl::eval_if< 167 has_result_type<F> 168 , mpl::false_ 169 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5)> > 170 >::type 171 {}; 172 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 173 struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5> 174 { 175 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5>::type type; 176 }; 177 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 178 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 &> 179 { 180 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5>::type type; 181 }; 182 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 183 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const&> 184 { 185 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5>::type type; 186 }; 187 188 189 190 191 192 193 194 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 195 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6> 196 : mpl::eval_if< 197 has_result_type<F> 198 , mpl::false_ 199 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5 , A6)> > 200 >::type 201 {}; 202 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 203 struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6> 204 { 205 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type type; 206 }; 207 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 208 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 & , A6 &> 209 { 210 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type type; 211 }; 212 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 213 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const& , A6 const&> 214 { 215 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type type; 216 }; 217 218 219 220 221 222 223 224 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 225 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7> 226 : mpl::eval_if< 227 has_result_type<F> 228 , mpl::false_ 229 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> > 230 >::type 231 {}; 232 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 233 struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7> 234 { 235 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type type; 236 }; 237 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 238 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 & , A6 & , A7 &> 239 { 240 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type type; 241 }; 242 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 243 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const& , A6 const& , A7 const&> 244 { 245 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type type; 246 }; 247 248 249 250 251 252 253 254 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 255 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8> 256 : mpl::eval_if< 257 has_result_type<F> 258 , mpl::false_ 259 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> > 260 >::type 261 {}; 262 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 263 struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8> 264 { 265 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type type; 266 }; 267 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 268 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 & , A6 & , A7 & , A8 &> 269 { 270 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type type; 271 }; 272 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 273 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const& , A6 const& , A7 const& , A8 const&> 274 { 275 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type type; 276 }; 277