/*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;
}
Exemplo n.º 2
0
Arquivo: set.c Projeto: shihyu/cii
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;
    }
}
Exemplo n.º 3
0
Arquivo: set.c Projeto: Coestar/craftd
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;
	}
}