lexmin.cc: move more code to edomain.cc
[barvinok.git] / edomain.h
blobd0c2a8aa21f3826fdac52166539864a4886af6b4
1 #include <vector>
2 #include <gmp.h>
3 extern "C" {
4 #include <polylib/polylibgmp.h>
6 #include <barvinok/evalue.h>
8 struct EDomain_floor {
9 int refcount;
10 evalue *e;
12 EDomain_floor(const evalue *f) {
13 e = new evalue;
14 value_init(e->d);
15 evalue_copy(e, f);
16 refcount = 1;
18 ~EDomain_floor() {
19 free_evalue_refs(e);
20 delete e;
22 EDomain_floor *ref() {
23 ++refcount;
24 return this;
26 static void unref(EDomain_floor* floor) {
27 if (!--floor->refcount)
28 delete floor;
32 struct EDomain {
33 Polyhedron *D;
34 Vector *sample;
35 std::vector<EDomain_floor *> floors;
37 EDomain(Polyhedron *D) {
38 this->D = Polyhedron_Copy(D);
39 sample = NULL;
41 EDomain(Polyhedron *D, std::vector<EDomain_floor *>floors) {
42 this->D = Polyhedron_Copy(D);
43 add_floors(floors);
44 sample = NULL;
46 EDomain(EDomain *ED) {
47 this->D = Polyhedron_Copy(ED->D);
48 add_floors(ED->floors);
49 sample = NULL;
51 EDomain(Polyhedron *D, EDomain *ED, std::vector<EDomain_floor *>floors) {
52 this->D = Polyhedron_Copy(D);
53 add_floors(ED->floors);
54 add_floors(floors);
55 sample = NULL;
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))
64 return i;
65 return -1;
67 void print(FILE *out, char **p);
68 ~EDomain() {
69 for (int i = 0; i < floors.size(); ++i)
70 EDomain_floor::unref(floors[i]);
71 Polyhedron_Free(D);
72 if (sample)
73 Vector_Free(sample);
76 Matrix *add_ge_constraint(evalue *constraint,
77 std::vector<EDomain_floor *>& new_floors) const;
80 int evalue2constraint(EDomain *D, evalue *E, Value *cons, int len);