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