1 2 // Copyright Peter Dimov 2001 3 // Copyright Aleksey Gurtovoy 2001-2004 4 // 5 // Distributed under the Boost Software License, Version 1.0. 6 // (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 // 9 10 // Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header 11 // -- DO NOT modify by hand! 12 13 namespace boost { namespace mpl { 14 15 namespace aux { 16 template< bool > 17 struct resolve_arg_impl 18 { 19 template< 20 typename T, typename U1, typename U2, typename U3 21 , typename U4, typename U5 22 > 23 struct result_ 24 { 25 typedef T type; 26 }; 27 }; 28 29 template<> 30 struct resolve_arg_impl<true> 31 { 32 template< 33 typename T, typename U1, typename U2, typename U3 34 , typename U4, typename U5 35 > 36 struct result_ 37 { 38 typedef typename apply_wrap5< 39 T 40 , U1, U2, U3, U4, U5 41 >::type type; 42 }; 43 }; 44 45 template< typename T > struct is_bind_template; 46 47 template< 48 typename T, typename U1, typename U2, typename U3, typename U4 49 , typename U5 50 > 51 struct resolve_bind_arg 52 : resolve_arg_impl< is_bind_template<T>::value > 53 ::template result_< T,U1,U2,U3,U4,U5 > 54 { 55 }; 56 57 template< int arity_ > struct bind_chooser; 58 59 aux::no_tag is_bind_helper(...); 60 template< typename T > aux::no_tag is_bind_helper(protect<T>*); 61 62 template< 63 typename F, typename T1, typename T2, typename T3, typename T4 64 , typename T5 65 > 66 aux::yes_tag is_bind_helper(bind< F,T1,T2,T3,T4,T5 >*); 67 68 template< int N > 69 aux::yes_tag is_bind_helper(arg<N>*); 70 71 template< bool is_ref_ = true > 72 struct is_bind_template_impl 73 { 74 template< typename T > struct result_ 75 { 76 BOOST_STATIC_CONSTANT(bool, value = false); 77 }; 78 }; 79 80 template<> 81 struct is_bind_template_impl<false> 82 { 83 template< typename T > struct result_ 84 { 85 BOOST_STATIC_CONSTANT(bool, value = 86 sizeof(aux::is_bind_helper(static_cast<T*>(0))) 87 == sizeof(aux::yes_tag) 88 ); 89 }; 90 }; 91 92 template< typename T > struct is_bind_template 93 : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value > 94 ::template result_<T> 95 { 96 }; 97 98 } // namespace aux 99 100 template< 101 typename F 102 > 103 struct bind0 104 { 105 template< 106 typename U1 = na, typename U2 = na, typename U3 = na 107 , typename U4 = na, typename U5 = na 108 > 109 struct apply 110 { 111 private: 112 typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_; 113 114 public: 115 typedef typename apply_wrap0< 116 f_ 117 >::type type; 118 119 }; 120 }; 121 122 namespace aux { 123 124 template< 125 typename F 126 > 127 aux::yes_tag 128 is_bind_helper(bind0<F>*); 129 130 } // namespace aux 131 132 BOOST_MPL_AUX_ARITY_SPEC(1, bind0) 133 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0) 134 135 namespace aux { 136 137 template<> 138 struct bind_chooser<0> 139 { 140 template< 141 typename F, typename T1, typename T2, typename T3, typename T4 142 , typename T5 143 > 144 struct result_ 145 { 146 typedef bind0<F> type; 147 }; 148 }; 149 150 } // namespace aux 151 152 template< 153 typename F, typename T1 154 > 155 struct bind1 156 { 157 template< 158 typename U1 = na, typename U2 = na, typename U3 = na 159 , typename U4 = na, typename U5 = na 160 > 161 struct apply 162 { 163 private: 164 typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_; 165 typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1; 166 167 public: 168 typedef typename apply_wrap1< 169 f_ 170 , typename t1::type 171 >::type type; 172 173 }; 174 }; 175 176 namespace aux { 177 178 template< 179 typename F, typename T1 180 > 181 aux::yes_tag 182 is_bind_helper(bind1< F,T1 >*); 183 184 } // namespace aux 185 186 BOOST_MPL_AUX_ARITY_SPEC(2, bind1) 187 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1) 188 189 namespace aux { 190 191 template<> 192 struct bind_chooser<1> 193 { 194 template< 195 typename F, typename T1, typename T2, typename T3, typename T4 196 , typename T5 197 > 198 struct result_ 199 { 200 typedef bind1< F,T1 > type; 201 }; 202 }; 203 204 } // namespace aux 205 206 template< 207 typename F, typename T1, typename T2 208 > 209 struct bind2 210 { 211 template< 212 typename U1 = na, typename U2 = na, typename U3 = na 213 , typename U4 = na, typename U5 = na 214 > 215 struct apply 216 { 217 private: 218 typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_; 219 typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1; 220 typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2; 221 222 public: 223 typedef typename apply_wrap2< 224 f_ 225 , typename t1::type, typename t2::type 226 >::type type; 227 228 }; 229 }; 230 231 namespace aux { 232 233 template< 234 typename F, typename T1, typename T2 235 > 236 aux::yes_tag 237 is_bind_helper(bind2< F,T1,T2 >*); 238 239 } // namespace aux 240 241 BOOST_MPL_AUX_ARITY_SPEC(3, bind2) 242 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2) 243 244 namespace aux { 245 246 template<> 247 struct bind_chooser<2> 248 { 249 template< 250 typename F, typename T1, typename T2, typename T3, typename T4 251 , typename T5 252 > 253 struct result_ 254 { 255 typedef bind2< F,T1,T2 > type; 256 }; 257 }; 258 259 } // namespace aux 260 261 template< 262 typename F, typename T1, typename T2, typename T3 263 > 264 struct bind3 265 { 266 template< 267 typename U1 = na, typename U2 = na, typename U3 = na 268 , typename U4 = na, typename U5 = na 269 > 270 struct apply 271 { 272 private: 273 typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_; 274 typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1; 275 typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2; 276 typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3; 277 278 public: 279 typedef typename apply_wrap3< 280 f_ 281 , typename t1::type, typename t2::type, typename t3::type 282 >::type type; 283 284 }; 285 }; 286 287 namespace aux { 288 289 template< 290 typename F, typename T1, typename T2, typename T3 291 > 292 aux::yes_tag 293 is_bind_helper(bind3< F,T1,T2,T3 >*); 294 295 } // namespace aux 296 297 BOOST_MPL_AUX_ARITY_SPEC(4, bind3) 298 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3) 299 300 namespace aux { 301 302 template<> 303 struct bind_chooser<3> 304 { 305 template< 306 typename F, typename T1, typename T2, typename T3, typename T4 307 , typename T5 308 > 309 struct result_ 310 { 311 typedef bind3< F,T1,T2,T3 > type; 312 }; 313 }; 314 315 } // namespace aux 316 317 template< 318 typename F, typename T1, typename T2, typename T3, typename T4 319 > 320 struct bind4 321 { 322 template< 323 typename U1 = na, typename U2 = na, typename U3 = na 324 , typename U4 = na, typename U5 = na 325 > 326 struct apply 327 { 328 private: 329 typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_; 330 typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1; 331 typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2; 332 typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3; 333 typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4; 334 335 public: 336 typedef typename apply_wrap4< 337 f_ 338 , typename t1::type, typename t2::type, typename t3::type 339 , typename t4::type 340 >::type type; 341 342 }; 343 }; 344 345 namespace aux { 346 347 template< 348 typename F, typename T1, typename T2, typename T3, typename T4 349 > 350 aux::yes_tag 351 is_bind_helper(bind4< F,T1,T2,T3,T4 >*); 352 353 } // namespace aux 354 355 BOOST_MPL_AUX_ARITY_SPEC(5, bind4) 356 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4) 357 358 namespace aux { 359 360 template<> 361 struct bind_chooser<4> 362 { 363 template< 364 typename F, typename T1, typename T2, typename T3, typename T4 365 , typename T5 366 > 367 struct result_ 368 { 369 typedef bind4< F,T1,T2,T3,T4 > type; 370 }; 371 }; 372 373 } // namespace aux 374 375 template< 376 typename F, typename T1, typename T2, typename T3, typename T4 377 , typename T5 378 > 379 struct bind5 380 { 381 template< 382 typename U1 = na, typename U2 = na, typename U3 = na 383 , typename U4 = na, typename U5 = na 384 > 385 struct apply 386 { 387 private: 388 typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_; 389 typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1; 390 typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2; 391 typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3; 392 typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4; 393 typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5; 394 395 public: 396 typedef typename apply_wrap5< 397 f_ 398 , typename t1::type, typename t2::type, typename t3::type 399 , typename t4::type, typename t5::type 400 >::type type; 401 402 }; 403 }; 404 405 namespace aux { 406 407 template< 408 typename F, typename T1, typename T2, typename T3, typename T4 409 , typename T5 410 > 411 aux::yes_tag 412 is_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*); 413 414 } // namespace aux 415 416 BOOST_MPL_AUX_ARITY_SPEC(6, bind5) 417 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5) 418 419 namespace aux { 420 421 template<> 422 struct bind_chooser<5> 423 { 424 template< 425 typename F, typename T1, typename T2, typename T3, typename T4 426 , typename T5 427 > 428 struct result_ 429 { 430 typedef bind5< F,T1,T2,T3,T4,T5 > type; 431 }; 432 }; 433 434 } // namespace aux 435 436 namespace aux { 437 438 template< typename T > 439 struct is_bind_arg 440 { 441 BOOST_STATIC_CONSTANT(bool, value = true); 442 }; 443 444 template<> 445 struct is_bind_arg<na> 446 { 447 BOOST_STATIC_CONSTANT(bool, value = false); 448 }; 449 450 template< 451 typename T1, typename T2, typename T3, typename T4, typename T5 452 > 453 struct bind_count_args 454 { 455 BOOST_STATIC_CONSTANT(int, value = 456 is_bind_arg<T1>::value + is_bind_arg<T2>::value 457 + is_bind_arg<T3>::value + is_bind_arg<T4>::value 458 + is_bind_arg<T5>::value 459 ); 460 461 }; 462 463 } 464 465 template< 466 typename F, typename T1, typename T2, typename T3, typename T4 467 , typename T5 468 > 469 struct bind 470 : aux::bind_chooser< 471 aux::bind_count_args< T1,T2,T3,T4,T5 >::value 472 >::template result_< F,T1,T2,T3,T4,T5 >::type 473 { 474 }; 475 476 BOOST_MPL_AUX_ARITY_SPEC( 477 6 478 , bind 479 ) 480 481 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC( 482 6 483 , bind 484 ) 485 }} 486 487