Itasca C++ Interface
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
callback.h
1 #pragma once
2 
3 // Note - VS2010 does not support variadic templates :(
4 
5 template <class R>
6 class Callback0 {
7 public:
8  virtual R execute()=0;
9 };
10 
11 template <class R,class Arg1>
12 class Callback1 {
13 public:
14  virtual R execute(Arg1 a)=0;
15 };
16 
17 template <class R,class Arg1,class Arg2>
18 class Callback2 {
19 public:
20  virtual R execute(Arg1 a,Arg2 b)=0;
21 };
22 
23 template <class R,class Arg1,class Arg2,class Arg3>
24 class Callback3 {
25 public:
26  virtual R execute(Arg1 a,Arg2 b,Arg3 c)=0;
27 };
28 
29 template <class R,class Arg1,class Arg2,class Arg3,class Arg4>
30 class Callback4 {
31 public:
32  virtual R execute(Arg1 a,Arg2 b,Arg3 c,Arg4 d)=0;
33 };
34 
35 template <class R>
36 class Callback0Static : public Callback0<R> {
37 public:
38  typedef R (*type)();
39  Callback0Static(type t) : t_(t) { }
40  virtual R execute() { return t_(); }
41 private:
42  type t_;
43 };
44 
45 template <class R,class Arg1>
46 class Callback1Static : public Callback1<R,Arg1> {
47 public:
48  typedef R (*type)(Arg1 a);
49  Callback1Static(type t) : t_(t) { }
50  virtual R execute(Arg1 a) { return t_(a); }
51 private:
52  type t_;
53 };
54 
55 template <class R,class Arg1,class Arg2>
56 class Callback2Static : public Callback2<R,Arg1,Arg2> {
57 public:
58  typedef R (*type)(Arg1 a,Arg2 b);
59  Callback2Static(type t) : t_(t) { }
60  virtual R execute(Arg1 a,Arg2 b) { return t_(a,b); }
61 private:
62  type t_;
63 };
64 
65 template <class R,class Arg1,class Arg2,class Arg3>
66 class Callback3Static : public Callback3<R,Arg1,Arg2,Arg3> {
67 public:
68  typedef R (*type)(Arg1 a,Arg2 b,Arg3 c);
69  Callback3Static(type t) : t_(t) { }
70  virtual R execute(Arg1 a,Arg2 b,Arg3 c) { return t_(a,b,c); }
71 private:
72  type t_;
73 };
74 
75 template <class R,class Arg1,class Arg2,class Arg3,class Arg4>
76 class Callback4Static : public Callback4<R,Arg1,Arg2,Arg3,Arg4> {
77 public:
78  typedef R (*type)(Arg1 a,Arg2 b,Arg3 c,Arg4 d);
79  Callback4Static(type t) : t_(t) { }
80  virtual R execute(Arg1 a,Arg2 b,Arg3 c,Arg4 d) { return t_(a,b,c,d); }
81 private:
82  type t_;
83 };
84 
85 template <class R,class S,R (S::*MFP)()>
86 class Callback0Method : public Callback0<R> {
87 public:
88  Callback0Method(S *s) : s_(s) { }
89  virtual R execute() { return (s_->*MFP)(); }
90 private:
91  S *s_;
92 };
93 
94 template <class R,class Arg1,class S,R (S::*MFP)(Arg1)>
95 class Callback1Method : public Callback1<R,Arg1> {
96 public:
97  Callback1Method(S *s) : s_(s) { }
98  virtual R execute(Arg1 a) { return (s_->*MFP)(a); }
99 private:
100  S *s_;
101 };
102 
103 template <class R,class Arg1,class Arg2,class S,R (S::*MFP)(Arg1,Arg2)>
104 class Callback2Method : public Callback2<R,Arg1,Arg2> {
105 public:
106  Callback2Method(S *s) : s_(s) { }
107  virtual R execute(Arg1 a,Arg2 b) { return (s_->*MFP)(a,b); }
108 private:
109  S *s_;
110 };
111 
112 template <class R,class Arg1,class Arg2,class Arg3,class S,R (S::*MFP)(Arg1,Arg2,Arg3)>
113 class Callback3Method : public Callback3<R,Arg1,Arg2,Arg3> {
114 public:
115  Callback3Method(S *s) : s_(s) { }
116  virtual R execute(Arg1 a,Arg2 b,Arg3 c) { return (s_->*MFP)(a,b,c); }
117 private:
118  S *s_;
119 };
120 
121 template <class R,class Arg1,class Arg2,class Arg3,class Arg4,class S,R (S::*MFP)(Arg1,Arg2,Arg3,Arg4)>
122 class Callback4Method : public Callback4<R,Arg1,Arg2,Arg3,Arg4> {
123 public:
124  Callback4Method(S *s) : s_(s) { }
125  virtual R execute(Arg1 a,Arg2 b,Arg3 c,Arg4 d) { return (s_->*MFP)(a,b,c,d); }
126 private:
127  S *s_;
128 };
129 
130 // EoF
Definition: callback.h:30
Definition: callback.h:95
Definition: callback.h:46
Definition: callback.h:76
Definition: callback.h:6
Definition: callback.h:122
Definition: callback.h:12
Definition: callback.h:104
Definition: callback.h:86
Definition: callback.h:24
Definition: callback.h:36
Definition: callback.h:113
Definition: callback.h:18
Definition: callback.h:66
Definition: callback.h:56