/*functions*/ T combine_if_match(T t, T s, int match) { T set = Set_new(Arith_min(s->m_size, t->m_size), s->m_compare, s->m_hash); /*for each member q in t*/ size_t i; struct element* q; for (i = 0; i < t->m_size; i++) { for (q = t->m_buckets[i]; q != NULL; q = q->m_next) { /*\for each member q in t*/ if (Set_member(s, q->m_value) == match) { /*add q->member to set*/ struct element* p; const void* member = q->m_value; size_t i = (*set->m_hash)(member) % set->m_size; /*add member to set*/ NEW(p); p->m_value = member; p->m_next = set->m_buckets[i]; set->m_buckets[i] = p; set->m_length++; /*\add member to set*/ /*\add q->member to set*/ } } } return set; }
T Set_minus(T t, T s) { if (t == NULL) { assert(s); return Set_new(s->size, s->cmp, s->hash); } else if (s == NULL) { return copy(t, t->size); } else { T set = Set_new(Arith_min(s->size, t->size), s->cmp, s->hash); assert(s->cmp == t->cmp && s->hash == t->hash); //<for each member q in t 112> int i; struct member *q; for (i = 0; i < t->size; i++) { for (q = t->buckets[i]; q; q = q->link) { if (!Set_member(s, q->member)) { //<add q->member to set 112> struct member *p; const void *member = q->member; int j = (*set->hash)(member) %set->size; //<add member to set 109> NEW(p); p->member = member; p->link = set->buckets[j]; set->buckets[j] = p; set->length++; } } } return set; } }
T Set_minus(T t, T s) { if (t == NULL){ assert(s); return Set_new(s->size, s->cmp, s->hash); } else if (s == NULL) return copy(t, t->size); else { T set = Set_new(Arith_min(s->size, t->size), s->cmp, s->hash); assert(s->cmp == t->cmp && s->hash == t->hash); { int i; struct member *q; for (i = 0; i < t->size; i++) for (q = t->buckets[i]; q; q = q->link) if (!Set_member(s, q->member)) { struct member *p; const void *member = q->member; int i = (*set->hash)(member)%set->size; NEW(p); p->member = member; p->link = set->buckets[i]; set->buckets[i] = p; set->length++; } } return set; } }