1 /*
2  * Copyright © 2004-2010 Jens Oknelid, paskharen@gmail.com
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  * In addition, as a special exception, compiling, linking, and/or
19  * using OpenSSL with this program is allowed.
20  */
21 
22 #pragma once
23 
24 class FuncBase
25 {
26 	public:
FuncBase()27 		FuncBase() {}
~FuncBase()28 		virtual ~FuncBase() {}
29 		virtual void call() = 0;
30 		virtual const std::string& getID() = 0;
31 };
32 
33 template<class c>
34 class Func0: public FuncBase
35 {
36 	public:
Func0(c * obj,void (c::* func)())37 		Func0(c *obj, void (c::*func)())
38 		{
39 			this->obj = obj;
40 			this->func = func;
41 		}
42 
call()43 		void call() {
44 			(*obj.*func)();
45 		}
46 
getID()47 		const std::string& getID()
48 		{
49 			return obj->getID();
50 		}
51 
52 	private:
53 		c *obj;
54 		void (c::*func)();
55 };
56 
57 template<class c, typename p1>
58 class Func1: public FuncBase
59 {
60 	public:
Func1(c * obj,void (c::* func)(p1),p1 param1)61 		Func1(c *obj, void (c::*func)(p1), p1 param1):
62 			_param1(param1)
63 		{
64 			this->obj = obj;
65 			this->func = func;
66 		}
67 
call()68 		void call() {
69 			(*obj.*func)(_param1);
70 		}
71 
getID()72 		const std::string& getID()
73 		{
74 			return obj->getID();
75 		}
76 
77 	private:
78 		c *obj;
79 		void (c::*func)(p1);
80 		p1 _param1;
81 };
82 
83 template<class c, typename p1, typename p2>
84 class Func2: public FuncBase
85 {
86 	public:
Func2(c * obj,void (c::* func)(p1,p2),p1 param1,p2 param2)87 		Func2(c *obj, void (c::*func)(p1, p2), p1 param1, p2 param2):
88 			_param1(param1),
89 			_param2(param2)
90 		{
91 			this->obj = obj;
92 			this->func = func;
93 		}
94 
call()95 		void call() {
96 			(*obj.*func)(_param1, _param2);
97 		}
98 
getID()99 		const std::string& getID()
100 		{
101 			return obj->getID();
102 		}
103 
104 	private:
105 		c *obj;
106 		void (c::*func)(p1, p2);
107 		p1 _param1;
108 		p2 _param2;
109 };
110 
111 template<class c, typename p1, typename p2, typename p3>
112 class Func3: public FuncBase
113 {
114 	public:
Func3(c * obj,void (c::* func)(p1,p2,p3),p1 param1,p2 param2,p3 param3)115 		Func3(c *obj, void (c::*func)(p1, p2, p3), p1 param1, p2 param2, p3 param3):
116 			_param1(param1),
117 			_param2(param2),
118 			_param3(param3)
119 		{
120 			this->obj = obj;
121 			this->func = func;
122 		}
123 
call()124 		void call() {
125 			(*obj.*func)(_param1, _param2, _param3);
126 		}
127 
getID()128 		const std::string& getID()
129 		{
130 			return obj->getID();
131 		}
132 
133 	private:
134 		c *obj;
135 		void (c::*func)(p1, p2, p3);
136 		p1 _param1;
137 		p2 _param2;
138 		p3 _param3;
139 };
140 
141 template<class c, typename p1, typename p2, typename p3, typename p4>
142 class Func4: public FuncBase
143 {
144 	public:
Func4(c * obj,void (c::* func)(p1,p2,p3,p4),p1 param1,p2 param2,p3 param3,p4 param4)145 		Func4(c *obj, void (c::*func)(p1, p2, p3, p4),
146 			p1 param1, p2 param2, p3 param3, p4 param4):
147 			_param1(param1),
148 			_param2(param2),
149 			_param3(param3),
150 			_param4(param4)
151 		{
152 			this->obj = obj;
153 			this->func = func;
154 		}
155 
call()156 		void call() {
157 			(*obj.*func)(_param1, _param2, _param3, _param4);
158 		}
159 
getID()160 		const std::string& getID()
161 		{
162 			return obj->getID();
163 		}
164 
165 	private:
166 		c *obj;
167 		void (c::*func)(p1, p2, p3, p4);
168 		p1 _param1;
169 		p2 _param2;
170 		p3 _param3;
171 		p4 _param4;
172 };
173 
174 template<class c, typename p1, typename p2, typename p3, typename p4, typename p5>
175 class Func5: public FuncBase
176 {
177 	public:
Func5(c * obj,void (c::* func)(p1,p2,p3,p4,p5),p1 param1,p2 param2,p3 param3,p4 param4,p5 param5)178 		Func5(c *obj, void (c::*func)(p1, p2, p3, p4, p5),
179 			p1 param1, p2 param2, p3 param3, p4 param4, p5 param5):
180 			_param1(param1),
181 			_param2(param2),
182 			_param3(param3),
183 			_param4(param4),
184 			_param5(param5)
185 		{
186 			this->obj = obj;
187 			this->func = func;
188 		}
189 
call()190 		void call() {
191 			(*obj.*func)(_param1, _param2, _param3, _param4, _param5);
192 		}
193 
getID()194 		const std::string& getID()
195 		{
196 			return obj->getID();
197 		}
198 
199 	private:
200 		c *obj;
201 		void (c::*func)(p1, p2, p3, p4, p5);
202 		p1 _param1;
203 		p2 _param2;
204 		p3 _param3;
205 		p4 _param4;
206 		p5 _param5;
207 };
208 
209 template<class c, typename p1, typename p2, typename p3, typename p4, typename p5, typename p6>
210 class Func6: public FuncBase
211 {
212 	public:
Func6(c * obj,void (c::* func)(p1,p2,p3,p4,p5,p6),p1 param1,p2 param2,p3 param3,p4 param4,p5 param5,p6 param6)213 		Func6(c *obj, void (c::*func)(p1, p2, p3, p4, p5, p6),
214 			p1 param1, p2 param2, p3 param3, p4 param4, p5 param5, p6 param6):
215 			_param1(param1),
216 			_param2(param2),
217 			_param3(param3),
218 			_param4(param4),
219 			_param5(param5),
220 			_param6(param6)
221 		{
222 			this->obj = obj;
223 			this->func = func;
224 		}
225 
call()226 		void call() {
227 			(*obj.*func)(_param1, _param2, _param3, _param4, _param5, _param6);
228 		}
229 
getID()230 		const std::string& getID()
231 		{
232 			return obj->getID();
233 		}
234 
235 	private:
236 		c *obj;
237 		void (c::*func)(p1, p2, p3, p4, p5, p6);
238 		p1 _param1;
239 		p2 _param2;
240 		p3 _param3;
241 		p4 _param4;
242 		p5 _param5;
243 		p6 _param6;
244 };
245 
246 template<class c, typename p1, typename p2, typename p3, typename p4, typename p5, typename p6, typename p7>
247 class Func7: public FuncBase
248 {
249 	public:
Func7(c * obj,void (c::* func)(p1,p2,p3,p4,p5,p6,p7),p1 param1,p2 param2,p3 param3,p4 param4,p5 param5,p6 param6,p7 param7)250 		Func7(c *obj, void (c::*func)(p1, p2, p3, p4, p5, p6, p7),
251 			p1 param1, p2 param2, p3 param3, p4 param4, p5 param5, p6 param6, p7 param7):
252 			_param1(param1),
253 			_param2(param2),
254 			_param3(param3),
255 			_param4(param4),
256 			_param5(param5),
257 			_param6(param6),
258 			_param7(param7)
259 		{
260 			this->obj = obj;
261 			this->func = func;
262 		}
263 
call()264 		void call() {
265 			(*obj.*func)(_param1, _param2, _param3, _param4, _param5, _param6, _param7);
266 		}
267 
getID()268 		const std::string& getID()
269 		{
270 			return obj->getID();
271 		}
272 
273 	private:
274 		c *obj;
275 		void (c::*func)(p1, p2, p3, p4, p5, p6, p7);
276 		p1 _param1;
277 		p2 _param2;
278 		p3 _param3;
279 		p4 _param4;
280 		p5 _param5;
281 		p6 _param6;
282 		p7 _param7;
283 };
284 
285 template<class c, typename p1, typename p2, typename p3, typename p4,
286 	typename p5, typename p6, typename p7, typename p8>
287 class Func8: public FuncBase
288 {
289 	public:
Func8(c * obj,void (c::* func)(p1,p2,p3,p4,p5,p6,p7,p8),p1 param1,p2 param2,p3 param3,p4 param4,p5 param5,p6 param6,p7 param7,p8 param8)290 		Func8(c *obj, void (c::*func)(p1, p2, p3, p4, p5, p6, p7, p8),
291 			p1 param1, p2 param2, p3 param3, p4 param4, p5 param5, p6 param6,
292 			p7 param7, p8 param8):
293 			_param1(param1),
294 			_param2(param2),
295 			_param3(param3),
296 			_param4(param4),
297 			_param5(param5),
298 			_param6(param6),
299 			_param7(param7),
300 			_param8(param8)
301 		{
302 			this->obj = obj;
303 			this->func = func;
304 		}
305 
call()306 		void call() {
307 			(*obj.*func)(_param1, _param2, _param3, _param4, _param5, _param6,
308 				_param7, _param8);
309 		}
310 
getID()311 		const std::string& getID()
312 		{
313 			return obj->getID();
314 		}
315 
316 	private:
317 		c *obj;
318 		void (c::*func)(p1, p2, p3, p4, p5, p6, p7, p8);
319 		p1 _param1;
320 		p2 _param2;
321 		p3 _param3;
322 		p4 _param4;
323 		p5 _param5;
324 		p6 _param6;
325 		p7 _param7;
326 		p8 _param8;
327 };
328 
329 template<class c, typename p1, typename p2, typename p3, typename p4,
330 	typename p5, typename p6, typename p7, typename p8, typename p9>
331 class Func9: public FuncBase
332 {
333 	public:
Func9(c * obj,void (c::* func)(p1,p2,p3,p4,p5,p6,p7,p8,p9),p1 param1,p2 param2,p3 param3,p4 param4,p5 param5,p6 param6,p7 param7,p8 param8,p9 param9)334 		Func9(c *obj, void (c::*func)(p1, p2, p3, p4, p5, p6, p7, p8, p9),
335 			p1 param1, p2 param2, p3 param3, p4 param4, p5 param5, p6 param6,
336 			p7 param7, p8 param8, p9 param9):
337 			_param1(param1),
338 			_param2(param2),
339 			_param3(param3),
340 			_param4(param4),
341 			_param5(param5),
342 			_param6(param6),
343 			_param7(param7),
344 			_param8(param8),
345 			_param9(param9)
346 		{
347 			this->obj = obj;
348 			this->func = func;
349 		}
350 
call()351 		void call() {
352 			(*obj.*func)(_param1, _param2, _param3, _param4, _param5, _param6,
353 				_param7, _param8, _param9);
354 		}
355 
getID()356 		const std::string& getID()
357 		{
358 			return obj->getID();
359 		}
360 
361 	private:
362 		c *obj;
363 		void (c::*func)(p1, p2, p3, p4, p5, p6, p7, p8, p9);
364 		p1 _param1;
365 		p2 _param2;
366 		p3 _param3;
367 		p4 _param4;
368 		p5 _param5;
369 		p6 _param6;
370 		p7 _param7;
371 		p8 _param8;
372 		p9 _param9;
373 };
374