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