isl_pw_lift_templ.c
1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
* Copyright 2010 INRIA Saclay
*
* Use of this software is governed by the MIT license
*
* Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
* Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
* 91893 Orsay, France
*/
#include <isl_pw_macro.h>
static isl_bool any_divs(__isl_keep isl_set *set)
{
int i;
if (!set)
return isl_bool_error;
for (i = 0; i < set->n; ++i)
if (set->p[i]->n_div > 0)
return isl_bool_true;
return isl_bool_false;
}
static isl_stat foreach_lifted_subset(__isl_take isl_set *set,
__isl_take EL *el,
isl_stat (*fn)(__isl_take isl_set *set, __isl_take EL *el,
void *user), void *user)
{
int i;
if (!set || !el)
goto error;
for (i = 0; i < set->n; ++i) {
isl_set *lift;
EL *copy;
lift = isl_set_from_basic_set(isl_basic_set_copy(set->p[i]));
lift = isl_set_lift(lift);
copy = FN(EL,copy)(el);
copy = FN(EL,lift)(copy, isl_set_get_space(lift));
if (fn(lift, copy, user) < 0)
goto error;
}
isl_set_free(set);
FN(EL,free)(el);
return isl_stat_ok;
error:
isl_set_free(set);
FN(EL,free)(el);
return isl_stat_error;
}
isl_stat FN(PW,foreach_lifted_piece)(__isl_keep PW *pw,
isl_stat (*fn)(__isl_take isl_set *set, __isl_take EL *el,
void *user), void *user)
{
int i;
if (!pw)
return isl_stat_error;
for (i = 0; i < pw->n; ++i) {
isl_bool any;
isl_set *set;
EL *el;
any = any_divs(pw->p[i].set);
if (any < 0)
return isl_stat_error;
set = isl_set_copy(pw->p[i].set);
el = FN(EL,copy)(pw->p[i].FIELD);
if (!any) {
if (fn(set, el, user) < 0)
return isl_stat_error;
continue;
}
if (foreach_lifted_subset(set, el, fn, user) < 0)
return isl_stat_error;
}
return isl_stat_ok;
}