+
+Set *Set::clone(CSolver *solver, CloneMap *map) {
+ Set *s = (Set *) map->get(this);
+ if (s != NULL)
+ return s;
+ if (isRange) {
+ s = solver->createRangeSet(type, low, high);
+ } else {
+ s = solver->createSet(type, members->expose(), members->getSize());
+ }
+ map->put(this, s);
+ return s;
+}
+
+
+void Set::serialize(Serializer* serializer){
+ if(serializer->isSerialized(this))
+ return;
+ serializer->addObject(this);
+ ASTNodeType asttype = SETTYPE;
+ serializer->mywrite(&asttype, sizeof(ASTNodeType));
+ Set* This = this;
+ serializer->mywrite(&This, sizeof(Set*));
+ serializer->mywrite(&type, sizeof(VarType));
+ 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 mem = members->get(i);
+ serializer->mywrite(&mem, sizeof(uint64_t));
+ }
+}