bind should handle member functions
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Dec 2011 20:59:53 +0000 (20:59 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Dec 2011 20:59:53 +0000 (20:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=74529

Reviewed by Sam Weinig.

Source/JavaScriptCore:

Add FunctionWrapper partial specializations for member function pointers.

* wtf/Functional.h:
(WTF::C::):

Tools:

Add tests.

* TestWebKitAPI/Tests/WTF/Functional.cpp:
(TestWebKitAPI::A::A):
(TestWebKitAPI::A::f):
(TestWebKitAPI::A::addF):
(TestWebKitAPI::TEST):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@102813 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wtf/Functional.h
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WTF/Functional.cpp

index 1cf1d4f..f6e7b48 100644 (file)
@@ -1,3 +1,15 @@
+2011-12-14  Anders Carlsson  <andersca@apple.com>
+
+        bind should handle member functions
+        https://bugs.webkit.org/show_bug.cgi?id=74529
+
+        Reviewed by Sam Weinig.
+
+        Add FunctionWrapper partial specializations for member function pointers.
+
+        * wtf/Functional.h:
+        (WTF::C::):
+
 2011-12-14  Gavin Barraclough  <barraclough@apple.com>
 
         DFG relies on returning a struct in registers
index 6e0ddcf..60e514c 100644 (file)
@@ -96,6 +96,42 @@ private:
     R (*m_function)(P0, P1);
 };
 
+template<typename R, typename C> class FunctionWrapper<R (C::*)()> {
+public:
+    typedef R ResultType;
+
+    explicit FunctionWrapper(R (C::*function)())
+        : m_function(function)
+    {
+    }
+
+    R operator()(C* c)
+    {
+        return (c->*m_function)();
+    }
+
+private:
+    R (C::*m_function)();
+};
+
+template<typename R, typename C, typename P0> class FunctionWrapper<R (C::*)(P0)> {
+public:
+    typedef R ResultType;
+
+    explicit FunctionWrapper(R (C::*function)(P0))
+        : m_function(function)
+    {
+    }
+
+    R operator()(C* c, P0 p0)
+    {
+        return (c->*m_function)(p0);
+    }
+
+private:
+    R (C::*m_function)(P0);
+};
+
 class FunctionImplBase : public ThreadSafeRefCounted<FunctionImplBase> {
 public:
     virtual ~FunctionImplBase() { }
index 9c5b08b..4e4cc0d 100644 (file)
@@ -1,5 +1,20 @@
 2011-12-14  Anders Carlsson  <andersca@apple.com>
 
+        bind should handle member functions
+        https://bugs.webkit.org/show_bug.cgi?id=74529
+
+        Reviewed by Sam Weinig.
+
+        Add tests.
+
+        * TestWebKitAPI/Tests/WTF/Functional.cpp:
+        (TestWebKitAPI::A::A):
+        (TestWebKitAPI::A::f):
+        (TestWebKitAPI::A::addF):
+        (TestWebKitAPI::TEST):
+
+2011-12-14  Anders Carlsson  <andersca@apple.com>
+
         Add unary and binary bind overloads
         https://bugs.webkit.org/show_bug.cgi?id=74524
 
index f6a81f1..f9c8519 100644 (file)
@@ -81,4 +81,28 @@ TEST(FunctionalTest, BinaryBind)
     ASSERT_EQ(2, subtractTwoFromFourFunction());
 }
 
+class A {
+public:
+    explicit A(int i)
+        : m_i(i)
+    {
+    }
+
+    int f() { return m_i; }
+    int addF(int j) { return m_i + j; }
+
+private:
+    int m_i;
+};
+
+TEST(FunctionalTest, MemberFunctionBind)
+{
+    A a(10);
+    Function<int ()> function1 = bind(&A::f, &a);
+    ASSERT_EQ(10, function1());
+
+    Function<int ()> function2 = bind(&A::addF, &a, 15);
+    ASSERT_EQ(25, function2());
+}
+
 } // namespace TestWebKitAPI