1 #include <isl_obj_list.h>
3 struct isl_list
*isl_list_alloc(struct isl_ctx
*ctx
, int n
)
8 isl_assert(ctx
, n
>= 0, return NULL
);
9 list
= isl_alloc(ctx
, struct isl_list
,
10 sizeof(struct isl_list
) + n
* sizeof(struct isl_obj
));
15 isl_ctx_ref(list
->ctx
);
19 for (i
= 0; i
< n
; ++i
) {
20 list
->obj
[i
].type
= isl_obj_none
;
21 list
->obj
[i
].v
= NULL
;
27 struct isl_list
*isl_list_copy(struct isl_list
*list
)
36 void isl_list_free(struct isl_list
*list
)
46 for (i
= 0; i
< list
->n
; ++i
)
47 list
->obj
[i
].type
->free(list
->obj
[i
].v
);
48 isl_ctx_deref(list
->ctx
);
52 static void *isl_obj_list_copy(void *v
)
54 return isl_list_copy((struct isl_list
*)v
);
57 static void isl_obj_list_free(void *v
)
59 isl_list_free((struct isl_list
*)v
);
62 static __isl_give isl_printer
*isl_obj_list_print(__isl_take isl_printer
*p
,
65 struct isl_list
*list
= (struct isl_list
*)v
;
68 p
= isl_printer_print_str(p
, "(");
69 for (i
= 0; i
< list
->n
; ++i
) {
71 p
= isl_printer_print_str(p
, ", ");
72 p
= list
->obj
[i
].type
->print(p
, list
->obj
[i
].v
);
74 p
= isl_printer_print_str(p
, ")");
78 __isl_give isl_list
*isl_list_concat(__isl_take isl_list
*list1
,
79 __isl_take isl_list
*list2
)
82 struct isl_list
*list
;
87 list
= isl_list_alloc(list1
->ctx
, list1
->n
+ list2
->n
);
91 for (i
= 0; i
< list1
->n
; ++i
) {
92 list
->obj
[i
].type
= list1
->obj
[i
].type
;
93 list
->obj
[i
].v
= list1
->obj
[i
].type
->copy(list1
->obj
[i
].v
);
96 for (i
= 0; i
< list2
->n
; ++i
) {
97 list
->obj
[list1
->n
+ i
].type
= list2
->obj
[i
].type
;
98 list
->obj
[list1
->n
+ i
].v
= list2
->obj
[i
].type
->copy(list2
->obj
[i
].v
);
101 isl_list_free(list1
);
102 isl_list_free(list2
);
106 isl_list_free(list1
);
107 isl_list_free(list2
);
111 __isl_give isl_list
*isl_list_add_obj(__isl_take isl_list
*list
,
112 __isl_take
struct isl_obj obj
)
114 struct isl_list
*new_list
;
119 new_list
= isl_realloc(list
->ctx
, list
, struct isl_list
,
120 sizeof(struct isl_list
) +
121 (list
->n
+ 1) * sizeof(struct isl_obj
));
126 list
->obj
[list
->n
] = obj
;
131 obj
.type
->free(obj
.v
);
136 static void *isl_obj_list_add(void *v1
, void *v2
)
138 struct isl_list
*list1
= (struct isl_list
*)v1
;
139 struct isl_list
*list2
= (struct isl_list
*)v2
;
141 return isl_list_concat(list1
, list2
);
144 struct isl_obj_vtable isl_obj_list_vtable
= {