Esempio n. 1
0
File: set.c Progetto: shihyu/cii
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;
	}
}