runnable.h
1 /*
2 ** ClanLib SDK
3 ** Copyright (c) 1997-2013 The ClanLib Team
4 **
5 ** This software is provided 'as-is', without any express or implied
6 ** warranty. In no event will the authors be held liable for any damages
7 ** arising from the use of this software.
8 **
9 ** Permission is granted to anyone to use this software for any purpose,
10 ** including commercial applications, and to alter it and redistribute it
11 ** freely, subject to the following restrictions:
12 **
13 ** 1. The origin of this software must not be misrepresented; you must not
14 ** claim that you wrote the original software. If you use this software
15 ** in a product, an acknowledgment in the product documentation would be
16 ** appreciated but is not required.
17 ** 2. Altered source versions must be plainly marked as such, and must not be
18 ** misrepresented as being the original software.
19 ** 3. This notice may not be removed or altered from any source distribution.
20 **
21 ** Note: Some of the libraries ClanLib may link to may have additional
22 ** requirements or restrictions.
23 **
24 ** File Author(s):
25 **
26 ** Magnus Norddahl
27 */
28 
29 
30 
31 #pragma once
32 
33 #include "../api_core.h"
34 #include <typeinfo>
35 
36 namespace clan
37 {
40 
42 class CL_API_CORE Runnable
43 {
46 
47 public:
48  Runnable();
49 
50  virtual ~Runnable();
51 
52 
56 
57 public:
58 
59 
63 
64 public:
65  virtual void run() = 0;
66 
68 
69  static void set_thread_name(const char *name);
70 
71 
75 
76 private:
78 };
79 
81 template<class C>
83 {
86 
87 public:
88  typedef void (C::*PtrMemberFunc)();
89 
90  RunnableMember_v0(C *instance, PtrMemberFunc func)
91  : instance(instance), func(func)
92  {
93  }
94 
95 
99 
100 public:
101  virtual void run()
102  {
103  set_thread_name(typeid(func).name());
104  C *local_instance = instance;
105  PtrMemberFunc local_func = func;
106  delete this;
107  (local_instance->*local_func)();
108  }
109 
110 
114 
115 private:
116  C *instance;
117 
118  PtrMemberFunc func;
120 };
121 
123 template<class C, class P1>
125 {
128 
129 public:
130  typedef void (C::*PtrMemberFunc)(P1 p1);
131 
132  RunnableMember_v1(C *instance, PtrMemberFunc func, P1 p1)
133  : instance(instance), func(func), p1(p1)
134  {
135  }
136 
137 
141 
142 public:
143  virtual void run()
144  {
145  set_thread_name(typeid(func).name());
146  C *local_instance = instance;
147  PtrMemberFunc local_func = func;
148  P1 local_p1 = p1;
149  delete this;
150  (local_instance->*local_func)(local_p1);
151  }
152 
153 
157 
158 private:
159  C *instance;
160 
161  PtrMemberFunc func;
162 
163  P1 p1;
165 };
166 
168 template<class C, class P1, class P2>
170 {
173 
174 public:
175  typedef void (C::*PtrMemberFunc)(P1 p1, P2 p2);
176 
177  RunnableMember_v2(C *instance, PtrMemberFunc func, P1 p1, P2 p2)
178  : instance(instance), func(func), p1(p1), p2(p2)
179  {
180  }
181 
182 
186 
187 public:
188  virtual void run()
189  {
190  set_thread_name(typeid(func).name());
191  C *local_instance = instance;
192  PtrMemberFunc local_func = func;
193  P1 local_p1 = p1;
194  P2 local_p2 = p2;
195  delete this;
196  (local_instance->*local_func)(local_p1, local_p2);
197  }
198 
199 
203 
204 private:
205  C *instance;
206 
207  PtrMemberFunc func;
208 
209  P1 p1;
210 
211  P2 p2;
213 };
214 
216 template<class C, class P1, class P2, class P3>
218 {
221 
222 public:
223  typedef void (C::*PtrMemberFunc)(P1 p1, P2 p2, P3 p3);
224 
225  RunnableMember_v3(C *instance, PtrMemberFunc func, P1 p1, P2 p2, P3 p3)
226  : instance(instance), func(func), p1(p1), p2(p2), p3(p3)
227  {
228  }
229 
230 
234 
235 public:
236  virtual void run()
237  {
238  set_thread_name(typeid(func).name());
239  C *local_instance = instance;
240  PtrMemberFunc local_func = func;
241  P1 local_p1 = p1;
242  P2 local_p2 = p2;
243  P3 local_p3 = p3;
244  delete this;
245  (local_instance->*local_func)(local_p1, local_p2, local_p3);
246  }
247 
248 
252 
253 private:
254  C *instance;
255 
256  PtrMemberFunc func;
257 
258  P1 p1;
259 
260  P2 p2;
261 
262  P3 p3;
264 };
265 
267 template<class C, class P1, class P2, class P3, class P4>
269 {
272 
273 public:
274  typedef void (C::*PtrMemberFunc)(P1 p1, P2 p2, P3 p3, P4 p4);
275 
276  RunnableMember_v4(C *instance, PtrMemberFunc func, P1 p1, P2 p2, P3 p3, P4 p4)
277  : instance(instance), func(func), p1(p1), p2(p2), p3(p3), p4(p4)
278  {
279  }
280 
281 
285 
286 public:
287  virtual void run()
288  {
289  set_thread_name(typeid(func).name());
290  C *local_instance = instance;
291  PtrMemberFunc local_func = func;
292  P1 local_p1 = p1;
293  P2 local_p2 = p2;
294  P3 local_p3 = p3;
295  P4 local_p4 = p4;
296  delete this;
297  (local_instance->*local_func)(local_p1, local_p2, local_p3, local_p4);
298  }
299 
300 
304 
305 private:
306  C *instance;
307 
308  PtrMemberFunc func;
309 
310  P1 p1;
311 
312  P2 p2;
313 
314  P3 p3;
315 
316  P4 p4;
318 };
319 
321 template<class C, class P1, class P2, class P3, class P4, class P5>
323 {
326 
327 public:
328  typedef void (C::*PtrMemberFunc)(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
329 
330  RunnableMember_v5(C *instance, PtrMemberFunc func, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
331  : instance(instance), func(func), p1(p1), p2(p2), p3(p3), p4(p4), p5(p5)
332  {
333  }
334 
335 
339 
340 public:
341  virtual void run()
342  {
343  set_thread_name(typeid(func).name());
344  C *local_instance = instance;
345  PtrMemberFunc local_func = func;
346  P1 local_p1 = p1;
347  P2 local_p2 = p2;
348  P3 local_p3 = p3;
349  P4 local_p4 = p4;
350  P5 local_p5 = p5;
351  delete this;
352  (local_instance->*local_func)(local_p1, local_p2, local_p3, local_p4, local_p5);
353  }
354 
355 
359 
360 private:
361  C *instance;
362 
363  PtrMemberFunc func;
364 
365  P1 p1;
366 
367  P2 p2;
368 
369  P3 p3;
370 
371  P4 p4;
372 
373  P5 p5;
375 };
376 
377 }
378 
(Internal ClanLib Class)
Definition: runnable.h:124
virtual void run()
Definition: runnable.h:287
RunnableMember_v1(C *instance, PtrMemberFunc func, P1 p1)
Definition: runnable.h:132
(Internal ClanLib Class)
Definition: runnable.h:169
RunnableMember_v4(C *instance, PtrMemberFunc func, P1 p1, P2 p2, P3 p3, P4 p4)
Definition: runnable.h:276
RunnableMember_v3(C *instance, PtrMemberFunc func, P1 p1, P2 p2, P3 p3)
Definition: runnable.h:225
(Internal ClanLib Class)
Definition: runnable.h:217
void(C::* PtrMemberFunc)(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
Definition: runnable.h:328
static void set_thread_name(const char *name)
Sets the name (displayed in debuggers) of the calling thread.
virtual void run()
Definition: runnable.h:236
virtual void run()
Definition: runnable.h:188
void(C::* PtrMemberFunc)(P1 p1, P2 p2, P3 p3, P4 p4)
Definition: runnable.h:274
RunnableMember_v5(C *instance, PtrMemberFunc func, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
Definition: runnable.h:330
RunnableMember_v2(C *instance, PtrMemberFunc func, P1 p1, P2 p2)
Definition: runnable.h:177
virtual void run()
Definition: runnable.h:101
(Internal ClanLib Class)
Definition: runnable.h:268
Thread runnable object.
Definition: runnable.h:42
void(C::* PtrMemberFunc)(P1 p1, P2 p2)
Definition: runnable.h:175
void(C::* PtrMemberFunc)(P1 p1)
Definition: runnable.h:130
void(C::* PtrMemberFunc)()
Definition: runnable.h:88
(Internal ClanLib Class)
Definition: runnable.h:82
virtual void run()
Definition: runnable.h:143
void(C::* PtrMemberFunc)(P1 p1, P2 p2, P3 p3)
Definition: runnable.h:223
(Internal ClanLib Class)
Definition: runnable.h:322
RunnableMember_v0(C *instance, PtrMemberFunc func)
Definition: runnable.h:90
virtual void run()
Definition: runnable.h:341