Home | History | Annotate | Download | only in wtf
      1 /*
      2  * Copyright (C) 2011 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
     14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
     17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     23  * THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef WTF_Functional_h
     27 #define WTF_Functional_h
     28 
     29 #include "wtf/Assertions.h"
     30 #include "wtf/PassRefPtr.h"
     31 #include "wtf/RefPtr.h"
     32 #include "wtf/ThreadSafeRefCounted.h"
     33 #include "wtf/WeakPtr.h"
     34 
     35 namespace WTF {
     36 
     37 // Functional.h provides a very simple way to bind a function pointer and arguments together into a function object
     38 // that can be stored, copied and invoked, similar to how boost::bind and std::bind in C++11.
     39 
     40 // A FunctionWrapper is a class template that can wrap a function pointer or a member function pointer and
     41 // provide a unified interface for calling that function.
     42 template<typename>
     43 class FunctionWrapper;
     44 
     45 // Bound static functions:
     46 
     47 template<typename R>
     48 class FunctionWrapper<R (*)()> {
     49 public:
     50     typedef R ResultType;
     51 
     52     explicit FunctionWrapper(R (*function)())
     53         : m_function(function)
     54     {
     55     }
     56 
     57     R operator()()
     58     {
     59         return m_function();
     60     }
     61 
     62 private:
     63     R (*m_function)();
     64 };
     65 
     66 template<typename R, typename P1>
     67 class FunctionWrapper<R (*)(P1)> {
     68 public:
     69     typedef R ResultType;
     70 
     71     explicit FunctionWrapper(R (*function)(P1))
     72         : m_function(function)
     73     {
     74     }
     75 
     76     R operator()(P1 p1)
     77     {
     78         return m_function(p1);
     79     }
     80 
     81 private:
     82     R (*m_function)(P1);
     83 };
     84 
     85 template<typename R, typename P1, typename P2>
     86 class FunctionWrapper<R (*)(P1, P2)> {
     87 public:
     88     typedef R ResultType;
     89 
     90     explicit FunctionWrapper(R (*function)(P1, P2))
     91         : m_function(function)
     92     {
     93     }
     94 
     95     R operator()(P1 p1, P2 p2)
     96     {
     97         return m_function(p1, p2);
     98     }
     99 
    100 private:
    101     R (*m_function)(P1, P2);
    102 };
    103 
    104 template<typename R, typename P1, typename P2, typename P3>
    105 class FunctionWrapper<R (*)(P1, P2, P3)> {
    106 public:
    107     typedef R ResultType;
    108 
    109     explicit FunctionWrapper(R (*function)(P1, P2, P3))
    110         : m_function(function)
    111     {
    112     }
    113 
    114     R operator()(P1 p1, P2 p2, P3 p3)
    115     {
    116         return m_function(p1, p2, p3);
    117     }
    118 
    119 private:
    120     R (*m_function)(P1, P2, P3);
    121 };
    122 
    123 template<typename R, typename P1, typename P2, typename P3, typename P4>
    124 class FunctionWrapper<R (*)(P1, P2, P3, P4)> {
    125 public:
    126     typedef R ResultType;
    127 
    128     explicit FunctionWrapper(R (*function)(P1, P2, P3, P4))
    129         : m_function(function)
    130     {
    131     }
    132 
    133     R operator()(P1 p1, P2 p2, P3 p3, P4 p4)
    134     {
    135         return m_function(p1, p2, p3, p4);
    136     }
    137 
    138 private:
    139     R (*m_function)(P1, P2, P3, P4);
    140 };
    141 
    142 template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
    143 class FunctionWrapper<R (*)(P1, P2, P3, P4, P5)> {
    144 public:
    145     typedef R ResultType;
    146 
    147     explicit FunctionWrapper(R (*function)(P1, P2, P3, P4, P5))
    148         : m_function(function)
    149     {
    150     }
    151 
    152     R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
    153     {
    154         return m_function(p1, p2, p3, p4, p5);
    155     }
    156 
    157 private:
    158     R (*m_function)(P1, P2, P3, P4, P5);
    159 };
    160 
    161 // Bound member functions:
    162 
    163 template<typename R, typename C>
    164 class FunctionWrapper<R (C::*)()> {
    165 public:
    166     typedef R ResultType;
    167 
    168     explicit FunctionWrapper(R (C::*function)())
    169         : m_function(function)
    170     {
    171     }
    172 
    173     R operator()(C* c)
    174     {
    175         return (c->*m_function)();
    176     }
    177 
    178     R operator()(const WeakPtr<C>& c)
    179     {
    180         C* obj = c.get();
    181         if (!obj)
    182             return R();
    183         return (obj->*m_function)();
    184     }
    185 
    186 private:
    187     R (C::*m_function)();
    188 };
    189 
    190 template<typename R, typename C, typename P1>
    191 class FunctionWrapper<R (C::*)(P1)> {
    192 public:
    193     typedef R ResultType;
    194 
    195     explicit FunctionWrapper(R (C::*function)(P1))
    196         : m_function(function)
    197     {
    198     }
    199 
    200     R operator()(C* c, P1 p1)
    201     {
    202         return (c->*m_function)(p1);
    203     }
    204 
    205     R operator()(const WeakPtr<C>& c, P1 p1)
    206     {
    207         C* obj = c.get();
    208         if (!obj)
    209             return R();
    210         return (obj->*m_function)(p1);
    211     }
    212 
    213 private:
    214     R (C::*m_function)(P1);
    215 };
    216 
    217 template<typename R, typename C, typename P1, typename P2>
    218 class FunctionWrapper<R (C::*)(P1, P2)> {
    219 public:
    220     typedef R ResultType;
    221 
    222     explicit FunctionWrapper(R (C::*function)(P1, P2))
    223         : m_function(function)
    224     {
    225     }
    226 
    227     R operator()(C* c, P1 p1, P2 p2)
    228     {
    229         return (c->*m_function)(p1, p2);
    230     }
    231 
    232     R operator()(const WeakPtr<C>& c, P1 p1, P2 p2)
    233     {
    234         C* obj = c.get();
    235         if (!obj)
    236             return R();
    237         return (obj->*m_function)(p1, p2);
    238     }
    239 
    240 private:
    241     R (C::*m_function)(P1, P2);
    242 };
    243 
    244 template<typename R, typename C, typename P1, typename P2, typename P3>
    245 class FunctionWrapper<R (C::*)(P1, P2, P3)> {
    246 public:
    247     typedef R ResultType;
    248 
    249     explicit FunctionWrapper(R (C::*function)(P1, P2, P3))
    250         : m_function(function)
    251     {
    252     }
    253 
    254     R operator()(C* c, P1 p1, P2 p2, P3 p3)
    255     {
    256         return (c->*m_function)(p1, p2, p3);
    257     }
    258 
    259     R operator()(const WeakPtr<C>& c, P1 p1, P2 p2, P3 p3)
    260     {
    261         C* obj = c.get();
    262         if (!obj)
    263             return R();
    264         return (obj->*m_function)(p1, p2, p3);
    265     }
    266 
    267 private:
    268     R (C::*m_function)(P1, P2, P3);
    269 };
    270 
    271 template<typename R, typename C, typename P1, typename P2, typename P3, typename P4>
    272 class FunctionWrapper<R (C::*)(P1, P2, P3, P4)> {
    273 public:
    274     typedef R ResultType;
    275 
    276     explicit FunctionWrapper(R (C::*function)(P1, P2, P3, P4))
    277         : m_function(function)
    278     {
    279     }
    280 
    281     R operator()(C* c, P1 p1, P2 p2, P3 p3, P4 p4)
    282     {
    283         return (c->*m_function)(p1, p2, p3, p4);
    284     }
    285 
    286     R operator()(const WeakPtr<C>& c, P1 p1, P2 p2, P3 p3, P4 p4)
    287     {
    288         C* obj = c.get();
    289         if (!obj)
    290             return R();
    291         return (obj->*m_function)(p1, p2, p3, p4);
    292     }
    293 
    294 private:
    295     R (C::*m_function)(P1, P2, P3, P4);
    296 };
    297 
    298 template<typename R, typename C, typename P1, typename P2, typename P3, typename P4, typename P5>
    299 class FunctionWrapper<R (C::*)(P1, P2, P3, P4, P5)> {
    300 public:
    301     typedef R ResultType;
    302 
    303     explicit FunctionWrapper(R (C::*function)(P1, P2, P3, P4, P5))
    304         : m_function(function)
    305     {
    306     }
    307 
    308     R operator()(C* c, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
    309     {
    310         return (c->*m_function)(p1, p2, p3, p4, p5);
    311     }
    312 
    313     R operator()(const WeakPtr<C>& c, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
    314     {
    315         C* obj = c.get();
    316         if (!obj)
    317             return R();
    318         return (obj->*m_function)(p1, p2, p3, p4, p5);
    319     }
    320 
    321 private:
    322     R (C::*m_function)(P1, P2, P3, P4, P5);
    323 };
    324 
    325 template<typename T> struct ParamStorageTraits {
    326     typedef T StorageType;
    327 
    328     static StorageType wrap(const T& value) { return value; }
    329     static const T& unwrap(const StorageType& value) { return value; }
    330 };
    331 
    332 template<typename T> struct ParamStorageTraits<PassRefPtr<T> > {
    333     typedef RefPtr<T> StorageType;
    334 
    335     static StorageType wrap(PassRefPtr<T> value) { return value; }
    336     static T* unwrap(const StorageType& value) { return value.get(); }
    337 };
    338 
    339 template<typename T> struct ParamStorageTraits<RefPtr<T> > {
    340     typedef RefPtr<T> StorageType;
    341 
    342     static StorageType wrap(RefPtr<T> value) { return value.release(); }
    343     static T* unwrap(const StorageType& value) { return value.get(); }
    344 };
    345 
    346 template<typename> class RetainPtr;
    347 
    348 template<typename T> struct ParamStorageTraits<RetainPtr<T> > {
    349     typedef RetainPtr<T> StorageType;
    350 
    351     static StorageType wrap(const RetainPtr<T>& value) { return value; }
    352     static typename RetainPtr<T>::PtrType unwrap(const StorageType& value) { return value.get(); }
    353 };
    354 
    355 class FunctionImplBase : public ThreadSafeRefCounted<FunctionImplBase> {
    356 public:
    357     virtual ~FunctionImplBase() { }
    358 };
    359 
    360 template<typename>
    361 class FunctionImpl;
    362 
    363 template<typename R>
    364 class FunctionImpl<R ()> : public FunctionImplBase {
    365 public:
    366     virtual R operator()() = 0;
    367 };
    368 
    369 template<typename FunctionWrapper, typename FunctionType>
    370 class BoundFunctionImpl;
    371 
    372 template<typename FunctionWrapper, typename R>
    373 class BoundFunctionImpl<FunctionWrapper, R ()> : public FunctionImpl<typename FunctionWrapper::ResultType ()> {
    374 public:
    375     explicit BoundFunctionImpl(FunctionWrapper functionWrapper)
    376         : m_functionWrapper(functionWrapper)
    377     {
    378     }
    379 
    380     virtual typename FunctionWrapper::ResultType operator()()
    381     {
    382         return m_functionWrapper();
    383     }
    384 
    385 private:
    386     FunctionWrapper m_functionWrapper;
    387 };
    388 
    389 template<typename FunctionWrapper, typename R, typename P1>
    390 class BoundFunctionImpl<FunctionWrapper, R (P1)> : public FunctionImpl<typename FunctionWrapper::ResultType ()> {
    391 public:
    392     BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1)
    393         : m_functionWrapper(functionWrapper)
    394         , m_p1(ParamStorageTraits<P1>::wrap(p1))
    395     {
    396     }
    397 
    398     virtual typename FunctionWrapper::ResultType operator()()
    399     {
    400         return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1));
    401     }
    402 
    403 private:
    404     FunctionWrapper m_functionWrapper;
    405     typename ParamStorageTraits<P1>::StorageType m_p1;
    406 };
    407 
    408 template<typename FunctionWrapper, typename R, typename P1, typename P2>
    409 class BoundFunctionImpl<FunctionWrapper, R (P1, P2)> : public FunctionImpl<typename FunctionWrapper::ResultType ()> {
    410 public:
    411     BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2)
    412         : m_functionWrapper(functionWrapper)
    413         , m_p1(ParamStorageTraits<P1>::wrap(p1))
    414         , m_p2(ParamStorageTraits<P2>::wrap(p2))
    415     {
    416     }
    417 
    418     virtual typename FunctionWrapper::ResultType operator()()
    419     {
    420         return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1), ParamStorageTraits<P2>::unwrap(m_p2));
    421     }
    422 
    423 private:
    424     FunctionWrapper m_functionWrapper;
    425     typename ParamStorageTraits<P1>::StorageType m_p1;
    426     typename ParamStorageTraits<P2>::StorageType m_p2;
    427 };
    428 
    429 template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3>
    430 class BoundFunctionImpl<FunctionWrapper, R (P1, P2, P3)> : public FunctionImpl<typename FunctionWrapper::ResultType ()> {
    431 public:
    432     BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3)
    433         : m_functionWrapper(functionWrapper)
    434         , m_p1(ParamStorageTraits<P1>::wrap(p1))
    435         , m_p2(ParamStorageTraits<P2>::wrap(p2))
    436         , m_p3(ParamStorageTraits<P3>::wrap(p3))
    437     {
    438     }
    439 
    440     virtual typename FunctionWrapper::ResultType operator()()
    441     {
    442         return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1), ParamStorageTraits<P2>::unwrap(m_p2), ParamStorageTraits<P3>::unwrap(m_p3));
    443     }
    444 
    445 private:
    446     FunctionWrapper m_functionWrapper;
    447     typename ParamStorageTraits<P1>::StorageType m_p1;
    448     typename ParamStorageTraits<P2>::StorageType m_p2;
    449     typename ParamStorageTraits<P3>::StorageType m_p3;
    450 };
    451 
    452 template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4>
    453 class BoundFunctionImpl<FunctionWrapper, R (P1, P2, P3, P4)> : public FunctionImpl<typename FunctionWrapper::ResultType ()> {
    454 public:
    455     BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3, const P4& p4)
    456         : m_functionWrapper(functionWrapper)
    457         , m_p1(ParamStorageTraits<P1>::wrap(p1))
    458         , m_p2(ParamStorageTraits<P2>::wrap(p2))
    459         , m_p3(ParamStorageTraits<P3>::wrap(p3))
    460         , m_p4(ParamStorageTraits<P4>::wrap(p4))
    461     {
    462     }
    463 
    464     virtual typename FunctionWrapper::ResultType operator()()
    465     {
    466         return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1), ParamStorageTraits<P2>::unwrap(m_p2), ParamStorageTraits<P3>::unwrap(m_p3), ParamStorageTraits<P4>::unwrap(m_p4));
    467     }
    468 
    469 private:
    470     FunctionWrapper m_functionWrapper;
    471     typename ParamStorageTraits<P1>::StorageType m_p1;
    472     typename ParamStorageTraits<P2>::StorageType m_p2;
    473     typename ParamStorageTraits<P3>::StorageType m_p3;
    474     typename ParamStorageTraits<P4>::StorageType m_p4;
    475 };
    476 
    477 template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
    478 class BoundFunctionImpl<FunctionWrapper, R (P1, P2, P3, P4, P5)> : public FunctionImpl<typename FunctionWrapper::ResultType ()> {
    479 public:
    480     BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5)
    481         : m_functionWrapper(functionWrapper)
    482         , m_p1(ParamStorageTraits<P1>::wrap(p1))
    483         , m_p2(ParamStorageTraits<P2>::wrap(p2))
    484         , m_p3(ParamStorageTraits<P3>::wrap(p3))
    485         , m_p4(ParamStorageTraits<P4>::wrap(p4))
    486         , m_p5(ParamStorageTraits<P5>::wrap(p5))
    487     {
    488     }
    489 
    490     virtual typename FunctionWrapper::ResultType operator()()
    491     {
    492         return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1), ParamStorageTraits<P2>::unwrap(m_p2), ParamStorageTraits<P3>::unwrap(m_p3), ParamStorageTraits<P4>::unwrap(m_p4), ParamStorageTraits<P5>::unwrap(m_p5));
    493     }
    494 
    495 private:
    496     FunctionWrapper m_functionWrapper;
    497     typename ParamStorageTraits<P1>::StorageType m_p1;
    498     typename ParamStorageTraits<P2>::StorageType m_p2;
    499     typename ParamStorageTraits<P3>::StorageType m_p3;
    500     typename ParamStorageTraits<P4>::StorageType m_p4;
    501     typename ParamStorageTraits<P5>::StorageType m_p5;
    502 };
    503 
    504 template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
    505 class BoundFunctionImpl<FunctionWrapper, R (P1, P2, P3, P4, P5, P6)> : public FunctionImpl<typename FunctionWrapper::ResultType ()> {
    506 public:
    507     BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6)
    508         : m_functionWrapper(functionWrapper)
    509         , m_p1(ParamStorageTraits<P1>::wrap(p1))
    510         , m_p2(ParamStorageTraits<P2>::wrap(p2))
    511         , m_p3(ParamStorageTraits<P3>::wrap(p3))
    512         , m_p4(ParamStorageTraits<P4>::wrap(p4))
    513         , m_p5(ParamStorageTraits<P5>::wrap(p5))
    514         , m_p6(ParamStorageTraits<P6>::wrap(p6))
    515     {
    516     }
    517 
    518     virtual typename FunctionWrapper::ResultType operator()()
    519     {
    520         return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1), ParamStorageTraits<P2>::unwrap(m_p2), ParamStorageTraits<P3>::unwrap(m_p3), ParamStorageTraits<P4>::unwrap(m_p4), ParamStorageTraits<P5>::unwrap(m_p5), ParamStorageTraits<P6>::unwrap(m_p6));
    521     }
    522 
    523 private:
    524     FunctionWrapper m_functionWrapper;
    525     typename ParamStorageTraits<P1>::StorageType m_p1;
    526     typename ParamStorageTraits<P2>::StorageType m_p2;
    527     typename ParamStorageTraits<P3>::StorageType m_p3;
    528     typename ParamStorageTraits<P4>::StorageType m_p4;
    529     typename ParamStorageTraits<P5>::StorageType m_p5;
    530     typename ParamStorageTraits<P6>::StorageType m_p6;
    531 };
    532 
    533 class FunctionBase {
    534 public:
    535     bool isNull() const
    536     {
    537         return !m_impl;
    538     }
    539 
    540 protected:
    541     FunctionBase()
    542     {
    543     }
    544 
    545     explicit FunctionBase(PassRefPtr<FunctionImplBase> impl)
    546         : m_impl(impl)
    547     {
    548     }
    549 
    550     template<typename FunctionType> FunctionImpl<FunctionType>* impl() const
    551     {
    552         return static_cast<FunctionImpl<FunctionType>*>(m_impl.get());
    553     }
    554 
    555 private:
    556     RefPtr<FunctionImplBase> m_impl;
    557 };
    558 
    559 template<typename>
    560 class Function;
    561 
    562 template<typename R>
    563 class Function<R ()> : public FunctionBase {
    564 public:
    565     Function()
    566     {
    567     }
    568 
    569     Function(PassRefPtr<FunctionImpl<R ()> > impl)
    570         : FunctionBase(impl)
    571     {
    572     }
    573 
    574     R operator()() const
    575     {
    576         ASSERT(!isNull());
    577         return impl<R ()>()->operator()();
    578     }
    579 };
    580 
    581 template<typename FunctionType>
    582 Function<typename FunctionWrapper<FunctionType>::ResultType ()> bind(FunctionType function)
    583 {
    584     return Function<typename FunctionWrapper<FunctionType>::ResultType ()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType ()>(FunctionWrapper<FunctionType>(function))));
    585 }
    586 
    587 template<typename FunctionType, typename A1>
    588 Function<typename FunctionWrapper<FunctionType>::ResultType ()> bind(FunctionType function, const A1& a1)
    589 {
    590     return Function<typename FunctionWrapper<FunctionType>::ResultType ()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1)>(FunctionWrapper<FunctionType>(function), a1)));
    591 }
    592 
    593 template<typename FunctionType, typename A1, typename A2>
    594 Function<typename FunctionWrapper<FunctionType>::ResultType ()> bind(FunctionType function, const A1& a1, const A2& a2)
    595 {
    596     return Function<typename FunctionWrapper<FunctionType>::ResultType ()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2)>(FunctionWrapper<FunctionType>(function), a1, a2)));
    597 }
    598 
    599 template<typename FunctionType, typename A1, typename A2, typename A3>
    600 Function<typename FunctionWrapper<FunctionType>::ResultType ()> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3)
    601 {
    602     return Function<typename FunctionWrapper<FunctionType>::ResultType ()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3)>(FunctionWrapper<FunctionType>(function), a1, a2, a3)));
    603 }
    604 
    605 template<typename FunctionType, typename A1, typename A2, typename A3, typename A4>
    606 Function<typename FunctionWrapper<FunctionType>::ResultType ()> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3, const A4& a4)
    607 {
    608     return Function<typename FunctionWrapper<FunctionType>::ResultType ()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4)>(FunctionWrapper<FunctionType>(function), a1, a2, a3, a4)));
    609 }
    610 
    611 template<typename FunctionType, typename A1, typename A2, typename A3, typename A4, typename A5>
    612 Function<typename FunctionWrapper<FunctionType>::ResultType ()> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
    613 {
    614     return Function<typename FunctionWrapper<FunctionType>::ResultType ()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5)>(FunctionWrapper<FunctionType>(function), a1, a2, a3, a4, a5)));
    615 }
    616 
    617 template<typename FunctionType, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    618 Function<typename FunctionWrapper<FunctionType>::ResultType ()> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6)
    619 {
    620     return Function<typename FunctionWrapper<FunctionType>::ResultType ()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5, A6)>(FunctionWrapper<FunctionType>(function), a1, a2, a3, a4, a5, a6)));
    621 }
    622 
    623 typedef Function<void()> Closure;
    624 
    625 }
    626 
    627 using WTF::Function;
    628 using WTF::bind;
    629 using WTF::Closure;
    630 
    631 #endif // WTF_Functional_h
    632