1 #ifndef ___HGL___FUNCTION_CALLBACK___
2 #define ___HGL___FUNCTION_CALLBACK___
9 全てのコールバック関数クラスは、このクラスから派生する。
12 class function_callback {
15 virtual ~function_callback() {}
18 virtual void run() = 0;
28 template<class T> class function_callback_vg0;
29 class function_callback_v0;
30 template<class T> class function_callback_v1;
31 template<class T1,class T2> class function_callback_v2;
32 template<class T1,class T2,class T3> class function_callback_v3;
33 template<class T1,class T2,class T3,class T4> class function_callback_v4;
34 template<class T1,class T2,class T3,class T4,class T5> class function_callback_v5;
35 template<class Obj> class function_callback_vm0;
36 template<class Obj,class T> class function_callback_vm1;
37 template<class Obj,class T1,class T2> class function_callback_vm2;
38 template<class Obj,class T1,class T2,class T3> class function_callback_vm3;
39 template<class Obj,class T1,class T2,class T3,class T4> class function_callback_vm4;
40 template<class Obj,class T1,class T2,class T3,class T4,class T5> class function_callback_vm5;
45 staticなcreate関数によって、それぞれを作成する。
46 また、これから作成されるクラスも、全てfunction_callback派生クラスである。
48 class function_callback_v : public function_callback {
51 virtual ~function_callback_v() {}
53 //--------------------------------------------------------------------------------
55 // ここでの関数群は、全て同じ名前のオーバーロードによって行われる。
56 //--------------------------------------------------------------------------------
58 //引数無し、返り値無しの静的関数のみのコールバック関数クラス作成
60 static function_callback_v* create(void (T::*f)()) {
61 return new function_callback_vg0<T>(f);
66 static function_callback_v* create(void (*f)(Arg1),Arg1 a1) {
67 return new function_callback_v1<Arg1>(f,a1);
70 template<class Arg1,class Arg2>
71 static function_callback_v* create(void (*f)(Arg1,Arg2),Arg1 a1,Arg2 a2) {
72 return new function_callback_v2<Arg1,Arg2>(f,a1,a2);
75 template<class Arg1,class Arg2,class Arg3>
76 static function_callback_v* create(void (*f)(Arg1,Arg2,Arg3),Arg1 a1,Arg2 a2,Arg3 a3) {
77 return new function_callback_v3<Arg1,Arg2,Arg3>(f,a1,a2,a3);
80 template<class Arg1,class Arg2,class Arg3,class Arg4>
81 static function_callback_v* create(void (*f)(Arg1,Arg2,Arg3,Arg4),Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) {
82 return new function_callback_v4<Arg1,Arg2,Arg3,Arg4>(f,a1,a2,a3,a4);
85 template<class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
86 static function_callback_v* create(void (*f)(Arg1,Arg2,Arg3,Arg4,Arg5),
87 Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) {
88 return new function_callback_v5<Arg1,Arg2,Arg3,Arg4,Arg5>(f,a1,a2,a3,a4,a5);
93 static function_callback_v* create(void (obj::*f)(),obj* p) {
94 return new function_callback_vm0<obj>(f,p);
97 template<class obj,class Arg1>
98 static function_callback_v* create(void (obj::*f)(Arg1),obj* p,Arg1 a1) {
99 return new function_callback_vm1<obj,Arg1>(f,p,a1);
102 template<class obj,class Arg1,class Arg2>
103 static function_callback_v* create(void (obj::*f)(Arg1,Arg2),obj* p,Arg1 a1,Arg2 a2) {
104 return new function_callback_vm2<obj,Arg1,Arg2>(f,p,a1,a2);
107 template<class obj,class Arg1,class Arg2,class Arg3>
108 static function_callback_v* create(void (obj::*f)(Arg1,Arg2,Arg3),obj* p,Arg1 a1,Arg2 a2,Arg3 a3) {
109 return new function_callback_vm3<obj,Arg1,Arg2,Arg3>(f,p,a1,a2,a3);
112 template<class obj,class Arg1,class Arg2,class Arg3,class Arg4>
113 static function_callback_v* create(void (obj::*f)(Arg1,Arg2,Arg3,Arg4),obj* p,
114 Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) {
115 return new function_callback_vm4<obj,Arg1,Arg2,Arg3,Arg4>(f,p,a1,a2,a3,a4);
118 template<class obj,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
119 static function_callback_v* create(void (obj::*f)(Arg1,Arg2,Arg3,Arg4,Arg5),obj* p,
120 Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) {
121 return new function_callback_vm5<obj,Arg1,Arg2,Arg3,Arg4,Arg5>(f,p,a1,a2,a3,a4,a5);
124 virtual void run() {}
128 //================================================================================
130 //================================================================================
132 template<class Result,class T> class function_callback_rg0;
133 template<class Result>class function_callback_r0;
134 template<class Result, class T> class function_callback_r1;
135 template<class Result, class T1,class T2> class function_callback_r2;
136 template<class Result, class T1,class T2,class T3> class function_callback_r3;
137 template<class Result, class T1,class T2,class T3,class T4> class function_callback_r4;
138 template<class Result, class T1,class T2,class T3,class T4,class T5> class function_callback_r5;
139 template<class Result, class OBJ> class function_callback_rm0;
140 template<class Result, class OBJ,class T> class function_callback_rm1;
141 template<class Result, class OBJ,class T1,class T2> class function_callback_rm2;
142 template<class Result, class OBJ,class T1,class T2,class T3> class function_callback_rm3;
143 template<class Result, class OBJ,class T1,class T2,class T3,class T4> class function_callback_rm4;
144 template<class Result, class OBJ,class T1,class T2,class T3,class T4,class T5> class function_callback_rm5;
148 返り値ありのコールバック関数クラスの元締め
151 template<class Result>
152 class function_callback_r : public function_callback {
155 function_callback_r() : m_Result() {}
156 virtual ~function_callback_r() {}
159 //--------------------------------------------------------------------------------
161 // 返り値はそれぞれ自由に設定することができる。
162 //--------------------------------------------------------------------------------
163 inline function_callback_r<Result>* create(Result (*f)(void)) {
164 return new function_callback_r0<Result>(f);
169 static function_callback_r<Result>* create(Result (T::*f)()) {
170 return new function_callback_rg0<Result,T>(f);
175 static function_callback_r<Result>* create(Result (*f)(Arg1),Arg1 a1) {
176 return new function_callback_r1<Result,Arg1>(f,a1);
179 template<class Arg1,class Arg2>
180 static function_callback_r<Result>* create(Result (*f)(Arg1,Arg2),Arg1 a1,Arg2 a2) {
181 return new function_callback_r2<Result,Arg1,Arg2>(f,a1,a2);
184 template<class Arg1,class Arg2,class Arg3>
185 static function_callback_r<Result>*
186 create(Result (*f)(Arg1,Arg2,Arg3),Arg1 a1,Arg2 a2,Arg3 a3) {
187 return new function_callback_r3<Result,Arg1,Arg2,Arg3>(f,a1,a2,a3);
190 template<class Arg1,class Arg2,class Arg3,class Arg4>
191 static function_callback_r<Result>* create(Result (*f)(Arg1,Arg2,Arg3,Arg4),Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) {
192 return new function_callback_r4<Result,Arg1,Arg2,Arg3,Arg4>(f,a1,a2,a3,a4);
195 template<class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
196 static function_callback_r<Result>* create(Result (*f)(Arg1,Arg2,Arg3,Arg4),
197 Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) {
198 return new function_callback_r5<Result,Arg1,Arg2,Arg3,Arg4,Arg5>(f,a1,a2,a3,a4,a5);
203 static function_callback_r<Result>* create(Result (T::*f)(),T* p) {
204 return new function_callback_rm0<Result,T>(f,p);
207 template<class T,class Arg1>
208 static function_callback_r<Result>* create(Result (T::*f)(Arg1),T* p,Arg1 a1) {
209 return new function_callback_rm1<Result,T,Arg1>(f,p,a1);
212 template<class T,class Arg1,class Arg2>
213 static function_callback_r<Result>* create(Result (T::*f)(Arg1,Arg2),T* p,Arg1 a1,Arg2 a2) {
214 return new function_callback_rm2<Result,T,Arg1,Arg2>(f,p,a1,a2);
217 template<class T,class Arg1,class Arg2,class Arg3>
218 static function_callback_r<Result>* create(Result (T::*f)(Arg1,Arg2,Arg3),T* p,Arg1 a1,Arg2 a2,Arg3 a3) {
219 return new function_callback_rm3<Result,T,Arg1,Arg2,Arg3>(f,p,a1,a2,a3);
222 template<class T,class Arg1,class Arg2,class Arg3,class Arg4>
223 static function_callback_r<Result>* create(Result (T::*f)(Arg1,Arg2,Arg3,Arg4),T* p,
224 Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) {
225 return new function_callback_rm4<Result,T,Arg1,Arg2,Arg3,Arg4>(f,p,a1,a2,a3,a4);
228 template<class T,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
229 static function_callback_r<Result>* create(Result (T::*f)(Arg1,Arg2,Arg3,Arg4,Arg5),T* p,
230 Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) {
231 return new function_callback_rm5<Result,T,Arg1,Arg2,Arg3,Arg4,Arg5>(f,p,a1,a2,a3,a4,a5);
238 void setResult(Result r) {this->m_Result = r;}
246 //================================================================================
248 //================================================================================
250 class function_callback_v0 : public function_callback_v {
252 typedef void (*CallBack)(void);
254 function_callback_v0(CallBack c) : m_lpFunc(c) {}
267 class function_callback_vg0 : public function_callback_v {
269 typedef void (T::*CallBack)();
271 function_callback_vg0(CallBack c) : m_lpFunc(c) {}
284 class function_callback_v1 : public function_callback_v {
286 typedef void (*CallBack)(Arg1);
288 function_callback_v1(CallBack c,Arg1 a1) : m_lpFunc(c),m_Arg1(a1) {}
301 template<class Arg1,class Arg2>
302 class function_callback_v2 : public function_callback_v {
304 typedef void (*CallBack)(Arg1,Arg2);
306 function_callback_v2(CallBack c,Arg1 a1,Arg2 a2) :
307 m_lpFunc(c),m_Arg1(a1),m_Arg2(a2) {}
310 m_lpFunc(m_Arg1,m_Arg2);
321 template<class Arg1,class Arg2,class Arg3>
322 class function_callback_v3 : public function_callback_v {
324 typedef void (*CallBack)(Arg1,Arg2,Arg3);
326 function_callback_v3(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3) :
327 m_lpFunc(c),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3) {}
330 m_lpFunc(m_Arg1,m_Arg2,m_Arg3);
342 template<class Arg1,class Arg2,class Arg3,class Arg4>
343 class function_callback_v4 : public function_callback_v {
345 typedef void (*CallBack)(Arg1,Arg2,Arg3,Arg4);
347 function_callback_v4(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) :
348 m_lpFunc(c),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3),m_Arg4(a4) {}
351 m_lpFunc(m_Arg1,m_Arg2,m_Arg3,m_Arg4);
364 template<class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
365 class function_callback_v5 : public function_callback_v {
367 typedef void (*CallBack)(Arg1,Arg2,Arg3,Arg4,Arg5);
369 function_callback_v5(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) :
370 m_lpFunc(c),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3),m_Arg4(a4),m_Arg5(a5) {}
373 m_lpFunc(m_Arg1,m_Arg2,m_Arg3,m_Arg4,m_Arg5);
387 //------------------------------------------------------------------
390 class function_callback_vm0 : public function_callback_v {
392 typedef void (obj::*CallBack)();
394 function_callback_vm0(CallBack c,obj* p) : m_lpFunc(c),m_lpObj(p) {}
397 (m_lpObj->*m_lpFunc)();
407 template<class obj,class Arg1>
408 class function_callback_vm1 : public function_callback_v {
410 typedef void (obj::*CallBack)(Arg1);
412 function_callback_vm1(CallBack c,obj* p,Arg1 a1) :
413 m_lpFunc(c),m_lpObj(p),m_Arg1(a1) {}
416 (m_lpObj->*m_lpFunc)(m_Arg1);
427 template<class obj,class Arg1,class Arg2>
428 class function_callback_vm2 : public function_callback_v {
430 typedef void (obj::*CallBack)(Arg1,Arg2);
432 function_callback_vm2(CallBack c,obj* p,Arg1 a1,Arg2 a2) :
433 m_lpFunc(c),m_lpObj(p),m_Arg1(a1),m_Arg2(a2) {}
436 (m_lpObj->*m_lpFunc)(m_Arg1,m_Arg2);
448 template<class obj,class Arg1,class Arg2,class Arg3>
449 class function_callback_vm3 : public function_callback_v {
451 typedef void (obj::*CallBack)(Arg1,Arg2,Arg3);
453 function_callback_vm3(CallBack c,obj* p,Arg1 a1,Arg2 a2,Arg3 a3) :
454 m_lpFunc(c),m_lpObj(p),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3) {}
457 (m_lpObj->*m_lpFunc)(m_Arg1,m_Arg2,m_Arg3);
470 template<class obj,class Arg1,class Arg2,class Arg3,class Arg4>
471 class function_callback_vm4 : public function_callback_v {
473 typedef void (obj::*CallBack)(Arg1,Arg2,Arg3,Arg4);
475 function_callback_vm4(CallBack c,obj* p,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) :
476 m_lpFunc(c),m_lpObj(p),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3),m_Arg4(a4) {}
479 (m_lpObj->*m_lpFunc)(m_Arg1,m_Arg2,m_Arg3,m_Arg4);
493 template<class obj,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
494 class function_callback_vm5 : public function_callback_v {
496 typedef void (obj::*CallBack)(Arg1,Arg2,Arg3,Arg4,Arg5);
498 function_callback_vm5(CallBack c,obj* p,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) :
499 m_lpFunc(c),m_lpObj(p),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3),m_Arg4(a4),m_Arg5(a5) {}
502 (m_lpObj->*m_lpFunc)(m_Arg1,m_Arg2,m_Arg3,m_Arg4,m_Arg5);
517 //-----------------------------------------------------------------------
519 template<class Result>
520 class function_callback_r0 : public function_callback_r<Result> {
522 typedef Result (*CallBack)();
524 function_callback_r0(CallBack c) : m_lpFunc(c) {}
527 Result r = m_lpFunc();
537 template<class Result,class T>
538 class function_callback_rg0 : public function_callback_r<Result> {
540 typedef Result (T::*CallBack)();
542 function_callback_rg0(CallBack c) : m_lpFunc(c) {}
545 Result r = m_lpFunc();
555 template<class Result,class Arg1>
556 class function_callback_r1 : public function_callback_r<Result> {
558 typedef Result (*CallBack)(Arg1);
560 function_callback_r1(CallBack c,Arg1 a1) : m_lpFunc(c),m_Arg1(a1) {}
563 Result r = m_lpFunc(m_Arg1);
574 template<class Result,class Arg1,class Arg2>
575 class function_callback_r2 : public function_callback_r<Result> {
577 typedef Result (*CallBack)(Arg1,Arg2);
579 function_callback_r2(CallBack c,Arg1 a1,Arg2 a2) : m_lpFunc(c),m_Arg1(a1),m_Arg2(a2) {}
582 Result r = m_lpFunc(m_Arg1,m_Arg2);
594 template<class Result,class Arg1,class Arg2,class Arg3>
595 class function_callback_r3 : public function_callback_r<Result> {
597 typedef Result (*CallBack)(Arg1,Arg2,Arg3);
599 function_callback_r3(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3) :
600 m_lpFunc(c),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3) {}
603 Result r = m_lpFunc(m_Arg1,m_Arg2,m_Arg3);
616 template<class Result,class Arg1,class Arg2,class Arg3,class Arg4>
617 class function_callback_r4 : public function_callback_r<Result> {
619 typedef Result (*CallBack)(Arg1,Arg2,Arg3,Arg4);
621 function_callback_r4(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) :
622 m_lpFunc(c),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3),m_Arg4(a4) {}
625 Result r = m_lpFunc(m_Arg1,m_Arg2,m_Arg3,m_Arg4);
639 template<class Result,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
640 class function_callback_r5 : public function_callback_r<Result> {
642 typedef Result (*CallBack)(Arg1,Arg2,Arg3,Arg4);
644 function_callback_r5(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) :
645 m_lpFunc(c),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3),m_Arg4(a4),m_Arg5(a5) {}
648 Result r = m_lpFunc(m_Arg1,m_Arg2,m_Arg3,m_Arg4,m_Arg5);
663 template<class Result,class T>
664 class function_callback_rm0 : public function_callback_r<Result> {
666 typedef Result (T::*CallBack)();
668 function_callback_rm0(CallBack c,T* p) : m_lpFunc(c),m_lpObj(p) {}
671 Result r = (m_lpObj->*m_lpFunc)();
682 template<class Result,class T,class Arg1>
683 class function_callback_rm1 : public function_callback_r<Result> {
685 typedef Result (T::*CallBack)(Arg1);
687 function_callback_rm1(CallBack c,T* p,Arg1 a1) :
688 m_lpFunc(c),m_lpObj(p),m_Arg1(a1) {}
691 Result r = (m_lpObj->*m_lpFunc)(m_Arg1);
703 template<class Result,class T,class Arg1,class Arg2>
704 class function_callback_rm2 : public function_callback_r<Result> {
706 typedef Result (T::*CallBack)(Arg1,Arg2);
708 function_callback_rm2(CallBack c,T* p,Arg1 a1,Arg2 a2) :
709 m_lpFunc(c),m_lpObj(p),m_Arg1(a1),m_Arg2(a2) {}
712 Result r = (m_lpObj->*m_lpFunc)(m_Arg1,m_Arg2);
725 template<class Result,class T,class Arg1,class Arg2,class Arg3>
726 class function_callback_rm3 : public function_callback_r<Result> {
728 typedef Result (T::*CallBack)(Arg1,Arg2,Arg3);
730 function_callback_rm3(CallBack c,T* p,Arg1 a1,Arg2 a2,Arg3 a3) :
731 m_lpFunc(c),m_lpObj(p),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3) {}
734 Result r = (m_lpObj->*m_lpFunc)(m_Arg1,m_Arg2,m_Arg3);
748 template<class Result,class T,class Arg1,class Arg2,class Arg3,class Arg4>
749 class function_callback_rm4 : public function_callback_r<Result> {
751 typedef Result (T::*CallBack)(Arg1,Arg2,Arg3,Arg4);
753 function_callback_rm4(CallBack c,T* p,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) :
754 m_lpFunc(c),m_lpObj(p),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3),m_Arg4(a4) {}
757 Result r = (m_lpObj->*m_lpFunc)(m_Arg1,m_Arg2,m_Arg3,m_Arg4);
772 template<class Result,class T,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
773 class function_callback_rm5 : public function_callback_r<Result> {
775 typedef Result (T::*CallBack)(Arg1,Arg2,Arg3,Arg4,Arg5);
777 function_callback_rm5(CallBack c,T* p,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) :
778 m_lpFunc(c),m_lpObj(p),m_Arg1(a1),m_Arg2(a2),m_Arg3(a3),m_Arg4(a4),m_Arg5(a5) {}
781 Result r = (m_lpObj->*m_lpFunc)(m_Arg1,m_Arg2,m_Arg3,m_Arg4,m_Arg5);
798 // この関数のみ、実体が必要であるため、ここで定義する。
799 inline function_callback_v* create(void (*f)(void))
801 return new function_callback_v0(f);