Home | History | Annotate | Download | only in bind
      1 //
      2 //  bind/mem_fn_template.hpp
      3 //
      4 //  Do not include this header directly
      5 //
      6 //  Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
      7 //
      8 // Distributed under the Boost Software License, Version 1.0. (See
      9 // accompanying file LICENSE_1_0.txt or copy at
     10 // http://www.boost.org/LICENSE_1_0.txt)
     11 //
     12 //  See http://www.boost.org/libs/bind/mem_fn.html for documentation.
     13 //
     14 
     15 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
     16 # define BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
     17 #endif
     18 
     19 // mf0
     20 
     21 template<class R, class T BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(mf0)
     22 {
     23 public:
     24 
     25     typedef R result_type;
     26     typedef T * argument_type;
     27 
     28 private:
     29 
     30     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) ())
     31     F f_;
     32 
     33     template<class U> R call(U & u, T const *) const
     34     {
     35         BOOST_MEM_FN_RETURN (u.*f_)();
     36     }
     37 
     38     template<class U> R call(U & u, void const *) const
     39     {
     40         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)();
     41     }
     42 
     43 public:
     44 
     45     explicit BOOST_MEM_FN_NAME(mf0)(F f): f_(f) {}
     46 
     47     R operator()(T * p) const
     48     {
     49         BOOST_MEM_FN_RETURN (p->*f_)();
     50     }
     51 
     52     template<class U> R operator()(U & u) const
     53     {
     54         U const * p = 0;
     55         BOOST_MEM_FN_RETURN call(u, p);
     56     }
     57 
     58 #ifdef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
     59 
     60     template<class U> R operator()(U const & u) const
     61     {
     62         U const * p = 0;
     63         BOOST_MEM_FN_RETURN call(u, p);
     64     }
     65 
     66 #endif
     67 
     68     R operator()(T & t) const
     69     {
     70         BOOST_MEM_FN_RETURN (t.*f_)();
     71     }
     72 
     73     bool operator==(BOOST_MEM_FN_NAME(mf0) const & rhs) const
     74     {
     75         return f_ == rhs.f_;
     76     }
     77 
     78     bool operator!=(BOOST_MEM_FN_NAME(mf0) const & rhs) const
     79     {
     80         return f_ != rhs.f_;
     81     }
     82 };
     83 
     84 // cmf0
     85 
     86 template<class R, class T BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(cmf0)
     87 {
     88 public:
     89 
     90     typedef R result_type;
     91     typedef T const * argument_type;
     92 
     93 private:
     94 
     95     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) () const)
     96     F f_;
     97 
     98     template<class U> R call(U & u, T const *) const
     99     {
    100         BOOST_MEM_FN_RETURN (u.*f_)();
    101     }
    102 
    103     template<class U> R call(U & u, void const *) const
    104     {
    105         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)();
    106     }
    107 
    108 public:
    109 
    110     explicit BOOST_MEM_FN_NAME(cmf0)(F f): f_(f) {}
    111 
    112     template<class U> R operator()(U const & u) const
    113     {
    114         U const * p = 0;
    115         BOOST_MEM_FN_RETURN call(u, p);
    116     }
    117 
    118     R operator()(T const & t) const
    119     {
    120         BOOST_MEM_FN_RETURN (t.*f_)();
    121     }
    122 
    123     bool operator==(BOOST_MEM_FN_NAME(cmf0) const & rhs) const
    124     {
    125         return f_ == rhs.f_;
    126     }
    127 
    128     bool operator!=(BOOST_MEM_FN_NAME(cmf0) const & rhs) const
    129     {
    130         return f_ != rhs.f_;
    131     }
    132 };
    133 
    134 // mf1
    135 
    136 template<class R, class T, class A1 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(mf1)
    137 {
    138 public:
    139 
    140     typedef R result_type;
    141     typedef T * first_argument_type;
    142     typedef A1 second_argument_type;
    143 
    144 private:
    145 
    146     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1))
    147     F f_;
    148 
    149     template<class U, class B1> R call(U & u, T const *, B1 & b1) const
    150     {
    151         BOOST_MEM_FN_RETURN (u.*f_)(b1);
    152     }
    153 
    154     template<class U, class B1> R call(U & u, void const *, B1 & b1) const
    155     {
    156         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1);
    157     }
    158 
    159 public:
    160 
    161     explicit BOOST_MEM_FN_NAME(mf1)(F f): f_(f) {}
    162 
    163     R operator()(T * p, A1 a1) const
    164     {
    165         BOOST_MEM_FN_RETURN (p->*f_)(a1);
    166     }
    167 
    168     template<class U> R operator()(U & u, A1 a1) const
    169     {
    170         U const * p = 0;
    171         BOOST_MEM_FN_RETURN call(u, p, a1);
    172     }
    173 
    174 #ifdef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
    175 
    176     template<class U> R operator()(U const & u, A1 a1) const
    177     {
    178         U const * p = 0;
    179         BOOST_MEM_FN_RETURN call(u, p, a1);
    180     }
    181 
    182 #endif
    183 
    184     R operator()(T & t, A1 a1) const
    185     {
    186         BOOST_MEM_FN_RETURN (t.*f_)(a1);
    187     }
    188 
    189     bool operator==(BOOST_MEM_FN_NAME(mf1) const & rhs) const
    190     {
    191         return f_ == rhs.f_;
    192     }
    193 
    194     bool operator!=(BOOST_MEM_FN_NAME(mf1) const & rhs) const
    195     {
    196         return f_ != rhs.f_;
    197     }
    198 };
    199 
    200 // cmf1
    201 
    202 template<class R, class T, class A1 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(cmf1)
    203 {
    204 public:
    205 
    206     typedef R result_type;
    207     typedef T const * first_argument_type;
    208     typedef A1 second_argument_type;
    209 
    210 private:
    211 
    212     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1) const)
    213     F f_;
    214 
    215     template<class U, class B1> R call(U & u, T const *, B1 & b1) const
    216     {
    217         BOOST_MEM_FN_RETURN (u.*f_)(b1);
    218     }
    219 
    220     template<class U, class B1> R call(U & u, void const *, B1 & b1) const
    221     {
    222         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1);
    223     }
    224 
    225 public:
    226 
    227     explicit BOOST_MEM_FN_NAME(cmf1)(F f): f_(f) {}
    228 
    229     template<class U> R operator()(U const & u, A1 a1) const
    230     {
    231         U const * p = 0;
    232         BOOST_MEM_FN_RETURN call(u, p, a1);
    233     }
    234 
    235     R operator()(T const & t, A1 a1) const
    236     {
    237         BOOST_MEM_FN_RETURN (t.*f_)(a1);
    238     }
    239 
    240     bool operator==(BOOST_MEM_FN_NAME(cmf1) const & rhs) const
    241     {
    242         return f_ == rhs.f_;
    243     }
    244 
    245     bool operator!=(BOOST_MEM_FN_NAME(cmf1) const & rhs) const
    246     {
    247         return f_ != rhs.f_;
    248     }
    249 };
    250 
    251 // mf2
    252 
    253 template<class R, class T, class A1, class A2 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(mf2)
    254 {
    255 public:
    256 
    257     typedef R result_type;
    258 
    259 private:
    260 
    261     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2))
    262     F f_;
    263 
    264     template<class U, class B1, class B2> R call(U & u, T const *, B1 & b1, B2 & b2) const
    265     {
    266         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2);
    267     }
    268 
    269     template<class U, class B1, class B2> R call(U & u, void const *, B1 & b1, B2 & b2) const
    270     {
    271         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2);
    272     }
    273 
    274 public:
    275 
    276     explicit BOOST_MEM_FN_NAME(mf2)(F f): f_(f) {}
    277 
    278     R operator()(T * p, A1 a1, A2 a2) const
    279     {
    280         BOOST_MEM_FN_RETURN (p->*f_)(a1, a2);
    281     }
    282 
    283     template<class U> R operator()(U & u, A1 a1, A2 a2) const
    284     {
    285         U const * p = 0;
    286         BOOST_MEM_FN_RETURN call(u, p, a1, a2);
    287     }
    288 
    289 #ifdef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
    290 
    291     template<class U> R operator()(U const & u, A1 a1, A2 a2) const
    292     {
    293         U const * p = 0;
    294         BOOST_MEM_FN_RETURN call(u, p, a1, a2);
    295     }
    296 
    297 #endif
    298 
    299     R operator()(T & t, A1 a1, A2 a2) const
    300     {
    301         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2);
    302     }
    303 
    304     bool operator==(BOOST_MEM_FN_NAME(mf2) const & rhs) const
    305     {
    306         return f_ == rhs.f_;
    307     }
    308 
    309     bool operator!=(BOOST_MEM_FN_NAME(mf2) const & rhs) const
    310     {
    311         return f_ != rhs.f_;
    312     }
    313 };
    314 
    315 // cmf2
    316 
    317 template<class R, class T, class A1, class A2 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(cmf2)
    318 {
    319 public:
    320 
    321     typedef R result_type;
    322 
    323 private:
    324 
    325     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2) const)
    326     F f_;
    327 
    328     template<class U, class B1, class B2> R call(U & u, T const *, B1 & b1, B2 & b2) const
    329     {
    330         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2);
    331     }
    332 
    333     template<class U, class B1, class B2> R call(U & u, void const *, B1 & b1, B2 & b2) const
    334     {
    335         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2);
    336     }
    337 
    338 public:
    339 
    340     explicit BOOST_MEM_FN_NAME(cmf2)(F f): f_(f) {}
    341 
    342     template<class U> R operator()(U const & u, A1 a1, A2 a2) const
    343     {
    344         U const * p = 0;
    345         BOOST_MEM_FN_RETURN call(u, p, a1, a2);
    346     }
    347 
    348     R operator()(T const & t, A1 a1, A2 a2) const
    349     {
    350         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2);
    351     }
    352 
    353     bool operator==(BOOST_MEM_FN_NAME(cmf2) const & rhs) const
    354     {
    355         return f_ == rhs.f_;
    356     }
    357 
    358     bool operator!=(BOOST_MEM_FN_NAME(cmf2) const & rhs) const
    359     {
    360         return f_ != rhs.f_;
    361     }
    362 };
    363 
    364 // mf3
    365 
    366 template<class R, class T, class A1, class A2, class A3 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(mf3)
    367 {
    368 public:
    369 
    370     typedef R result_type;
    371 
    372 private:
    373 
    374     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3))
    375     F f_;
    376 
    377     template<class U, class B1, class B2, class B3> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3) const
    378     {
    379         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3);
    380     }
    381 
    382     template<class U, class B1, class B2, class B3> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3) const
    383     {
    384         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3);
    385     }
    386 
    387 public:
    388 
    389     explicit BOOST_MEM_FN_NAME(mf3)(F f): f_(f) {}
    390 
    391     R operator()(T * p, A1 a1, A2 a2, A3 a3) const
    392     {
    393         BOOST_MEM_FN_RETURN (p->*f_)(a1, a2, a3);
    394     }
    395 
    396     template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3) const
    397     {
    398         U const * p = 0;
    399         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3);
    400     }
    401 
    402 #ifdef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
    403 
    404     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3) const
    405     {
    406         U const * p = 0;
    407         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3);
    408     }
    409 
    410 #endif
    411 
    412     R operator()(T & t, A1 a1, A2 a2, A3 a3) const
    413     {
    414         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3);
    415     }
    416 
    417     bool operator==(BOOST_MEM_FN_NAME(mf3) const & rhs) const
    418     {
    419         return f_ == rhs.f_;
    420     }
    421 
    422     bool operator!=(BOOST_MEM_FN_NAME(mf3) const & rhs) const
    423     {
    424         return f_ != rhs.f_;
    425     }
    426 };
    427 
    428 // cmf3
    429 
    430 template<class R, class T, class A1, class A2, class A3 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(cmf3)
    431 {
    432 public:
    433 
    434     typedef R result_type;
    435 
    436 private:
    437 
    438     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3) const)
    439     F f_;
    440 
    441     template<class U, class B1, class B2, class B3> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3) const
    442     {
    443         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3);
    444     }
    445 
    446     template<class U, class B1, class B2, class B3> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3) const
    447     {
    448         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3);
    449     }
    450 
    451 public:
    452 
    453     explicit BOOST_MEM_FN_NAME(cmf3)(F f): f_(f) {}
    454 
    455     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3) const
    456     {
    457         U const * p = 0;
    458         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3);
    459     }
    460 
    461     R operator()(T const & t, A1 a1, A2 a2, A3 a3) const
    462     {
    463         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3);
    464     }
    465 
    466     bool operator==(BOOST_MEM_FN_NAME(cmf3) const & rhs) const
    467     {
    468         return f_ == rhs.f_;
    469     }
    470 
    471     bool operator!=(BOOST_MEM_FN_NAME(cmf3) const & rhs) const
    472     {
    473         return f_ != rhs.f_;
    474     }
    475 };
    476 
    477 // mf4
    478 
    479 template<class R, class T, class A1, class A2, class A3, class A4 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(mf4)
    480 {
    481 public:
    482 
    483     typedef R result_type;
    484 
    485 private:
    486 
    487     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4))
    488     F f_;
    489 
    490     template<class U, class B1, class B2, class B3, class B4> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4) const
    491     {
    492         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4);
    493     }
    494 
    495     template<class U, class B1, class B2, class B3, class B4> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4) const
    496     {
    497         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4);
    498     }
    499 
    500 public:
    501 
    502     explicit BOOST_MEM_FN_NAME(mf4)(F f): f_(f) {}
    503 
    504     R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4) const
    505     {
    506         BOOST_MEM_FN_RETURN (p->*f_)(a1, a2, a3, a4);
    507     }
    508 
    509     template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4) const
    510     {
    511         U const * p = 0;
    512         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4);
    513     }
    514 
    515 #ifdef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
    516 
    517     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4) const
    518     {
    519         U const * p = 0;
    520         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4);
    521     }
    522 
    523 #endif
    524 
    525     R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4) const
    526     {
    527         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4);
    528     }
    529 
    530     bool operator==(BOOST_MEM_FN_NAME(mf4) const & rhs) const
    531     {
    532         return f_ == rhs.f_;
    533     }
    534 
    535     bool operator!=(BOOST_MEM_FN_NAME(mf4) const & rhs) const
    536     {
    537         return f_ != rhs.f_;
    538     }
    539 };
    540 
    541 // cmf4
    542 
    543 template<class R, class T, class A1, class A2, class A3, class A4 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(cmf4)
    544 {
    545 public:
    546 
    547     typedef R result_type;
    548 
    549 private:
    550 
    551     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4) const)
    552     F f_;
    553 
    554     template<class U, class B1, class B2, class B3, class B4> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4) const
    555     {
    556         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4);
    557     }
    558 
    559     template<class U, class B1, class B2, class B3, class B4> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4) const
    560     {
    561         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4);
    562     }
    563 
    564 public:
    565 
    566     explicit BOOST_MEM_FN_NAME(cmf4)(F f): f_(f) {}
    567 
    568     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4) const
    569     {
    570         U const * p = 0;
    571         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4);
    572     }
    573 
    574     R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4) const
    575     {
    576         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4);
    577     }
    578 
    579     bool operator==(BOOST_MEM_FN_NAME(cmf4) const & rhs) const
    580     {
    581         return f_ == rhs.f_;
    582     }
    583 
    584     bool operator!=(BOOST_MEM_FN_NAME(cmf4) const & rhs) const
    585     {
    586         return f_ != rhs.f_;
    587     }
    588 };
    589 
    590 // mf5
    591 
    592 template<class R, class T, class A1, class A2, class A3, class A4, class A5 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(mf5)
    593 {
    594 public:
    595 
    596     typedef R result_type;
    597 
    598 private:
    599 
    600     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5))
    601     F f_;
    602 
    603     template<class U, class B1, class B2, class B3, class B4, class B5> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5) const
    604     {
    605         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4, b5);
    606     }
    607 
    608     template<class U, class B1, class B2, class B3, class B4, class B5> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5) const
    609     {
    610         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4, b5);
    611     }
    612 
    613 public:
    614 
    615     explicit BOOST_MEM_FN_NAME(mf5)(F f): f_(f) {}
    616 
    617     R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
    618     {
    619         BOOST_MEM_FN_RETURN (p->*f_)(a1, a2, a3, a4, a5);
    620     }
    621 
    622     template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
    623     {
    624         U const * p = 0;
    625         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5);
    626     }
    627 
    628 #ifdef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
    629 
    630     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
    631     {
    632         U const * p = 0;
    633         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5);
    634     }
    635 
    636 #endif
    637 
    638     R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
    639     {
    640         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4, a5);
    641     }
    642 
    643     bool operator==(BOOST_MEM_FN_NAME(mf5) const & rhs) const
    644     {
    645         return f_ == rhs.f_;
    646     }
    647 
    648     bool operator!=(BOOST_MEM_FN_NAME(mf5) const & rhs) const
    649     {
    650         return f_ != rhs.f_;
    651     }
    652 };
    653 
    654 // cmf5
    655 
    656 template<class R, class T, class A1, class A2, class A3, class A4, class A5 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(cmf5)
    657 {
    658 public:
    659 
    660     typedef R result_type;
    661 
    662 private:
    663 
    664     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5) const)
    665     F f_;
    666 
    667     template<class U, class B1, class B2, class B3, class B4, class B5> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5) const
    668     {
    669         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4, b5);
    670     }
    671 
    672     template<class U, class B1, class B2, class B3, class B4, class B5> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5) const
    673     {
    674         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4, b5);
    675     }
    676 
    677 public:
    678 
    679     explicit BOOST_MEM_FN_NAME(cmf5)(F f): f_(f) {}
    680 
    681     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
    682     {
    683         U const * p = 0;
    684         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5);
    685     }
    686 
    687     R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
    688     {
    689         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4, a5);
    690     }
    691 
    692     bool operator==(BOOST_MEM_FN_NAME(cmf5) const & rhs) const
    693     {
    694         return f_ == rhs.f_;
    695     }
    696 
    697     bool operator!=(BOOST_MEM_FN_NAME(cmf5) const & rhs) const
    698     {
    699         return f_ != rhs.f_;
    700     }
    701 };
    702 
    703 // mf6
    704 
    705 template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(mf6)
    706 {
    707 public:
    708 
    709     typedef R result_type;
    710 
    711 private:
    712 
    713     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6))
    714     F f_;
    715 
    716     template<class U, class B1, class B2, class B3, class B4, class B5, class B6> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6) const
    717     {
    718         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4, b5, b6);
    719     }
    720 
    721     template<class U, class B1, class B2, class B3, class B4, class B5, class B6> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6) const
    722     {
    723         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6);
    724     }
    725 
    726 public:
    727 
    728     explicit BOOST_MEM_FN_NAME(mf6)(F f): f_(f) {}
    729 
    730     R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
    731     {
    732         BOOST_MEM_FN_RETURN (p->*f_)(a1, a2, a3, a4, a5, a6);
    733     }
    734 
    735     template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
    736     {
    737         U const * p = 0;
    738         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5, a6);
    739     }
    740 
    741 #ifdef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
    742 
    743     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
    744     {
    745         U const * p = 0;
    746         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5, a6);
    747     }
    748 
    749 #endif
    750 
    751     R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
    752     {
    753         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4, a5, a6);
    754     }
    755 
    756     bool operator==(BOOST_MEM_FN_NAME(mf6) const & rhs) const
    757     {
    758         return f_ == rhs.f_;
    759     }
    760 
    761     bool operator!=(BOOST_MEM_FN_NAME(mf6) const & rhs) const
    762     {
    763         return f_ != rhs.f_;
    764     }
    765 };
    766 
    767 // cmf6
    768 
    769 template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(cmf6)
    770 {
    771 public:
    772 
    773     typedef R result_type;
    774 
    775 private:
    776 
    777     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6) const)
    778     F f_;
    779 
    780     template<class U, class B1, class B2, class B3, class B4, class B5, class B6> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6) const
    781     {
    782         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4, b5, b6);
    783     }
    784 
    785     template<class U, class B1, class B2, class B3, class B4, class B5, class B6> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6) const
    786     {
    787         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6);
    788     }
    789 
    790 public:
    791 
    792     explicit BOOST_MEM_FN_NAME(cmf6)(F f): f_(f) {}
    793 
    794     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
    795     {
    796         U const * p = 0;
    797         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5, a6);
    798     }
    799 
    800     R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
    801     {
    802         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4, a5, a6);
    803     }
    804 
    805     bool operator==(BOOST_MEM_FN_NAME(cmf6) const & rhs) const
    806     {
    807         return f_ == rhs.f_;
    808     }
    809 
    810     bool operator!=(BOOST_MEM_FN_NAME(cmf6) const & rhs) const
    811     {
    812         return f_ != rhs.f_;
    813     }
    814 };
    815 
    816 // mf7
    817 
    818 template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(mf7)
    819 {
    820 public:
    821 
    822     typedef R result_type;
    823 
    824 private:
    825 
    826     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6, A7))
    827     F f_;
    828 
    829     template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7) const
    830     {
    831         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4, b5, b6, b7);
    832     }
    833 
    834     template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7) const
    835     {
    836         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6, b7);
    837     }
    838 
    839 public:
    840 
    841     explicit BOOST_MEM_FN_NAME(mf7)(F f): f_(f) {}
    842 
    843     R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
    844     {
    845         BOOST_MEM_FN_RETURN (p->*f_)(a1, a2, a3, a4, a5, a6, a7);
    846     }
    847 
    848     template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
    849     {
    850         U const * p = 0;
    851         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5, a6, a7);
    852     }
    853 
    854 #ifdef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
    855 
    856     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
    857     {
    858         U const * p = 0;
    859         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5, a6, a7);
    860     }
    861 
    862 #endif
    863 
    864     R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
    865     {
    866         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4, a5, a6, a7);
    867     }
    868 
    869     bool operator==(BOOST_MEM_FN_NAME(mf7) const & rhs) const
    870     {
    871         return f_ == rhs.f_;
    872     }
    873 
    874     bool operator!=(BOOST_MEM_FN_NAME(mf7) const & rhs) const
    875     {
    876         return f_ != rhs.f_;
    877     }
    878 };
    879 
    880 // cmf7
    881 
    882 template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(cmf7)
    883 {
    884 public:
    885 
    886     typedef R result_type;
    887 
    888 private:
    889 
    890     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6, A7) const)
    891     F f_;
    892 
    893     template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7) const
    894     {
    895         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4, b5, b6, b7);
    896     }
    897 
    898     template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7) const
    899     {
    900         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6, b7);
    901     }
    902 
    903 public:
    904 
    905     explicit BOOST_MEM_FN_NAME(cmf7)(F f): f_(f) {}
    906 
    907     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
    908     {
    909         U const * p = 0;
    910         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5, a6, a7);
    911     }
    912 
    913     R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
    914     {
    915         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4, a5, a6, a7);
    916     }
    917 
    918     bool operator==(BOOST_MEM_FN_NAME(cmf7) const & rhs) const
    919     {
    920         return f_ == rhs.f_;
    921     }
    922 
    923     bool operator!=(BOOST_MEM_FN_NAME(cmf7) const & rhs) const
    924     {
    925         return f_ != rhs.f_;
    926     }
    927 };
    928 
    929 // mf8
    930 
    931 template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(mf8)
    932 {
    933 public:
    934 
    935     typedef R result_type;
    936 
    937 private:
    938 
    939     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6, A7, A8))
    940     F f_;
    941 
    942     template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7, B8 & b8) const
    943     {
    944         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4, b5, b6, b7, b8);
    945     }
    946 
    947     template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7, B8 & b8) const
    948     {
    949         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6, b7, b8);
    950     }
    951 
    952 public:
    953 
    954     explicit BOOST_MEM_FN_NAME(mf8)(F f): f_(f) {}
    955 
    956     R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
    957     {
    958         BOOST_MEM_FN_RETURN (p->*f_)(a1, a2, a3, a4, a5, a6, a7, a8);
    959     }
    960 
    961     template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
    962     {
    963         U const * p = 0;
    964         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5, a6, a7, a8);
    965     }
    966 
    967 #ifdef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
    968 
    969     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
    970     {
    971         U const * p = 0;
    972         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5, a6, a7, a8);
    973     }
    974 
    975 #endif
    976 
    977     R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
    978     {
    979         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4, a5, a6, a7, a8);
    980     }
    981 
    982     bool operator==(BOOST_MEM_FN_NAME(mf8) const & rhs) const
    983     {
    984         return f_ == rhs.f_;
    985     }
    986 
    987     bool operator!=(BOOST_MEM_FN_NAME(mf8) const & rhs) const
    988     {
    989         return f_ != rhs.f_;
    990     }
    991 };
    992 
    993 // cmf8
    994 
    995 template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 BOOST_MEM_FN_CLASS_F> class BOOST_MEM_FN_NAME(cmf8)
    996 {
    997 public:
    998 
    999     typedef R result_type;
   1000 
   1001 private:
   1002 
   1003     BOOST_MEM_FN_TYPEDEF(R (BOOST_MEM_FN_CC T::*F) (A1, A2, A3, A4, A5, A6, A7, A8) const)
   1004     F f_;
   1005 
   1006     template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7, B8 & b8) const
   1007     {
   1008         BOOST_MEM_FN_RETURN (u.*f_)(b1, b2, b3, b4, b5, b6, b7, b8);
   1009     }
   1010 
   1011     template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7, B8 & b8) const
   1012     {
   1013         BOOST_MEM_FN_RETURN (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6, b7, b8);
   1014     }
   1015 
   1016 public:
   1017 
   1018     explicit BOOST_MEM_FN_NAME(cmf8)(F f): f_(f) {}
   1019 
   1020     R operator()(T const * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
   1021     {
   1022         BOOST_MEM_FN_RETURN (p->*f_)(a1, a2, a3, a4, a5, a6, a7, a8);
   1023     }
   1024 
   1025     template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
   1026     {
   1027         U const * p = 0;
   1028         BOOST_MEM_FN_RETURN call(u, p, a1, a2, a3, a4, a5, a6, a7, a8);
   1029     }
   1030 
   1031     R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
   1032     {
   1033         BOOST_MEM_FN_RETURN (t.*f_)(a1, a2, a3, a4, a5, a6, a7, a8);
   1034     }
   1035 
   1036     bool operator==(BOOST_MEM_FN_NAME(cmf8) const & rhs) const
   1037     {
   1038         return f_ == rhs.f_;
   1039     }
   1040 
   1041     bool operator!=(BOOST_MEM_FN_NAME(cmf8) const & rhs) const
   1042     {
   1043         return f_ != rhs.f_;
   1044     }
   1045 };
   1046 
   1047 #undef BOOST_MEM_FN_ENABLE_CONST_OVERLOADS
   1048