Itasca C++ Interface
callback.h
1 #pragma once
2 
3 // Note - VS2010 does not support variadic templates :(
4 // MOO NOTE: Do not use these in new codes, between lambdas and std::function
5 // it really doesn't make sense. Remove in old code when you are messing around
6 // with it anyway.
7 
8 template <class R>
9 class Callback0 {
10 public:
11  virtual ~Callback0() {}
12  virtual R execute()=0;
13 };
14 
15 template <class R,class Arg1>
16 class Callback1 {
17 public:
18  virtual ~Callback1() {}
19  virtual R execute(Arg1 a)=0;
20 };
21 
22 template <class R,class Arg1,class Arg2>
23 class Callback2 {
24 public:
25  virtual ~Callback2() {}
26  virtual R execute(Arg1 a,Arg2 b)=0;
27 };
28 
29 template <class R,class Arg1,class Arg2,class Arg3>
30 class Callback3 {
31 public:
32  virtual ~Callback3() {}
33  virtual R execute(Arg1 a,Arg2 b,Arg3 c)=0;
34 };
35 
36 template <class R,class Arg1,class Arg2,class Arg3,class Arg4>
37 class Callback4 {
38 public:
39  virtual ~Callback4() {}
40  virtual R execute(Arg1 a,Arg2 b,Arg3 c,Arg4 d)=0;
41 };
42 
43 template <class R>
44 class Callback0Static : public Callback0<R> {
45 public:
46  typedef R (*type)();
47  Callback0Static(type t) : t_(t) { }
48  virtual R execute() { return t_(); }
49 private:
50  type t_;
51 };
52 
53 template <class R,class Arg1>
54 class Callback1Static : public Callback1<R,Arg1> {
55 public:
56  typedef R (*type)(Arg1 a);
57  Callback1Static(type t) : t_(t) { }
58  virtual R execute(Arg1 a) { return t_(a); }
59 private:
60  type t_;
61 };
62 
63 template <class R,class Arg1,class Arg2>
64 class Callback2Static : public Callback2<R,Arg1,Arg2> {
65 public:
66  typedef R (*type)(Arg1 a,Arg2 b);
67  Callback2Static(type t) : t_(t) { }
68  virtual R execute(Arg1 a,Arg2 b) { return t_(a,b); }
69 private:
70  type t_;
71 };
72 
73 template <class R,class Arg1,class Arg2,class Arg3>
74 class Callback3Static : public Callback3<R,Arg1,Arg2,Arg3> {
75 public:
76  typedef R (*type)(Arg1 a,Arg2 b,Arg3 c);
77  Callback3Static(type t) : t_(t) { }
78  virtual R execute(Arg1 a,Arg2 b,Arg3 c) { return t_(a,b,c); }
79 private:
80  type t_;
81 };
82 
83 template <class R,class Arg1,class Arg2,class Arg3,class Arg4>
84 class Callback4Static : public Callback4<R,Arg1,Arg2,Arg3,Arg4> {
85 public:
86  typedef R (*type)(Arg1 a,Arg2 b,Arg3 c,Arg4 d);
87  Callback4Static(type t) : t_(t) { }
88  R execute(Arg1 a,Arg2 b,Arg3 c,Arg4 d) override { return t_(a,b,c,d); }
89 private:
90  type t_;
91 };
92 
93 template <class R,class S,R (S::*MFP)()>
94 class Callback0Method : public Callback0<R> {
95 public:
96  Callback0Method(S *s) : s_(s) { }
97  virtual R execute() { return (s_->*MFP)(); }
98 private:
99  S *s_;
100 };
101 
102 template <class R,class Arg1,class S,R (S::*MFP)(Arg1)>
103 class Callback1Method : public Callback1<R,Arg1> {
104 public:
105  Callback1Method(S *s) : s_(s) { }
106  virtual R execute(Arg1 a) { return (s_->*MFP)(a); }
107 private:
108  S *s_;
109 };
110 
111 template <class R,class Arg1,class Arg2,class S,R (S::*MFP)(Arg1,Arg2)>
112 class Callback2Method : public Callback2<R,Arg1,Arg2> {
113 public:
114  Callback2Method(S *s) : s_(s) { }
115  virtual R execute(Arg1 a,Arg2 b) { return (s_->*MFP)(a,b); }
116 private:
117  S *s_;
118 };
119 
120 template <class R,class Arg1,class Arg2,class Arg3,class S,R (S::*MFP)(Arg1,Arg2,Arg3)>
121 class Callback3Method : public Callback3<R,Arg1,Arg2,Arg3> {
122 public:
123  Callback3Method(S *s) : s_(s) { }
124  R execute(Arg1 a,Arg2 b,Arg3 c) override { return (s_->*MFP)(a,b,c); }
125 private:
126  S *s_;
127 };
128 
129 template <class R,class Arg1,class Arg2,class Arg3,class Arg4,class S,R (S::*MFP)(Arg1,Arg2,Arg3,Arg4)>
130 class Callback4Method : public Callback4<R,Arg1,Arg2,Arg3,Arg4> {
131 public:
132  Callback4Method(S *s) : s_(s) { }
133  R execute(Arg1 a,Arg2 b,Arg3 c,Arg4 d) override { return (s_->*MFP)(a,b,c,d); }
134 private:
135  S *s_;
136 };
137 
138 // EoF
Definition: callback.h:9
Definition: callback.h:94
Definition: callback.h:44
Definition: callback.h:16
Definition: callback.h:103
Definition: callback.h:54
Definition: callback.h:23
Definition: callback.h:112
Definition: callback.h:64
Definition: callback.h:30
Definition: callback.h:121
Definition: callback.h:74
Definition: callback.h:37
Definition: callback.h:130
Definition: callback.h:84