371717aa3658faa55dfca8b5e39e0790ed79d8c6
[platform/framework/web/wrt-commons.git] / modules / core / include / dpl / generic_event.h
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *    Licensed under the Apache License, Version 2.0 (the "License");
5  *    you may not use this file except in compliance with the License.
6  *    You may obtain a copy of the License at
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *    Unless required by applicable law or agreed to in writing, software
11  *    distributed under the License is distributed on an "AS IS" BASIS,
12  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *    See the License for the specific language governing permissions and
14  *    limitations under the License.
15  */
16 /*
17  * @file        generic_event.h
18  * @author      Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
19  * @version     1.0
20  * @brief       This file is the implementation file of MVC generic event
21  */
22 #ifndef DPL_GENERIC_EVENT_H
23 #define DPL_GENERIC_EVENT_H
24
25 namespace DPL
26 {
27
28 class EventSender
29 {
30 public:
31     explicit EventSender(void *sender)
32         : m_sender(sender)
33     {
34     }
35
36     void* GetSender() const
37     {
38         return m_sender;
39     }
40
41 private:
42     void *m_sender;
43 };
44
45 class GenericEvent
46 {
47 protected:
48     void *m_sender;
49
50 public:
51     explicit GenericEvent(const EventSender &sender)
52         : m_sender(sender.GetSender())
53     {
54     }
55
56     virtual ~GenericEvent()
57     {
58     }
59
60     void *GetSender() const
61     {
62         return m_sender;
63     }
64 };
65
66 class GenericEvent0
67     : public GenericEvent
68 {
69 public:
70     explicit GenericEvent0(const EventSender &sender)
71         : GenericEvent(sender)
72     {
73     }
74
75     virtual ~GenericEvent0()
76     {
77     }
78
79 };
80
81 template<typename Arg0Type>
82 class GenericEvent1
83     : public GenericEvent0
84 {
85 public:
86     typedef Arg0Type Arg0;
87
88 protected:
89     Arg0 m_arg0;
90
91 public:
92     explicit GenericEvent1(const EventSender &sender)
93         : GenericEvent0(sender)
94     {
95     }
96
97     GenericEvent1(Arg0 arg0, const EventSender &sender)
98         : GenericEvent0(sender),
99           m_arg0(arg0)
100     {
101     }
102
103     virtual ~GenericEvent1()
104     {
105     }
106
107     Arg0 GetArg0() const
108     {
109         return m_arg0;
110     }
111 };
112
113 template<typename Arg0Type, typename Arg1Type>
114 class GenericEvent2
115     : public GenericEvent1<Arg0Type>
116 {
117 public:
118     typedef Arg0Type Arg0;
119     typedef Arg1Type Arg1;
120
121 protected:
122     Arg1 m_arg1;
123
124 public:
125     explicit GenericEvent2(const EventSender &sender)
126         : GenericEvent1<Arg0Type>(sender)
127     {
128     }
129
130     GenericEvent2(Arg0 arg0, Arg1 arg1, const EventSender &sender)
131         : GenericEvent1<Arg0Type>(arg0, sender),
132           m_arg1(arg1)
133     {
134     }
135
136     virtual ~GenericEvent2()
137     {
138     }
139
140     Arg1 GetArg1() const
141     {
142         return m_arg1;
143     }
144 };
145
146 template<typename Arg0Type, typename Arg1Type, typename Arg2Type>
147 class GenericEvent3
148     : public GenericEvent2<Arg0Type, Arg1Type>
149 {
150 public:
151     typedef Arg0Type Arg0;
152     typedef Arg1Type Arg1;
153     typedef Arg2Type Arg2;
154
155 protected:
156     Arg2 m_arg2;
157
158 public:
159     explicit GenericEvent3(const EventSender &sender)
160         : GenericEvent2<Arg0Type, Arg1Type>(sender)
161     {
162     }
163
164     GenericEvent3(Arg0 arg0, Arg1 arg1, Arg2 arg2, const EventSender &sender)
165         : GenericEvent2<Arg0Type, Arg1Type>(arg0, arg1, sender),
166           m_arg2(arg2)
167     {
168     }
169
170     virtual ~GenericEvent3()
171     {
172     }
173
174     Arg2 GetArg2() const
175     {
176         return m_arg2;
177     }
178 };
179
180 template<typename Arg0Type, typename Arg1Type, typename Arg2Type, typename Arg3Type>
181 class GenericEvent4
182     : public GenericEvent3<Arg0Type, Arg1Type, Arg2Type>
183 {
184 public:
185     typedef Arg0Type Arg0;
186     typedef Arg1Type Arg1;
187     typedef Arg2Type Arg2;
188     typedef Arg3Type Arg3;
189
190 protected:
191     Arg3 m_arg3;
192
193 public:
194     explicit GenericEvent4(const EventSender &sender)
195         : GenericEvent3<Arg0Type, Arg1Type, Arg2Type>(sender)
196     {
197     }
198
199     GenericEvent4(Arg0 arg0, Arg1 arg1, Arg2 arg2, Arg3 arg3, const EventSender &sender)
200         : GenericEvent3<Arg0Type, Arg1Type, Arg2Type>(arg0, arg1, arg2, sender),
201           m_arg3(arg3)
202     {
203     }
204
205     virtual ~GenericEvent4()
206     {
207     }
208
209     Arg3 GetArg3() const
210     {
211         return m_arg3;
212     }
213 };
214
215 template<typename Arg0Type, typename Arg1Type, typename Arg2Type, typename Arg3Type, typename Arg4Type>
216 class GenericEvent5
217     : public GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>
218 {
219 public:
220     typedef Arg0Type Arg0;
221     typedef Arg1Type Arg1;
222     typedef Arg2Type Arg2;
223     typedef Arg3Type Arg3;
224     typedef Arg4Type Arg4;
225
226 protected:
227     Arg4 m_arg4;
228
229 public:
230     explicit GenericEvent5(const EventSender &sender)
231         : GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>(sender)
232     {
233     }
234
235     GenericEvent5(Arg0 arg0, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, const EventSender &sender)
236         : GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>(arg0, arg1, arg2, arg3, sender),
237           m_arg4(arg4)
238     {
239     }
240
241     virtual ~GenericEvent5()
242     {
243     }
244
245     Arg4 GetArg4() const
246     {
247         return m_arg4;
248     }
249 };
250
251 template<typename Arg0Type, typename Arg1Type, typename Arg2Type, typename Arg3Type, typename Arg4Type, typename Arg5Type>
252 class GenericEvent6
253     : public GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>
254 {
255 public:
256     typedef Arg0Type Arg0;
257     typedef Arg1Type Arg1;
258     typedef Arg2Type Arg2;
259     typedef Arg3Type Arg3;
260     typedef Arg4Type Arg4;
261     typedef Arg5Type Arg5;
262
263 protected:
264     Arg5 m_arg5;
265
266 public:
267     explicit GenericEvent6(const EventSender &sender)
268         : GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>(sender)
269     {
270     }
271
272     GenericEvent6(Arg0 arg0, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, const EventSender &sender)
273         : GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>(arg0, arg1, arg2, arg3, arg4, sender),
274           m_arg5(arg5)
275     {
276     }
277
278     virtual ~GenericEvent6()
279     {
280     }
281
282     Arg5 GetArg5() const
283     {
284         return m_arg5;
285     }
286 };
287
288 template<typename Arg0Type, typename Arg1Type, typename Arg2Type, typename Arg3Type, typename Arg4Type, typename Arg5Type, typename Arg6Type>
289 class GenericEvent7
290     : public GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type>
291 {
292 public:
293     typedef Arg0Type Arg0;
294     typedef Arg1Type Arg1;
295     typedef Arg2Type Arg2;
296     typedef Arg3Type Arg3;
297     typedef Arg4Type Arg4;
298     typedef Arg5Type Arg5;
299     typedef Arg6Type Arg6;
300
301 protected:
302     Arg6 m_arg6;
303
304 public:
305     explicit GenericEvent7(const EventSender &sender)
306         : GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type>(sender)
307     {
308     }
309
310     GenericEvent7(Arg0 arg0, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, const EventSender &sender)
311         : GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type>(arg0, arg1, arg2, arg3, arg4, arg5, sender),
312           m_arg6(arg6)
313     {
314     }
315
316     virtual ~GenericEvent7()
317     {
318     }
319
320     Arg6 GetArg6() const
321     {
322         return m_arg6;
323     }
324 };
325
326 template<typename Arg0Type, typename Arg1Type, typename Arg2Type, typename Arg3Type, typename Arg4Type, typename Arg5Type, typename Arg6Type, typename Arg7Type>
327 class GenericEvent8
328     : public GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type>
329 {
330 public:
331     typedef Arg0Type Arg0;
332     typedef Arg1Type Arg1;
333     typedef Arg2Type Arg2;
334     typedef Arg3Type Arg3;
335     typedef Arg4Type Arg4;
336     typedef Arg5Type Arg5;
337     typedef Arg6Type Arg6;
338     typedef Arg7Type Arg7;
339
340 protected:
341     Arg7 m_arg7;
342
343 public:
344     explicit GenericEvent8(const EventSender &sender)
345         : GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type>(sender)
346     {
347     }
348
349     GenericEvent8(Arg0 arg0, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, const EventSender &sender)
350         : GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type>(arg0, arg1, arg2, arg3, arg4, arg5, arg6, sender),
351           m_arg7(arg7)
352     {
353     }
354
355     virtual ~GenericEvent8()
356     {
357     }
358
359     Arg7 GetArg7() const
360     {
361         return m_arg7;
362     }
363 };
364
365 } // namespace DPL
366
367 #define DECLARE_GENERIC_EVENT_0(ClassName)                                  \
368     class ClassName                                                         \
369         : public DPL::GenericEvent0                                         \
370     {                                                                       \
371     public:                                                                 \
372         explicit ClassName(const DPL::EventSender &sender = DPL::EventSender(NULL)) \
373             : DPL::GenericEvent0(sender)                                    \
374         {                                                                   \
375         }                                                                   \
376     };
377
378 #define DECLARE_GENERIC_EVENT_1(ClassName, Arg0Type)                          \
379     class ClassName                                                           \
380         : public DPL::GenericEvent1<Arg0Type>                                 \
381     {                                                                         \
382     public:                                                                   \
383         explicit ClassName(const DPL::EventSender &sender = DPL::EventSender(NULL)) \
384             : DPL::GenericEvent1<Arg0Type>(sender)                            \
385         {                                                                     \
386         }                                                                     \
387                                                                               \
388         explicit ClassName(Arg0Type arg0,                                     \
389                   const DPL::EventSender &sender = DPL::EventSender(NULL))    \
390             : DPL::GenericEvent1<Arg0Type>(arg0, sender)                      \
391         {                                                                     \
392         }                                                                     \
393     };
394
395 #define DECLARE_GENERIC_EVENT_2(ClassName, Arg0Type, Arg1Type)                \
396     class ClassName                                                           \
397         : public DPL::GenericEvent2<Arg0Type, Arg1Type>                       \
398     {                                                                         \
399     public:                                                                   \
400         explicit ClassName(const DPL::EventSender &sender = DPL::EventSender(NULL)) \
401             : DPL::GenericEvent2<Arg0Type, Arg1Type>(sender)                  \
402         {                                                                     \
403         }                                                                     \
404                                                                               \
405         ClassName(Arg0Type arg0, Arg1Type arg1,                               \
406                   const DPL::EventSender &sender = DPL::EventSender(NULL))    \
407             : DPL::GenericEvent2<Arg0Type, Arg1Type>(arg0, arg1, sender)      \
408         {                                                                     \
409         }                                                                     \
410     };
411
412 #define DECLARE_GENERIC_EVENT_3(ClassName, Arg0Type, Arg1Type, Arg2Type)                      \
413     class ClassName                                                                           \
414         : public DPL::GenericEvent3<Arg0Type, Arg1Type, Arg2Type>                             \
415     {                                                                                         \
416     public:                                                                                   \
417         explicit ClassName(const DPL::EventSender &sender = DPL::EventSender(NULL))           \
418             : DPL::GenericEvent3<Arg0Type, Arg1Type, Arg2Type>(sender)                        \
419         {                                                                                     \
420         }                                                                                     \
421                                                                                               \
422         ClassName(Arg0Type arg0, Arg1Type arg1, Arg2Type arg2,                                \
423                   const DPL::EventSender &sender = DPL::EventSender(NULL))                    \
424             : DPL::GenericEvent3<Arg0Type, Arg1Type, Arg2Type>(arg0, arg1, arg2, sender)      \
425         {                                                                                     \
426         }                                                                                     \
427     };
428
429 #define DECLARE_GENERIC_EVENT_4(ClassName, Arg0Type, Arg1Type, Arg2Type, Arg3Type)                            \
430     class ClassName                                                                                           \
431         : public DPL::GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>                                   \
432     {                                                                                                         \
433     public:                                                                                                   \
434         explicit ClassName(const DPL::EventSender &sender = DPL::EventSender(NULL))                           \
435             : DPL::GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>(sender)                              \
436         {                                                                                                     \
437         }                                                                                                     \
438                                                                                                               \
439         ClassName(Arg0Type arg0, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3,                                 \
440                   const DPL::EventSender &sender = DPL::EventSender(NULL))                                    \
441             : DPL::GenericEvent4<Arg0Type, Arg1Type, Arg2Type, Arg3Type>(arg0, arg1, arg2, arg3, sender)      \
442         {                                                                                                     \
443         }                                                                                                     \
444     };
445
446 #define DECLARE_GENERIC_EVENT_5(ClassName, Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type)                                  \
447     class ClassName                                                                                                           \
448         : public DPL::GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>                                         \
449     {                                                                                                                         \
450     public:                                                                                                                   \
451         explicit ClassName(const DPL::EventSender &sender = DPL::EventSender(NULL))                                           \
452             : DPL::GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>(sender)                                    \
453         {                                                                                                                     \
454         }                                                                                                                     \
455                                                                                                                               \
456         ClassName(Arg0Type arg0, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, Arg4Type arg4,                                  \
457                   const DPL::EventSender &sender = DPL::EventSender(NULL))                                                    \
458             : DPL::GenericEvent5<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type>(arg0, arg1, arg2, arg3, arg4, sender)      \
459         {                                                                                                                     \
460         }                                                                                                                     \
461     };
462
463 #define DECLARE_GENERIC_EVENT_6(ClassName, Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type)                                        \
464     class ClassName                                                                                                                           \
465         : public DPL::GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type>                                               \
466     {                                                                                                                                         \
467     public:                                                                                                                                   \
468         explicit ClassName(const DPL::EventSender &sender = DPL::EventSender(NULL))                                                           \
469             : DPL::GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type>(sender)                                          \
470         {                                                                                                                                     \
471         }                                                                                                                                     \
472                                                                                                                                               \
473         ClassName(Arg0Type arg0, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, Arg4Type arg4, Arg5Type arg5,                                   \
474                   const DPL::EventSender &sender = DPL::EventSender(NULL))                                                                    \
475             : DPL::GenericEvent6<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type>(arg0, arg1, arg2, arg3, arg4, arg5, sender)      \
476         {                                                                                                                                     \
477         }                                                                                                                                     \
478     };
479
480 #define DECLARE_GENERIC_EVENT_7(ClassName, Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type)                                              \
481     class ClassName                                                                                                                                           \
482         : public DPL::GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type>                                                     \
483     {                                                                                                                                                         \
484     public:                                                                                                                                                   \
485         explicit ClassName(const DPL::EventSender &sender = DPL::EventSender(NULL))                                                                           \
486             : DPL::GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type>(sender)                                                \
487         {                                                                                                                                                     \
488         }                                                                                                                                                     \
489                                                                                                                                                               \
490         ClassName(Arg0Type arg0, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, Arg4Type arg4, Arg5Type arg5, Arg6Type arg6,                                    \
491                   const DPL::EventSender &sender = DPL::EventSender(NULL))                                                                                    \
492             : DPL::GenericEvent7<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type>(arg0, arg1, arg2, arg3, arg4, arg5, arg6, sender)      \
493         {                                                                                                                                                     \
494         }                                                                                                                                                     \
495     };
496
497 #define DECLARE_GENERIC_EVENT_8(ClassName, Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type, Arg7Type)                                                    \
498     class ClassName                                                                                                                                                           \
499         : public DPL::GenericEvent8<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type, Arg7Type>                                                           \
500     {                                                                                                                                                                         \
501     public:                                                                                                                                                                   \
502         explicit ClassName(const DPL::EventSender &sender = DPL::EventSender(NULL))                                                                                           \
503             : DPL::GenericEvent8<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type, Arg7Type>(sender)                                                      \
504         {                                                                                                                                                                     \
505         }                                                                                                                                                                     \
506                                                                                                                                                                               \
507         ClassName(Arg0Type arg0, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, Arg4Type arg4, Arg5Type arg5, Arg6Type arg6, Arg7Type arg7,                                     \
508                   const DPL::EventSender &sender = DPL::EventSender(NULL))                                                                                                    \
509             : DPL::GenericEvent8<Arg0Type, Arg1Type, Arg2Type, Arg3Type, Arg4Type, Arg5Type, Arg6Type, Arg7Type>(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, sender)      \
510         {                                                                                                                                                                     \
511         }                                                                                                                                                                     \
512     };
513
514 #endif // DPL_GENERIC_EVENT_H