1 | /*************************************************************************/ |
2 | /* */ |
3 | /* Language Technologies Institute */ |
4 | /* Carnegie Mellon University */ |
5 | /* Copyright (c) 1999 */ |
6 | /* All Rights Reserved. */ |
7 | /* */ |
8 | /* Permission is hereby granted, free of charge, to use and distribute */ |
9 | /* this software and its documentation without restriction, including */ |
10 | /* without limitation the rights to use, copy, modify, merge, publish, */ |
11 | /* distribute, sublicense, and/or sell copies of this work, and to */ |
12 | /* permit persons to whom this work is furnished to do so, subject to */ |
13 | /* the following conditions: */ |
14 | /* 1. The code must retain the above copyright notice, this list of */ |
15 | /* conditions and the following disclaimer. */ |
16 | /* 2. Any modifications must be clearly marked as such. */ |
17 | /* 3. Original authors' names are not deleted. */ |
18 | /* 4. The authors' names are not used to endorse or promote products */ |
19 | /* derived from this software without specific prior written */ |
20 | /* permission. */ |
21 | /* */ |
22 | /* CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK */ |
23 | /* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */ |
24 | /* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */ |
25 | /* SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE */ |
26 | /* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */ |
27 | /* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */ |
28 | /* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */ |
29 | /* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */ |
30 | /* THIS SOFTWARE. */ |
31 | /* */ |
32 | /*************************************************************************/ |
33 | /* Author: Alan W Black (awb@cs.cmu.edu) */ |
34 | /* Date: December 1999 */ |
35 | /*************************************************************************/ |
36 | /* */ |
37 | /* Macros for user defined type objects */ |
38 | /* */ |
39 | /*************************************************************************/ |
40 | #ifndef _CST_VAL_DEFS_H__ |
41 | #define _CST_VAL_DEFS_H__ |
42 | |
43 | #include <stdlib.h> |
44 | |
45 | /* Macro for defining new user structs as vals */ |
46 | #define CST_VAL_USER_TYPE_DCLS(NAME,TYPE) \ |
47 | extern const int cst_val_type_##NAME; \ |
48 | TYPE *val_##NAME(const cst_val *v); \ |
49 | cst_val *NAME##_val(const TYPE *v); |
50 | |
51 | #define CST_VAL_USER_FUNCPTR_DCLS(NAME,TYPE) \ |
52 | extern const int cst_val_type_##NAME; \ |
53 | TYPE val_##NAME(const cst_val *v); \ |
54 | cst_val *NAME##_val(const TYPE v); |
55 | |
56 | #define CST_VAL_REGISTER_TYPE(NAME,TYPE) \ |
57 | TYPE *val_##NAME(const cst_val *v) \ |
58 | { \ |
59 | return (TYPE *)val_generic(v,cst_val_type_##NAME,#NAME); \ |
60 | } \ |
61 | void val_delete_##NAME(void *v) \ |
62 | { \ |
63 | delete_##NAME((TYPE *)v); \ |
64 | } \ |
65 | \ |
66 | cst_val *NAME##_val(const TYPE *v) \ |
67 | { \ |
68 | return val_new_typed(cst_val_type_##NAME, \ |
69 | (void *)v); \ |
70 | } \ |
71 | |
72 | #define CST_VAL_REG_TD_TYPE(NAME,TYPE,NUM) \ |
73 | extern const int cst_val_type_##NAME; \ |
74 | const int cst_val_type_##NAME=NUM; \ |
75 | void val_delete_##NAME(void *v); \ |
76 | |
77 | /* When objects of this type can never be owned by vals */ |
78 | #define CST_VAL_REGISTER_TYPE_NODEL(NAME,TYPE) \ |
79 | TYPE *val_##NAME(const cst_val *v) \ |
80 | { \ |
81 | return (TYPE *)val_generic(v,cst_val_type_##NAME,#NAME); \ |
82 | } \ |
83 | \ |
84 | cst_val *NAME##_val(const TYPE *v) \ |
85 | { \ |
86 | return val_new_typed(cst_val_type_##NAME, \ |
87 | (void *)v); \ |
88 | } \ |
89 | |
90 | #define CST_VAL_REG_TD_TYPE_NODEL(NAME,TYPE,NUM) \ |
91 | extern const int cst_val_type_##NAME; \ |
92 | const int cst_val_type_##NAME=NUM; \ |
93 | void val_delete_##NAME(void *v) { (void)v; } \ |
94 | |
95 | #define CST_VAL_REGISTER_FUNCPTR(NAME,TYPE) \ |
96 | TYPE val_##NAME(const cst_val *v) \ |
97 | { \ |
98 | return (TYPE)val_generic(v,cst_val_type_##NAME,#NAME); \ |
99 | } \ |
100 | \ |
101 | cst_val *NAME##_val(const TYPE v) \ |
102 | { \ |
103 | return val_new_typed(cst_val_type_##NAME, \ |
104 | (void *)v); \ |
105 | } \ |
106 | |
107 | #define CST_VAL_REG_TD_FUNCPTR(NAME,TYPE,NUM) \ |
108 | extern const int cst_val_type_##NAME; \ |
109 | const int cst_val_type_##NAME=NUM; \ |
110 | void val_delete_##NAME(void *v) { (void)v; } \ |
111 | |
112 | #endif |
113 | |