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 28 template <typename F, typename A0> 29 struct phx2_result<F, A0 &> 30 { 31 typedef typename F::template result<A0>::type type; 32 }; 33 34 template <typename F, typename A0> 35 struct phx2_result<F, A0 const&> 36 { 37 typedef typename F::template result<A0>::type type; 38 }; 39 40 41 42 43 44 45 46 template <typename F, typename A0 , typename A1> 47 struct has_phx2_result<F, A0 , A1> 48 : mpl::eval_if< 49 has_result_type<F> 50 , mpl::false_ 51 , has_phx2_result_impl<typename F::template result<F(A0 , A1)> > 52 >::type 53 {}; 54 template <typename F, typename A0 , typename A1> 55 struct phx2_result<F, A0 , A1> 56 { 57 typedef typename F::template result<A0 , A1>::type type; 58 }; 59 60 template <typename F, typename A0 , typename A1> 61 struct phx2_result<F, A0 & , A1 &> 62 { 63 typedef typename F::template result<A0 , A1>::type type; 64 }; 65 66 template <typename F, typename A0 , typename A1> 67 struct phx2_result<F, A0 const& , A1 const&> 68 { 69 typedef typename F::template result<A0 , A1>::type type; 70 }; 71 72 73 74 75 76 77 78 template <typename F, typename A0 , typename A1 , typename A2> 79 struct has_phx2_result<F, A0 , A1 , A2> 80 : mpl::eval_if< 81 has_result_type<F> 82 , mpl::false_ 83 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2)> > 84 >::type 85 {}; 86 template <typename F, typename A0 , typename A1 , typename A2> 87 struct phx2_result<F, A0 , A1 , A2> 88 { 89 typedef typename F::template result<A0 , A1 , A2>::type type; 90 }; 91 92 template <typename F, typename A0 , typename A1 , typename A2> 93 struct phx2_result<F, A0 & , A1 & , A2 &> 94 { 95 typedef typename F::template result<A0 , A1 , A2>::type type; 96 }; 97 98 template <typename F, typename A0 , typename A1 , typename A2> 99 struct phx2_result<F, A0 const& , A1 const& , A2 const&> 100 { 101 typedef typename F::template result<A0 , A1 , A2>::type type; 102 }; 103 104 105 106 107 108 109 110 template <typename F, typename A0 , typename A1 , typename A2 , typename A3> 111 struct has_phx2_result<F, A0 , A1 , A2 , A3> 112 : mpl::eval_if< 113 has_result_type<F> 114 , mpl::false_ 115 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3)> > 116 >::type 117 {}; 118 template <typename F, typename A0 , typename A1 , typename A2 , typename A3> 119 struct phx2_result<F, A0 , A1 , A2 , A3> 120 { 121 typedef typename F::template result<A0 , A1 , A2 , A3>::type type; 122 }; 123 124 template <typename F, typename A0 , typename A1 , typename A2 , typename A3> 125 struct phx2_result<F, A0 & , A1 & , A2 & , A3 &> 126 { 127 typedef typename F::template result<A0 , A1 , A2 , A3>::type type; 128 }; 129 130 template <typename F, typename A0 , typename A1 , typename A2 , typename A3> 131 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const&> 132 { 133 typedef typename F::template result<A0 , A1 , A2 , A3>::type type; 134 }; 135 136 137 138 139 140 141 142 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 143 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4> 144 : mpl::eval_if< 145 has_result_type<F> 146 , mpl::false_ 147 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4)> > 148 >::type 149 {}; 150 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 151 struct phx2_result<F, A0 , A1 , A2 , A3 , A4> 152 { 153 typedef typename F::template result<A0 , A1 , A2 , A3 , A4>::type type; 154 }; 155 156 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 157 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 &> 158 { 159 typedef typename F::template result<A0 , A1 , A2 , A3 , A4>::type type; 160 }; 161 162 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4> 163 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const&> 164 { 165 typedef typename F::template result<A0 , A1 , A2 , A3 , A4>::type type; 166 }; 167 168 169 170 171 172 173 174 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 175 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5> 176 : mpl::eval_if< 177 has_result_type<F> 178 , mpl::false_ 179 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5)> > 180 >::type 181 {}; 182 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 183 struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5> 184 { 185 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5>::type type; 186 }; 187 188 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 189 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 &> 190 { 191 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5>::type type; 192 }; 193 194 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5> 195 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const&> 196 { 197 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5>::type type; 198 }; 199 200 201 202 203 204 205 206 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 207 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6> 208 : mpl::eval_if< 209 has_result_type<F> 210 , mpl::false_ 211 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5 , A6)> > 212 >::type 213 {}; 214 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 215 struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6> 216 { 217 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type type; 218 }; 219 220 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 221 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 & , A6 &> 222 { 223 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type type; 224 }; 225 226 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6> 227 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const& , A6 const&> 228 { 229 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type type; 230 }; 231 232 233 234 235 236 237 238 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 239 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7> 240 : mpl::eval_if< 241 has_result_type<F> 242 , mpl::false_ 243 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> > 244 >::type 245 {}; 246 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 247 struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7> 248 { 249 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type type; 250 }; 251 252 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 253 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 & , A6 & , A7 &> 254 { 255 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type type; 256 }; 257 258 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7> 259 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const& , A6 const& , A7 const&> 260 { 261 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type type; 262 }; 263 264 265 266 267 268 269 270 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 271 struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8> 272 : mpl::eval_if< 273 has_result_type<F> 274 , mpl::false_ 275 , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> > 276 >::type 277 {}; 278 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 279 struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8> 280 { 281 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type type; 282 }; 283 284 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 285 struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 & , A6 & , A7 & , A8 &> 286 { 287 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type type; 288 }; 289 290 template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8> 291 struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const& , A6 const& , A7 const& , A8 const&> 292 { 293 typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type type; 294 }; 295