15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef WTF_Functional_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define WTF_Functional_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Assertions.h"
30591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassRefPtr.h"
31591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/RefPtr.h"
32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/ThreadSafeRefCounted.h"
33591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/WeakPtr.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Functional.h provides a very simple way to bind a function pointer and arguments together into a function object
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// that can be stored, copied and invoked, similar to how boost::bind and std::bind in C++11.
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A FunctionWrapper is a class template that can wrap a function pointer or a member function pointer and
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// provide a unified interface for calling that function.
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename>
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FunctionWrapper;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Bound static functions:
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R>
4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(*)()> {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(*function)())
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()()
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_function();
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(*m_function)();
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R, typename P1>
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(*)(P1)> {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(*function)(P1))
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()(P1 p1)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_function(p1);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(*m_function)(P1);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R, typename P1, typename P2>
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(*)(P1, P2)> {
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(*function)(P1, P2))
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()(P1 p1, P2 p2)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_function(p1, p2);
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(*m_function)(P1, P2);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R, typename P1, typename P2, typename P3>
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(*)(P1, P2, P3)> {
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(*function)(P1, P2, P3))
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()(P1 p1, P2 p2, P3 p3)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_function(p1, p2, p3);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(*m_function)(P1, P2, P3);
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)template<typename R, typename P1, typename P2, typename P3, typename P4>
12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(*)(P1, P2, P3, P4)> {
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    typedef R ResultType;
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(*function)(P1, P2, P3, P4))
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        : m_function(function)
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    R operator()(P1 p1, P2 p2, P3 p3, P4 p4)
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_function(p1, p2, p3, p4);
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
13909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(*m_function)(P1, P2, P3, P4);
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
14309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(*)(P1, P2, P3, P4, P5)> {
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    typedef R ResultType;
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(*function)(P1, P2, P3, P4, P5))
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        : m_function(function)
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_function(p1, p2, p3, p4, p5);
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(*m_function)(P1, P2, P3, P4, P5);
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
161c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FunctionWrapper<R(*)(P1, P2, P3, P4, P5, P6)> {
163c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
164c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typedef R ResultType;
165c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
166c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    explicit FunctionWrapper(R(*function)(P1, P2, P3, P4, P5, P6))
167c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_function(function)
168c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
169c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
170c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
171c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
172c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_function(p1, p2, p3, p4, p5, p6);
174c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
175c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
176c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    R(*m_function)(P1, P2, P3, P4, P5, P6);
178c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
179c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Bound member functions:
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R, typename C>
18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(C::*)()> {
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(C::*function)())
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()(C* c)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (c->*m_function)();
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    R operator()(const WeakPtr<C>& c)
198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        C* obj = c.get();
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!obj)
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return R();
202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return (obj->*m_function)();
203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(C::*m_function)();
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R, typename C, typename P1>
21009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(C::*)(P1)> {
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(C::*function)(P1))
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()(C* c, P1 p1)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (c->*m_function)(p1);
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    R operator()(const WeakPtr<C>& c, P1 p1)
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        C* obj = c.get();
227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!obj)
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return R();
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return (obj->*m_function)(p1);
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
23309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(C::*m_function)(P1);
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R, typename C, typename P1, typename P2>
23709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(C::*)(P1, P2)> {
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(C::*function)(P1, P2))
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()(C* c, P1 p1, P2 p2)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (c->*m_function)(p1, p2);
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    R operator()(const WeakPtr<C>& c, P1 p1, P2 p2)
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        C* obj = c.get();
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!obj)
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return R();
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return (obj->*m_function)(p1, p2);
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
26009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(C::*m_function)(P1, P2);
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R, typename C, typename P1, typename P2, typename P3>
26409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(C::*)(P1, P2, P3)> {
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(C::*function)(P1, P2, P3))
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()(C* c, P1 p1, P2 p2, P3 p3)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (c->*m_function)(p1, p2, p3);
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    R operator()(const WeakPtr<C>& c, P1 p1, P2 p2, P3 p3)
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        C* obj = c.get();
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!obj)
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return R();
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return (obj->*m_function)(p1, p2, p3);
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
28709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(C::*m_function)(P1, P2, P3);
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R, typename C, typename P1, typename P2, typename P3, typename P4>
29109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(C::*)(P1, P2, P3, P4)> {
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(C::*function)(P1, P2, P3, P4))
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()(C* c, P1 p1, P2 p2, P3 p3, P4 p4)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (c->*m_function)(p1, p2, p3, p4);
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    R operator()(const WeakPtr<C>& c, P1 p1, P2 p2, P3 p3, P4 p4)
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        C* obj = c.get();
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!obj)
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return R();
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return (obj->*m_function)(p1, p2, p3, p4);
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(C::*m_function)(P1, P2, P3, P4);
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R, typename C, typename P1, typename P2, typename P3, typename P4, typename P5>
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionWrapper<R(C::*)(P1, P2, P3, P4, P5)> {
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef R ResultType;
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    explicit FunctionWrapper(R(C::*function)(P1, P2, P3, P4, P5))
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_function(function)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    R operator()(C* c, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (c->*m_function)(p1, p2, p3, p4, p5);
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    R operator()(const WeakPtr<C>& c, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        C* obj = c.get();
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!obj)
336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return R();
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return (obj->*m_function)(p1, p2, p3, p4, p5);
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
34109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    R(C::*m_function)(P1, P2, P3, P4, P5);
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename T> struct ParamStorageTraits {
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef T StorageType;
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static StorageType wrap(const T& value) { return value; }
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const T& unwrap(const StorageType& value) { return value; }
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename T> struct ParamStorageTraits<PassRefPtr<T> > {
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef RefPtr<T> StorageType;
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static StorageType wrap(PassRefPtr<T> value) { return value; }
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static T* unwrap(const StorageType& value) { return value.get(); }
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename T> struct ParamStorageTraits<RefPtr<T> > {
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef RefPtr<T> StorageType;
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static StorageType wrap(RefPtr<T> value) { return value.release(); }
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static T* unwrap(const StorageType& value) { return value.get(); }
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename> class RetainPtr;
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename T> struct ParamStorageTraits<RetainPtr<T> > {
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef RetainPtr<T> StorageType;
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static StorageType wrap(const RetainPtr<T>& value) { return value; }
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static typename RetainPtr<T>::PtrType unwrap(const StorageType& value) { return value.get(); }
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FunctionImplBase : public ThreadSafeRefCounted<FunctionImplBase> {
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~FunctionImplBase() { }
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename>
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FunctionImpl;
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename R>
38309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class FunctionImpl<R()> : public FunctionImplBase {
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual R operator()() = 0;
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
388c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1>
389c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FunctionImpl<R(A1)> : public FunctionImplBase {
390c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
391c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual R operator()(A1 a1) = 0;
392c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
393c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
394c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2>
395c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FunctionImpl<R(A1, A2)> : public FunctionImplBase {
396c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
397c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual R operator()(A1 a1, A2 a2) = 0;
398c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
399c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
400c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2, typename A3>
401c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FunctionImpl<R(A1, A2, A3)> : public FunctionImplBase {
402c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
403c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual R operator()(A1 a1, A2 a2, A3 a3) = 0;
404c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
405c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
406c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2, typename A3, typename A4>
407c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FunctionImpl<R(A1, A2, A3, A4)> : public FunctionImplBase {
408c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
409c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual R operator()(A1 a1, A2 a2, A3 a3, A4 a4) = 0;
410c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
411c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
412c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5>
413c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FunctionImpl<R(A1, A2, A3, A4, A5)> : public FunctionImplBase {
414c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
415c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual R operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) = 0;
416c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
417c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
418c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
419c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FunctionImpl<R(A1, A2, A3, A4, A5, A6)> : public FunctionImplBase {
420c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
421c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual R operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) = 0;
422c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
423c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionWrapper, typename FunctionType>
425c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class UnboundFunctionImpl;
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
427c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1>
4287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass UnboundFunctionImpl<FunctionWrapper, R(P1)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P1)> {
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
430c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    UnboundFunctionImpl(FunctionWrapper functionWrapper)
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P1 p1) override
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
437c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(p1);
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
444c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2>
4457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass UnboundFunctionImpl<FunctionWrapper, R(P1, P2)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P1, P2)> {
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
447c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    UnboundFunctionImpl(FunctionWrapper functionWrapper)
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P1 p1, P2 p2) override
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
454c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(p1, p2);
455c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
456c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
457c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
458c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
459c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
460c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
461c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3>
4627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass UnboundFunctionImpl<FunctionWrapper, R(P1, P2, P3)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P1, P2, P3)> {
463c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
464c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    UnboundFunctionImpl(FunctionWrapper functionWrapper)
465c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
466c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
467c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
468c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
4697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P1 p1, P2 p2, P3 p3) override
470c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
471c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(p1, p2, p3);
472c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
473c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
474c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
475c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
476c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
477c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
478c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4>
4797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass UnboundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P1, P2, P3, P4)> {
480c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
481c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    UnboundFunctionImpl(FunctionWrapper functionWrapper)
482c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
483c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
484c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
485c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
4867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P1 p1, P2 p2, P3 p3, P4 p4) override
487c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
488c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(p1, p2, p3, p4);
489c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
490c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
491c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
492c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
493c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
494c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
495c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
4967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass UnboundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P1, P2, P3, P4, P5)> {
497c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
498c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    UnboundFunctionImpl(FunctionWrapper functionWrapper)
499c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
500c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
501c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
502c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) override
504c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
505c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(p1, p2, p3, p4, p5);
506c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
507c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
508c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
509c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
510c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
511c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
512c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
5137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass UnboundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5, P6)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P1, P2, P3, P4, P5, P6)> {
514c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
515c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    UnboundFunctionImpl(FunctionWrapper functionWrapper)
516c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
517c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
518c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
519c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) override
521c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
522c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(p1, p2, p3, p4, p5, p6);
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
529c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename FunctionType>
530c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class OneArgPartBoundFunctionImpl;
531c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2>
5337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass OneArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P2)> {
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
535c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    OneArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1)
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
54002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P2 p2) override
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
543c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, p2);
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3>
5527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass OneArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P2, P3)> {
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
554c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    OneArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1)
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P2 p2, P3 p3) override
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
562c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, p2, p3);
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4>
5717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass OneArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P2, P3, P4)> {
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
573c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    OneArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1)
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
57802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P2 p2, P3 p3, P4 p4) override
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
581c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, p2, p3, p4);
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
5907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass OneArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P2, P3, P4, P5)> {
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
592c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    OneArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1)
593c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
594c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
595c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
596c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
597c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P2 p2, P3 p3, P4 p4, P5 p5) override
599c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
600c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, p2, p3, p4, p5);
601c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
602c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
603c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
604c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
605c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
606c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
607c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
608c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
6097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass OneArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5, P6)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P2, P3, P4, P5, P6)> {
610c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
611c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    OneArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1)
612c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
613c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
614c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
615c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
616c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
6177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) override
618c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
619c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, p2, p3, p4, p5, p6);
620c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
621c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
622c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
623c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
624c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
625c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
626c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
627c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename FunctionType>
628c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class TwoArgPartBoundFunctionImpl;
629c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
630c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3>
6317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass TwoArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P3)> {
632c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
633c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    TwoArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2)
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P3 p3) override
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
642c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, p3);
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
651c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4>
6527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass TwoArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P3, P4)> {
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
654c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    TwoArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2)
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P3 p3, P4 p4) override
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
663c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, p3, p4);
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
672c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
6737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass TwoArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P3, P4, P5)> {
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
675c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    TwoArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2)
676c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
677c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
678c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P3 p3, P4 p4, P5 p5) override
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
684c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, p3, p4, p5);
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
687c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
688c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
689c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
690c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
691c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
692c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
693c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
6947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass TwoArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5, P6)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P3, P4, P5, P6)> {
695c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
696c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    TwoArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2)
697c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
698c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
699c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P3 p3, P4 p4, P5 p5, P6 p6) override
70402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
705c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, p3, p4, p5, p6);
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
709c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
710c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
711c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
714c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename FunctionType>
715c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class ThreeArgPartBoundFunctionImpl;
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
717c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4>
7187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ThreeArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P4)> {
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
720c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ThreeArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3)
721c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
722c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
723c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
724c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P4 p4) override
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
730c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, m_p3, p4);
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
733c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
734c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
735c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
736c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
737c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
738c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
739c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
740c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
7417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ThreeArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P4, P5)> {
742c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
743c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ThreeArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3)
744c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
745c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
746c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
747c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P4 p4, P5 p5) override
752c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
753c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, m_p3, p4, p5);
754c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
756c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
757c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
758c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
759c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
760c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
761c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
762c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
763c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
7647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ThreeArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5, P6)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P4, P5, P6)> {
765c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
766c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ThreeArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3)
767c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
768c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
769c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
770c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
771c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
772c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
773c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
7747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P4 p4, P5 p5, P6 p6) override
775c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
776c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, m_p3, p4, p5, p6);
777c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
778c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
779c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
780c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
781c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
782c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
783c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
784c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
785c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
786c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename FunctionType>
787c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FourArgPartBoundFunctionImpl;
788c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
789c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
7907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass FourArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P5)> {
791c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
792c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FourArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3, const P4& p4)
793c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
794c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
795c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
796c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
797c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p4(ParamStorageTraits<P4>::wrap(p4))
798c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
799c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
800c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
8017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P5 p5) override
802c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
803c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, m_p3, m_p4, p5);
804c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
805c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
806c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
807c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
808c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
809c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
810c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
811c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P4>::StorageType m_p4;
812c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
813c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
814c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
8157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass FourArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5, P6)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P5, P6)> {
816c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
817c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FourArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3, const P4& p4)
818c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
819c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
820c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
821c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
822c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p4(ParamStorageTraits<P4>::wrap(p4))
823c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
824c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
825c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
8267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P5 p5, P6 p6) override
827c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
828c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, m_p3, m_p4, p5, p6);
829c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
830c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
831c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
832c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
833c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
834c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
835c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
836c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P4>::StorageType m_p4;
837c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
838c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
839c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename FunctionType>
840c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FiveArgPartBoundFunctionImpl;
841c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
842c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
8437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass FiveArgPartBoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5, P6)> final : public FunctionImpl<typename FunctionWrapper::ResultType(P6)> {
844c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
845c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FiveArgPartBoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5)
846c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
847c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
848c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
849c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
850c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p4(ParamStorageTraits<P4>::wrap(p4))
851c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p5(ParamStorageTraits<P5>::wrap(p5))
852c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
853c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
854c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
8557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()(P6 p6) override
856c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
857c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(m_p1, m_p2, m_p3, m_p4, m_p5, p6);
858c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
859c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
860c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
861c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
862c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
863c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
864c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
865c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P4>::StorageType m_p4;
866c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P5>::StorageType m_p5;
867c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
868c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
869c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename FunctionType>
870c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class BoundFunctionImpl;
871c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
872c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R>
8737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass BoundFunctionImpl<FunctionWrapper, R()> final : public FunctionImpl<typename FunctionWrapper::ResultType()> {
874c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
875c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    explicit BoundFunctionImpl(FunctionWrapper functionWrapper)
876c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
877c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
878c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
879c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
8807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()() override
881c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
882c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper();
883c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
884c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
885c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
886c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
887c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
888c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
889c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1>
8907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass BoundFunctionImpl<FunctionWrapper, R(P1)> final : public FunctionImpl<typename FunctionWrapper::ResultType()> {
891c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
892c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1)
893c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
894c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
895c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
896c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
897c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
8987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()() override
899c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
900c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1));
901c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
902c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
903c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
904c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
905c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
906c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
907c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
908c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2>
9097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass BoundFunctionImpl<FunctionWrapper, R(P1, P2)> final : public FunctionImpl<typename FunctionWrapper::ResultType()> {
910c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
911c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2)
912c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
913c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
914c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
915c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
916c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
917c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
9187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()() override
919c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
920c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1), ParamStorageTraits<P2>::unwrap(m_p2));
921c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
922c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
923c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
924c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
925c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
926c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
927c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
928c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
929c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3>
9307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass BoundFunctionImpl<FunctionWrapper, R(P1, P2, P3)> final : public FunctionImpl<typename FunctionWrapper::ResultType()> {
931c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
932c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3)
933c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
934c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
935c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
936c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
937c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
938c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
939c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
9407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()() override
941c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
942c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1), ParamStorageTraits<P2>::unwrap(m_p2), ParamStorageTraits<P3>::unwrap(m_p3));
943c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
944c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
945c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
946c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
947c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
948c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
949c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
950c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
951c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
952c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4>
9537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass BoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4)> final : public FunctionImpl<typename FunctionWrapper::ResultType()> {
954c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
955c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3, const P4& p4)
956c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
957c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
958c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
959c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
960c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p4(ParamStorageTraits<P4>::wrap(p4))
961c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
962c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
963c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
9647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()() override
965c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
966c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_functionWrapper(ParamStorageTraits<P1>::unwrap(m_p1), ParamStorageTraits<P2>::unwrap(m_p2), ParamStorageTraits<P3>::unwrap(m_p3), ParamStorageTraits<P4>::unwrap(m_p4));
967c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
968c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
969c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
970c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
971c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
972c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
973c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
974c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P4>::StorageType m_p4;
975c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
976c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
977c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5>
9787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass BoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5)> final : public FunctionImpl<typename FunctionWrapper::ResultType()> {
979c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
980c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5)
981c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
982c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
983c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
984c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
985c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p4(ParamStorageTraits<P4>::wrap(p4))
986c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p5(ParamStorageTraits<P5>::wrap(p5))
987c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
988c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
989c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
9907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()() override
991c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
992c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        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));
993c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
994c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
995c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
996c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
997c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
998c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
999c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
1000c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P4>::StorageType m_p4;
1001c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P5>::StorageType m_p5;
1002c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1003c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1004c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionWrapper, typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
10057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass BoundFunctionImpl<FunctionWrapper, R(P1, P2, P3, P4, P5, P6)> final : public FunctionImpl<typename FunctionWrapper::ResultType()> {
1006c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1007c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    BoundFunctionImpl(FunctionWrapper functionWrapper, const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6)
1008c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_functionWrapper(functionWrapper)
1009c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p1(ParamStorageTraits<P1>::wrap(p1))
1010c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p2(ParamStorageTraits<P2>::wrap(p2))
1011c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p3(ParamStorageTraits<P3>::wrap(p3))
1012c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p4(ParamStorageTraits<P4>::wrap(p4))
1013c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p5(ParamStorageTraits<P5>::wrap(p5))
1014c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_p6(ParamStorageTraits<P6>::wrap(p6))
1015c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1016c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1017c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
10187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual typename FunctionWrapper::ResultType operator()() override
1019c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1020c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        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));
1021c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1022c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1023c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
1024c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionWrapper m_functionWrapper;
1025c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P1>::StorageType m_p1;
1026c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P2>::StorageType m_p2;
1027c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P3>::StorageType m_p3;
1028c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P4>::StorageType m_p4;
1029c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P5>::StorageType m_p5;
1030c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typename ParamStorageTraits<P6>::StorageType m_p6;
1031c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1032c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1033c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class FunctionBase {
1034c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1035c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    bool isNull() const
1036c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1037c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return !m_impl;
1038c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1039c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1040c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)protected:
1041c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FunctionBase()
1042c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1043c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1044c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1045c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    explicit FunctionBase(PassRefPtr<FunctionImplBase> impl)
1046c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_impl(impl)
1047c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1048c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1049c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1050c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    template<typename FunctionType> FunctionImpl<FunctionType>* impl() const
1051c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1052c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return static_cast<FunctionImpl<FunctionType>*>(m_impl.get());
1053c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1054c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1055c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
1056c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<FunctionImplBase> m_impl;
1057c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1058c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1059c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename>
1060c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class Function;
1061c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1062c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R>
1063c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class Function<R()> : public FunctionBase {
1064c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1065c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function()
1066c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1067c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1068c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1069c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function(PassRefPtr<FunctionImpl<R()> > impl)
1070c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : FunctionBase(impl)
1071c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1072c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1073c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1074c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    R operator()() const
1075c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1076c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ASSERT(!isNull());
1077c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return impl<R()>()->operator()();
1078c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1079c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1080c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1081c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1>
1082c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class Function<R(A1)> : public FunctionBase {
1083c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1084c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function()
1085c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1086c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1087c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1088c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function(PassRefPtr<FunctionImpl<R(A1)> > impl)
1089c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : FunctionBase(impl)
1090c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1091c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1092c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1093c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    R operator()(A1 a1) const
1094c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1095c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ASSERT(!isNull());
1096c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return impl<R(A1)>()->operator()(a1);
1097c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1098c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1099c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1100c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2>
1101c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class Function<R(A1, A2)> : public FunctionBase {
1102c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function()
1104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1105c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1107c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function(PassRefPtr<FunctionImpl<R(A1, A2)> > impl)
1108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : FunctionBase(impl)
1109c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    R operator()(A1 a1, A2 a2) const
1113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ASSERT(!isNull());
1115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return impl<R(A1, A2)>()->operator()(a1, a2);
1116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1119c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2, typename A3>
1120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class Function<R(A1, A2, A3)> : public FunctionBase {
1121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function()
1123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1125c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function(PassRefPtr<FunctionImpl<R(A1, A2, A3)> > impl)
1127c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : FunctionBase(impl)
1128c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1129c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1130c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    R operator()(A1 a1, A2 a2, A3 a3) const
1132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1133c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ASSERT(!isNull());
1134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return impl<R(A1, A2, A3)>()->operator()(a1, a2, a3);
1135c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1136c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2, typename A3, typename A4>
1139c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class Function<R(A1, A2, A3, A4)> : public FunctionBase {
1140c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function()
1142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1143c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1144c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function(PassRefPtr<FunctionImpl<R(A1, A2, A3, A4)> > impl)
1146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : FunctionBase(impl)
1147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1148c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1150c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    R operator()(A1 a1, A2 a2, A3 a3, A4 a4) const
1151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1152c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ASSERT(!isNull());
1153c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return impl<R(A1, A2, A3, A4)>()->operator()(a1, a2, a3, a4);
1154c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1155c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1156c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1157c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5>
1158c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class Function<R(A1, A2, A3, A4, A5)> : public FunctionBase {
1159c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1160c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function()
1161c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1163c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1164c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function(PassRefPtr<FunctionImpl<R(A1, A2, A3, A4, A5)> > impl)
1165c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : FunctionBase(impl)
1166c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1167c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1168c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1169c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    R operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
1170c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1171c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ASSERT(!isNull());
1172c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return impl<R(A1, A2, A3, A4, A5)>()->operator()(a1, a2, a3, a4, a5);
1173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1174c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1175c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1176c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class Function<R(A1, A2, A3, A4, A5, A6)> : public FunctionBase {
1178c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1179c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function()
1180c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1181c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1182c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1183c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Function(PassRefPtr<FunctionImpl<R(A1, A2, A3, A4, A5, A6)> > impl)
1184c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : FunctionBase(impl)
1185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1186c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1187c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1188c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    R operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
1189c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1190c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ASSERT(!isNull());
1191c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return impl<R(A1, A2, A3, A4, A5, A6)>()->operator()(a1, a2, a3, a4, a5, a6);
1192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
1193c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
1194c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1195c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionType>
1196c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType()> bind(FunctionType function)
1197c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1198c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType()>(FunctionWrapper<FunctionType>(function))));
1199c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1200c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1201c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename FunctionType, typename A1>
1202c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType()> bind(FunctionType function, const A1& a1)
1203c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1204c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1)>(FunctionWrapper<FunctionType>(function), a1)));
1205c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionType, typename A1, typename A2>
120809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType()> bind(FunctionType function, const A1& a1, const A2& a2)
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
121009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2)>(FunctionWrapper<FunctionType>(function), a1, a2)));
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionType, typename A1, typename A2, typename A3>
121409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType()> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3)
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
121609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType()>(adoptRef(new BoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3)>(FunctionWrapper<FunctionType>(function), a1, a2, a3)));
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionType, typename A1, typename A2, typename A3, typename A4>
122009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType()> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3, const A4& a4)
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
122209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    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)));
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionType, typename A1, typename A2, typename A3, typename A4, typename A5>
122609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType()> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
122809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    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)));
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename FunctionType, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
123209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)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)
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
123409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    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)));
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1237c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1238c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Partial parameter binding.
1239c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1240c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A1, typename FunctionType>
1241c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A1)> bind(FunctionType function)
1242c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1243c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A1)>(adoptRef(new UnboundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1)>(FunctionWrapper<FunctionType>(function))));
1244c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1245c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1246c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A1, typename A2, typename FunctionType>
1247c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2)> bind(FunctionType function)
1248c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1249c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2)>(adoptRef(new UnboundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2)>(FunctionWrapper<FunctionType>(function))));
1250c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1251c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1252c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A2, typename FunctionType, typename A1>
1253c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A2)> bind(FunctionType function, const A1& a1)
1254c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1255c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A2)>(adoptRef(new OneArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2)>(FunctionWrapper<FunctionType>(function), a1)));
1256c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1257c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1258c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A1, typename A2, typename A3, typename FunctionType>
1259c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2, A3)> bind(FunctionType function)
1260c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1261c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2, A3)>(adoptRef(new UnboundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3)>(FunctionWrapper<FunctionType>(function))));
1262c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1263c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1264c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A2, typename A3, typename FunctionType, typename A1>
1265c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A2, A3)> bind(FunctionType function, const A1& a1)
1266c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1267c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A2, A3)>(adoptRef(new OneArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3)>(FunctionWrapper<FunctionType>(function), a1)));
1268c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1269c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1270c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A3, typename FunctionType, typename A1, typename A2>
1271c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A3)> bind(FunctionType function, const A1& a1, const A2& a2)
1272c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1273c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A3)>(adoptRef(new TwoArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3)>(FunctionWrapper<FunctionType>(function), a1, a2)));
1274c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1275c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1276c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A1, typename A2, typename A3, typename A4, typename FunctionType>
1277c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2, A3, A4)> bind(FunctionType function)
1278c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1279c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2, A3, A4)>(adoptRef(new UnboundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4)>(FunctionWrapper<FunctionType>(function))));
1280c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1281c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1282c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A2, typename A3, typename A4, typename FunctionType, typename A1>
1283c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A2, A3, A4)> bind(FunctionType function, const A1& a1)
1284c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1285c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A2, A3, A4)>(adoptRef(new OneArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4)>(FunctionWrapper<FunctionType>(function), a1)));
1286c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1287c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1288c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A3, typename A4, typename FunctionType, typename A1, typename A2>
1289c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A3, A4)> bind(FunctionType function, const A1& a1, const A2& a2)
1290c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1291c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A3, A4)>(adoptRef(new TwoArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4)>(FunctionWrapper<FunctionType>(function), a1, a2)));
1292c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1293c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1294c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A4, typename FunctionType, typename A1, typename A2, typename A3>
1295c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A4)> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3)
1296c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1297c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A4)>(adoptRef(new ThreeArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4)>(FunctionWrapper<FunctionType>(function), a1, a2, a3)));
1298c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1299c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1300c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A1, typename A2, typename A3, typename A4, typename A5, typename FunctionType>
1301c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2, A3, A4, A5)> bind(FunctionType function)
1302c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1303c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2, A3, A4, A5)>(adoptRef(new UnboundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5)>(FunctionWrapper<FunctionType>(function))));
1304c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1305c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1306c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A2, typename A3, typename A4, typename A5, typename FunctionType, typename A1>
1307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A2, A3, A4, A5)> bind(FunctionType function, const A1& a1)
1308c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1309c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A2, A3, A4, A5)>(adoptRef(new OneArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5)>(FunctionWrapper<FunctionType>(function), a1)));
1310c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1311c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1312c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A3, typename A4, typename A5, typename FunctionType, typename A1, typename A2>
1313c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A3, A4, A5)> bind(FunctionType function, const A1& a1, const A2& a2)
1314c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1315c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A3, A4, A5)>(adoptRef(new TwoArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5)>(FunctionWrapper<FunctionType>(function), a1, a2)));
1316c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1317c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1318c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A4, typename A5, typename FunctionType, typename A1, typename A2, typename A3>
1319c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A4, A5)> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3)
1320c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1321c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A4, A5)>(adoptRef(new ThreeArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5)>(FunctionWrapper<FunctionType>(function), a1, a2, a3)));
1322c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1323c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1324c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A5, typename FunctionType, typename A1, typename A2, typename A3, typename A4>
1325c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A5)> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3, const A4& a4)
1326c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1327c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A5)>(adoptRef(new FourArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5)>(FunctionWrapper<FunctionType>(function), a1, a2, a3, a4)));
1328c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1329c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1330c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename FunctionType>
1331c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2, A3, A4, A5, A6)> bind(FunctionType function)
1332c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1333c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A1, A2, A3, A4, A5, A6)>(adoptRef(new UnboundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5, A6)>(FunctionWrapper<FunctionType>(function))));
1334c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1335c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1336c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A2, typename A3, typename A4, typename A5, typename A6, typename FunctionType, typename A1>
1337c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A2, A3, A4, A5, A6)> bind(FunctionType function, const A1& a1)
1338c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1339c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A2, A3, A4, A5, A6)>(adoptRef(new OneArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5, A6)>(FunctionWrapper<FunctionType>(function), a1)));
1340c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1341c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1342c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A3, typename A4, typename A5, typename A6, typename FunctionType, typename A1, typename A2>
1343c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A3, A4, A5, A6)> bind(FunctionType function, const A1& a1, const A2& a2)
1344c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1345c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A3, A4, A5, A6)>(adoptRef(new TwoArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5, A6)>(FunctionWrapper<FunctionType>(function), a1, a2)));
1346c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1347c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1348c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A4, typename A5, typename A6, typename FunctionType, typename A1, typename A2, typename A3>
1349c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A4, A5, A6)> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3)
1350c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1351c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A4, A5, A6)>(adoptRef(new ThreeArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5, A6)>(FunctionWrapper<FunctionType>(function), a1, a2, a3)));
1352c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1353c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1354c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A5, typename A6, typename FunctionType, typename A1, typename A2, typename A3, typename A4>
1355c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A5, A6)> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3, const A4& a4)
1356c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1357c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A5, A6)>(adoptRef(new FourArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5, A6)>(FunctionWrapper<FunctionType>(function), a1, a2, a3, a4)));
1358c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1359c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1360c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)template<typename A6, typename FunctionType, typename A1, typename A2, typename A3, typename A4, typename A5>
1361c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Function<typename FunctionWrapper<FunctionType>::ResultType(A6)> bind(FunctionType function, const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
1362c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1363c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return Function<typename FunctionWrapper<FunctionType>::ResultType(A6)>(adoptRef(new FiveArgPartBoundFunctionImpl<FunctionWrapper<FunctionType>, typename FunctionWrapper<FunctionType>::ResultType (A1, A2, A3, A4, A5, A6)>(FunctionWrapper<FunctionType>(function), a1, a2, a3, a4, a5)));
1364c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1365c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
136693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)typedef Function<void()> Closure;
136793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::Function;
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::bind;
137293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)using WTF::Closure;
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // WTF_Functional_h
1375