signal_v4.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, class Param3, class Param4>
43 {
44 public:
45  virtual void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4) = 0;
46 };
47 
49 template <class Param1, class Param2, class Param3, class Param4>
50 class SlotCallback_v4_static : public SlotCallback_v4<Param1, Param2, Param3, Param4>
51 {
52 public:
53  SlotCallback_v4_static(void (*static_func)(Param1, Param2, Param3, Param4))
54  : static_func(static_func) { return; }
55  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4) { static_func(param1, param2, param3, param4); }
56  void (*static_func)(Param1, Param2, Param3, Param4);
57 };
58 
60 template <class Param1, class Param2, class Param3, class Param4, class UserData>
61 class SlotCallback_v4_static_user : public SlotCallback_v4<Param1, Param2, Param3, Param4>
62 {
63 public:
64  SlotCallback_v4_static_user(void (*static_func)(Param1, Param2, Param3, Param4, UserData), const UserData &user_data)
65  : static_func(static_func), user_data(user_data) { return; }
66  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4) { static_func(param1, param2, param3, param4, user_data); }
67  void (*static_func)(Param1, Param2, Param3, Param4, UserData);
69 };
70 
72 template <class Param1, class Param2, class Param3, class Param4, class InstanceClass>
73 class SlotCallback_v4_member : public SlotCallback_v4<Param1, Param2, Param3, Param4>
74 {
75 public:
76  SlotCallback_v4_member(InstanceClass *instance, void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4))
77  : instance(instance), member_func(member_func) { return; }
78  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4) { (instance->*member_func)(param1, param2, param3, param4); }
79  InstanceClass *instance;
80  void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4);
81 };
82 
84 template <class Param1, class Param2, class Param3, class Param4, class InstanceClass, class UserData>
85 class SlotCallback_v4_member_user : public SlotCallback_v4<Param1, Param2, Param3, Param4>
86 {
87 public:
88  SlotCallback_v4_member_user(InstanceClass *instance, void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, UserData), const UserData &user_data)
89  : instance(instance), member_func(member_func), user_data(user_data) { return; }
90  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4) { (instance->*member_func)(param1, param2, param3, param4, user_data); }
91  InstanceClass *instance;
92  void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, UserData);
94 };
95 
97 template <class Param1, class Param2, class Param3, class Param4, class Functor>
98 class SlotCallback_v4_functor : public SlotCallback_v4<Param1, Param2, Param3, Param4>
99 {
100 public:
102  : functor(functor) { return; }
103  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4) { functor(param1, param2, param3, param4); }
104  Functor functor;
105 };
106 
109 template <class Param1, class Param2, class Param3, class Param4>
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, Param3, Param4))
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, Param3, Param4, 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, Param3, Param4))
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, Param3, Param4, 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, Param3 param3, Param4 param4) 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_v4<Param1, Param2, Param3, Param4> *) callbacks[i].get())->invoke(param1, param2, param3, param4);
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_v4.h:85
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4)
Definition: signal_v4.h:66
Slot connect(void(*function)(Param1, Param2, Param3, Param4))
Definition: signal_v4.h:128
(Internal ClanLib Class)
Definition: signal_v4.h:42
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4)
Definition: signal_v4.h:55
InstanceClass * instance
Definition: signal_v4.h:91
SlotCallback_v4_member_user(InstanceClass *instance, void(InstanceClass::*member_func)(Param1, Param2, Param3, Param4, UserData), const UserData &user_data)
Definition: signal_v4.h:88
Slot connect(void(*function)(Param1, Param2, Param3, Param4, UserData), const UserData &user_data)
Definition: signal_v4.h:138
void(* static_func)(Param1, Param2, Param3, Param4, UserData)
Definition: signal_v4.h:67
SlotCallback_v4_static_user(void(*static_func)(Param1, Param2, Param3, Param4, UserData), const UserData &user_data)
Definition: signal_v4.h:64
Slot connect(InstanceClass *instance, void(InstanceClass::*function)(Param1, Param2, Param3, Param4))
Definition: signal_v4.h:148
virtual void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4)=0
Functor functor
Definition: signal_v4.h:104
Signal_v4()
Definition: signal_v4.h:116
SlotCallback_v4_member(InstanceClass *instance, void(InstanceClass::*member_func)(Param1, Param2, Param3, Param4))
Definition: signal_v4.h:76
Definition: userdata.h:47
Signal_v4.
Definition: signal_v4.h:110
(Internal ClanLib Class)
Definition: signal_v4.h:98
Slot connect_functor(const Functor &functor)
Definition: signal_v4.h:168
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4)
Definition: signal_v4.h:78
SlotCallback_v4_functor(const Functor &functor)
Definition: signal_v4.h:101
Signal_v4(const Signal_v4< Param1, Param2, Param3, Param4 > &copy)
Definition: signal_v4.h:119
Slot connect(InstanceClass *instance, void(InstanceClass::*function)(Param1, Param2, Param3, Param4, UserData), const UserData &user_data)
Definition: signal_v4.h:158
(Internal ClanLib Class)
Definition: signal_v4.h:73
InstanceClass * instance
Definition: signal_v4.h:79
void(* static_func)(Param1, Param2, Param3, Param4)
Definition: signal_v4.h:56
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4)
Definition: signal_v4.h:90
(Internal ClanLib Class)
Definition: signal_v4.h:50
Slot.
Definition: slot.h:41
(Internal ClanLib Class)
Definition: signals_impl.h:62
void(InstanceClass::* member_func)(Param1, Param2, Param3, Param4, UserData)
Definition: signal_v4.h:92
(Internal ClanLib Class)
Definition: signal_v4.h:61
void(InstanceClass::* member_func)(Param1, Param2, Param3, Param4)
Definition: signal_v4.h:80
UserData user_data
Definition: signal_v4.h:93
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4)
Definition: signal_v4.h:103
(Internal ClanLib Class)
Definition: signals_impl.h:40
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4) const
Definition: signal_v4.h:177
SlotCallback_v4_static(void(*static_func)(Param1, Param2, Param3, Param4))
Definition: signal_v4.h:53
UserData user_data
Definition: signal_v4.h:68