T Set_inter(T s, T t) { if (s == NULL) { assert(t); return Set_new(t->size, t->cmp, t->hash); } else if (t == NULL) { return Set_new(s->size, s->cmp, s->hash); } else if (s->length < t->length) { return Set_inter(t, s); } 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 i = (*set->hash)(member) % set->size; //<add member to set 109> NEW(p); p->member = member; p->link = set->buckets[i]; set->buckets[i] = p; set->length++; } } } return set; } }
T Set_inter(T s, T t) { if (s == NULL) { assert(t); return Set_new(t->m_size, t->m_compare, t->m_hash); } else if (t == NULL) { return Set_new(s->m_size, s->m_compare, s->m_hash); } else if (s->m_length < t->m_length) { return Set_inter(t, s); } else { //T set = Set_new(Arith_min(s->size, t->size), s->cmp, s->hash); T set; assert(s->m_compare == t->m_compare && s->m_hash == t->m_hash); set = combine_if_match(t, s, TRUE); return set; } }