signal_v2.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, class Param2>
43 {
44 public:
45  virtual void invoke(Param1 param1, Param2 param2) = 0;
46 };
47 
49 template <class Param1, class Param2>
50 class SlotCallback_v2_static : public SlotCallback_v2<Param1, Param2>
51 {
52 public:
53  SlotCallback_v2_static(void (*static_func)(Param1, Param2))
54  : static_func(static_func) { return; }
55  void invoke(Param1 param1, Param2 param2) { static_func(param1, param2); }
56  void (*static_func)(Param1, Param2);
57 };
58 
60 template <class Param1, class Param2, class UserData>
61 class SlotCallback_v2_static_user : public SlotCallback_v2<Param1, Param2>
62 {
63 public:
65  : static_func(static_func), user_data(user_data) { return; }
66  void invoke(Param1 param1, Param2 param2) { static_func(param1, param2, user_data); }
67  void (*static_func)(Param1, Param2, UserData);
69 };
70 
72 template <class Param1, class Param2, class InstanceClass>
73 class SlotCallback_v2_member : public SlotCallback_v2<Param1, Param2>
74 {
75 public:
76  SlotCallback_v2_member(InstanceClass *instance, void (InstanceClass::*member_func)(Param1, Param2))
77  : instance(instance), member_func(member_func) { return; }
78  void invoke(Param1 param1, Param2 param2) { (instance->*member_func)(param1, param2); }
79  InstanceClass *instance;
80  void (InstanceClass::*member_func)(Param1, Param2);
81 };
82 
84 template <class Param1, class Param2, class InstanceClass, class UserData>
85 class SlotCallback_v2_member_user : public SlotCallback_v2<Param1, Param2>
86 {
87 public:
88  SlotCallback_v2_member_user(InstanceClass *instance, void (InstanceClass::*member_func)(Param1, Param2, UserData), const UserData &user_data)
89  : instance(instance), member_func(member_func), user_data(user_data) { return; }
90  void invoke(Param1 param1, Param2 param2) { (instance->*member_func)(param1, param2, user_data); }
91  InstanceClass *instance;
92  void (InstanceClass::*member_func)(Param1, Param2, UserData);
94 };
95 
97 template <class Param1, class Param2, class Functor>
98 class SlotCallback_v2_functor : public SlotCallback_v2<Param1, Param2>
99 {
100 public:
102  : functor(functor) { return; }
103  void invoke(Param1 param1, Param2 param2) { functor(param1, param2); }
104  Functor functor;
105 };
106 
109 template <class Param1, class Param2>
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, Param2))
129  {
130  clean_up();
131  std::shared_ptr<SlotCallback> callback(
133  impl->connected_slots.push_back(callback);
134  return Slot(callback);
135  }
136 
137  template<class UserData>
138  Slot connect(void (*function)(Param1, Param2, UserData), const UserData &user_data)
139  {
140  clean_up();
141  std::shared_ptr<SlotCallback> callback(
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, Param2))
149  {
150  clean_up();
151  std::shared_ptr<SlotCallback> callback(
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, Param2, UserData), const UserData &user_data)
159  {
160  clean_up();
161  std::shared_ptr<SlotCallback> callback(
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, Param2 param2) 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_v2<Param1, Param2> *) callbacks[i].get())->invoke(param1, param2);
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 
(Internal ClanLib Class)
Definition: signal_v2.h:85
void invoke(Param1 param1, Param2 param2)
Definition: signal_v2.h:90
InstanceClass * instance
Definition: signal_v2.h:79
void(InstanceClass::* member_func)(Param1, Param2)
Definition: signal_v2.h:80
void invoke(Param1 param1, Param2 param2)
Definition: signal_v2.h:66
void(InstanceClass::* member_func)(Param1, Param2, UserData)
Definition: signal_v2.h:92
SlotCallback_v2_static(void(*static_func)(Param1, Param2))
Definition: signal_v2.h:53
void(* static_func)(Param1, Param2)
Definition: signal_v2.h:56
(Internal ClanLib Class)
Definition: signal_v2.h:98
Signal_v2(const Signal_v2< Param1, Param2 > &copy)
Definition: signal_v2.h:119
(Internal ClanLib Class)
Definition: signal_v2.h:42
Functor functor
Definition: signal_v2.h:104
Slot connect(void(*function)(Param1, Param2, UserData), const UserData &user_data)
Definition: signal_v2.h:138
void invoke(Param1 param1, Param2 param2)
Definition: signal_v2.h:55
Definition: userdata.h:47
Signal_v2.
Definition: signal_v2.h:110
UserData user_data
Definition: signal_v2.h:68
InstanceClass * instance
Definition: signal_v2.h:91
Slot connect(InstanceClass *instance, void(InstanceClass::*function)(Param1, Param2))
Definition: signal_v2.h:148
void invoke(Param1 param1, Param2 param2)
Definition: signal_v2.h:78
SlotCallback_v2_member(InstanceClass *instance, void(InstanceClass::*member_func)(Param1, Param2))
Definition: signal_v2.h:76
(Internal ClanLib Class)
Definition: signal_v2.h:73
SlotCallback_v2_member_user(InstanceClass *instance, void(InstanceClass::*member_func)(Param1, Param2, UserData), const UserData &user_data)
Definition: signal_v2.h:88
void invoke(Param1 param1, Param2 param2) const
Definition: signal_v2.h:177
Signal_v2()
Definition: signal_v2.h:116
Slot connect_functor(const Functor &functor)
Definition: signal_v2.h:168
(Internal ClanLib Class)
Definition: signal_v2.h:50
Slot.
Definition: slot.h:41
void invoke(Param1 param1, Param2 param2)
Definition: signal_v2.h:103
(Internal ClanLib Class)
Definition: signals_impl.h:62
virtual void invoke(Param1 param1, Param2 param2)=0
SlotCallback_v2_functor(const Functor &functor)
Definition: signal_v2.h:101
(Internal ClanLib Class)
Definition: signal_v2.h:61
SlotCallback_v2_static_user(void(*static_func)(Param1, Param2, UserData), const UserData &user_data)
Definition: signal_v2.h:64
Slot connect(void(*function)(Param1, Param2))
Definition: signal_v2.h:128
Slot connect(InstanceClass *instance, void(InstanceClass::*function)(Param1, Param2, UserData), const UserData &user_data)
Definition: signal_v2.h:158
void(* static_func)(Param1, Param2, UserData)
Definition: signal_v2.h:67
UserData user_data
Definition: signal_v2.h:93
(Internal ClanLib Class)
Definition: signals_impl.h:40