IDB: Implement IDBObjectStore.count()
[WebKit-https.git] / Source / WebKit2 / Shared / AsyncTask.h
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef AsyncTask_h
27 #define AsyncTask_h
28
29 #include <WebCore/CrossThreadCopier.h>
30 #include <functional>
31
32 namespace WebKit {
33
34 class AsyncTask {
35     WTF_MAKE_NONCOPYABLE(AsyncTask);
36 public:
37     virtual ~AsyncTask() { }
38
39     virtual void performTask() = 0;
40
41 protected:
42     explicit AsyncTask() { }
43 };
44
45 template <typename T, typename... Arguments>
46 class AsyncTaskImpl final : public AsyncTask {
47 public:
48     AsyncTaskImpl(T* callee, void (T::*method)(Arguments...), Arguments&&... arguments)
49     {
50         m_taskFunction = [callee, method, arguments...]() {
51             (callee->*method)(arguments...);
52         };
53     }
54
55     virtual ~AsyncTaskImpl()
56     {
57     }
58
59 private:
60     virtual void performTask() override
61     {
62         m_taskFunction();
63     }
64
65     std::function<void()> m_taskFunction;
66 };
67
68 template<typename T>
69 std::unique_ptr<AsyncTask> createAsyncTask(
70     T& callee,
71     void (T::*method)())
72 {
73     return std::make_unique<AsyncTaskImpl<T>>(&callee, method);
74 }
75
76 template<typename T, typename P1, typename MP1>
77 std::unique_ptr<AsyncTask> createAsyncTask(
78     T& callee,
79     void (T::*method)(MP1),
80     const P1& parameter1)
81 {
82     return std::make_unique<AsyncTaskImpl<T, MP1>>(
83         &callee,
84         method,
85         WebCore::CrossThreadCopier<P1>::copy(parameter1));
86 }
87
88 template<typename T, typename P1, typename MP1, typename P2, typename MP2>
89 std::unique_ptr<AsyncTask> createAsyncTask(
90     T& callee,
91     void (T::*method)(MP1, MP2),
92     const P1& parameter1,
93     const P2& parameter2)
94 {
95     return std::make_unique<AsyncTaskImpl<T, MP1, MP2>>(
96         &callee,
97         method,
98         WebCore::CrossThreadCopier<P1>::copy(parameter1),
99         WebCore::CrossThreadCopier<P2>::copy(parameter2));
100
101 }
102
103 template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
104 std::unique_ptr<AsyncTask> createAsyncTask(
105     T& callee,
106     void (T::*method)(MP1, MP2, MP3),
107     const P1& parameter1,
108     const P2& parameter2,
109     const P3& parameter3)
110 {
111     return std::make_unique<AsyncTaskImpl<T, MP1, MP2, MP3>>(
112         &callee,
113         method,
114         WebCore::CrossThreadCopier<P1>::copy(parameter1),
115         WebCore::CrossThreadCopier<P2>::copy(parameter2),
116         WebCore::CrossThreadCopier<P3>::copy(parameter3));
117 }
118
119 template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4>
120 std::unique_ptr<AsyncTask> createAsyncTask(
121     T& callee,
122     void (T::*method)(MP1, MP2, MP3, MP4),
123     const P1& parameter1,
124     const P2& parameter2,
125     const P3& parameter3,
126     const P4& parameter4)
127 {
128     return std::make_unique<AsyncTaskImpl<T, MP1, MP2, MP3, MP4>>(
129         &callee,
130         method,
131         WebCore::CrossThreadCopier<P1>::copy(parameter1),
132         WebCore::CrossThreadCopier<P2>::copy(parameter2),
133         WebCore::CrossThreadCopier<P3>::copy(parameter3),
134         WebCore::CrossThreadCopier<P4>::copy(parameter4));
135 }
136
137 template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5>
138 std::unique_ptr<AsyncTask> createAsyncTask(
139     T& callee,
140     void (T::*method)(MP1, MP2, MP3, MP4, MP5),
141     const P1& parameter1,
142     const P2& parameter2,
143     const P3& parameter3,
144     const P4& parameter4,
145     const P5& parameter5)
146 {
147     return std::make_unique<AsyncTaskImpl<T, MP1, MP2, MP3, MP4, MP5>>(
148         &callee,
149         method,
150         WebCore::CrossThreadCopier<P1>::copy(parameter1),
151         WebCore::CrossThreadCopier<P2>::copy(parameter2),
152         WebCore::CrossThreadCopier<P3>::copy(parameter3),
153         WebCore::CrossThreadCopier<P4>::copy(parameter4),
154         WebCore::CrossThreadCopier<P5>::copy(parameter5));
155 }
156
157 template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6>
158 std::unique_ptr<AsyncTask> createAsyncTask(
159     T& callee,
160     void (T::*method)(MP1, MP2, MP3, MP4, MP5, MP6),
161     const P1& parameter1,
162     const P2& parameter2,
163     const P3& parameter3,
164     const P4& parameter4,
165     const P5& parameter5,
166     const P6& parameter6)
167 {
168     return std::make_unique<AsyncTaskImpl<T, MP1, MP2, MP3, MP4, MP5, MP6>>(
169         &callee,
170         method,
171         WebCore::CrossThreadCopier<P1>::copy(parameter1),
172         WebCore::CrossThreadCopier<P2>::copy(parameter2),
173         WebCore::CrossThreadCopier<P3>::copy(parameter3),
174         WebCore::CrossThreadCopier<P4>::copy(parameter4),
175         WebCore::CrossThreadCopier<P5>::copy(parameter5),
176         WebCore::CrossThreadCopier<P6>::copy(parameter6));
177 }
178
179 template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7, typename P8, typename MP8>
180 std::unique_ptr<AsyncTask> createAsyncTask(
181     T& callee,
182     void (T::*method)(MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8),
183     const P1& parameter1,
184     const P2& parameter2,
185     const P3& parameter3,
186     const P4& parameter4,
187     const P5& parameter5,
188     const P6& parameter6,
189     const P7& parameter7,
190     const P8& parameter8)
191 {
192     return std::make_unique<AsyncTaskImpl<T, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8>>(
193         &callee,
194         method,
195         WebCore::CrossThreadCopier<P1>::copy(parameter1),
196         WebCore::CrossThreadCopier<P2>::copy(parameter2),
197         WebCore::CrossThreadCopier<P3>::copy(parameter3),
198         WebCore::CrossThreadCopier<P4>::copy(parameter4),
199         WebCore::CrossThreadCopier<P5>::copy(parameter5),
200         WebCore::CrossThreadCopier<P6>::copy(parameter6),
201         WebCore::CrossThreadCopier<P7>::copy(parameter7),
202         WebCore::CrossThreadCopier<P8>::copy(parameter8));
203 }
204
205 } // namespace WebKit
206
207 #endif // AsyncTask_h