54 #ifndef _MGUI_NCSCTRL_OBJECT_H 55 #define _MGUI_NCSCTRL_OBJECT_H 66 #define MGNCS_INIT_CLASS(clss) \ 67 Class(clss).classConstructor((mObjectClass*)(void*)(&(Class(clss)))) 72 #define _c(ths) (ths)->_class 73 #define ClassType(className) className##Class 74 #define Class(className) g_st##className##Cls 75 #define ObjectType(className) className 78 #define _TYPEOF(x) void* //__typeof(x) 80 #define _TYPEOF(x) typeof(x) 83 #define BEGIN_MINI_CLASS(clss, superCls) \ 84 static ClassType(clss) * clss##ClassConstructor(ClassType(clss)* _class); \ 85 ClassType(clss) Class(clss) = { (PClassConstructor)clss##ClassConstructor }; \ 86 static const char* clss##_type_name = #clss; \ 87 static ClassType(clss) * clss##ClassConstructor(ClassType(clss)* _class) { \ 88 unsigned short * _pintfOffset = NULL; \ 89 _pintfOffset = (unsigned short *)((UINT_PTR)_pintfOffset ^ 0); \ 90 _class = (ClassType(clss)*)((PClassConstructor)(Class(superCls).classConstructor))((mObjectClass*)_class); \ 91 _class->super = (superCls##Class*)&Class(superCls); \ 92 _class->typeName = clss##_type_name; \ 93 _class->objSize = sizeof(clss); \ 94 _pintfOffset = &_class->intfOffset; 96 #define END_MINI_CLASS return _class; } 98 #define CLASS_METHOD_MAP(clss, name) \ 99 _class->name = (_TYPEOF(_class->name))(clss##_##name); 105 #define CHECK_METHOD(cls, mth) ((cls) && (cls)->mth) 107 #define CHECK_METHOD(cls, mth) (1) 116 #define _M(pobj, method, ...) _c(pobj)->method((pobj), ##__VA_ARGS__) 118 #define DECLARE_CLASSEX(EXPORT, clss, clssSuper) \ 119 typedef struct _##clss##Class clss##Class; \ 120 typedef struct _##clss clss; \ 121 struct _##clss##Class{ \ 122 clss##ClassHeader(clss, clssSuper) \ 127 EXPORT extern clss##Class g_st##clss##Cls; 129 #define DECLARE_CLASS(clss, clssSuper) DECLARE_CLASSEX(MGNCS_EXPORT, clss, clssSuper) 132 #define _SUPER(super,self,method, ...) Class(super).method((super*)(self), ##__VA_ARGS__) 134 #define DECLARE_OBJECT(Clss) \ 135 typedef struct _##Clss##Class Clss##Class; \ 136 typedef struct _##Clss Clss; \ 137 MGNCS_EXPORT extern Clss##Class g_st##Clss##Cls; 139 #define DEFINE_OBJECT(Clss, ClssSuper) \ 140 struct _##Clss##Class { Clss##ClassHeader(Clss, ClssSuper) }; \ 141 struct _##Clss { Clss##Header(Clss) }; 144 #define INTERFACE(Interface) \ 145 Interface##VTable * Interface##_; 147 #define DECLARE_INTERFACE(Interface) \ 148 typedef struct _##Interface##VTable Interface##VTable; \ 149 typedef struct _##Interface Interface; 151 #define DEFINE_INTERFACE(Interface) \ 152 struct _##Interface##VTable { \ 153 Interface##Header(Interface, Interface) \ 155 struct _##Interface { Interface##VTable *_vtable; }; 157 #define IMPLEMENT(Clss,Interface) \ 158 _class->_##Interface##_obj_offset = (UINT_PTR)(void*)&(((Clss*)0)->Interface##_); \ 159 _class->_##Interface##_next_offset = 0; \ 160 *_pintfOffset = (unsigned short)(UINT_PTR)(void*)&(((ClassType(Clss)*)0)->_##Interface##_obj_offset); \ 161 _pintfOffset = &_class->_##Interface##_next_offset; 163 #define INTERFACE_CAST(Interface, pobj) \ 164 ((Interface*)((unsigned char*)(pobj) + (_c(pobj)->_##Interface##_obj_offset))) 167 DECLARE_INTERFACE(IInterface)
168 struct _IInterfaceVTable{
169 unsigned short _obj_offset;
170 unsigned short _next_offset;
174 IInterfaceVTable * _vtable;
177 #define IInterfaceHeader(Interface, ClssImpl) \ 178 unsigned short _##Interface##_obj_offset; \ 179 unsigned short _##Interface##_next_offset; \ 185 #define INTEFACE_ADJUST(piobj) (_TYPEOF(piobj))((unsigned char*)(piobj) - \ 186 ((IInterfaceVTable*)((piobj))->_vtable)->_obj_offset) 188 #define INTERFACE2OBJECT(type, piobj) (type*)((unsigned char*)(piobj) - ((IInterfaceVTable*)((piobj))->_vtable)->_obj_offset) 194 #define _IM(piobj, method, ...) \ 195 (piobj)->_vtable->method(INTEFACE_ADJUST(piobj), ##__VA_ARGS__) 196 #define _I(piobj) (piobj)->_vtable 201 typedef struct _mObject
mObject;
225 typedef void (*PCONSTRUCT_VALIST)(
void*
self, va_list va);
227 #define mObjectClassHeader(clss, superCls) \ 228 PClassConstructor classConstructor; \ 229 ClassType(superCls) * super; \ 230 const char* typeName; \ 231 unsigned short objSize; \ 232 unsigned short intfOffset; \ 233 void (*construct)(clss *self, DWORD addData); \ 234 void (*destroy)(clss *self); \ 235 DWORD (*hash)(clss *self); \ 236 const char* (*toString)(clss *self, char* str, int max); \ 237 int (*addRef)(clss*); \ 238 int (*release)(clss*); 272 struct _mObjectClass {
284 NCSF_OBJECT_TODEL = 0x1000,
286 #define NCS_OBJ_TODEL(self) (self->objStatus & NCSF_OBJECT_TODEL) 288 #define mObjectHeader(clss) \ 289 ClassType(clss) * _class; \ 311 MGNCS_EXPORT
void ncsRefObjFreeSpecificData(DWORD key, DWORD value);
319 memset(pobj, 0, _class->objSize);
320 initObject(pobj, _class);
332 va_start(va, _class);
333 memset(pobj, 0, _class->objSize);
334 initObject(pobj, _class);
335 ((PCONSTRUCT_VALIST)(_class->construct))(pobj, va);
340 #define INIT_OBJEX(Clss, pobj, param) ((Clss* )_initObject((mObject*)(pobj), (mObjectClass*)&Class(Clss), (DWORD)(param))) 341 #define INIT_OBJ(Clss, pobj) INIT_OBJEX(Clss, pobj, 0) 342 #define INIT_OBJV(Clss, pobj, ...) ((Clss* )initObjectArgs((mObject*)(pobj), (mObjectClass*)&Class(Clss), ##__VA_ARGS__)) 343 #define UNIT_OBJ(pobj) (_c(pobj)->destroy(pobj)) 372 _class->construct(obj, addData);
376 #define NEWEX(classType, addData) (classType*)(void*)ncsNewObject((mObjectClass*)(void *)(&Class(classType)), (DWORD)(addData)) 377 #define NEW(classType) NEWEX(classType, 0) 382 va_start(va, _class);
385 ((PCONSTRUCT_VALIST)(_class->construct))(obj, va);
389 #define NEWV(Clss, ...) ((Clss*)_newobject_args((mObjectClass*)&(Class(Clss)), ##__VA_ARGS__)) 399 #define DELETE(obj) deleteObject((mObject*)(obj)) 405 #define TYPENAME(obj) ((obj)?(((obj)->_class)?((obj)->_class)->typeName:""):"") 428 #define INSTANCEOF(obj, clss) ncsInstanceOf((mObject*)(obj), (mObjectClass*)(void*)(&Class(clss))) 448 #define CHECKOBJ(obj) ncsIsValidObj((mObject*)obj) 467 #define TYPE_CAST(Type, obj) ((Type*)(obj)) 476 #define SAFE_CAST(Type, obj) TYPE_CAST(Type, ncsSafeCast((mObject*)obj,(mObjectClass*)(void*)(&(Class(Type))))) 494 #define SAFE_CAST_CLASS(Clss, ClssCast) ((ClassType(ClssCast)*)(ncsSafeCastClass((mObjectClass*)Clss, (mObjectClass*)(void*)(&Class(ClssCast))))) 496 int ncsParseConstructParams(va_list args,
const char* signature, ...);
513 #define NCS_CB_ONPIECEEVENT NCS_CB_ONOBJEVENT 604 MGNCS_EXPORT
void ncsRaiseEvent(mObject *sender,
int eventId, DWORD param);
MGNCS_EXPORT mObjectClass * ncsSafeCastClass(mObjectClass *clss, mObjectClass *castCls)
cast from a supper class to derived class type safely
MGNCS_EXPORT BOOL ncsAddEventListener(mObject *sender, mObject *listener, NCS_CB_ONOBJEVENT eventProc, int eventId)
connect sender object to listener object
MGNCS_EXPORT BOOL ncsRemoveEventSource(mObject *sender)
remove the connections when a sender is destroied
#define INSTANCEOF(obj, clss)
A wrapper of ncsInstanceOf, just like java's instanceof.
MGNCS_EXPORT BOOL ncsAddEventListeners(mObject *sender, mObject *listener, NCS_CB_ONOBJEVENT eventProc, int *eventIds)
connect a group of events from sender to listener
MGNCS_EXPORT BOOL ncsInstanceOf(mObject *object, mObjectClass *clss)
check an object is the class instance or not, same as instanceof operator in Java ...
MGNCS_EXPORT mObject * newObject(mObjectClass *_class)
new a object instance, like new operator in C++
void(* PCONSTRUCT_DWORD)(void *self, DWORD addData)
static mObject * ncsIsValidObj(mObject *obj)
Check a pointer is a valid mObject or not.
MGNCS_EXPORT BOOL ncsRemoveEventConnect(mObject *listener, mObject *source, int eventId)
remove a special event connect
MGNCS_EXPORT BOOL ncsRemoveEventListener(mObject *listener)
remove the connections which are listened by the object
MGNCS_EXPORT void deleteObject(mObject *obj)
delete a object intance, like delete operator in C++
static mObject * _initObject(mObject *pobj, mObjectClass *_class, DWORD param)
static mObject * initObjectArgs(mObject *pobj, mObjectClass *_class,...)
MGNCS_EXPORT void ncsRaiseEvent(mObject *sender, int eventId, DWORD param)
raise an event to listeners
the basic object class of NCS
MGNCS_EXPORT mObjectClass g_stmObjectCls
the singleton of mObjectClass, represent a class object
BOOL(* NCS_CB_ONOBJEVENT)(mObject *self, mObject *sender, int eventId, DWORD param)
The Callback of connection.
MGNCS_EXPORT mObject * ncsSafeCast(mObject *obj, mObjectClass *clss)
safe type cast function, like the dynamic_cast operator in C++