#include "mutableset.h"
#include "csolver.h"
+#include "qsort.h"
MutableSet::MutableSet(VarType t) : Set(t) {
}
s = solver->createMutableSet(type);
for (uint i = 0; i < members->getSize(); i++) {
((MutableSet *)s)->addElementMSet(members->get(i));
- // solver->addItem((MutableSet *) s, members->get(i));
+ solver->addItem((MutableSet *) s, members->get(i));
}
+ ((MutableSet*)s)->finalize();
map->put(this, s);
return s;
}
+
+void MutableSet::finalize(){
+ bsdqsort(members->expose(), members->getSize(), sizeof(uint64_t), intcompare);
+}
\ No newline at end of file
MutableSet(VarType t);
void addElementMSet(uint64_t element);
Set *clone(CSolver *solver, CloneMap *map);
+ bool isMutableSet() {return true;}
+ void finalize();
CMEMALLOC;
};
#endif
#include "serializer.h"
#include "qsort.h"
-Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
- members = new Vector<uint64_t>();
-}
-
int intcompare(const void *p1, const void *p2) {
uint64_t a=*(uint64_t const *) p1;
uint64_t b=*(uint64_t const *) p2;
return 1;
}
+Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
+ members = new Vector<uint64_t>();
+}
+
+
Set::Set(VarType t, uint64_t *elements, uint num) : type(t), isRange(false), low(0), high(0) {
members = new Vector<uint64_t>(num, elements);
bsdqsort(members->expose(), members->getSize(), sizeof(uint64_t), intcompare);
serializer->mywrite(&isRange, sizeof(bool));
serializer->mywrite(&low, sizeof(uint64_t));
serializer->mywrite(&high, sizeof(uint64_t));
+ bool isMutable = isMutableSet();
+ serializer->mywrite(&isMutable, sizeof(bool));
uint size = members->getSize();
serializer->mywrite(&size, sizeof(uint));
for(uint i=0; i<size; i++){
uint64_t getMemberAt(uint index);
uint64_t getElement(uint index);
uint getUnionSize(Set *s);
+ virtual bool isMutableSet() {return false;}
virtual Set *clone(CSolver *solver, CloneMap *map);
virtual void serialize(Serializer* serializer);
CMEMALLOC;
Vector<uint64_t> *members;
};
+int intcompare(const void *p1, const void *p2);
#endif/* SET_H */
#include "predicate.h"
#include "table.h"
#include "element.h"
+#include "mutableset.h"
Deserializer::Deserializer(const char* file):
solver(new CSolver())
myread(&low, sizeof(uint64_t));
uint64_t high;
myread(&high, sizeof(uint64_t));
+ bool isMutable;
+ myread(&isMutable, sizeof(bool));
+ Set *set;
+ if(isMutable){
+ set = new MutableSet(type);
+ }
uint size;
myread(&size, sizeof(uint));
Vector<uint64_t> members;
for(uint i=0; i<size; i++){
uint64_t mem;
myread(&mem, sizeof(uint64_t));
- members.push(mem);
+ if(isMutable) {
+ ((MutableSet*) set)->addElementMSet(mem);
+ }else {
+ members.push(mem);
+ }
+ }
+ if(!isMutable){
+ set = isRange? solver->createRangeSet(type, low, high):
+ solver->createSet(type, members.expose(), size);
}
- Set *set = isRange? solver->createRangeSet(type, low, high):
- solver->createSet(type, members.expose(), size);
map.put(s_ptr, set);
}
return set;
}
-//void CSolver::addItem(MutableSet *set, uint64_t element) {
-// set->addElementMSet(element);
-//}
+void CSolver::addItem(MutableSet *set, uint64_t element) {
+ set->addElementMSet(element);
+}
uint64_t CSolver::createUniqueItem(MutableSet *set) {
uint64_t element = set->getNewUniqueItem();
return element;
}
+void CSolver::finalizeMutableSet(MutableSet* set){
+ set->finalize();
+}
+
Element *CSolver::getElementVar(Set *set) {
Element *element = new ElementSet(set);
allElements.push(element);
/** This function adds a new item to a set. */
//Deprecating this unless we need it...
- // void addItem(MutableSet *set, uint64_t element);
+ void addItem(MutableSet *set, uint64_t element);
/** This function adds a new unique item to the set and returns it.
This function cannot be used in conjunction with manually adding
items to the set. */
uint64_t createUniqueItem(MutableSet *set);
+
+ /**
+ * Freeze and finalize the mutableSet ...
+ */
+ void finalizeMutableSet(MutableSet* set);
/** This function creates an element variable over a set. */
void * ourrealloc(void *ptr, size_t size);
*/
-#if 0
+#if 1
void * model_malloc(size_t size);
void model_free(void *ptr);
void * model_calloc(size_t count, size_t size);