callback_v0.h
1 /*
2 ** ClanLib SDK
3 ** Copyright (c) 1997-2013 The ClanLib Team
4 **
5 ** This software is provided 'as-is', without any express or implied
6 ** warranty. In no event will the authors be held liable for any damages
7 ** arising from the use of this software.
8 **
9 ** Permission is granted to anyone to use this software for any purpose,
10 ** including commercial applications, and to alter it and redistribute it
11 ** freely, subject to the following restrictions:
12 **
13 ** 1. The origin of this software must not be misrepresented; you must not
14 ** claim that you wrote the original software. If you use this software
15 ** in a product, an acknowledgment in the product documentation would be
16 ** appreciated but is not required.
17 ** 2. Altered source versions must be plainly marked as such, and must not be
18 ** misrepresented as being the original software.
19 ** 3. This notice may not be removed or altered from any source distribution.
20 **
21 ** Note: Some of the libraries ClanLib may link to may have additional
22 ** requirements or restrictions.
23 **
24 ** File Author(s):
25 **
26 ** Magnus Norddahl
27 */
28 
29 
30 #pragma once
31 
32 #include "../System/exception.h"
33 #include <memory>
34 
35 namespace clan
36 {
39 
42 {
43 public:
45  {
46  }
47 
48  virtual void invoke() const = 0;
49 };
50 
53 {
54 public:
57  {
58  }
59 
60  void invoke() const
61  {
62  static_func();
63  }
64 
65  void (*static_func)();
66 };
67 
69 template <typename UserData>
71 {
72 public:
74  void (*static_func)(UserData), const UserData &user_data)
75  : static_func(static_func), user_data(user_data)
76  {
77  }
78 
79  void invoke() const
80  {
82  }
83 
85 
87 };
88 
90 template <typename InstanceClass>
92 {
93 public:
95  void (InstanceClass::*member_func)())
96  : instance(instance), member_func(member_func)
97  {
98  }
99 
100  void invoke() const
101  {
102  (instance->*member_func)();
103  }
104 
105  InstanceClass *instance;
106 
107  void (InstanceClass::*member_func)();
108 };
109 
111 template <typename InstanceClass, typename UserData>
113 {
114 public:
115  Callback_Impl_v0_member_user(InstanceClass *instance,
116  void (InstanceClass::*member_func)(UserData), const UserData &user_data)
117  : instance(instance), member_func(member_func), user_data(user_data)
118  {
119  }
120 
121  void invoke() const
122  {
123  (instance->*member_func)(user_data);
124  }
125 
126  InstanceClass *instance;
127 
128  void (InstanceClass::*member_func)(UserData);
129 
131 };
132 
134 template <class Functor>
136 {
137 public:
139  : functor(functor)
140  {
141  }
142 
143  void invoke() const
144  {
145  functor();
146  }
147 
148  Functor functor;
149 };
150 
153 {
154 public:
156  {
157  }
158 
160  : impl(copy.impl)
161  {
162  }
163 
165  : impl(impl)
166  {
167  }
168 
169  Callback_v0(void (*function)())
170  : impl(new Callback_Impl_v0_static(function))
171  {
172  }
173 
174  template<typename UserData>
175  Callback_v0(void (*function)(UserData), const UserData &user_data)
176  : impl(new Callback_Impl_v0_static_user<UserData>(function, user_data))
177  {
178  }
179 
180  template<class InstanceClass>
181  Callback_v0(InstanceClass *instance, void (InstanceClass::*function)())
182  : impl(new Callback_Impl_v0_member<InstanceClass>(instance, function))
183  {
184  }
185 
186  template<class InstanceClass, typename UserData>
187  Callback_v0(InstanceClass *instance, void (InstanceClass::*function)(UserData), const UserData &user_data)
188  : impl(new Callback_Impl_v0_member_user<InstanceClass, UserData>(instance, function, user_data))
189  {
190  }
191 
192  void set(void (*function)())
193  {
194  impl = std::shared_ptr< Callback_Impl_v0 >(new Callback_Impl_v0_static(function));
195  }
196 
197  template<typename UserData>
198  void set(void (*function)(UserData), const UserData &user_data)
199  {
200  impl = std::shared_ptr< Callback_Impl_v0 >(new Callback_Impl_v0_static_user<UserData>(function, user_data));
201  }
202 
203  template<class InstanceClass>
204  void set(InstanceClass *instance, void (InstanceClass::*function)())
205  {
206  impl = std::shared_ptr< Callback_Impl_v0 >(new Callback_Impl_v0_member<InstanceClass>(instance, function));
207  }
208 
209  template<class InstanceClass, typename UserData>
210  void set(InstanceClass *instance, void (InstanceClass::*function)(UserData), const UserData &user_data)
211  {
212  impl = std::shared_ptr< Callback_Impl_v0 >(new Callback_Impl_v0_member_user<InstanceClass, UserData>(instance, function, user_data));
213  }
214 
215  void clear()
216  {
217  impl = std::shared_ptr< Callback_Impl_v0 >();
218  }
219 
220  void invoke() const
221  {
222  impl->invoke();
223  }
224 
225  bool is_null() const
226  {
227  return !impl;
228  }
229 
230 private:
231  std::shared_ptr< Callback_Impl_v0 > impl;
232 };
233 
236 {
237 public:
239  {
240  }
241 
243  : Callback_v0(copy)
244  {
245  }
246 
247  template<class Functor>
248  Callback_v0_functor(Functor functor)
249  : Callback_v0(new Callback_Impl_v0_functor<Functor>(functor))
250  {
251  }
252 
253 };
254 
255 }
256 
(Internal ClanLib Class)
Definition: callback_v0.h:135
Functor functor
Definition: callback_v0.h:148
(Internal ClanLib Class)
Definition: callback_v0.h:112
UserData user_data
Definition: callback_v0.h:86
InstanceClass * instance
Definition: callback_v0.h:105
void clear()
Definition: callback_v0.h:215
Callback_v0_functor.
Definition: callback_v0.h:235
void set(void(*function)())
Definition: callback_v0.h:192
Callback_v0(InstanceClass *instance, void(InstanceClass::*function)())
Definition: callback_v0.h:181
Callback_v0()
Definition: callback_v0.h:155
void invoke() const
Definition: callback_v0.h:143
void(* static_func)()
Definition: callback_v0.h:65
Callback_Impl_v0_member(InstanceClass *instance, void(InstanceClass::*member_func)())
Definition: callback_v0.h:94
void invoke() const
Definition: callback_v0.h:121
void invoke() const
Definition: callback_v0.h:220
bool is_null() const
Definition: callback_v0.h:225
Definition: userdata.h:47
Callback_v0(InstanceClass *instance, void(InstanceClass::*function)(UserData), const UserData &user_data)
Definition: callback_v0.h:187
virtual ~Callback_Impl_v0()
Definition: callback_v0.h:44
Callback_Impl_v0_static_user(void(*static_func)(UserData), const UserData &user_data)
Definition: callback_v0.h:73
(Internal ClanLib Class)
Definition: callback_v0.h:41
InstanceClass * instance
Definition: callback_v0.h:126
virtual void invoke() const =0
Callback_Impl_v0_functor(Functor functor)
Definition: callback_v0.h:138
void set(InstanceClass *instance, void(InstanceClass::*function)())
Definition: callback_v0.h:204
void invoke() const
Definition: callback_v0.h:79
(Internal ClanLib Class)
Definition: callback_v0.h:52
void(InstanceClass::* member_func)(UserData)
Definition: callback_v0.h:128
Callback_Impl_v0_member_user(InstanceClass *instance, void(InstanceClass::*member_func)(UserData), const UserData &user_data)
Definition: callback_v0.h:115
void(InstanceClass::* member_func)()
Definition: callback_v0.h:107
Callback_v0(const Callback_v0 &copy)
Definition: callback_v0.h:159
Callback_v0(void(*function)(UserData), const UserData &user_data)
Definition: callback_v0.h:175
void set(InstanceClass *instance, void(InstanceClass::*function)(UserData), const UserData &user_data)
Definition: callback_v0.h:210
void invoke() const
Definition: callback_v0.h:100
void invoke() const
Definition: callback_v0.h:60
(Internal ClanLib Class)
Definition: callback_v0.h:70
Callback_v0(void(*function)())
Definition: callback_v0.h:169
Callback_v0(Callback_Impl_v0 *impl)
Definition: callback_v0.h:164
Callback_Impl_v0_static(void(*static_func)())
Definition: callback_v0.h:55
Callback_v0_functor()
Definition: callback_v0.h:238
UserData user_data
Definition: callback_v0.h:130
(Internal ClanLib Class)
Definition: callback_v0.h:91
void set(void(*function)(UserData), const UserData &user_data)
Definition: callback_v0.h:198
void(* static_func)(UserData)
Definition: callback_v0.h:84
Callback_v0_functor(Functor functor)
Definition: callback_v0.h:248
Callback_v0_functor(const Callback_v0_functor &copy)
Definition: callback_v0.h:242
Callback_v0.
Definition: callback_v0.h:152