5 #include "Function.hpp"
9 /* Signal class, not support copy now!! */
10 template<typename signature
>
13 #define SCX_SIGNAL_COPY_SIGNAL_COMMON \
17 for (size_t i = 0; i < m_Slots.size(); ++i) { \
22 template<typename fn_t, typename pv_t> \
23 const Function_t* Connect(fn_t fn, pv_t pv) \
25 Function_t* pslot = new Function_t(fn, pv); \
26 m_Slots.push_back(pslot); \
30 template<typename fn_t> \
31 const Function_t* Connect(fn_t fn) \
33 Function_t* pslot = new Function_t(fn); \
34 m_Slots.push_back(pslot); \
38 void Connect(Signal* sig) \
40 m_Signals.push_back(sig); \
43 void Disconnect(const Function_t* fn) \
45 for (size_t i = 0; i < m_Slots.size(); ++i) { \
46 if (m_Slots[i] == fn) { \
48 m_Slots.erase(m_Slots.begin() + i); \
54 void Disconnect(const Signal* sig) \
56 for (size_t i = 0; i < m_Signals.size(); ++i) { \
57 if (m_Signals[i] == sig) { \
58 m_Signals.erase(m_Signals.begin() + i); \
64 template<typename recv_t> \
65 void DisconnectReceiver(recv_t* recv) \
67 for (int i = m_Slots.size()-1; i >= 0; --i) { \
68 if ((m_Slots[i]->GetReceiver()) == recv) { \
70 m_Slots.erase(m_Slots.begin() + i); \
75 void Reserve(const size_t size) \
77 m_Slots.Reserve(size); \
78 m_Signals.Reserve(size); \
82 std::vector<Function_t*> m_Slots; \
83 std::vector<Signal*> m_Signals
85 template<typename ret_t
, typename arg_t
>
86 class Signal
<ret_t (arg_t
)>
88 typedef Function
<ret_t (arg_t
)> Function_t
;
90 SCX_SIGNAL_COPY_SIGNAL_COMMON
;
93 void operator()(arg_t arg
) const
95 for (size_t i
= 0; i
< m_Slots
.size(); ++i
) {
99 for (size_t i
= 0; i
< m_Signals
.size(); ++i
) {
100 (*m_Signals
[i
])(arg
);
105 template<typename ret_t
>
106 class Signal
<ret_t (void)>
108 typedef Function
<ret_t (void)> Function_t
;
110 SCX_SIGNAL_COPY_SIGNAL_COMMON
;
113 void operator()(void) const
115 for (size_t i
= 0; i
< m_Slots
.size(); ++i
) {
119 for (size_t i
= 0; i
< m_Signals
.size(); ++i
) {
125 template<typename ret_t
,
128 class Signal
<ret_t (arg1_t
, arg2_t
)>
130 typedef Function
<ret_t (arg1_t
, arg2_t
)> Function_t
;
132 SCX_SIGNAL_COPY_SIGNAL_COMMON
;
135 void operator()(arg1_t arg1
, arg2_t arg2
) const
137 for (size_t i
= 0; i
< m_Slots
.size(); ++i
) {
138 (*m_Slots
[i
])(arg1
, arg2
);
141 for (size_t i
= 0; i
< m_Signals
.size(); ++i
) {
142 (*m_Signals
[i
])(arg1
, arg2
);
147 template<typename ret_t
,
151 class Signal
<ret_t (arg1_t
, arg2_t
, arg3_t
)>
153 typedef Function
<ret_t (arg1_t
, arg2_t
, arg3_t
)> Function_t
;
155 SCX_SIGNAL_COPY_SIGNAL_COMMON
;
158 void operator()(arg1_t arg1
, arg2_t arg2
, arg3_t arg3
) const
160 for (size_t i
= 0; i
< m_Slots
.size(); ++i
) {
161 (*m_Slots
[i
])(arg1
, arg2
, arg3
);
164 for (size_t i
= 0; i
< m_Signals
.size(); ++i
) {
165 (*m_Signals
[i
])(arg1
, arg2
, arg3
);
170 template<typename ret_t
,
175 class Signal
<ret_t (arg1_t
, arg2_t
, arg3_t
, arg4_t
)>
177 typedef Function
<ret_t (arg1_t
, arg2_t
, arg3_t
, arg4_t
)> Function_t
;
179 SCX_SIGNAL_COPY_SIGNAL_COMMON
;
182 void operator()(arg1_t arg1
, arg2_t arg2
, arg3_t arg3
, arg4_t arg4
) const
184 for (size_t i
= 0; i
< m_Slots
.size(); ++i
) {
185 (*m_Slots
[i
])(arg1
, arg2
, arg3
, arg4
);
188 for (size_t i
= 0; i
< m_Signals
.size(); ++i
) {
189 (*m_Signals
[i
])(arg1
, arg2
, arg3
, arg4
);
194 template<typename ret_t
,
200 class Signal
<ret_t (arg1_t
, arg2_t
, arg3_t
, arg4_t
, arg5_t
)>
202 typedef Function
<ret_t (arg1_t
, arg2_t
, arg3_t
, arg4_t
, arg5_t
)> Function_t
;
204 SCX_SIGNAL_COPY_SIGNAL_COMMON
;
207 void operator()(arg1_t arg1
, arg2_t arg2
, arg3_t arg3
, arg4_t arg4
, arg5_t arg5
) const
209 for (size_t i
= 0; i
< m_Slots
.size(); ++i
) {
210 (*m_Slots
[i
])(arg1
, arg2
, arg3
, arg4
, arg5
);
213 for (size_t i
= 0; i
< m_Signals
.size(); ++i
) {
214 (*m_Signals
[i
])(arg1
, arg2
, arg3
, arg4
, arg5
);
219 #undef SCX_SIGNAL_COPY_SIGNAL_COMMON