objp.h

changeset 60
a4033700e35c
child 62
aae5facf9fc5
equal deleted inserted replaced
59:d8ecbeda7683 60:a4033700e35c
1 /*
2 * libtu/objp.h
3 *
4 * Copyright (c) Tuomo Valkonen 1999-2004.
5 *
6 * You may distribute and modify this library under the terms of either
7 * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
8 */
9
10 #ifndef LIBTU_OBJP_H
11 #define LIBTU_OBJP_H
12
13 #include "types.h"
14 #include "obj.h"
15
16 typedef void DynFun();
17
18 INTRSTRUCT(DynFunTab);
19
20 DECLSTRUCT(DynFunTab){
21 DynFun *func, *handler;
22 };
23
24 DECLSTRUCT(ClassDescr){
25 const char *name;
26 ClassDescr *ancestor;
27 int funtab_n;
28 DynFunTab *funtab;
29 void (*destroy_fn)();
30 };
31
32 #define OBJ_TYPESTR(OBJ) (((Obj*)OBJ)->obj_type->name)
33
34 #define IMPLCLASS(CLS, ANCESTOR, DFN, DYN) \
35 ClassDescr CLASSDESCR(CLS)={ \
36 #CLS, &CLASSDESCR(ANCESTOR), -1, DYN, (void (*)())DFN}
37
38 #define OBJ_INIT(O, TYPE) {((Obj*)(O))->obj_type=&CLASSDESCR(TYPE); \
39 ((Obj*)(O))->obj_watches=NULL; ((Obj*)(O))->flags=0;}
40
41 #define CREATEOBJ_IMPL(OBJ, LOWOBJ, INIT_ARGS) \
42 OBJ *p; p=ALLOC(OBJ); if(p==NULL){ warn_err(); return NULL; } \
43 OBJ_INIT(p, OBJ); \
44 if(!LOWOBJ ## _init INIT_ARGS) { free((void*)p); return NULL; } return p
45
46 #define SIMPLECREATEOBJ_IMPL(OBJ, LOWOBJ) \
47 OBJ *p; p=ALLOC(OBJ); if(p==NULL){ warn_err(); return NULL; } \
48 OBJ_INIT(p, OBJ); \
49 return p;
50
51 #define END_DYNFUNTAB {NULL, NULL}
52
53 extern DynFun *lookup_dynfun(const Obj *obj, DynFun *func,
54 bool *funnotfound);
55 extern bool has_dynfun(const Obj *obj, DynFun *func);
56
57 #define CALL_DYN(FUNC, OBJ, ARGS) \
58 bool funnotfound; \
59 lookup_dynfun((Obj*)OBJ, (DynFun*)FUNC, &funnotfound) ARGS;
60
61 #define CALL_DYN_RET(RETV, RET, FUNC, OBJ, ARGS) \
62 typedef RET ThisDynFun(); \
63 bool funnotfound; \
64 ThisDynFun *funtmp; \
65 funtmp=(ThisDynFun*)lookup_dynfun((Obj*)OBJ, (DynFun*)FUNC, \
66 &funnotfound); \
67 if(!funnotfound) \
68 RETV=funtmp ARGS;
69
70 #define HAS_DYN(OBJ, FUNC) has_dynfun((Obj*)OBJ, (DynFun*)FUNC)
71
72 #endif /* LIBTU_OBJP_H */

mercurial