signal_v6.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, class Param5, class Param6>
43 {
44 public:
45  virtual void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6) = 0;
46 };
47 
49 template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6>
50 class SlotCallback_v6_static : public SlotCallback_v6<Param1, Param2, Param3, Param4, Param5, Param6>
51 {
52 public:
53  SlotCallback_v6_static(void (*static_func)(Param1, Param2, Param3, Param4, Param5, Param6))
54  : static_func(static_func) { return; }
55  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6) { static_func(param1, param2, param3, param4, param5, param6); }
56  void (*static_func)(Param1, Param2, Param3, Param4, Param5, Param6);
57 };
58 
60 template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class UserData>
61 class SlotCallback_v6_static_user : public SlotCallback_v6<Param1, Param2, Param3, Param4, Param5, Param6>
62 {
63 public:
64  SlotCallback_v6_static_user(void (*static_func)(Param1, Param2, Param3, Param4, Param5, Param6, 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, Param5 param5, Param6 param6) { static_func(param1, param2, param3, param4, param5, param6, user_data); }
67  void (*static_func)(Param1, Param2, Param3, Param4, Param5, Param6, UserData);
69 };
70 
72 template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class InstanceClass>
73 class SlotCallback_v6_member : public SlotCallback_v6<Param1, Param2, Param3, Param4, Param5, Param6>
74 {
75 public:
76  SlotCallback_v6_member(InstanceClass *instance, void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5, Param6))
77  : instance(instance), member_func(member_func) { return; }
78  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6) { (instance->*member_func)(param1, param2, param3, param4, param5, param6); }
79  InstanceClass *instance;
80  void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5, Param6);
81 };
82 
84 template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class InstanceClass, class UserData>
85 class SlotCallback_v6_member_user : public SlotCallback_v6<Param1, Param2, Param3, Param4, Param5, Param6>
86 {
87 public:
88  SlotCallback_v6_member_user(InstanceClass *instance, void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5, Param6, 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, Param5 param5, Param6 param6) { (instance->*member_func)(param1, param2, param3, param4, param5, param6, user_data); }
91  InstanceClass *instance;
92  void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5, Param6, UserData);
94 };
95 
97 template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Functor>
98 class SlotCallback_v6_functor : public SlotCallback_v6<Param1, Param2, Param3, Param4, Param5, Param6>
99 {
100 public:
102  : functor(functor) { return; }
103  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6) { functor(param1, param2, param3, param4, param5, param6); }
104  Functor functor;
105 };
106 
109 template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6>
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, Param5, Param6))
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, Param5, Param6, 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, Param5, Param6))
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, Param5, Param6, 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, Param5 param5, Param6 param6) 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_v6<Param1, Param2, Param3, Param4, Param5, Param6> *) callbacks[i].get())->invoke(param1, param2, param3, param4, param5, param6);
185  }
186 
190 
191 private:
192  void clean_up()
193  {
194  std::vector< std::shared_ptr<SlotCallback> >::size_type i, size;
195  size = impl->connected_slots.size();
196  for (i = 0; i < size; i++)
197  {
198  if (!impl->connected_slots[i]->valid)
199  {
200  impl->connected_slots.erase(impl->connected_slots.begin()+i);
201  i--;
202  size--;
203  }
204  }
205  }
206 
207  std::shared_ptr<Signal_Impl> impl;
209 };
210 
211 }
212 
Signal_v6.
Definition: signal_v6.h:110
(Internal ClanLib Class)
Definition: signal_v6.h:85
Slot connect(InstanceClass *instance, void(InstanceClass::*function)(Param1, Param2, Param3, Param4, Param5, Param6))
Definition: signal_v6.h:148
InstanceClass * instance
Definition: signal_v6.h:91
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6)
Definition: signal_v6.h:90
SlotCallback_v6_member_user(InstanceClass *instance, void(InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5, Param6, UserData), const UserData &user_data)
Definition: signal_v6.h:88
InstanceClass * instance
Definition: signal_v6.h:79
SlotCallback_v6_member(InstanceClass *instance, void(InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5, Param6))
Definition: signal_v6.h:76
SlotCallback_v6_static_user(void(*static_func)(Param1, Param2, Param3, Param4, Param5, Param6, UserData), const UserData &user_data)
Definition: signal_v6.h:64
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6)
Definition: signal_v6.h:55
SlotCallback_v6_functor(const Functor &functor)
Definition: signal_v6.h:101
Slot connect(void(*function)(Param1, Param2, Param3, Param4, Param5, Param6))
Definition: signal_v6.h:128
SlotCallback_v6_static(void(*static_func)(Param1, Param2, Param3, Param4, Param5, Param6))
Definition: signal_v6.h:53
Slot connect_functor(const Functor &functor)
Definition: signal_v6.h:168
(Internal ClanLib Class)
Definition: signal_v6.h:98
Definition: userdata.h:47
void(InstanceClass::* member_func)(Param1, Param2, Param3, Param4, Param5, Param6, UserData)
Definition: signal_v6.h:92
Slot connect(InstanceClass *instance, void(InstanceClass::*function)(Param1, Param2, Param3, Param4, Param5, Param6, UserData), const UserData &user_data)
Definition: signal_v6.h:158
UserData user_data
Definition: signal_v6.h:93
(Internal ClanLib Class)
Definition: signal_v6.h:42
void(InstanceClass::* member_func)(Param1, Param2, Param3, Param4, Param5, Param6)
Definition: signal_v6.h:80
(Internal ClanLib Class)
Definition: signal_v6.h:73
void(* static_func)(Param1, Param2, Param3, Param4, Param5, Param6, UserData)
Definition: signal_v6.h:67
(Internal ClanLib Class)
Definition: signal_v6.h:50
Slot.
Definition: slot.h:41
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6)
Definition: signal_v6.h:78
(Internal ClanLib Class)
Definition: signals_impl.h:62
Signal_v6()
Definition: signal_v6.h:116
Slot connect(void(*function)(Param1, Param2, Param3, Param4, Param5, Param6, UserData), const UserData &user_data)
Definition: signal_v6.h:138
(Internal ClanLib Class)
Definition: signal_v6.h:61
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6) const
Definition: signal_v6.h:177
Signal_v6(const Signal_v6< Param1, Param2, Param3, Param4, Param5, Param6 > &copy)
Definition: signal_v6.h:119
UserData user_data
Definition: signal_v6.h:68
(Internal ClanLib Class)
Definition: signals_impl.h:40
virtual void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6)=0
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6)
Definition: signal_v6.h:66
void(* static_func)(Param1, Param2, Param3, Param4, Param5, Param6)
Definition: signal_v6.h:56
void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, Param6 param6)
Definition: signal_v6.h:103
Functor functor
Definition: signal_v6.h:104