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