SET setXIntersect(SET A,SET B) { SET set; void *e; if (! (A->cmp && B->cmp) ) return NULL; /* Both need a compare function */ /* Create new set */ if (! (set = setNew(A->cmp,A->ed,A->ord))) { XLOG(set); return NULL; } /* Add elements of A only */ for (e = setFirst(A); e; e = setNext(A)) if (!setContains(B,e)) setAdd(set,e); /* Add elements of B only */ for (e = setFirst(B); e; e = setNext(B)) if (!setContains(A,e)) setAdd(set,e); return set; }
SET setUnion1(SET s1,SET s2) { SET set; void *e; set = setNew(s1->cmp,s1->ed,s1->ord); if (!set) { XLOG(set); return NULL; } for (e = setFirst(s1); e; e = setNext(s1)) setAdd(set,e); /* Blind copy of s1 */ for (e = setFirst(s2); e; e = setNext(s2)) setAdd(set,e); /* Call setAdd() to weed out duplicates */ return set; }
SET setDifference(SET A,SET B) { SET set; void *e; if ( ! B->cmp) return NULL; /* B needs a compare function */ /* Create the resulting set */ set = setNew(A->cmp,A->ed,A->ord); if (!set) { XLOG(set); return NULL; } for (e = setFirst(A); e; e = setNext(A)) if (!setContains(B,e)) setAdd(set,e); return set; }
SET setIntersect(SET s1,SET s2) { SET set; void *e; /* At least one of the sets must have a compare function */ if ( ! (s1->cmp || s2->cmp) ) return NULL; /* Create a disjoint set */ set = setNew(s1->cmp ? s1->cmp : s2->cmp,1,s1->ord); if (!set) { XLOG(set); return NULL; } for (e = setFirst(s1); e; e = setNext(s1)) { if (setContains(s2,e)) setAdd(set,e); } return set; }
SET setMake(void) { return setNew(NULL,0,0); }
void Timestamp::setOld(i64 ms){ setNew(); d[0] -= 1000*ms; }
State::State(Validator * const v,const effect_lists* is) : tolerance(v->getTolerance()), vld(v), time(0.0) { setNew(is); };