signal_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 "../api_core.h"
33 #include "slot.h"
34 #include "signals_impl.h"
35 
36 namespace clan
37 {
40 
42 class CL_API_CORE SlotCallback_v0 : public SlotCallback
43 {
44 public:
45  virtual void invoke() = 0;
46 };
47 
49 class CL_API_CORE SlotCallback_v0_static : public SlotCallback_v0
50 {
51 public:
52  SlotCallback_v0_static(void (*static_func)())
53  : static_func(static_func) { return; }
54  void invoke() { static_func(); }
55  void (*static_func)();
56 };
57 
59 template <class UserData>
61 {
62 public:
64  : static_func(static_func), user_data(user_data) { return; }
68 };
69 
71 template <class InstanceClass>
73 {
74 public:
75  SlotCallback_v0_member(InstanceClass *instance, void (InstanceClass::*member_func)())
76  : instance(instance), member_func(member_func) { return; }
77  void invoke() { (instance->*member_func)(); }
78  InstanceClass *instance;
79  void (InstanceClass::*member_func)();
80 };
81 
83 template <class InstanceClass, class UserData>
85 {
86 public:
87  SlotCallback_v0_member_user(InstanceClass *instance, void (InstanceClass::*member_func)(UserData), const UserData &user_data)
88  : instance(instance), member_func(member_func), user_data(user_data) { return; }
89  void invoke() { (instance->*member_func)(user_data); }
90  InstanceClass *instance;
91  void (InstanceClass::*member_func)(UserData);
93 };
94 
96 template <class Functor>
98 {
99 public:
101  : functor(functor) { return; }
102  void invoke() { functor(); }
103  Functor functor;
104 };
105 
107 class CL_API_CORE Signal_v0
108 {
111 
112 public:
114  : impl(new Signal_Impl) { return; }
115 
116  Signal_v0(const Signal_v0 &copy)
117  : impl(copy.impl) { return; }
118 
119 
123 
124 public:
125  Slot connect(void (*function)())
126  {
127  clean_up();
128  std::shared_ptr<SlotCallback> callback(
129  new SlotCallback_v0_static(function));
130  impl->connected_slots.push_back(callback);
131  return Slot(callback);
132  }
133 
134  template<class UserData>
135  Slot connect(void (*function)(UserData), const UserData &user_data)
136  {
137  clean_up();
138  std::shared_ptr<SlotCallback> callback(
139  new SlotCallback_v0_static_user<UserData>(function, user_data));
140  impl->connected_slots.push_back(callback);
141  return Slot(callback);
142  }
143 
144  template<class InstanceClass>
145  Slot connect(InstanceClass *instance, void (InstanceClass::*function)())
146  {
147  clean_up();
148  std::shared_ptr<SlotCallback> callback(
149  new SlotCallback_v0_member<InstanceClass>(instance, function));
150  impl->connected_slots.push_back(callback);
151  return Slot(callback);
152  }
153 
154  template<class InstanceClass, class UserData>
155  Slot connect(InstanceClass *instance, void (InstanceClass::*function)(UserData), const UserData &user_data)
156  {
157  clean_up();
158  std::shared_ptr<SlotCallback> callback(
159  new SlotCallback_v0_member_user<InstanceClass, UserData>(instance, function, user_data));
160  impl->connected_slots.push_back(callback);
161  return Slot(callback);
162  }
163 
164  template<class Functor>
165  Slot connect_functor(const Functor &functor)
166  {
167  clean_up();
168  std::shared_ptr<SlotCallback> callback(
169  new SlotCallback_v0_functor<Functor>(functor));
170  impl->connected_slots.push_back(callback);
171  return Slot(callback);
172  }
173 
174  void invoke() const
175  {
176  std::vector< std::shared_ptr<SlotCallback> > callbacks = impl->connected_slots;
177  std::vector< std::shared_ptr<SlotCallback> >::size_type i, size;
178  size = callbacks.size();
179  for (i = 0; i < size; i++)
180  if (callbacks[i]->valid && callbacks[i]->enabled)
181  ((SlotCallback_v0 *) callbacks[i].get())->invoke();
182  }
183 
184 
188 
189 private:
190  void clean_up()
191  {
192  std::vector< std::shared_ptr<SlotCallback> >::size_type i, size;
193  size = impl->connected_slots.size();
194  for (i = 0; i < size; i++)
195  {
196  if (!impl->connected_slots[i]->valid)
197  {
198  impl->connected_slots.erase(impl->connected_slots.begin()+i);
199  i--;
200  size--;
201  }
202  }
203  }
204 
205  std::shared_ptr<Signal_Impl> impl;
207 };
208 
209 }
210 
(Internal ClanLib Class)
Definition: signal_v0.h:84
SlotCallback_v0_static(void(*static_func)())
Definition: signal_v0.h:52
void invoke()
Definition: signal_v0.h:102
Slot connect(void(*function)())
Definition: signal_v0.h:125
InstanceClass * instance
Definition: signal_v0.h:90
Signal_v0(const Signal_v0 &copy)
Definition: signal_v0.h:116
void invoke()
Definition: signal_v0.h:54
UserData user_data
Definition: signal_v0.h:67
void invoke() const
Definition: signal_v0.h:174
Slot connect(InstanceClass *instance, void(InstanceClass::*function)(UserData), const UserData &user_data)
Definition: signal_v0.h:155
(Internal ClanLib Class)
Definition: signal_v0.h:97
Signal_v0()
Definition: signal_v0.h:113
SlotCallback_v0_functor(const Functor &functor)
Definition: signal_v0.h:100
Definition: userdata.h:47
UserData user_data
Definition: signal_v0.h:92
Slot connect(void(*function)(UserData), const UserData &user_data)
Definition: signal_v0.h:135
InstanceClass * instance
Definition: signal_v0.h:78
(Internal ClanLib Class)
Definition: signal_v0.h:72
SlotCallback_v0_member_user(InstanceClass *instance, void(InstanceClass::*member_func)(UserData), const UserData &user_data)
Definition: signal_v0.h:87
void(* static_func)(UserData)
Definition: signal_v0.h:66
(Internal ClanLib Class)
Definition: signal_v0.h:49
Slot connect_functor(const Functor &functor)
Definition: signal_v0.h:165
void(InstanceClass::* member_func)()
Definition: signal_v0.h:79
Functor functor
Definition: signal_v0.h:103
Slot.
Definition: slot.h:41
void invoke()
Definition: signal_v0.h:77
(Internal ClanLib Class)
Definition: signals_impl.h:62
(Internal ClanLib Class)
Definition: signal_v0.h:60
Signal_v0.
Definition: signal_v0.h:107
void invoke()
Definition: signal_v0.h:89
(Internal ClanLib Class)
Definition: signal_v0.h:42
void invoke()
Definition: signal_v0.h:65
(Internal ClanLib Class)
Definition: signals_impl.h:40
SlotCallback_v0_member(InstanceClass *instance, void(InstanceClass::*member_func)())
Definition: signal_v0.h:75
void(InstanceClass::* member_func)(UserData)
Definition: signal_v0.h:91
SlotCallback_v0_static_user(void(*static_func)(UserData), const UserData &user_data)
Definition: signal_v0.h:63
Slot connect(InstanceClass *instance, void(InstanceClass::*function)())
Definition: signal_v0.h:145