soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SEventSlot.h
1#ifndef __SEVENTSLOT__H__
2#define __SEVENTSLOT__H__
3
4#include <interface/SEvtArgs-i.h>
5#include <helper/obj-ref-impl.hpp>
6
7#if !defined(_WIN32) || _MSC_VER >= 1700
8#define ENABLE_STDFUNCTOR 1
9#else
10#define ENABLE_STDFUNCTOR 0
11#endif
12
13#if ENABLE_STDFUNCTOR
14#include <functional>
15#endif
16
17SNSBEGIN
18
19/**
20 * @enum _SLOTTYPE
21 * @brief 定义了事件槽的类型
22 */
23enum _SLOTTYPE
24{
25 SLOT_FUN, ///< 自由函数槽
26 SLOT_STDFUNCTOR, ///< 标准函数对象槽
27 SLOT_MEMBER, ///< 成员函数槽
28 SLOT_USER ///< 用户自定义槽
29};
30
31/**
32 * @class FreeFunctionSlot
33 * @brief 通过自由函数指针回调的槽函数类
34 */
35class FreeFunctionSlot : public TObjRefImpl<IEvtSlot> {
36 public:
37 /**
38 * @brief 构造函数
39 * @param func 自由函数指针
40 * @param ctx 上下文指针
41 */
42 FreeFunctionSlot(FunCallback func, void *ctx)
43 : d_function(func)
44 , d_ctx(ctx)
45 {
46 }
47
48 /**
49 * @brief 运行槽函数
50 * @param pArg 事件参数对象
51 * @return 成功返回TRUE,失败返回FALSE
52 */
53 STDMETHOD_(BOOL, Run)(THIS_ IEvtArgs *pArg) OVERRIDE
54 {
55 return d_function(pArg, d_ctx);
56 }
57
58 /**
59 * @brief 克隆槽函数对象
60 * @return 克隆的槽函数对象指针
61 */
62 STDMETHOD_(IEvtSlot *, Clone)(THIS) SCONST OVERRIDE
63 {
64 return new FreeFunctionSlot(d_function, d_ctx);
65 }
66
67 /**
68 * @brief 比较两个槽函数对象是否相等
69 * @param sour 源槽函数对象指针
70 * @return 相等返回TRUE,不相等返回FALSE
71 */
72 STDMETHOD_(BOOL, Equal)(THIS_ const IEvtSlot *sour) SCONST OVERRIDE
73 {
74 if (sour->GetSlotType() != SLOT_FUN)
75 return FALSE;
76 const FreeFunctionSlot *psour = static_cast<const FreeFunctionSlot *>(sour);
77 SASSERT(psour);
78 return psour->d_function == d_function && psour->d_ctx == d_ctx;
79 }
80
81 /**
82 * @brief 获取槽函数类型
83 * @return 槽函数类型
84 */
85 STDMETHOD_(UINT, GetSlotType)(THIS) SCONST OVERRIDE
86 {
87 return SLOT_FUN;
88 }
89
90 private:
91 FunCallback d_function; ///< 自由函数指针
92 void *d_ctx; ///< 上下文指针
93};
94
95#if ENABLE_STDFUNCTOR
96typedef std::function<BOOL(IEvtArgs *)> StdFunCallback;
97
98/**
99 * @class StdFunctionSlot
100 * @brief 通过标准函数对象回调的槽函数类
101 */
102class StdFunctionSlot : public TObjRefImpl<IEvtSlot> {
103 public:
104 /**
105 * @brief 构造函数
106 * @param fun 标准函数对象
107 */
108 StdFunctionSlot(const StdFunCallback &fun)
109 : d_function(fun)
110 {
111 }
112
113 /**
114 * @brief 运行槽函数
115 * @param pArg 事件参数对象
116 * @return 成功返回TRUE,失败返回FALSE
117 */
118 STDMETHOD_(BOOL, Run)(THIS_ IEvtArgs *pArg) OVERRIDE
119 {
120 return d_function(pArg);
121 }
122
123 /**
124 * @brief 克隆槽函数对象
125 * @return 克隆的槽函数对象指针
126 */
127 STDMETHOD_(IEvtSlot *, Clone)(THIS) SCONST OVERRIDE
128 {
129 return new StdFunctionSlot(d_function);
130 }
131
132 /**
133 * @brief 比较两个槽函数对象是否相等
134 * @param sour 源槽函数对象指针
135 * @return 相等返回TRUE,不相等返回FALSE
136 */
137 STDMETHOD_(BOOL, Equal)(THIS_ const IEvtSlot *sour) SCONST OVERRIDE
138 {
139 SASSERT(sour);
140 if (sour->GetSlotType() != SLOT_STDFUNCTOR)
141 return FALSE;
142 // Note: as we don't know how to compare two std::function objects, here just return TRUE.
143 // Such a behavior will make it impossible to subscribe an event with two different slots.
144 return TRUE;
145 }
146
147 /**
148 * @brief 获取槽函数类型
149 * @return 槽函数类型
150 */
151 STDMETHOD_(UINT, GetSlotType)(THIS) SCONST OVERRIDE
152 {
153 return SLOT_STDFUNCTOR;
154 }
155
156 private:
157 StdFunCallback d_function; ///< 标准函数对象
158};
159#endif // ENABLE_STDFUNCTOR
160
161/**
162 * @class MemberFunctionSlot
163 * @brief 通过类成员函数回调的槽函数类模板
164 * @tparam T 类型
165 * @tparam A 事件参数类型
166 */
167template <typename T, typename A>
168class MemberFunctionSlot : public TObjRefImpl<IEvtSlot> {
169 public:
170 /**
171 * @brief 成员函数槽类型
172 */
173 typedef BOOL (T::*MemberFunctionType)(A *);
174
175 /**
176 * @brief 构造函数
177 * @param func 成员函数指针
178 * @param obj 对象指针
179 */
181 : d_function(func)
182 , d_object(obj)
183 {
184 }
185
186 /**
187 * @brief 运行槽函数
188 * @param pArg 事件参数对象
189 * @return 成功返回TRUE,失败返回FALSE
190 */
191 STDMETHOD_(BOOL, Run)(THIS_ IEvtArgs *pArg) OVERRIDE
192 {
193 return (d_object->*d_function)(static_cast<A *>(pArg));
194 }
195
196 /**
197 * @brief 克隆槽函数对象
198 * @return 克隆的槽函数对象指针
199 */
200 STDMETHOD_(IEvtSlot *, Clone)(THIS) SCONST OVERRIDE
201 {
202 return new MemberFunctionSlot(d_function, d_object);
203 }
204
205 /**
206 * @brief 比较两个槽函数对象是否相等
207 * @param sour 源槽函数对象指针
208 * @return 相等返回TRUE,不相等返回FALSE
209 */
210 STDMETHOD_(BOOL, Equal)(THIS_ const IEvtSlot *sour) SCONST OVERRIDE
211 {
212 SASSERT(sour);
213 if (sour->GetSlotType() != GetSlotType())
214 return FALSE;
215 const MemberFunctionSlot *psour = static_cast<const MemberFunctionSlot *>(sour);
216 SASSERT(psour);
217 return psour->d_function == d_function && psour->d_object == d_object;
218 }
219
220 /**
221 * @brief 获取槽函数类型
222 * @return 槽函数类型
223 */
224 STDMETHOD_(UINT, GetSlotType)(THIS) SCONST OVERRIDE
225 {
226 return SLOT_MEMBER;
227 }
228
229 private:
230 MemberFunctionType d_function; ///< 成员函数指针
231 T *d_object; ///< 对象指针
232};
233
234template <typename T, typename A = IEvtArgs>
236
237/**
238 * @brief 创建成员函数槽对象
239 * @tparam T 类型
240 * @tparam A 事件参数类型
241 * @param pFn 成员函数指针
242 * @param pObject 对象指针
243 * @return 成员函数槽对象
244 */
245template <class T, class A>
246MemberFunctionSlot<T, A> Subscriber(BOOL (T::*pFn)(A *), T *pObject)
247{
248 return MemberFunctionSlot<T, A>(pFn, pObject);
249}
250
251/**
252 * @brief 创建自由函数槽对象
253 * @param pFn 自由函数指针
254 * @param ctx 上下文指针
255 * @return 自由函数槽对象
256 */
257inline FreeFunctionSlot Subscriber(FunCallback pFn, void *ctx)
258{
259 return FreeFunctionSlot(pFn, ctx);
260}
261
262SNSEND
263#endif // __SEVENTSLOT__H__
通过自由函数指针回调的槽函数类
Definition SEventSlot.h:35
FreeFunctionSlot(FunCallback func, void *ctx)
构造函数
Definition SEventSlot.h:42
UINT GetSlotType() SCONST OVERRIDE
获取槽函数类型
Definition SEventSlot.h:85
BOOL Run(IEvtArgs *pArg) OVERRIDE
运行槽函数
Definition SEventSlot.h:53
BOOL Equal(const IEvtSlot *sour) SCONST OVERRIDE
比较两个槽函数对象是否相等
Definition SEventSlot.h:72
IEvtSlot * Clone() SCONST OVERRIDE
克隆槽函数对象
Definition SEventSlot.h:62
通过类成员函数回调的槽函数类模板
Definition SEventSlot.h:168
BOOL(T::* MemberFunctionType)(A *)
成员函数槽类型
Definition SEventSlot.h:173
MemberFunctionSlot(MemberFunctionType func, T *obj)
构造函数
Definition SEventSlot.h:180
BOOL Equal(const IEvtSlot *sour) SCONST OVERRIDE
比较两个槽函数对象是否相等
Definition SEventSlot.h:210
UINT GetSlotType() SCONST OVERRIDE
获取槽函数类型
Definition SEventSlot.h:224
BOOL Run(IEvtArgs *pArg) OVERRIDE
运行槽函数
Definition SEventSlot.h:191
IEvtSlot * Clone() SCONST OVERRIDE
克隆槽函数对象
Definition SEventSlot.h:200
BOOL Run(IEvtArgs *pArg) OVERRIDE
运行槽函数
Definition SEventSlot.h:118
IEvtSlot * Clone() SCONST OVERRIDE
克隆槽函数对象
Definition SEventSlot.h:127
StdFunctionSlot(const StdFunCallback &fun)
构造函数
Definition SEventSlot.h:108
BOOL Equal(const IEvtSlot *sour) SCONST OVERRIDE
比较两个槽函数对象是否相等
Definition SEventSlot.h:137
UINT GetSlotType() SCONST OVERRIDE
获取槽函数类型
Definition SEventSlot.h:151