ClanLib  2.3.7
signal_v5.h
Go to the documentation of this file.
1 /*
2 ** ClanLib SDK
3 ** Copyright (c) 1997-2011 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 
31 
32 #pragma once
33 
34 #include "slot.h"
35 #include "signals_impl.h"
36 
39 template <class Param1, class Param2, class Param3, class Param4, class Param5>
41 {
42 public:
43  virtual void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5) = 0;
44 };
45 
48 template <class Param1, class Param2, class Param3, class Param4, class Param5>
49 class CL_SlotCallback_v5_static : public CL_SlotCallback_v5<Param1, Param2, Param3, Param4, Param5>
50 {
51 public:
52  CL_SlotCallback_v5_static(void (*static_func)(Param1, Param2, Param3, Param4, Param5))
53  : static_func(static_func) { return; }
54  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5) { static_func(param1, param2, param3, param4, param5); }
55  void (*static_func)(Param1, Param2, Param3, Param4, Param5);
56 };
57 
60 template <class Param1, class Param2, class Param3, class Param4, class Param5, class UserData>
61 class CL_SlotCallback_v5_static_user : public CL_SlotCallback_v5<Param1, Param2, Param3, Param4, Param5>
62 {
63 public:
64  CL_SlotCallback_v5_static_user(void (*static_func)(Param1, Param2, Param3, Param4, Param5, 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) { static_func(param1, param2, param3, param4, param5, user_data); }
67  void (*static_func)(Param1, Param2, Param3, Param4, Param5, UserData);
68  UserData user_data;
69 };
70 
73 template <class Param1, class Param2, class Param3, class Param4, class Param5, class InstanceClass>
74 class CL_SlotCallback_v5_member : public CL_SlotCallback_v5<Param1, Param2, Param3, Param4, Param5>
75 {
76 public:
77  CL_SlotCallback_v5_member(InstanceClass *instance, void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5))
78  : instance(instance), member_func(member_func) { return; }
79  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5) { (instance->*member_func)(param1, param2, param3, param4, param5); }
80  InstanceClass *instance;
81  void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5);
82 };
83 
86 template <class Param1, class Param2, class Param3, class Param4, class Param5, class InstanceClass, class UserData>
87 class CL_SlotCallback_v5_member_user : public CL_SlotCallback_v5<Param1, Param2, Param3, Param4, Param5>
88 {
89 public:
90  CL_SlotCallback_v5_member_user(InstanceClass *instance, void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5, UserData), const UserData &user_data)
91  : instance(instance), member_func(member_func), user_data(user_data) { return; }
92  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5) { (instance->*member_func)(param1, param2, param3, param4, param5, user_data); }
93  InstanceClass *instance;
94  void (InstanceClass::*member_func)(Param1, Param2, Param3, Param4, Param5, UserData);
95  UserData user_data;
96 };
97 
100 template <class Param1, class Param2, class Param3, class Param4, class Param5, class Functor>
101 class CL_SlotCallback_v5_functor : public CL_SlotCallback_v5<Param1, Param2, Param3, Param4, Param5>
102 {
103 public:
105  : functor(functor) { return; }
106  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5) { functor(param1, param2, param3, param4, param5); }
107  Functor functor;
108 };
109 
113 template <class Param1, class Param2, class Param3, class Param4, class Param5>
115 {
118 
119 public:
121  : impl(new CL_Signal_Impl) { return; }
122 
124  : impl(copy.impl) { return; }
125 
126 
130 
131 public:
132  CL_Slot connect(void (*function)(Param1, Param2, Param3, Param4, Param5))
133  {
134  clean_up();
135  CL_SharedPtr<CL_SlotCallback> callback(
137  impl->connected_slots.push_back(callback);
138  return CL_Slot(callback);
139  }
140 
141  template<class UserData>
142  CL_Slot connect(void (*function)(Param1, Param2, Param3, Param4, Param5, UserData), const UserData &user_data)
143  {
144  clean_up();
145  CL_SharedPtr<CL_SlotCallback> callback(
147  impl->connected_slots.push_back(callback);
148  return CL_Slot(callback);
149  }
150 
151  template<class InstanceClass>
152  CL_Slot connect(InstanceClass *instance, void (InstanceClass::*function)(Param1, Param2, Param3, Param4, Param5))
153  {
154  clean_up();
155  CL_SharedPtr<CL_SlotCallback> callback(
157  impl->connected_slots.push_back(callback);
158  return CL_Slot(callback);
159  }
160 
161  template<class InstanceClass, class UserData>
162  CL_Slot connect(InstanceClass *instance, void (InstanceClass::*function)(Param1, Param2, Param3, Param4, Param5, UserData), const UserData &user_data)
163  {
164  clean_up();
165  CL_SharedPtr<CL_SlotCallback> callback(
167  impl->connected_slots.push_back(callback);
168  return CL_Slot(callback);
169  }
170 
171  template<class Functor>
172  CL_Slot connect_functor(const Functor &functor)
173  {
174  clean_up();
175  CL_SharedPtr<CL_SlotCallback> callback(
177  impl->connected_slots.push_back(callback);
178  return CL_Slot(callback);
179  }
180 
181  void invoke(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5) const
182  {
183  std::vector< CL_SharedPtr<CL_SlotCallback> > callbacks = impl->connected_slots;
184  std::vector< CL_SharedPtr<CL_SlotCallback> >::size_type i, size;
185  size = callbacks.size();
186  for (i = 0; i < size; i++)
187  if (callbacks[i]->valid && callbacks[i]->enabled)
188  ((CL_SlotCallback_v5<Param1, Param2, Param3, Param4, Param5> *) callbacks[i].get())->invoke(param1, param2, param3, param4, param5);
189  }
190 
191 
195 
196 private:
197  void clean_up()
198  {
199  std::vector< CL_SharedPtr<CL_SlotCallback> >::size_type i, size;
200  size = impl->connected_slots.size();
201  for (i = 0; i < size; i++)
202  {
203  if (!impl->connected_slots[i]->valid)
204  {
205  impl->connected_slots.erase(impl->connected_slots.begin()+i);
206  i--;
207  size--;
208  }
209  }
210  }
211 
212  CL_SharedPtr<CL_Signal_Impl> impl;
214 };
215 
216