1/* 2 * Copyright 2010 INRIA Saclay 3 * 4 * Use of this software is governed by the MIT license 5 * 6 * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France, 7 * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, 8 * 91893 Orsay, France 9 */ 10 11#include <isl/set.h> 12#include <isl/map.h> 13#include <isl/polynomial.h> 14#include <isl/obj.h> 15 16struct isl_int_obj { 17 int ref; 18 isl_ctx *ctx; 19 isl_int v; 20}; 21 22__isl_give isl_int_obj *isl_int_obj_alloc(isl_ctx *ctx, isl_int v) 23{ 24 isl_int_obj *i; 25 26 i = isl_alloc_type(ctx, isl_int_obj); 27 if (!i) 28 return NULL; 29 30 i->ctx = ctx; 31 isl_ctx_ref(ctx); 32 i->ref = 1; 33 isl_int_init(i->v); 34 isl_int_set(i->v, v); 35 36 return i; 37} 38 39__isl_give isl_int_obj *isl_int_obj_copy(__isl_keep isl_int_obj *i) 40{ 41 if (!i) 42 return NULL; 43 44 i->ref++; 45 return i; 46} 47 48__isl_give isl_int_obj *isl_int_obj_dup(__isl_keep isl_int_obj *i) 49{ 50 if (!i) 51 return NULL; 52 53 return isl_int_obj_alloc(i->ctx, i->v); 54} 55 56__isl_give isl_int_obj *isl_int_obj_cow(__isl_take isl_int_obj *i) 57{ 58 if (!i) 59 return NULL; 60 61 if (i->ref == 1) 62 return i; 63 i->ref--; 64 return isl_int_obj_dup(i); 65} 66 67void isl_int_obj_free(__isl_take isl_int_obj *i) 68{ 69 if (!i) 70 return; 71 72 if (--i->ref > 0) 73 return; 74 75 isl_ctx_deref(i->ctx); 76 isl_int_clear(i->v); 77 free(i); 78} 79 80__isl_give isl_int_obj *isl_int_obj_add(__isl_take isl_int_obj *i1, 81 __isl_take isl_int_obj *i2) 82{ 83 i1 = isl_int_obj_cow(i1); 84 if (!i1 || !i2) 85 goto error; 86 87 isl_int_add(i1->v, i1->v, i2->v); 88 89 isl_int_obj_free(i2); 90 return i1; 91error: 92 isl_int_obj_free(i1); 93 isl_int_obj_free(i2); 94 return NULL; 95} 96 97__isl_give isl_int_obj *isl_int_obj_sub(__isl_take isl_int_obj *i1, 98 __isl_take isl_int_obj *i2) 99{ 100 i1 = isl_int_obj_cow(i1); 101 if (!i1 || !i2) 102 goto error; 103 104 isl_int_sub(i1->v, i1->v, i2->v); 105 106 isl_int_obj_free(i2); 107 return i1; 108error: 109 isl_int_obj_free(i1); 110 isl_int_obj_free(i2); 111 return NULL; 112} 113 114__isl_give isl_int_obj *isl_int_obj_mul(__isl_take isl_int_obj *i1, 115 __isl_take isl_int_obj *i2) 116{ 117 i1 = isl_int_obj_cow(i1); 118 if (!i1 || !i2) 119 goto error; 120 121 isl_int_mul(i1->v, i1->v, i2->v); 122 123 isl_int_obj_free(i2); 124 return i1; 125error: 126 isl_int_obj_free(i1); 127 isl_int_obj_free(i2); 128 return NULL; 129} 130 131void isl_int_obj_get_int(__isl_keep isl_int_obj *i, isl_int *v) 132{ 133 if (!i) 134 return; 135 isl_int_set(*v, i->v); 136} 137 138static void *isl_obj_int_copy(void *v) 139{ 140 return isl_int_obj_copy((isl_int_obj *)v); 141} 142 143static void isl_obj_int_free(void *v) 144{ 145 isl_int_obj_free((isl_int_obj *)v); 146} 147 148static __isl_give isl_printer *isl_obj_int_print(__isl_take isl_printer *p, 149 void *v) 150{ 151 isl_int_obj *i = v; 152 return isl_printer_print_isl_int(p, i->v); 153} 154 155static void *isl_obj_int_add(void *v1, void *v2) 156{ 157 return isl_int_obj_add((isl_int_obj *)v1, (isl_int_obj *)v2); 158} 159 160struct isl_obj_vtable isl_obj_int_vtable = { 161 isl_obj_int_copy, 162 isl_obj_int_add, 163 isl_obj_int_print, 164 isl_obj_int_free 165}; 166 167static void *isl_obj_val_copy(void *v) 168{ 169 return isl_val_copy((isl_val *)v); 170} 171 172static void isl_obj_val_free(void *v) 173{ 174 isl_val_free((isl_val *)v); 175} 176 177static __isl_give isl_printer *isl_obj_val_print(__isl_take isl_printer *p, 178 void *v) 179{ 180 return isl_printer_print_val(p, (isl_val *)v); 181} 182 183static void *isl_obj_val_add(void *v1, void *v2) 184{ 185 return isl_val_add((isl_val *) v1, (isl_val *) v2); 186} 187 188struct isl_obj_vtable isl_obj_val_vtable = { 189 isl_obj_val_copy, 190 isl_obj_val_add, 191 isl_obj_val_print, 192 isl_obj_val_free 193}; 194 195static void *isl_obj_map_copy(void *v) 196{ 197 return isl_map_copy((struct isl_map *)v); 198} 199 200static void isl_obj_map_free(void *v) 201{ 202 isl_map_free((struct isl_map *)v); 203} 204 205static __isl_give isl_printer *isl_obj_map_print(__isl_take isl_printer *p, 206 void *v) 207{ 208 return isl_printer_print_map(p, (struct isl_map *)v); 209} 210 211static void *isl_obj_map_add(void *v1, void *v2) 212{ 213 return isl_map_union((struct isl_map *)v1, (struct isl_map *)v2); 214} 215 216struct isl_obj_vtable isl_obj_map_vtable = { 217 isl_obj_map_copy, 218 isl_obj_map_add, 219 isl_obj_map_print, 220 isl_obj_map_free 221}; 222 223static void *isl_obj_union_map_copy(void *v) 224{ 225 return isl_union_map_copy((isl_union_map *)v); 226} 227 228static void isl_obj_union_map_free(void *v) 229{ 230 isl_union_map_free((isl_union_map *)v); 231} 232 233static __isl_give isl_printer *isl_obj_union_map_print(__isl_take isl_printer *p, 234 void *v) 235{ 236 return isl_printer_print_union_map(p, (isl_union_map *)v); 237} 238 239static void *isl_obj_union_map_add(void *v1, void *v2) 240{ 241 return isl_union_map_union((isl_union_map *)v1, (isl_union_map *)v2); 242} 243 244struct isl_obj_vtable isl_obj_union_map_vtable = { 245 isl_obj_union_map_copy, 246 isl_obj_union_map_add, 247 isl_obj_union_map_print, 248 isl_obj_union_map_free 249}; 250 251static void *isl_obj_set_copy(void *v) 252{ 253 return isl_set_copy((struct isl_set *)v); 254} 255 256static void isl_obj_set_free(void *v) 257{ 258 isl_set_free((struct isl_set *)v); 259} 260 261static __isl_give isl_printer *isl_obj_set_print(__isl_take isl_printer *p, 262 void *v) 263{ 264 return isl_printer_print_set(p, (struct isl_set *)v); 265} 266 267static void *isl_obj_set_add(void *v1, void *v2) 268{ 269 return isl_set_union((struct isl_set *)v1, (struct isl_set *)v2); 270} 271 272struct isl_obj_vtable isl_obj_set_vtable = { 273 isl_obj_set_copy, 274 isl_obj_set_add, 275 isl_obj_set_print, 276 isl_obj_set_free 277}; 278 279static void *isl_obj_union_set_copy(void *v) 280{ 281 return isl_union_set_copy((isl_union_set *)v); 282} 283 284static void isl_obj_union_set_free(void *v) 285{ 286 isl_union_set_free((isl_union_set *)v); 287} 288 289static __isl_give isl_printer *isl_obj_union_set_print(__isl_take isl_printer *p, 290 void *v) 291{ 292 return isl_printer_print_union_set(p, (isl_union_set *)v); 293} 294 295static void *isl_obj_union_set_add(void *v1, void *v2) 296{ 297 return isl_union_set_union((isl_union_set *)v1, (isl_union_set *)v2); 298} 299 300struct isl_obj_vtable isl_obj_union_set_vtable = { 301 isl_obj_union_set_copy, 302 isl_obj_union_set_add, 303 isl_obj_union_set_print, 304 isl_obj_union_set_free 305}; 306 307static void *isl_obj_none_copy(void *v) 308{ 309 return v; 310} 311 312static void isl_obj_none_free(void *v) 313{ 314} 315 316static __isl_give isl_printer *isl_obj_none_print(__isl_take isl_printer *p, 317 void *v) 318{ 319 return p; 320} 321 322static void *isl_obj_none_add(void *v1, void *v2) 323{ 324 return NULL; 325} 326 327struct isl_obj_vtable isl_obj_none_vtable = { 328 isl_obj_none_copy, 329 isl_obj_none_add, 330 isl_obj_none_print, 331 isl_obj_none_free 332}; 333 334static void *isl_obj_pw_qp_copy(void *v) 335{ 336 return isl_pw_qpolynomial_copy((struct isl_pw_qpolynomial *)v); 337} 338 339static void isl_obj_pw_qp_free(void *v) 340{ 341 isl_pw_qpolynomial_free((struct isl_pw_qpolynomial *)v); 342} 343 344static __isl_give isl_printer *isl_obj_pw_qp_print(__isl_take isl_printer *p, 345 void *v) 346{ 347 return isl_printer_print_pw_qpolynomial(p, 348 (struct isl_pw_qpolynomial *)v); 349} 350 351static void *isl_obj_pw_qp_add(void *v1, void *v2) 352{ 353 return isl_pw_qpolynomial_add((struct isl_pw_qpolynomial *)v1, 354 (struct isl_pw_qpolynomial *)v2); 355} 356 357struct isl_obj_vtable isl_obj_pw_qpolynomial_vtable = { 358 isl_obj_pw_qp_copy, 359 isl_obj_pw_qp_add, 360 isl_obj_pw_qp_print, 361 isl_obj_pw_qp_free 362}; 363 364static void *isl_obj_union_pw_qp_copy(void *v) 365{ 366 return isl_union_pw_qpolynomial_copy((struct isl_union_pw_qpolynomial *)v); 367} 368 369static void isl_obj_union_pw_qp_free(void *v) 370{ 371 isl_union_pw_qpolynomial_free((struct isl_union_pw_qpolynomial *)v); 372} 373 374static __isl_give isl_printer *isl_obj_union_pw_qp_print( 375 __isl_take isl_printer *p, void *v) 376{ 377 return isl_printer_print_union_pw_qpolynomial(p, 378 (struct isl_union_pw_qpolynomial *)v); 379} 380 381static void *isl_obj_union_pw_qp_add(void *v1, void *v2) 382{ 383 return isl_union_pw_qpolynomial_add( 384 (struct isl_union_pw_qpolynomial *)v1, 385 (struct isl_union_pw_qpolynomial *)v2); 386} 387 388struct isl_obj_vtable isl_obj_union_pw_qpolynomial_vtable = { 389 isl_obj_union_pw_qp_copy, 390 isl_obj_union_pw_qp_add, 391 isl_obj_union_pw_qp_print, 392 isl_obj_union_pw_qp_free 393}; 394 395static void *isl_obj_pw_qpf_copy(void *v) 396{ 397 return isl_pw_qpolynomial_fold_copy((struct isl_pw_qpolynomial_fold *)v); 398} 399 400static void isl_obj_pw_qpf_free(void *v) 401{ 402 isl_pw_qpolynomial_fold_free((struct isl_pw_qpolynomial_fold *)v); 403} 404 405static __isl_give isl_printer *isl_obj_pw_qpf_print(__isl_take isl_printer *p, 406 void *v) 407{ 408 return isl_printer_print_pw_qpolynomial_fold(p, 409 (struct isl_pw_qpolynomial_fold *)v); 410} 411 412static void *isl_obj_pw_qpf_add(void *v1, void *v2) 413{ 414 return isl_pw_qpolynomial_fold_fold((struct isl_pw_qpolynomial_fold *)v1, 415 (struct isl_pw_qpolynomial_fold *)v2); 416} 417 418struct isl_obj_vtable isl_obj_pw_qpolynomial_fold_vtable = { 419 isl_obj_pw_qpf_copy, 420 isl_obj_pw_qpf_add, 421 isl_obj_pw_qpf_print, 422 isl_obj_pw_qpf_free 423}; 424 425static void *isl_obj_union_pw_qpf_copy(void *v) 426{ 427 return isl_union_pw_qpolynomial_fold_copy((struct isl_union_pw_qpolynomial_fold *)v); 428} 429 430static void isl_obj_union_pw_qpf_free(void *v) 431{ 432 isl_union_pw_qpolynomial_fold_free((struct isl_union_pw_qpolynomial_fold *)v); 433} 434 435static __isl_give isl_printer *isl_obj_union_pw_qpf_print( 436 __isl_take isl_printer *p, void *v) 437{ 438 return isl_printer_print_union_pw_qpolynomial_fold(p, 439 (struct isl_union_pw_qpolynomial_fold *)v); 440} 441 442static void *isl_obj_union_pw_qpf_add(void *v1, void *v2) 443{ 444 return isl_union_pw_qpolynomial_fold_fold( 445 (struct isl_union_pw_qpolynomial_fold *)v1, 446 (struct isl_union_pw_qpolynomial_fold *)v2); 447} 448 449struct isl_obj_vtable isl_obj_union_pw_qpolynomial_fold_vtable = { 450 isl_obj_union_pw_qpf_copy, 451 isl_obj_union_pw_qpf_add, 452 isl_obj_union_pw_qpf_print, 453 isl_obj_union_pw_qpf_free 454}; 455