Home | History | Annotate | Download | only in bind
      1 //
      2 //  bind/bind_template.hpp
      3 //
      4 //  Do not include this header directly.
      5 //
      6 //  Copyright (c) 2001-2004 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/bind.html for documentation.
     13 //
     14 
     15     typedef typename result_traits<R, F>::type result_type;
     16 
     17     result_type operator()()
     18     {
     19         list0 a;
     20         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     21     }
     22 
     23     result_type operator()() const
     24     {
     25         list0 a;
     26         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     27     }
     28 
     29     template<class A1> result_type operator()(A1 & a1)
     30     {
     31         list1<A1 &> a(a1);
     32         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     33     }
     34 
     35     template<class A1> result_type operator()(A1 & a1) const
     36     {
     37         list1<A1 &> a(a1);
     38         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     39     }
     40 
     41 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
     42  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
     43 
     44     template<class A1> result_type operator()(A1 const & a1)
     45     {
     46         list1<A1 const &> a(a1);
     47         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     48     }
     49 
     50     template<class A1> result_type operator()(A1 const & a1) const
     51     {
     52         list1<A1 const &> a(a1);
     53         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     54     }
     55 
     56 #endif
     57 
     58     template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2)
     59     {
     60         list2<A1 &, A2 &> a(a1, a2);
     61         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     62     }
     63 
     64     template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) const
     65     {
     66         list2<A1 &, A2 &> a(a1, a2);
     67         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     68     }
     69 
     70 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
     71  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
     72 
     73     template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2)
     74     {
     75         list2<A1 const &, A2 &> a(a1, a2);
     76         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     77     }
     78 
     79     template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2) const
     80     {
     81         list2<A1 const &, A2 &> a(a1, a2);
     82         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     83     }
     84 
     85 
     86     template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2)
     87     {
     88         list2<A1 &, A2 const &> a(a1, a2);
     89         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     90     }
     91 
     92     template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2) const
     93     {
     94         list2<A1 &, A2 const &> a(a1, a2);
     95         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
     96     }
     97 
     98 
     99     template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2)
    100     {
    101         list2<A1 const &, A2 const &> a(a1, a2);
    102         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    103     }
    104 
    105     template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2) const
    106     {
    107         list2<A1 const &, A2 const &> a(a1, a2);
    108         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    109     }
    110 
    111 #endif
    112 
    113     template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3)
    114     {
    115         list3<A1 &, A2 &, A3 &> a(a1, a2, a3);
    116         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    117     }
    118 
    119     template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) const
    120     {
    121         list3<A1 &, A2 &, A3 &> a(a1, a2, a3);
    122         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    123     }
    124 
    125 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
    126  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
    127 
    128     template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3)
    129     {
    130         list3<A1 const &, A2 const &, A3 const &> a(a1, a2, a3);
    131         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    132     }
    133 
    134     template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3) const
    135     {
    136         list3<A1 const &, A2 const &, A3 const &> a(a1, a2, a3);
    137         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    138     }
    139 
    140 #endif
    141 
    142     template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4)
    143     {
    144         list4<A1 &, A2 &, A3 &, A4 &> a(a1, a2, a3, a4);
    145         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    146     }
    147 
    148     template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) const
    149     {
    150         list4<A1 &, A2 &, A3 &, A4 &> a(a1, a2, a3, a4);
    151         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    152     }
    153 
    154 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
    155  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
    156 
    157     template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4)
    158     {
    159         list4<A1 const &, A2 const &, A3 const &, A4 const &> a(a1, a2, a3, a4);
    160         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    161     }
    162 
    163     template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4) const
    164     {
    165         list4<A1 const &, A2 const &, A3 const &, A4 const &> a(a1, a2, a3, a4);
    166         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    167     }
    168 
    169 #endif
    170 
    171     template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5)
    172     {
    173         list5<A1 &, A2 &, A3 &, A4 &, A5 &> a(a1, a2, a3, a4, a5);
    174         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    175     }
    176 
    177     template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5) const
    178     {
    179         list5<A1 &, A2 &, A3 &, A4 &, A5 &> a(a1, a2, a3, a4, a5);
    180         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    181     }
    182 
    183 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
    184  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
    185 
    186     template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5)
    187     {
    188         list5<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &> a(a1, a2, a3, a4, a5);
    189         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    190     }
    191 
    192     template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5) const
    193     {
    194         list5<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &> a(a1, a2, a3, a4, a5);
    195         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    196     }
    197 
    198 #endif
    199 
    200     template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6)
    201     {
    202         list6<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &> a(a1, a2, a3, a4, a5, a6);
    203         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    204     }
    205 
    206     template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6) const
    207     {
    208         list6<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &> a(a1, a2, a3, a4, a5, a6);
    209         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    210     }
    211 
    212 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
    213  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
    214 
    215     template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6)
    216     {
    217         list6<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &> a(a1, a2, a3, a4, a5, a6);
    218         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    219     }
    220 
    221     template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6) const
    222     {
    223         list6<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &> a(a1, a2, a3, a4, a5, a6);
    224         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    225     }
    226 
    227 #endif
    228 
    229     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7)
    230     {
    231         list7<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &> a(a1, a2, a3, a4, a5, a6, a7);
    232         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    233     }
    234 
    235     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7) const
    236     {
    237         list7<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &> a(a1, a2, a3, a4, a5, a6, a7);
    238         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    239     }
    240 
    241 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
    242  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
    243 
    244     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7)
    245     {
    246         list7<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &> a(a1, a2, a3, a4, a5, a6, a7);
    247         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    248     }
    249 
    250     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7) const
    251     {
    252         list7<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &> a(a1, a2, a3, a4, a5, a6, a7);
    253         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    254     }
    255 
    256 #endif
    257 
    258     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8)
    259     {
    260         list8<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &> a(a1, a2, a3, a4, a5, a6, a7, a8);
    261         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    262     }
    263 
    264     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8) const
    265     {
    266         list8<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &> a(a1, a2, a3, a4, a5, a6, a7, a8);
    267         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    268     }
    269 
    270 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
    271  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
    272 
    273     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8)
    274     {
    275         list8<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &> a(a1, a2, a3, a4, a5, a6, a7, a8);
    276         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    277     }
    278 
    279     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8) const
    280     {
    281         list8<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &> a(a1, a2, a3, a4, a5, a6, a7, a8);
    282         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    283     }
    284 
    285 #endif
    286 
    287     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9)
    288     {
    289         list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
    290         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    291     }
    292 
    293     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9) const
    294     {
    295         list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
    296         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    297     }
    298 
    299 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
    300  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
    301 
    302     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9)
    303     {
    304         list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
    305         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    306     }
    307 
    308     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9) const
    309     {
    310         list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
    311         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    312     }
    313 
    314 #endif
    315 
    316     template<class A> result_type eval(A & a)
    317     {
    318         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    319     }
    320 
    321     template<class A> result_type eval(A & a) const
    322     {
    323         BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    324     }
    325 
    326     template<class V> void accept(V & v) const
    327     {
    328 #if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( __BORLANDC__ )
    329 
    330         using boost::visit_each;
    331 
    332 #endif
    333         BOOST_BIND_VISIT_EACH(v, f_, 0);
    334         l_.accept(v);
    335     }
    336 
    337     bool compare(this_type const & rhs) const
    338     {
    339         return ref_compare(f_, rhs.f_, 0) && l_ == rhs.l_;
    340     }
    341 
    342 private:
    343 
    344     F f_;
    345     L l_;
    346