5 #include <polylib/polylibgmp.h>
7 #include <barvinok/evalue.h>
8 #include <barvinok/options.h>
10 struct EDomain_floor
{
15 EDomain_floor(const evalue
*f
, int dim
);
21 EDomain_floor
*ref() {
25 static void unref(EDomain_floor
* floor
) {
26 if (!--floor
->refcount
)
29 void print(std::ostream
& os
, char **p
) const;
35 std::vector
<EDomain_floor
*> floors
;
37 EDomain(Polyhedron
*D
) {
38 this->D
= Polyhedron_Copy(D
);
41 EDomain(Polyhedron
*D
, std::vector
<EDomain_floor
*>floors
) {
42 this->D
= Polyhedron_Copy(D
);
46 EDomain(EDomain
*ED
) {
47 this->D
= Polyhedron_Copy(ED
->D
);
48 add_floors(ED
->floors
);
51 EDomain(Polyhedron
*D
, EDomain
*ED
, std::vector
<EDomain_floor
*>floors
) {
52 this->D
= Polyhedron_Copy(D
);
53 add_floors(ED
->floors
);
57 void add_floors(std::vector
<EDomain_floor
*>floors
) {
58 for (int i
= 0; i
< floors
.size(); ++i
)
59 this->floors
.push_back(floors
[i
]->ref());
61 int find_floor(evalue
*needle
) const {
62 for (int i
= 0; i
< floors
.size(); ++i
)
63 if (eequal(needle
, floors
[i
]->e
))
67 void print(FILE *out
, char **p
);
68 void print_constraints(std::ostream
& os
, char **p
,
69 barvinok_options
*options
) const;
71 for (int i
= 0; i
< floors
.size(); ++i
)
72 EDomain_floor::unref(floors
[i
]);
78 unsigned dimension() const {
79 return D
->Dimension
- floors
.size();
82 Matrix
*add_ge_constraint(evalue
*constraint
,
83 std::vector
<EDomain_floor
*>& new_floors
) const;
86 int evalue2constraint(EDomain
*D
, evalue
*E
, Value
*cons
, int len
);