mGNCS API Reference  v1.5.0
A new control set and a new framework for MiniGUI apps
mobject.h
Go to the documentation of this file.
1 //
3 // IMPORTANT NOTICE
4 //
5 // The following open source license statement does not apply to any
6 // entity in the Exception List published by FMSoft.
7 //
8 // For more information, please visit:
9 //
10 // https://www.fmsoft.cn/exception-list
11 //
13 
54 #ifndef _MGUI_NCSCTRL_OBJECT_H
55 #define _MGUI_NCSCTRL_OBJECT_H
56 
57 #ifdef __cplusplus
58 extern "C"{
59 #endif
60 
66 #define MGNCS_INIT_CLASS(clss) \
67  Class(clss).classConstructor((mObjectClass*)(void*)(&(Class(clss))))
68 
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
76 
77 #ifdef WIN32
78 #define _TYPEOF(x) void* //__typeof(x)
79 #else
80 #define _TYPEOF(x) typeof(x)
81 #endif
82 
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); /* VW: prevent unused-but-set-variable warning */ \
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;
95 
96 #define END_MINI_CLASS return _class; }
97 
98 #define CLASS_METHOD_MAP(clss, name) \
99  _class->name = (_TYPEOF(_class->name))(clss##_##name);
100 
101 
102 #define NEED_CHECK
103 
104 #ifdef NEED_CHECK
105 #define CHECK_METHOD(cls, mth) ((cls) && (cls)->mth)
106 #else
107 #define CHECK_METHOD(cls, mth) (1)
108 #endif
109 
110 
111 #define PUBLIC
112 #define PRIVATE
113 #define PROTECTED
114 #define STATIC
115 
116 #define _M(pobj, method, ...) _c(pobj)->method((pobj), ##__VA_ARGS__)
117 
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) \
123  }; \
124  struct _##clss { \
125  clss##Header(clss) \
126  }; \
127  EXPORT extern clss##Class g_st##clss##Cls;
128 
129 #define DECLARE_CLASS(clss, clssSuper) DECLARE_CLASSEX(MGNCS_EXPORT, clss, clssSuper)
130 #define NONE_EXPORT
131 
132 #define _SUPER(super,self,method, ...) Class(super).method((super*)(self), ##__VA_ARGS__)
133 
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;
138 
139 #define DEFINE_OBJECT(Clss, ClssSuper) \
140  struct _##Clss##Class { Clss##ClassHeader(Clss, ClssSuper) }; \
141  struct _##Clss { Clss##Header(Clss) };
142 
144 #define INTERFACE(Interface) \
145  Interface##VTable * Interface##_; /*Interface vtable*/
146 
147 #define DECLARE_INTERFACE(Interface) \
148  typedef struct _##Interface##VTable Interface##VTable; \
149  typedef struct _##Interface Interface;
150 
151 #define DEFINE_INTERFACE(Interface) \
152  struct _##Interface##VTable { \
153  Interface##Header(Interface, Interface) \
154  }; \
155  struct _##Interface { Interface##VTable *_vtable; };
156 
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;
162 
163 #define INTERFACE_CAST(Interface, pobj) \
164  ((Interface*)((unsigned char*)(pobj) + (_c(pobj)->_##Interface##_obj_offset)))
165 
166 //the basic interface
167 DECLARE_INTERFACE(IInterface)
168 struct _IInterfaceVTable{
169  unsigned short _obj_offset;
170  unsigned short _next_offset;
171 };
172 
173 struct _IInterface {
174  IInterfaceVTable * _vtable;
175 };
176 
177 #define IInterfaceHeader(Interface, ClssImpl) \
178  unsigned short _##Interface##_obj_offset; \
179  unsigned short _##Interface##_next_offset; \
180 
181 
185 #define INTEFACE_ADJUST(piobj) (_TYPEOF(piobj))((unsigned char*)(piobj) - \
186  ((IInterfaceVTable*)((piobj))->_vtable)->_obj_offset)
187 
188 #define INTERFACE2OBJECT(type, piobj) (type*)((unsigned char*)(piobj) - ((IInterfaceVTable*)((piobj))->_vtable)->_obj_offset)
189 
194 #define _IM(piobj, method, ...) \
195  (piobj)->_vtable->method(INTEFACE_ADJUST(piobj), ##__VA_ARGS__)
196 #define _I(piobj) (piobj)->_vtable
197 
198 
199 
200 typedef struct _mObjectClass mObjectClass;
201 typedef struct _mObject mObject;
202 
211 typedef mObjectClass* (*PClassConstructor)(mObjectClass *);
212 
223 typedef void (*PCONSTRUCT_DWORD)(void* self, DWORD addData);
224 #include <stdarg.h>
225 typedef void (*PCONSTRUCT_VALIST)(void* self, va_list va);
226 
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*);
239 
240 
241 
242 
272 struct _mObjectClass {
273  mObjectClassHeader(mObject, mObject)
274 };
275 
280 MGNCS_EXPORT extern mObjectClass g_stmObjectCls; //Class(mObject);
281 
282 enum mObjectStatus
283 {
284  NCSF_OBJECT_TODEL = 0x1000,
285 };
286 #define NCS_OBJ_TODEL(self) (self->objStatus & NCSF_OBJECT_TODEL)
287 
288 #define mObjectHeader(clss) \
289  ClassType(clss) * _class; \
290  short objRefCount; \
291  short objStatus;
292 
303 struct _mObject {
304  mObjectHeader(mObject)
305 };
306 
307 
311 MGNCS_EXPORT void ncsRefObjFreeSpecificData(DWORD key, DWORD value);
312 
313 MGNCS_EXPORT mObject* initObject(mObject* pobj, mObjectClass* _class);
314 
318 static inline mObject* _initObject(mObject* pobj, mObjectClass* _class,DWORD param) {
319  memset(pobj, 0, _class->objSize);
320  initObject(pobj, _class);
321  ((PCONSTRUCT_DWORD)(_class->construct))(pobj, param);
322  return pobj;
323 }
324 
329 static inline mObject* initObjectArgs(mObject* pobj, mObjectClass* _class, ...)
330 {
331  va_list va;
332  va_start(va, _class);
333  memset(pobj, 0, _class->objSize);
334  initObject(pobj, _class);
335  ((PCONSTRUCT_VALIST)(_class->construct))(pobj, va);
336  va_end(va);
337  return pobj;
338 }
339 
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))
344 
366 MGNCS_EXPORT mObject * newObject(mObjectClass *_class);
367 static inline mObject * ncsNewObject(mObjectClass *_class,DWORD addData){
368  mObject * obj = newObject(_class);
369  if(!obj)
370  return NULL;
371 
372  _class->construct(obj, addData);
373  return obj;
374 }
375 
376 #define NEWEX(classType, addData) (classType*)(void*)ncsNewObject((mObjectClass*)(void *)(&Class(classType)), (DWORD)(addData))
377 #define NEW(classType) NEWEX(classType, 0)
378 static inline mObject * _newobject_args(mObjectClass* _class, ...)
379 {
380  va_list va;
381  mObject * obj;
382  va_start(va, _class);
383  obj = newObject(_class);
384  if(obj)
385  ((PCONSTRUCT_VALIST)(_class->construct))(obj, va);
386  va_end(va);
387  return obj;
388 }
389 #define NEWV(Clss, ...) ((Clss*)_newobject_args((mObjectClass*)&(Class(Clss)), ##__VA_ARGS__))
390 
398 MGNCS_EXPORT void deleteObject(mObject *obj);
399 #define DELETE(obj) deleteObject((mObject*)(obj))
400 
405 #define TYPENAME(obj) ((obj)?(((obj)->_class)?((obj)->_class)->typeName:""):"")
406 
408 
418 MGNCS_EXPORT BOOL ncsInstanceOf(mObject* object, mObjectClass* clss);
419 
428 #define INSTANCEOF(obj, clss) ncsInstanceOf((mObject*)(obj), (mObjectClass*)(void*)(&Class(clss)))
429 
438 static inline mObject* ncsIsValidObj(mObject* obj){
439  return (INSTANCEOF(obj, mObject)?(obj):NULL);
440 }
441 
448 #define CHECKOBJ(obj) ncsIsValidObj((mObject*)obj)
449 
461 MGNCS_EXPORT mObject* ncsSafeCast(mObject* obj, mObjectClass *clss);
462 
467 #define TYPE_CAST(Type, obj) ((Type*)(obj))
468 
476 #define SAFE_CAST(Type, obj) TYPE_CAST(Type, ncsSafeCast((mObject*)obj,(mObjectClass*)(void*)(&(Class(Type)))))
477 
489 MGNCS_EXPORT mObjectClass *ncsSafeCastClass(mObjectClass* clss, mObjectClass* castCls);
494 #define SAFE_CAST_CLASS(Clss, ClssCast) ((ClassType(ClssCast)*)(ncsSafeCastClass((mObjectClass*)Clss, (mObjectClass*)(void*)(&Class(ClssCast)))))
495 
496 int ncsParseConstructParams(va_list args, const char* signature, ...);
497 
511 typedef BOOL (*NCS_CB_ONOBJEVENT)(mObject* self, mObject *sender, int eventId, DWORD param);
512 
513 #define NCS_CB_ONPIECEEVENT NCS_CB_ONOBJEVENT
514 
531 MGNCS_EXPORT BOOL ncsAddEventListener(mObject *sender,
532  mObject* listener,
533  NCS_CB_ONOBJEVENT eventProc,
534  int eventId);
535 
552 MGNCS_EXPORT BOOL ncsAddEventListeners(mObject *sender,
553  mObject* listener,
554  NCS_CB_ONOBJEVENT eventProc,
555  int* eventIds);
556 
567 MGNCS_EXPORT BOOL ncsRemoveEventListener(mObject * listener);
568 
578 MGNCS_EXPORT BOOL ncsRemoveEventConnect(mObject* listener, mObject* source, int eventId);
579 
590 MGNCS_EXPORT BOOL ncsRemoveEventSource(mObject *sender);
591 
604 MGNCS_EXPORT void ncsRaiseEvent(mObject *sender, int eventId, DWORD param);
605 
606 
611 #ifdef __cplusplus
612 }
613 #endif
614 
615 
616 #endif
617 
g_stmObjectCls
MGNCS_EXPORT mObjectClass g_stmObjectCls
the singleton of mObjectClass, represent a class object
deleteObject
MGNCS_EXPORT void deleteObject(mObject *obj)
delete a object intance, like delete operator in C++
mObject
the Object struct
ncsRemoveEventListener
MGNCS_EXPORT BOOL ncsRemoveEventListener(mObject *listener)
remove the connections which are listened by the object
_initObject
static mObject * _initObject(mObject *pobj, mObjectClass *_class, DWORD param)
Definition: mobject.h:318
ncsAddEventListeners
MGNCS_EXPORT BOOL ncsAddEventListeners(mObject *sender, mObject *listener, NCS_CB_ONOBJEVENT eventProc, int *eventIds)
connect a group of events from sender to listener
ncsInstanceOf
MGNCS_EXPORT BOOL ncsInstanceOf(mObject *object, mObjectClass *clss)
check an object is the class instance or not, same as instanceof operator in Java
INSTANCEOF
#define INSTANCEOF(obj, clss)
A wrapper of ncsInstanceOf, just like java's instanceof.
Definition: mobject.h:428
ncsSafeCast
MGNCS_EXPORT mObject * ncsSafeCast(mObject *obj, mObjectClass *clss)
safe type cast function, like the dynamic_cast operator in C++
mObjectClass
the basic object class of NCS
ncsIsValidObj
static mObject * ncsIsValidObj(mObject *obj)
Check a pointer is a valid mObject or not.
Definition: mobject.h:438
newObject
MGNCS_EXPORT mObject * newObject(mObjectClass *_class)
new a object instance, like new operator in C++
PCONSTRUCT_DWORD
void(* PCONSTRUCT_DWORD)(void *self, DWORD addData)
Definition: mobject.h:223
ncsRemoveEventConnect
MGNCS_EXPORT BOOL ncsRemoveEventConnect(mObject *listener, mObject *source, int eventId)
remove a special event connect
initObjectArgs
static mObject * initObjectArgs(mObject *pobj, mObjectClass *_class,...)
Definition: mobject.h:329
ncsRaiseEvent
MGNCS_EXPORT void ncsRaiseEvent(mObject *sender, int eventId, DWORD param)
raise an event to listeners
ncsRemoveEventSource
MGNCS_EXPORT BOOL ncsRemoveEventSource(mObject *sender)
remove the connections when a sender is destroied