0b6b269f7b58911efbbb6c29b1cec82c49ddaa55
[m6w6/ext-psi] / src / types / set_value.h
1 #ifndef _PSI_TYPES_SET_VALUE_H
2 #define _PSI_TYPES_SET_VALUE_H
3
4 typedef struct set_value {
5 set_func *func;
6 decl_vars *vars;
7 num_exp *num;
8 struct {
9 struct set_value *set;
10 impl_val *val;
11 } outer;
12 struct set_values *inner;
13 } set_value;
14
15 static inline set_value *init_set_value(set_func *func, decl_vars *vars) {
16 set_value *val = calloc(1, sizeof(*val));
17 val->func = func;
18 val->vars = vars;
19 return val;
20 }
21
22 static inline struct set_values *add_set_value(struct set_values *vals, struct set_value *val);
23 static inline set_value *add_inner_set_value(set_value *val, set_value *inner) {
24 val->inner = add_set_value(val->inner, inner);
25 inner->outer.set = val;
26 return val;
27 }
28
29 static inline void free_set_value(set_value *val) {
30 if (val->func) {
31 free_set_func(val->func);
32 }
33 if (val->vars) {
34 free_decl_vars(val->vars);
35 }
36 if (val->inner && (!val->outer.set || val->outer.set->inner != val->inner)) {
37 free_set_values(val->inner);
38 }
39 if (val->num) {
40 free_num_exp(val->num);
41 }
42 free(val);
43 }
44
45 #endif