Mon, 16 Feb 2004 18:04:44 +0100
trunk: changeset 1313
Moved Ion object system and other generic code from Ion to libtu.
| 60 | 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 */ |