signal_v1.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 "slot.h"
33 #include "signals_impl.h"
34 
35 namespace clan
36 {
39 
41 template <class Param1>
43 {
44 public:
45  virtual void invoke(Param1 param1) = 0;
46 };
47 
49 template <class Param1>
51 {
52 public:
54  : static_func(static_func) { return; }
55  void invoke(Param1 param1) { static_func(param1); }
56  void (*static_func)(Param1);
57 };
58 
60 template <class Param1, class UserData>
62 {
63 public:
65  : static_func(static_func), user_data(user_data) { return; }
66  void invoke(Param1 param1) { static_func(param1, user_data); }
67  void (*static_func)(Param1, UserData);
69 };
70 
72 template <class Param1, class InstanceClass>
74 {
75 public:
76  SlotCallback_v1_member(InstanceClass *instance, void (InstanceClass::*member_func)(Param1))
77  : instance(instance), member_func(member_func) { return; }
78  void invoke(Param1 param1) { (instance->*member_func)(param1); }
79  InstanceClass *instance;
80  void (InstanceClass::*member_func)(Param1);
81 };
82 
84 template <class Param1, class InstanceClass, class UserData>
86 {
87 public:
88  SlotCallback_v1_member_user(InstanceClass *instance, void (InstanceClass::*member_func)(Param1, UserData), const UserData &user_data)
89  : instance(instance), member_func(member_func), user_data(user_data) { return; }
90  void invoke(Param1 param1) { (instance->*member_func)(param1, user_data); }
91  InstanceClass *instance;
92  void (InstanceClass::*member_func)(Param1, UserData);
94 };
95 
97 template <class Param1, class Functor>
99 {
100 public:
102  : functor(functor) { return; }
103  void invoke(Param1 param1) { functor(param1); }
104  Functor functor;
105 };
106 
109 template <class Param1>
111 {
114 
115 public:
117  : impl(new Signal_Impl) { return; }
118 
120  : impl(copy.impl) { return; }
121 
122 
126 
127 public:
128  Slot connect(void (*function)(Param1))
129  {
130  clean_up();
131  std::shared_ptr<SlotCallback> callback(
132  new SlotCallback_v1_static<Param1>(function));
133  impl->connected_slots.push_back(callback);
134  return Slot(callback);
135  }
136 
137  template<class UserData>
138  Slot connect(void (*function)(Param1, UserData), const UserData &user_data)
139  {
140  clean_up();
141  std::shared_ptr<SlotCallback> callback(
142  new SlotCallback_v1_static_user<Param1, UserData>(function, user_data));
143  impl->connected_slots.push_back(callback);
144  return Slot(callback);
145  }
146 
147  template<class InstanceClass>
148  Slot connect(InstanceClass *instance, void (InstanceClass::*function)(Param1))
149  {
150  clean_up();
151  std::shared_ptr<SlotCallback> callback(
152  new SlotCallback_v1_member<Param1, InstanceClass>(instance, function));
153  impl->connected_slots.push_back(callback);
154  return Slot(callback);
155  }
156 
157  template<class InstanceClass, class UserData>
158  Slot connect(InstanceClass *instance, void (InstanceClass::*function)(Param1, UserData), const UserData &user_data)
159  {
160  clean_up();
161  std::shared_ptr<SlotCallback> callback(
162  new SlotCallback_v1_member_user<Param1, InstanceClass, UserData>(instance, function, user_data));
163  impl->connected_slots.push_back(callback);
164  return Slot(callback);
165  }
166 
167  template<class Functor>
168  Slot connect_functor(const Functor &functor)
169  {
170  clean_up();
171  std::shared_ptr<SlotCallback> callback(
173  impl->connected_slots.push_back(callback);
174  return Slot(callback);
175  }
176 
177  void invoke(Param1 param1) const
178  {
179  std::vector< std::shared_ptr<SlotCallback> > callbacks = impl->connected_slots;
180  std::vector< std::shared_ptr<SlotCallback> >::size_type i, size;
181  size = callbacks.size();
182  for (i = 0; i < size; i++)
183  if (callbacks[i]->valid && callbacks[i]->enabled)
184  ((SlotCallback_v1<Param1> *) callbacks[i].get())->invoke(param1);
185  }
186 
187 
191 
192 private:
193  void clean_up()
194  {
195  std::vector< std::shared_ptr<SlotCallback> >::size_type i, size;
196  size = impl->connected_slots.size();
197  for (i = 0; i < size; i++)
198  {
199  if (!impl->connected_slots[i]->valid)
200  {
201  impl->connected_slots.erase(impl->connected_slots.begin()+i);
202  i--;
203  size--;
204  }
205  }
206  }
207 
208  std::shared_ptr<Signal_Impl> impl;
210 };
211 
212 }
213 
Functor functor
Definition: signal_v1.h:104
(Internal ClanLib Class)
Definition: signal_v1.h:85
Signal_v1(const Signal_v1< Param1 > &copy)
Definition: signal_v1.h:119
Slot connect(void(*function)(Param1, UserData), const UserData &user_data)
Definition: signal_v1.h:138
SlotCallback_v1_functor(const Functor &functor)
Definition: signal_v1.h:101
void invoke(Param1 param1)
Definition: signal_v1.h:90
Slot connect(InstanceClass *instance, void(InstanceClass::*function)(Param1))
Definition: signal_v1.h:148
Slot connect(InstanceClass *instance, void(InstanceClass::*function)(Param1, UserData), const UserData &user_data)
Definition: signal_v1.h:158
(Internal ClanLib Class)
Definition: signal_v1.h:98
Signal_v1()
Definition: signal_v1.h:116
Slot connect_functor(const Functor &functor)
Definition: signal_v1.h:168
void(InstanceClass::* member_func)(Param1, UserData)
Definition: signal_v1.h:92
Definition: userdata.h:47
Signal_v1.
Definition: signal_v1.h:110
SlotCallback_v1_static_user(void(*static_func)(Param1, UserData), const UserData &user_data)
Definition: signal_v1.h:64
InstanceClass * instance
Definition: signal_v1.h:79
void(InstanceClass::* member_func)(Param1)
Definition: signal_v1.h:80
SlotCallback_v1_member_user(InstanceClass *instance, void(InstanceClass::*member_func)(Param1, UserData), const UserData &user_data)
Definition: signal_v1.h:88
(Internal ClanLib Class)
Definition: signal_v1.h:42
(Internal ClanLib Class)
Definition: signal_v1.h:73
virtual void invoke(Param1 param1)=0
void(* static_func)(Param1, UserData)
Definition: signal_v1.h:67
(Internal ClanLib Class)
Definition: signal_v1.h:50
UserData user_data
Definition: signal_v1.h:93
void invoke(Param1 param1)
Definition: signal_v1.h:78
Slot.
Definition: slot.h:41
void invoke(Param1 param1)
Definition: signal_v1.h:66
(Internal ClanLib Class)
Definition: signals_impl.h:62
(Internal ClanLib Class)
Definition: signal_v1.h:61
UserData user_data
Definition: signal_v1.h:68
void invoke(Param1 param1) const
Definition: signal_v1.h:177
InstanceClass * instance
Definition: signal_v1.h:91
void invoke(Param1 param1)
Definition: signal_v1.h:103
Slot connect(void(*function)(Param1))
Definition: signal_v1.h:128
SlotCallback_v1_static(void(*static_func)(Param1))
Definition: signal_v1.h:53
(Internal ClanLib Class)
Definition: signals_impl.h:40
void invoke(Param1 param1)
Definition: signal_v1.h:55
void(* static_func)(Param1)
Definition: signal_v1.h:56
SlotCallback_v1_member(InstanceClass *instance, void(InstanceClass::*member_func)(Param1))
Definition: signal_v1.h:76