drop "nparam" argument from isl_{set,map}_read_from_{file,str}
[platform/upstream/isl.git] / isl_list_templ.c
index c3a8b4f..9aa4351 100644 (file)
 #define xLIST(EL) EL ## _list
 #define LIST(EL) xLIST(EL)
 
+isl_ctx *FN(LIST(EL),get_ctx)(__isl_keep LIST(EL) *list)
+{
+       return list ? list->ctx : NULL;
+}
+
 __isl_give LIST(EL) *FN(LIST(EL),alloc)(isl_ctx *ctx, int n)
 {
        LIST(EL) *list;
@@ -49,6 +54,22 @@ __isl_give LIST(EL) *FN(LIST(EL),copy)(__isl_keep LIST(EL) *list)
        return list;
 }
 
+__isl_give LIST(EL) *FN(LIST(EL),dup)(__isl_keep LIST(EL) *list)
+{
+       int i;
+       LIST(EL) *dup;
+
+       if (!list)
+               return NULL;
+
+       dup = FN(LIST(EL),alloc)(FN(LIST(EL),get_ctx)(list), list->n);
+       if (!dup)
+               return NULL;
+       for (i = 0; i < list->n; ++i)
+               dup = FN(LIST(EL),add)(dup, FN(EL,copy)(list->p[i]));
+       return dup;
+}
+
 __isl_give LIST(EL) *FN(LIST(EL),add)(__isl_take LIST(EL) *list,
        __isl_take struct EL *el)
 {
@@ -64,18 +85,132 @@ error:
        return NULL;
 }
 
-void FN(LIST(EL),free)(__isl_take LIST(EL) *list)
+void *FN(LIST(EL),free)(__isl_take LIST(EL) *list)
 {
        int i;
 
        if (!list)
-               return;
+               return NULL;
 
        if (--list->ref > 0)
-               return;
+               return NULL;
 
        isl_ctx_deref(list->ctx);
        for (i = 0; i < list->n; ++i)
                FN(EL,free)(list->p[i]);
        free(list);
+
+       return NULL;
+}
+
+int FN(FN(LIST(EL),n),BASE)(__isl_keep LIST(EL) *list)
+{
+       return list ? list->n : 0;
+}
+
+__isl_give EL *FN(FN(LIST(EL),get),BASE)(__isl_keep LIST(EL) *list, int index)
+{
+       if (!list)
+               return NULL;
+       if (index < 0 || index >= list->n)
+               isl_die(list->ctx, isl_error_invalid,
+                       "index out of bounds", return NULL);
+       return FN(EL,copy)(list->p[index]);
+}
+
+int FN(LIST(EL),foreach)(__isl_keep LIST(EL) *list,
+       int (*fn)(__isl_take EL *el, void *user), void *user)
+{
+       int i;
+
+       if (!list)
+               return -1;
+
+       for (i = 0; i < list->n; ++i) {
+               EL *el = FN(EL,copy(list->p[i]));
+               if (!el)
+                       return -1;
+               if (fn(el, user) < 0)
+                       return -1;
+       }
+
+       return 0;
+}
+
+__isl_give LIST(EL) *FN(FN(LIST(EL),from),BASE)(__isl_take EL *el)
+{
+       isl_ctx *ctx;
+       LIST(EL) *list;
+
+       if (!el)
+               return NULL;
+       ctx = FN(EL,get_ctx)(el);
+       list = FN(LIST(EL),alloc)(ctx, 1);
+       if (!list)
+               goto error;
+       list = FN(LIST(EL),add)(list, el);
+       return list;
+error:
+       FN(EL,free)(el);
+       return NULL;
+}
+
+__isl_give LIST(EL) *FN(LIST(EL),concat)(__isl_take LIST(EL) *list1,
+       __isl_take LIST(EL) *list2)
+{
+       int i;
+       isl_ctx *ctx;
+       LIST(EL) *res;
+
+       if (!list1 || !list2)
+               goto error;
+
+       ctx = FN(LIST(EL),get_ctx)(list1);
+       res = FN(LIST(EL),alloc)(ctx, list1->n + list2->n);
+       for (i = 0; i < list1->n; ++i)
+               res = FN(LIST(EL),add)(res, FN(EL,copy)(list1->p[i]));
+       for (i = 0; i < list2->n; ++i)
+               res = FN(LIST(EL),add)(res, FN(EL,copy)(list2->p[i]));
+
+       FN(LIST(EL),free)(list1);
+       FN(LIST(EL),free)(list2);
+       return res;
+error:
+       FN(LIST(EL),free)(list1);
+       FN(LIST(EL),free)(list2);
+       return NULL;
+}
+
+__isl_give isl_printer *CAT(isl_printer_print_,LIST(BASE))(
+       __isl_take isl_printer *p, __isl_keep LIST(EL) *list)
+{
+       int i;
+
+       if (!p || !list)
+               goto error;
+       p = isl_printer_print_str(p, "(");
+       for (i = 0; i < list->n; ++i) {
+               if (i)
+                       p = isl_printer_print_str(p, ",");
+               p = CAT(isl_printer_print_,BASE)(p, list->p[i]);
+       }
+       p = isl_printer_print_str(p, ")");
+       return p;
+error:
+       isl_printer_free(p);
+       return NULL;
+}
+
+void FN(LIST(EL),dump)(__isl_keep LIST(EL) *list)
+{
+       isl_printer *printer;
+
+       if (!list)
+               return;
+
+       printer = isl_printer_to_file(FN(LIST(EL),get_ctx)(list), stderr);
+       printer = CAT(isl_printer_print_,LIST(BASE))(printer, list);
+       printer = isl_printer_end_line(printer);
+
+       isl_printer_free(printer);
 }