| |
1 /* |
| |
2 * libtu/obj.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_OBJ_H |
| |
11 #define LIBTU_OBJ_H |
| |
12 |
| |
13 #include "types.h" |
| |
14 |
| |
15 #define CLASSDESCR(TYPE) TYPE##_classdescr |
| |
16 |
| |
17 #define OBJ_IS(OBJ, TYPE) obj_is((Obj*)OBJ, &CLASSDESCR(TYPE)) |
| |
18 #define OBJ_CAST(OBJ, TYPE) (TYPE*)obj_cast((Obj*)OBJ, &CLASSDESCR(TYPE)) |
| |
19 |
| |
20 #define INTRSTRUCT(STRU) \ |
| |
21 struct STRU##_struct; typedef struct STRU##_struct STRU |
| |
22 #define DECLSTRUCT(STRU) \ |
| |
23 struct STRU##_struct |
| |
24 |
| |
25 #define INTRCLASS(OBJ) INTRSTRUCT(OBJ); extern ClassDescr CLASSDESCR(OBJ) |
| |
26 #define DECLCLASS(OBJ) DECLSTRUCT(OBJ) |
| |
27 |
| |
28 INTRSTRUCT(ClassDescr); |
| |
29 INTRCLASS(Obj); |
| |
30 INTRSTRUCT(Watch); |
| |
31 |
| |
32 extern bool obj_is(const Obj *obj, const ClassDescr *descr); |
| |
33 extern bool obj_is_str(const Obj *obj, const char *str); |
| |
34 extern const void *obj_cast(const Obj *obj, const ClassDescr *descr); |
| |
35 |
| |
36 extern void destroy_obj(Obj *obj); |
| |
37 |
| |
38 DECLCLASS(Obj){ |
| |
39 ClassDescr *obj_type; |
| |
40 Watch *obj_watches; |
| |
41 int flags; |
| |
42 }; |
| |
43 |
| |
44 #define OBJ_DEST 0x0001 |
| |
45 #define OBJ_EXTL_CACHED 0x0002 |
| |
46 |
| |
47 #define OBJ_IS_BEING_DESTROYED(OBJ) (((Obj*)(OBJ))->flags&OBJ_DEST) |
| |
48 |
| |
49 #define DYNFUN |
| |
50 |
| |
51 typedef void WatchHandler(Watch *watch, Obj *obj); |
| |
52 |
| |
53 #define WWATCH_INIT {NULL, NULL, NULL, NULL} |
| |
54 |
| |
55 DECLSTRUCT(Watch){ |
| |
56 Obj *obj; |
| |
57 Watch *next, *prev; |
| |
58 WatchHandler *handler; |
| |
59 }; |
| |
60 |
| |
61 extern bool watch_setup(Watch *watch, Obj *obj, |
| |
62 WatchHandler *handler); |
| |
63 extern void watch_reset(Watch *watch); |
| |
64 extern bool watch_ok(Watch *watch); |
| |
65 extern void watch_init(Watch *watch); |
| |
66 extern void watch_call(Obj *obj); |
| |
67 |
| |
68 #endif /* LIBTU_OBJ_H */ |