YSTest: ybasemac.h 源文件

YSTest PreAlpha_b400_20130424 The YSLib Test Project

- 首页
- 相关页面
- 模块
- 命名空间
- 类
- 文件

- 文件列表
- 文件成员

全部 类 命名空间 文件 函数 变量 类型定义 枚举 枚举值 友元 宏定义 组 页
ybasemac.h
浏览该文件的文档.
1 ﻿/*
2 Copyright by FrankHB 2010 - 2013.
3
4 This file is part of the YSLib project, and may only be used,
5 modified, and distributed under the terms of the YSLib project
6 license, LICENSE.TXT. By continuing to use, modify, or distribute
7 this file you indicate that you have read the license and
8 understand and accept it fully.
9 */
10
28 #ifndef YSL_INC_Adaptor_ybasemac_h_
29 #define YSL_INC_Adaptor_ybasemac_h_ 1
30
32
33 /*
34 \def yJOIN
35 \brief 记号连接。
36 ISO/IEC C++ 未确定宏定义内 # 和 ## 操作符求值顺序。
37 GCC 中，宏定义内 ## 操作符修饰的形式参数为宏时，此宏不会被展开。
38 详见：http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html 。
39 解决方案来源：
40 https://www.securecoding.cert.org/confluence/display/cplusplus/ \
41 PRE05-CPP.+Understand+macro+replacement+when+concatenating \
42 +tokens+or+performing+stringification 。
43 */
44 #define yJOIN(x, y) x ## y
45
46
47 // YSLib 命名空间宏。
48
49 #define YSL_BEGIN namespace YSLib {
50 #define YSL_END }
51
52 #define YSL_BEGIN_NAMESPACE(_n) namespace _n {
53 #define YSL_END_NAMESPACE(_n) }
54
55
56 /* \defgroup cmacro Macros For Code Compressing
57 \brief 缩写代码用的宏。
58
59 以下名构词缩写的含义：
60 Ctor constructor
61 Cvt converter
62 De default
63 Decl declare
64 Def define
65 Del deleted
66 Dtor destructor
67 Expr expression
68 Fn function
69 Fwd forward
70 H head
71 I interface
72 Impl implement
73 Mem member
74 Op operator
75 P partially
76 PDecl pre-declare
77 Pred predicate
78 Ret returning
79 S statically
80 Tmpl template
81
82 以下宏参数缩写的含义：
83 _a argument
84 _alist arguments list
85 _attr attributes
86 _b base
87 _e expression
88 _i interface
89 _m member
90 _n name
91 _op operator
92 _p parameter
93 _plist parameters list
94 _q qualifier(s)
95 _sig signature
96 _t type
97 \since 早于 build 132
98 */
100 //接口类型宏。
101
102 #define _yInterface struct
103
104 #define implements public
105
111 #define _yInterfaceHead(_n) { \
112 virtual ~_n() {}
113
114 #define FwdDeclI(_n) _yInterface _n;
115
116 /*
117 \def DeclI
118 \brief 定义接口类型。
119 \since build 362
120 */
121 #define DeclI(_attr, _n) \
122 _yInterface _attr _n \
123 _yInterfaceHead(_n)
124
125 //对于基接口需要显式指定访问权限和继承方式。
126
127 /*
128 \def DeclDerivedI
129 \brief 定义派生接口类型。
130 \note 由于接口定义为 struct 类型，因此通常只需指定是否为 virtual 继承。
131 \since build 362
132 */
133 #define DeclDerivedI(_attr, _n, ...) \
134 _yInterface _attr _n : __VA_ARGS__ \
135 _yInterfaceHead(_n)
136
137 // ImplI = Implements Interface;
138 #define ImplI(...) virtual
139
140 //抽象实现：保留接口供派生类实现（可以提供接口函数的默认实现）。
141 // ImplA = Implements Abstractly;
142 #define ImplA(...)
143
144 #define DeclIEntry(_sig) virtual _sig = 0;
145
146 #define EndDecl };
147
148
153 #define DeclSEntry(...)
154
158 #define ImplS(...)
159
160
166 #define DefExtendClass(_attr, _n, ...) \
167 class _attr _n : __VA_ARGS__ \
168 { \
169 public: \
170 _n(); \
171 };
172
173
174 //函数宏。
175
176 //通用头定义。
177 #define PDefH(_t, _n, ...) \
178 _t _n(__VA_ARGS__)
179 #define PDefHOp(_t, _op, ...) \
180 PDefH(_t, operator _op, __VA_ARGS__)
181
182 #define PDefCvt(_t) \
183 operator _t()
184
185
186 //简单通用函数实现。
187 //prefix "Impl" = Implementation;
188 #define ImplExpr(...) \
189 { \
190 (__VA_ARGS__), void(); \
191 }
192 #define ImplRet(...) \
193 { \
194 return (__VA_ARGS__); \
195 }
196 // NOTE: Need 'ydef.h'.
197 // NOTE: GCC complains about 'void(yunseq(__VA_ARGS__))'.
198 #define ImplUnseq(...) \
199 { \
200 static_cast<void>(yunseq(__VA_ARGS__)); \
201 }
202
203 //基类同名函数映射和成员同名函数映射实现。
204 //prefix "Impl" = Implement;
205 #define ImplBodyBase(_b, _n, ...) \
206 ImplRet(_b::_n(__VA_ARGS__))
207 #define ImplBodyMem(_m, _n, ...) \
208 ImplRet((_m)._n(__VA_ARGS__))
209
210
211 //简单通用成员函数定义。
212 //prefix "Def" = Define;
220 #define DefEmptyDtor(_t) \
221 ~_t() \
222 {}
223 #define ImplEmptyDtor(_t) \
224 inline _t::DefEmptyDtor(_t)
225
226 #define DefDeCtor(_t) \
227 _t() = default;
228 #define DefDelCtor(_t) \
229 _t() = delete;
230
231 #define DefDeCopyCtor(_t) \
232 _t(const _t&) = default;
233 #define DefDelCopyCtor(_t) \
234 _t(const _t&) = delete;
235
236 #define DefDeMoveCtor(_t) \
237 _t(_t&&) = default;
238 #define DefDelMoveCtor(_t) \
239 _t(_t&&) = delete;
240
241 #define DefDeDtor(_t) \
242 ~_t() = default;
243 #define DefDelDtor(_t) \
244 ~_t() = delete;
245
246 #define DefDeCopyAssignment(_t) \
247 _t& operator=(const _t&) = default;
248 #define DefDelCopyAssignment(_t) \
249 _t& operator=(const _t&) = delete;
250
251 #define DefDeMoveAssignment(_t) \
252 _t& operator=(_t&&) = default;
253 #define DefDelMoveAssignment(_t) \
254 _t& operator=(_t&&) = delete;
255
256 #define DefCvt(_q, _t, ...) \
257 operator _t() _q \
258 ImplRet(__VA_ARGS__)
259 #define DefCvtBase(_q, _t, _b) \
260 DefCvt(_q, _t, _b::operator _t())
261 #define DefCvtMem(_q, _t, _m) \
262 DefCvt(_q, _t, (_m).operator _t())
263
264 #define DefPred(_q, _n, ...) \
265 bool yJOIN(Is, _n)() _q \
266 ImplRet(__VA_ARGS__)
267 #define DefPredBase(_q, _n, _b) \
268 DefPred(_q, _n, _b::yJOIN(Is, _n)())
269 #define DefPredMem(_q, _n, _m) \
270 DefPred(_q, _n, (_m).yJOIN(Is, _n)())
271
272 #define DefGetter(_q, _t, _n, ...) \
273 _t yJOIN(Get, _n)() _q \
274 ImplRet(__VA_ARGS__)
275 #define DefGetterBase(_q, _t, _n, _b) \
276 DefGetter(_q, _t, _n, _b::yJOIN(Get, _n)())
277 #define DefGetterMem(_q, _t, _n, _m) \
278 DefGetter(_q, _t, _n, (_m).yJOIN(Get, _n)())
279
280 #define DefSetter(_t, _n, _m) \
281 void yJOIN(Set, _n)(_t _tempArgName) \
282 ImplExpr((_m) = _tempArgName)
283 #define DefSetterDe(_t, _n, _m, _defv) \
284 void yJOIN(Set, _n)(_t _tempArgName = _defv) \
285 ImplExpr((_m) = _tempArgName)
286 #define DefSetterBase(_t, _n, _b) \
287 void yJOIN(Set, _n)(_t _tempArgName) \
288 ImplExpr(_b::yJOIN(Set, _n)(_tempArgName))
289 #define DefSetterBaseDe(_t, _n, _b, _defv) \
290 void yJOIN(Set, _n)(_t _tempArgName = _defv) \
291 ImplExpr(_b::yJOIN(Set, _n)(_tempArgName))
292 #define DefSetterMem(_t, _n, _m) \
293 void yJOIN(Set, _n)(_t _tempArgName) \
294 ImplExpr((_m).yJOIN(Set, _n)(_tempArgName))
295 #define DefSetterMemDe(_t, _n, _m, _defv) \
296 void yJOIN(Set, _n)(_t _tempArgName = _defv) \
297 ImplExpr((_m).yJOIN(Set, _n)(_tempArgName))
298 #define DefSetterEx(_t, _n, _m, ...) \
299 void yJOIN(Set, _n)(_t _tempArgName) \
300 ImplExpr((_m) = (__VA_ARGS__))
301 #define DefSetterDeEx(_t, _n, _m, _defv, ...) \
302 void yJOIN(Set, _n)(_t _tempArgName = _defv) \
303 ImplExpr((_m) = (__VA_ARGS__))
304
305
313 #define DefClone(_q, _t, _n) \
314 _t* \
315 _n() _q \
316 { \
317 return new _t(*this); \
318 }
319
320
321 //成员函数和模板映射。
322
323
328 #define DefFwdFn(_q, _t, _n, ...) \
329 inline _t \
330 _n() _q \
331 { \
332 return (__VA_ARGS__); \
333 }
334
339 #define DefFwdTmpl(_q, _t, _n, ...) \
340 template<typename... _tParams> \
341 inline _t \
342 _n(_tParams&&... args) _q \
343 { \
344 return (__VA_ARGS__); \
345 }
346
347
354 #define DefBitmaskAnd(_tBitmask, _tInt) \
355 yconstfn _tBitmask operator&(_tBitmask _x, _tBitmask _y) \
356 ImplRet(static_cast<_tBitmask>( \
357 static_cast<_tInt>(_x) & static_cast<_tInt>(_y)))
358
359 #define DefBitmaskOr(_tBitmask, _tInt) \
360 yconstfn _tBitmask operator|(_tBitmask _x, _tBitmask _y) \
361 ImplRet(static_cast<_tBitmask>( \
362 static_cast<_tInt>(_x) | static_cast<_tInt>(_y)))
363
364 #define DefBitmaskXor(_tBitmask, _tInt) \
365 yconstfn _tBitmask operator^(_tBitmask _x, _tBitmask _y) \
366 ImplRet(static_cast<_tBitmask>( \
367 static_cast<_tInt>(_x) ^ static_cast<_tInt>(_y)))
368
369 #define DefBitmaskNot(_tBitmask, _tInt) \
370 yconstfn _tBitmask operator~(_tBitmask _x) \
371 ImplRet(static_cast<_tBitmask>(~static_cast<_tInt>(_x)))
372
373 #define DefBitmaskAndAssignment(_tBitmask, _tInt) \
374 inline _tBitmask& operator&=(_tBitmask& _x, _tBitmask _y) \
375 ImplRet(_x = _x & _y)
376
377 #define DefBitmaskOrAssignment(_tBitmask, _tInt) \
378 inline _tBitmask& operator|=(_tBitmask& _x, _tBitmask _y) \
379 ImplRet(_x = _x | _y)
380
381 #define DefBitmaskXorAssignment(_tBitmask, _tInt) \
382 inline _tBitmask& operator^=(_tBitmask& _x, _tBitmask _y) \
383 ImplRet(_x = _x ^ _y)
384
385 #define DefBitmaskOperations(_tBitmask, _tInt) \
386 DefBitmaskAnd(_tBitmask, _tInt) \
387 DefBitmaskOr(_tBitmask, _tInt) \
388 DefBitmaskXor(_tBitmask, _tInt) \
389 DefBitmaskNot(_tBitmask, _tInt) \
390 DefBitmaskAndAssignment(_tBitmask, _tInt) \
391 DefBitmaskOrAssignment(_tBitmask, _tInt) \
392 DefBitmaskXorAssignment(_tBitmask, _tInt)
393
394
396
397 #endif
398