6#ifndef _ZFI_ZFEnumDeclare_inner_h_
7#define _ZFI_ZFEnumDeclare_inner_h_
14#define ZFENUM_INNER_BEGIN(OuterClass, EnumName) \
15 _ZFP_ZFENUM_INNER_BEGIN(OuterClass, EnumName)
18#define ZFENUM_INNER_VALUE(Value) \
19 _ZFP_ZFENUM_INNER_VALUE(Value)
21#define ZFENUM_INNER_VALUE_WITH_INIT(Value, initValue) \
22 _ZFP_ZFENUM_INNER_VALUE_WITH_INIT(Value, initValue)
25#define ZFENUM_INNER_SEPARATOR() \
26 _ZFP_ZFENUM_INNER_SEPARATOR(zffalse)
28#define ZFENUM_INNER_SEPARATOR_ALLOW_DUPLICATE_VALUE() \
29 _ZFP_ZFENUM_INNER_SEPARATOR(zftrue)
32#define ZFENUM_INNER_VALUE_REGISTER_WITH_NAME(Value, Name) \
33 _ZFP_ZFENUM_INNER_VALUE_REGISTER_WITH_NAME(Value, Name)
35#define ZFENUM_INNER_VALUE_REGISTER(Value) \
36 _ZFP_ZFENUM_INNER_VALUE_REGISTER_WITH_NAME(Value, zftext(#Value))
39#define ZFENUM_INNER_END(OuterClass, EnumName) \
40 _ZFP_ZFENUM_INNER_END(OuterClass, EnumName)
42#define ZFENUM_INNER_END_WITH_DEFAULT(OuterClass, EnumName, defaultEnum) \
43 _ZFP_ZFENUM_INNER_END_WITH_DEFAULT(OuterClass, EnumName, defaultEnum)
46#define ZFENUM_INNER_END_FLAGS(OuterClass, EnumName, EnumFlagsName) \
47 _ZFP_ZFENUM_INNER_END_FLAGS(OuterClass, EnumName, EnumFlagsName)
49#define ZFENUM_INNER_END_FLAGS_WITH_DEFAULT(OuterClass, EnumName, EnumFlagsName, defaultEnum, defaultEnumFlags) \
50 _ZFP_ZFENUM_INNER_END_FLAGS_WITH_DEFAULT(OuterClass, EnumName, EnumFlagsName, defaultEnum, defaultEnumFlags)
53#define ZFENUM_INNER_REG(OuterClass, EnumName) \
54 _ZFP_ZFENUM_INNER_TYPEID_REG(OuterClass, EnumName)
56#define ZFENUM_INNER_REG_FLAGS(OuterClass, EnumName, EnumFlagsName) \
57 ZFCORE_POD_DECLARE_NO_COMPARER(OuterClass::EnumFlagsName) \
58 _ZFP_ZFENUM_INNER_TYPEID_REG(OuterClass, EnumName) \
59 _ZFP_ZFENUM_INNER_FLAGS_TYPEID_REG(OuterClass, EnumName, EnumFlagsName)
62#define ZFENUM_INNER_DEFINE(OuterClass, EnumName) \
63 _ZFP_ZFENUM_INNER_DEFINE(OuterClass, EnumName)
66#define ZFENUM_INNER_DEFINE_FLAGS(OuterClass, EnumName, EnumFlagsName) \
67 _ZFP_ZFENUM_INNER_DEFINE_FLAGS(OuterClass, EnumName, EnumFlagsName)
70#define _ZFP_ZFENUM_INNER_BEGIN(OuterClass, EnumName) \
71 zfclass v_##EnumName : zfextend ZFEnum { \
72 ZFOBJECT_DECLARE(v_##EnumName, ZFEnum, OuterClass) \
77#define _ZFP_ZFENUM_INNER_VALUE(Value) e_##Value,
78#define _ZFP_ZFENUM_INNER_VALUE_WITH_INIT(Value, initValue) e_##Value = initValue,
80#define _ZFP_ZFENUM_INNER_SEPARATOR(isEnableDuplicateValue_) \
85 _ZFP_ZFEnumMax = ((zfuint)-1), \
89 static zfindex EnumCount(void) { \
90 return zfself::_ZFP_ZFEnumDataRef()->enumCount(); \
93 static zfindex EnumIndexForValue(ZF_IN zfuint value) { \
94 return zfself::_ZFP_ZFEnumDataRef()->enumIndexForValue(value); \
97 static zfuint EnumValueAt(ZF_IN zfindex index) { \
98 return zfself::_ZFP_ZFEnumDataRef()->enumValueAt(index); \
101 static const zfstring &EnumNameAt(ZF_IN zfindex index) { \
102 return zfself::_ZFP_ZFEnumDataRef()->enumNameAt(index); \
105 static zfbool EnumValueContain(ZF_IN zfuint value) { \
106 return zfself::_ZFP_ZFEnumDataRef()->enumValueContain(value); \
109 static zfuint EnumValueForName(ZF_IN const zfstring &name) { \
110 return zfself::_ZFP_ZFEnumDataRef()->enumValueForName(name); \
113 static const zfstring &EnumNameForValue(ZF_IN zfuint value) { \
114 return zfself::_ZFP_ZFEnumDataRef()->enumNameForValue(value); \
119 virtual zfindex enumCount(void) { \
120 return zfself::EnumCount(); \
123 virtual zfuint enumDefault(void) { \
124 return zfself::EnumDefault(); \
127 virtual zfbool enumIsFlags(void) { \
128 return zfself::EnumIsFlags(); \
131 virtual zfindex enumIndexForValue(ZF_IN zfuint value) { \
132 return zfself::EnumIndexForValue(value); \
135 virtual zfuint enumValueAt(ZF_IN zfindex index) { \
136 return zfself::EnumValueAt(index); \
139 virtual const zfstring &enumNameAt(ZF_IN zfindex index) { \
140 return zfself::EnumNameAt(index); \
143 virtual zfbool enumValueContain(ZF_IN zfuint value) { \
144 return zfself::EnumValueContain(value); \
147 virtual zfuint enumValueForName(ZF_IN const zfstring &name) { \
148 return zfself::EnumValueForName(name); \
151 virtual const zfstring &enumNameForValue(ZF_IN zfuint value) { \
152 return zfself::EnumNameForValue(value); \
156 static const _ZFP_ZFEnumData *_ZFP_ZFEnumDataRef(void) { \
157 static _ZFP_ZFEnumDataHolder d(_ZFP_ZFEnumDataInit()); \
160 static const _ZFP_ZFEnumData *_ZFP_ZFEnumDataInit(void) { \
161 ZFCoreMutexLocker(); \
162 _ZFP_ZFEnumData *d = _ZFP_ZFEnumDataAccess(zfself::ClassData()); \
163 if(d->needInitFlag) { \
164 d->needInitFlag = zffalse; \
165 zfbool isEnableDuplicateValue = isEnableDuplicateValue_;
167#define _ZFP_ZFENUM_INNER_VALUE_REGISTER_WITH_NAME(Value, Name) \
168 d->add(isEnableDuplicateValue, zfself::e_##Value, Name);
170#define _ZFP_ZFENUM_INNER_END(OuterClass, EnumName) \
171 _ZFP_ZFENUM_INNER_END_DETAIL(OuterClass, EnumName, zffalse, d->enumValueAt(0))
172#define _ZFP_ZFENUM_INNER_END_WITH_DEFAULT(OuterClass, EnumName, defaultEnum) \
173 _ZFP_ZFENUM_INNER_END_DETAIL(OuterClass, EnumName, zffalse, zfself::e_##defaultEnum)
175#define _ZFP_ZFENUM_INNER_END_FLAGS(OuterClass, EnumName, EnumFlagsName) \
176 _ZFP_ZFENUM_INNER_END_DETAIL(OuterClass, EnumName, zftrue, d->enumValueAt(0)) \
177 _ZFP_ZFENUM_INNER_FLAGS_DECLARE(OuterClass, EnumName, EnumFlagsName, v_##EnumName::EnumDefault())
178#define _ZFP_ZFENUM_INNER_END_FLAGS_WITH_DEFAULT(OuterClass, EnumName, EnumFlagsName, defaultEnum, defaultEnumFlags) \
179 _ZFP_ZFENUM_INNER_END_DETAIL(OuterClass, EnumName, zftrue, zfself::e_##defaultEnum) \
180 _ZFP_ZFENUM_INNER_FLAGS_DECLARE(OuterClass, EnumName, EnumFlagsName, defaultEnumFlags)
182#define _ZFP_ZFENUM_INNER_END_DETAIL(OuterClass, EnumName, IsFlags, defaultEnum) \
183 d->enumDefault = (zfuint)(defaultEnum); \
184 d->enumIsFlags = (IsFlags); \
190 static inline zfbool EnumIsFlags(void) { \
191 return (v_##EnumName::ZFEnumType)zfself::_ZFP_ZFEnumDataRef()->enumIsFlags; \
194 static inline v_##EnumName::ZFEnumType EnumDefault(void) { \
195 return (v_##EnumName::ZFEnumType)zfself::_ZFP_ZFEnumDataRef()->enumDefault; \
199 zffinal zfself::ZFEnumType zfv(void) { \
200 return (zfself::ZFEnumType)this->enumValue(); \
204 virtual const zfstring &zfvTypeId(void); \
207 typedef v_##EnumName::ZFEnumType EnumName; \
208 _ZFP_ZFENUM_INNER_CONVERTER_DECLARE(OuterClass, EnumName) \
209 _ZFP_ZFENUM_INNER_TYPEID_DECLARE(OuterClass, EnumName)
212#define _ZFP_ZFENUM_INNER_DEFINE(OuterClass, EnumName) \
213 _ZFP_ZFENUM_INNER_CONVERTER_DEFINE(OuterClass, EnumName) \
214 ZFOBJECT_REGISTER(OuterClass, v_##EnumName) \
215 _ZFP_ZFENUM_INNER_TYPEID_DEFINE(OuterClass, EnumName) \
216 ZF_STATIC_REGISTER_INIT(EnumReg_##OuterClass##_##EnumName) { \
217 for(zfindex i = 0; i < OuterClass::v_##EnumName::EnumCount(); ++i) { \
218 ZFMethodUserRegisterDetail_0(resultMethod, { \
219 return (OuterClass::EnumName)OuterClass::v_##EnumName::EnumValueForName(invokerMethod->methodName() + 2); \
220 }, OuterClass::v_##EnumName::ClassData(), public, ZFMethodTypeStatic, \
221 OuterClass::EnumName, zfstr("e_%s", OuterClass::v_##EnumName::EnumNameAt(i))); \
222 _m.add(resultMethod); \
224 _ZFP_ZFEnumMethodReg(_m, OuterClass::v_##EnumName::_ZFP_ZFEnumDataRef()); \
226 ZF_STATIC_REGISTER_DESTROY(EnumReg_##OuterClass##_##EnumName) { \
227 for(zfindex i = 0; i < _m.count(); ++i) { \
228 ZFMethodUserUnregister(_m[i]); \
231 ZFCoreArray<const ZFMethod *> _m; \
232 ZF_STATIC_REGISTER_END(EnumReg_##OuterClass##_##EnumName)
234#define _ZFP_ZFENUM_INNER_DEFINE_FLAGS(OuterClass, EnumName, EnumFlagsName) \
235 _ZFP_ZFENUM_INNER_DEFINE(OuterClass, EnumName) \
236 _ZFP_ZFENUM_INNER_FLAGS_DEFINE(OuterClass, EnumName, EnumFlagsName)
239#define _ZFP_ZFENUM_INNER_CONVERTER_DECLARE(OuterClass, EnumName) \
241 static zfbool EnumName##FromStringT( \
243 , ZF_IN const zfchar *src \
244 , ZF_IN_OPT zfindex srcLen = zfindexMax() \
245 , ZF_OUT_OPT zfstring *errorHint = zfnull \
248 static zfbool EnumName##ToStringT( \
249 ZF_IN_OUT zfstring &ret \
250 , ZF_IN v_##EnumName *const &value \
251 , ZF_OUT_OPT zfstring *errorHint = zfnull \
254 static inline zfstring EnumName##ToString( \
255 ZF_IN v_##EnumName *const &value \
256 , ZF_OUT_OPT zfstring *errorHint = zfnull \
259 EnumName##ToStringT(ret, value, errorHint); \
262#define _ZFP_ZFENUM_INNER_CONVERTER_DEFINE(OuterClass, EnumName) \
263 zfbool OuterClass::EnumName##ToStringT( \
264 ZF_IN_OUT zfstring &ret \
265 , ZF_IN OuterClass::v_##EnumName *const &value \
266 , ZF_OUT_OPT zfstring *errorHint \
268 ret += ((value == zfnull) ? zfstring() : value->enumName()); \
271 zfbool OuterClass::EnumName##FromStringT( \
273 , ZF_IN const zfchar *src \
274 , ZF_IN_OPT zfindex srcLen \
275 , ZF_OUT_OPT zfstring *errorHint \
277 if(zfstringIsEqual(src, srcLen, ZFEnumNameInvalid(), zfindexMax())) { \
278 ret = zfobj<v_##EnumName>(ZFEnumInvalid()); \
281 zfuint tmpValue = v_##EnumName::EnumValueForName( \
282 (srcLen == zfindexMax()) ? src : zfstring(src, srcLen).cString()); \
283 if(tmpValue == ZFEnumInvalid()) { \
284 zfstringAppend(errorHint, "no enum named: \"%s\"", zfstring(src, srcLen)); \
288 ret = zfobj<v_##EnumName>(tmpValue); \
294#define _ZFP_ZFENUM_INNER_FLAGS_DECLARE(OuterClass, EnumName, EnumFlagsName, defaultValue) \
296 zffinal zfclassPOD EnumFlagsName { \
300 static zfuint EnumDefault(void) { \
301 return defaultValue; \
305 EnumFlagsName(void) : flags(0) {} \
306 EnumFlagsName(ZF_IN zfuint const &flags) : flags(flags) {} \
307 EnumFlagsName(ZF_IN EnumName const &flags) : flags((zfuint)flags) {} \
308 EnumFlagsName(ZF_IN EnumFlagsName const &ref) : flags(ref.flags) {} \
310 zfuint const &enumValue(void) const {return this->flags;} \
311 void enumValue(ZF_IN zfuint const &flags) {this->flags = flags;} \
312 void enumValue(ZF_IN EnumName const &flags) {this->flags = (zfuint)flags;} \
314 operator zfuint const & (void) const {return this->flags;} \
315 EnumFlagsName &operator = (ZF_IN zfuint const &flags) {this->flags = flags; return *this;} \
316 EnumFlagsName &operator = (ZF_IN EnumName const &flags) {this->flags = (zfuint)flags; return *this;} \
317 EnumFlagsName &operator = (ZF_IN EnumFlagsName const &ref) {this->flags = ref.flags; return *this;} \
318 zfbool operator == (ZF_IN zfuint const &flags) const {return (this->flags == flags);} \
319 zfbool operator == (ZF_IN EnumName const &flags) const {return (this->flags == (zfuint)flags);} \
320 zfbool operator == (ZF_IN EnumFlagsName const &ref) const {return (this->flags == ref.flags);} \
321 zfbool operator != (ZF_IN zfuint const &flags) const {return (this->flags != flags);} \
322 zfbool operator != (ZF_IN EnumName const &flags) const {return (this->flags != (zfuint)flags);} \
323 zfbool operator != (ZF_IN EnumFlagsName const &ref) const {return (this->flags != ref.flags);} \
324 EnumFlagsName &operator |= (ZF_IN zfuint const &flags) {this->flags |= flags; return *this;} \
325 EnumFlagsName &operator |= (ZF_IN EnumName const &flags) {this->flags |= (zfuint)flags; return *this;} \
326 EnumFlagsName &operator |= (ZF_IN EnumFlagsName const &ref) {this->flags |= ref.flags; return *this;} \
327 EnumFlagsName &operator &= (ZF_IN zfuint const &flags) {this->flags &= flags; return *this;} \
328 EnumFlagsName &operator &= (ZF_IN EnumName const &flags) {this->flags &= (zfuint)flags; return *this;} \
329 EnumFlagsName &operator &= (ZF_IN EnumFlagsName const &ref) {this->flags &= ref.flags; return *this;} \
331 void objectInfoT(ZF_IN_OUT zfstring &ret) const; \
332 inline zfstring objectInfo(void) const { \
334 this->objectInfoT(ret); \
341 _ZFP_ZFENUM_INNER_FLAGS_TYPEID_DECLARE(OuterClass, EnumName, EnumFlagsName)
343#define _ZFP_ZFENUM_INNER_FLAGS_DEFINE(OuterClass, EnumName, EnumFlagsName) \
344 void OuterClass::EnumFlagsName::objectInfoT(ZF_IN_OUT zfstring &ret) const { \
345 zfflagsToStringT(ret, v_##EnumName::ClassData(), (zfflags)this->enumValue()); \
347 _ZFP_ZFENUM_INNER_FLAGS_TYPEID_DEFINE(OuterClass, EnumName, EnumFlagsName)
352#define _ZFP_ZFENUM_INNER_TYPEID_DECLARE(OuterClass, EnumName) \
353 ZFTYPEID_INNER_DECLARE_WITH_CUSTOM_WRAPPER(OuterClass, EnumName, EnumName)
354#define _ZFP_ZFENUM_INNER_TYPEID_REG(OuterClass, EnumName) \
357 zfclassNotPOD ZFTypeId<OuterClass::EnumName> : zfextend ZFTypeInfo { \
359 typedef OuterClass::EnumName _ZFP_PropType; \
360 typedef OuterClass::v_##EnumName _ZFP_WrapType; \
363 TypeIdRegistered = 1, \
364 TypeIdSerializable = 1, \
366 static inline const zfstring &TypeId(void) { \
367 return OuterClass::ZFTypeId_##EnumName(); \
369 static inline const ZFClass *TypeIdClass(void) { \
370 return _ZFP_WrapType::ClassData(); \
373 virtual zfbool typeIdSerializable(void) const { \
374 return TypeIdSerializable; \
377 virtual const zfstring &typeId(void) const { \
381 virtual const ZFClass *typeIdClass(void) const { \
382 return TypeIdClass(); \
384 static zfbool ValueStore( \
386 , ZF_IN zfuint const &v \
389 _ZFP_WrapType *t = zfunsafe_zfobjAlloc(_ZFP_WrapType, v); \
390 obj.zfunsafe_assign(t); \
391 zfunsafe_zfobjRelease(t); \
392 ZFCoreMutexUnlock(); \
395 static zfbool ValueStore( \
397 , ZF_IN _ZFP_PropType const &v \
400 _ZFP_WrapType *t = zfunsafe_zfobjAlloc(_ZFP_WrapType, (zfuint)v); \
401 obj.zfunsafe_assign(t); \
402 zfunsafe_zfobjRelease(t); \
403 ZFCoreMutexUnlock(); \
406 template<typename T_Access = _ZFP_PropType \
407 , int T_Mode = ((zftTraits<typename zftTraits<T_Access>::TrNoRef>::TrIsPtr \
408 && !zftIsSame<typename zftTraits<T_Access>::TrNoRef, _ZFP_PropType>::Value) ? 1 \
409 : ((zftTraits<typename zftTraits<T_Access>::TrNoRef>::TrIsPtr \
410 && zftIsSame<typename zftTraits<T_Access>::TrNoRef, _ZFP_PropType>::Value \
411 && !zftTraits<T_Access>::TrIsRef) ? 2 : 0)) \
412 , typename T_Fix = void \
414 zfclassNotPOD Value { \
416 static zfbool zfvAccessAvailable(ZF_IN const zfauto &obj) { \
417 return (zfcast(_ZFP_WrapType *, obj) != zfnull); \
419 static T_Access zfvAccess(ZF_IN const zfauto &obj) { \
421 return *(typename zftTraits<T_Access>::TrNoRef *)(&(zfcast(_ZFP_WrapType *, obj)->_ZFP_ZFEnum_value)); \
423 static zfauto zfvAccessFinish(ZF_IN const zfauto &obj) { \
427 template<typename T_Access> \
428 zfclassNotPOD Value<T_Access, 1> { \
430 static zfbool zfvAccessAvailable(ZF_IN const zfauto &obj) { \
431 return obj == zfnull || (zfcast(_ZFP_WrapType *, obj) != zfnull); \
433 static typename zftTraits<T_Access>::TrNoRef zfvAccess(ZF_IN const zfauto &obj) { \
434 if(obj == zfnull) { \
438 _ZFP_WrapType *t = zfcast(_ZFP_WrapType *, obj); \
440 return (typename zftTraits<T_Access>::TrNoRef)(&(t->_ZFP_ZFEnum_value)); \
443 static zfauto zfvAccessFinish(ZF_IN const zfauto &obj) { \
448 virtual zfbool genericValueStore(ZF_OUT zfauto &obj, ZF_IN const void *v) const { \
449 return ValueStore(obj, *(const _ZFP_PropType *)v); \
452 virtual void *genericAccess(ZF_IN const zfauto &obj) const { \
453 if(!Value<_ZFP_PropType>::zfvAccessAvailable(obj)) { \
457 return _ZFP_genericAccessWrap<_ZFP_PropType>(Value<_ZFP_PropType>::zfvAccess(obj)); \
461 virtual zfauto genericAccessFinish(ZF_IN const zfauto &obj, ZF_IN void *v) const { \
462 return _ZFP_genericAccessFinishWrap(Value<_ZFP_PropType>::zfvAccessFinish(obj), v, _ZFP_genericAccessFinish<_ZFP_PropType>); \
465 virtual ZFCoreArrayBase *genericArrayNew(void) const { \
466 return ZFCoreArray<_ZFP_PropType>().refNew(); \
470 ZFOUTPUT_TYPE(OuterClass::EnumName, {s += OuterClass::v_##EnumName::EnumNameForValue(v);})
472#define _ZFP_ZFENUM_INNER_TYPEID_DEFINE(OuterClass, EnumName) \
473 ZFTYPEID_INNER_DEFINE_BY_STRING_CONVERTER_WITH_CUSTOM_WRAPPER(OuterClass, EnumName, EnumName, { \
474 if(zfstringIsEqual(src, srcLen, ZFEnumNameInvalid(), zfindexMax())) { \
475 v = (EnumName)ZFEnumInvalid(); \
478 v = (EnumName)v_##EnumName::EnumValueForName( \
479 (srcLen == zfindexMax()) ? src : zfstring(src, srcLen).cString() \
481 if(v == ZFEnumInvalid()) { \
483 zfstringAppend(errorHint, "invalid value: \"%s\"", zfstring(src, srcLen)); \
489 s += v_##EnumName::EnumNameForValue(v); \
492 const zfstring &OuterClass::v_##EnumName::zfvTypeId(void) { \
493 return ZFTypeId_##EnumName(); \
499#define _ZFP_ZFENUM_INNER_FLAGS_TYPEID_DECLARE(OuterClass, EnumName, EnumFlagsName) \
500 ZFTYPEID_INNER_DECLARE_WITH_CUSTOM_WRAPPER(OuterClass, EnumFlagsName, EnumFlagsName) \
502 typedef v_##EnumName v_##EnumFlagsName;
503#define _ZFP_ZFENUM_INNER_FLAGS_TYPEID_REG(OuterClass, EnumName, EnumFlagsName) \
506 zfclassNotPOD ZFTypeId<OuterClass::EnumFlagsName> : zfextend ZFTypeInfo { \
508 typedef OuterClass::EnumName _ZFP_PropTypeOrig; \
509 typedef OuterClass::EnumFlagsName _ZFP_PropType; \
510 typedef OuterClass::v_##EnumFlagsName _ZFP_WrapType; \
513 TypeIdRegistered = 1, \
514 TypeIdSerializable = 1, \
516 static inline const zfstring &TypeId(void) { \
517 return OuterClass::ZFTypeId_##EnumFlagsName(); \
519 static inline const ZFClass *TypeIdClass(void) { \
520 return _ZFP_WrapType::ClassData(); \
523 virtual zfbool typeIdSerializable(void) const { \
524 return TypeIdSerializable; \
527 virtual const zfstring &typeId(void) const { \
531 virtual const ZFClass *typeIdClass(void) const { \
532 return TypeIdClass(); \
534 static zfbool ValueStore( \
536 , ZF_IN zfuint const &v \
539 _ZFP_WrapType *t = zfunsafe_zfobjAlloc(_ZFP_WrapType, v); \
540 obj.zfunsafe_assign(t); \
541 zfunsafe_zfobjRelease(t); \
542 ZFCoreMutexUnlock(); \
545 static zfbool ValueStore( \
547 , ZF_IN _ZFP_PropTypeOrig const &v \
550 _ZFP_WrapType *t = zfunsafe_zfobjAlloc(_ZFP_WrapType, (zfuint)v); \
551 obj.zfunsafe_assign(t); \
552 zfunsafe_zfobjRelease(t); \
553 ZFCoreMutexUnlock(); \
556 static zfbool ValueStore( \
558 , ZF_IN _ZFP_PropType const &v \
561 _ZFP_WrapType *t = zfunsafe_zfobjAlloc(_ZFP_WrapType, (zfuint)v); \
562 obj.zfunsafe_assign(t); \
563 zfunsafe_zfobjRelease(t); \
564 ZFCoreMutexUnlock(); \
567 template<typename T_Access = _ZFP_PropType \
568 , int T_Mode = ((zftTraits<typename zftTraits<T_Access>::TrNoRef>::TrIsPtr \
569 && !zftIsSame<typename zftTraits<T_Access>::TrNoRef, _ZFP_PropType>::Value) ? 1 \
570 : ((zftTraits<typename zftTraits<T_Access>::TrNoRef>::TrIsPtr \
571 && zftIsSame<typename zftTraits<T_Access>::TrNoRef, _ZFP_PropType>::Value \
572 && !zftTraits<T_Access>::TrIsRef) ? 2 : 0)) \
573 , typename T_Fix = void \
575 zfclassNotPOD Value { \
577 static zfbool zfvAccessAvailable(ZF_IN const zfauto &obj) { \
578 return (zfcast(_ZFP_WrapType *, obj) != zfnull); \
580 static T_Access zfvAccess(ZF_IN const zfauto &obj) { \
582 return *(typename zftTraits<T_Access>::TrNoRef *)(&(zfcast(_ZFP_WrapType *, obj)->_ZFP_ZFEnum_value)); \
584 static zfauto zfvAccessFinish(ZF_IN const zfauto &obj) { \
588 template<typename T_Access> \
589 zfclassNotPOD Value<T_Access, 1> { \
591 static zfbool zfvAccessAvailable(ZF_IN const zfauto &obj) { \
592 return obj == zfnull || (zfcast(_ZFP_WrapType *, obj) != zfnull); \
594 static typename zftTraits<T_Access>::TrNoRef zfvAccess(ZF_IN const zfauto &obj) { \
595 if(obj == zfnull) { \
599 _ZFP_WrapType *t = zfcast(_ZFP_WrapType *, obj); \
601 return (typename zftTraits<T_Access>::TrNoRef)(&(t->_ZFP_ZFEnum_value)); \
604 static zfauto zfvAccessFinish(ZF_IN const zfauto &obj) { \
609 virtual zfbool genericValueStore(ZF_OUT zfauto &obj, ZF_IN const void *v) const { \
610 return ValueStore(obj, *(const _ZFP_PropType *)v); \
613 virtual void *genericAccess(ZF_IN const zfauto &obj) const { \
614 if(!Value<_ZFP_PropType>::zfvAccessAvailable(obj)) { \
618 return _ZFP_genericAccessWrap<_ZFP_PropType>(Value<_ZFP_PropType>::zfvAccess(obj)); \
622 virtual zfauto genericAccessFinish(ZF_IN const zfauto &obj, ZF_IN void *v) const { \
623 return _ZFP_genericAccessFinishWrap(Value<_ZFP_PropType>::zfvAccessFinish(obj), v, _ZFP_genericAccessFinish<_ZFP_PropType>); \
626 virtual ZFCoreArrayBase *genericArrayNew(void) const { \
627 return ZFCoreArray<_ZFP_PropType>().refNew(); \
631 ZFOUTPUT_TYPE(OuterClass::EnumFlagsName, {v.objectInfoT(s);})
633#define _ZFP_ZFENUM_INNER_FLAGS_TYPEID_DEFINE(OuterClass, EnumName, EnumFlagsName) \
634 ZFTYPEID_INNER_DEFINE_BY_STRING_CONVERTER_WITH_CUSTOM_WRAPPER(OuterClass, EnumFlagsName, EnumFlagsName, { \
636 if(!zfflagsFromStringT(flags, \
637 v_##EnumName::ClassData(), \
640 zfstringAppend(errorHint, "invalid value: \"%s\"", zfstring(src, srcLen)); \
644 v.enumValue((zfuint)flags); \
647 return zfflagsToStringT(s, v_##EnumName::ClassData(), (zfflags)v.enumValue()); \
649 ZF_STATIC_REGISTER_INIT(EnumReg_##OuterClass##_##EnumFlagsName) { \
650 ZFClassAlias(OuterClass::v_##EnumName::ClassData(), OuterClass::v_##EnumName::ClassData()->classNamespace() \
651 ? zfstr("%s.%s", OuterClass::v_##EnumName::ClassData()->classNamespace(), #EnumFlagsName).cString() \
655 ZF_STATIC_REGISTER_DESTROY(EnumReg_##OuterClass##_##EnumFlagsName) { \
656 ZFClassAliasRemove(OuterClass::v_##EnumName::ClassData(), OuterClass::v_##EnumName::ClassData()->classNamespace() \
657 ? zfstr("%s.%s", OuterClass::v_##EnumName::ClassData()->classNamespace(), #EnumFlagsName).cString() \
661 ZF_STATIC_REGISTER_END(EnumReg_##OuterClass##_##EnumFlagsName)
#define ZF_NAMESPACE_GLOBAL_BEGIN
begin namespace ZFFramework
Definition ZFNamespace.h:97
#define ZF_NAMESPACE_GLOBAL_END
end namespace ZFFramework
Definition ZFNamespace.h:98