fix dependence on build isl
[barvinok.git] / isl_obj_list.c
blob0625450c8960572e9797dac967aedac774c1a8fc
1 #include <isl_obj_list.h>
3 struct isl_list *isl_list_alloc(struct isl_ctx *ctx, int n)
5 int i;
6 struct isl_list *list;
8 isl_assert(ctx, n >= 0, return NULL);
9 list = isl_alloc(ctx, struct isl_list,
10 sizeof(struct isl_list) +
11 (n - 1) * sizeof(struct isl_obj));
12 if (!list)
13 return NULL;
15 list->ctx = ctx;
16 isl_ctx_ref(list->ctx);
17 list->ref = 1;
18 list->n = n;
20 for (i = 0; i < n; ++i) {
21 list->obj[i].type = isl_obj_none;
22 list->obj[i].v = NULL;
25 return list;
28 struct isl_list *isl_list_copy(struct isl_list *list)
30 if (!list)
31 return NULL;
33 list->ref++;
34 return list;
37 void isl_list_free(struct isl_list *list)
39 int i;
41 if (!list)
42 return;
44 if (--list->ref > 0)
45 return;
47 for (i = 0; i < list->n; ++i)
48 list->obj[i].type->free(list->obj[i].v);
49 isl_ctx_deref(list->ctx);
50 free(list);
53 static void *isl_obj_list_copy(void *v)
55 return isl_list_copy((struct isl_list *)v);
58 static void isl_obj_list_free(void *v)
60 isl_list_free((struct isl_list *)v);
63 static __isl_give isl_printer *isl_obj_list_print(__isl_take isl_printer *p,
64 void *v)
66 struct isl_list *list = (struct isl_list *)v;
67 int i;
69 isl_printer_print_str(p, "(");
70 for (i = 0; i < list->n; ++i) {
71 if (i)
72 isl_printer_print_str(p, ", ");
73 list->obj[i].type->print(p, list->obj[i].v);
75 isl_printer_print_str(p, ")");
78 __isl_give isl_list *isl_list_concat(__isl_take isl_list *list1,
79 __isl_take isl_list *list2)
81 int i;
82 struct isl_list *list;
84 if (!list1 || !list2)
85 goto error;
87 list = isl_list_alloc(list1->ctx, list1->n + list2->n);
88 if (!list)
89 goto error;
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);
104 return list;
105 error:
106 isl_list_free(list1);
107 isl_list_free(list2);
108 return NULL;
111 static void *isl_obj_list_add(void *v1, void *v2)
113 struct isl_list *list1 = (struct isl_list *)v1;
114 struct isl_list *list2 = (struct isl_list *)v2;
116 return isl_list_concat(list1, list2);
119 struct isl_obj_vtable isl_obj_list_vtable = {
120 isl_obj_list_copy,
121 isl_obj_list_add,
122 isl_obj_list_print,
123 isl_obj_list_free