/* This gets the fore part of the product and saves it and * also gets the back part */ static Bool get_both_parts( const Set* a, const Set* b, SetIter* iter, SetIter* iter_a, SetIter* iter_b, Tuple* tuple, int offset, int offset2) { int i; if (!set_iter_next_intern(iter_a, a, tuple, offset)) return FALSE; for(i = 0; i < a->head.dim; i++) { assert(iter->prod.elem[i] == NULL); iter->prod.elem[i] = elem_copy(tuple_get_elem(tuple, i + offset)); assert(elem_is_valid(iter->prod.elem[i])); } if (!set_iter_next_intern(iter_b, b, tuple, offset2)) return FALSE; return TRUE; }
List* list_new_elem(const Elem* elem) { ListData data; assert(elem_is_valid(elem)); data.elem = elem_copy(elem); return list_new(LIST_ELEM, &data); }
void list_insert_elem(List* list, const Elem* elem) { ListData data; assert(list_is_valid(list)); assert(elem_is_valid(elem)); assert(list->type == LIST_ELEM); data.elem = elem_copy(elem); list_insert_data(list, &data); }
void hash_add_elem_idx(Hash* hash, const Elem* elem, int idx) { HElem* he = blk_alloc(sizeof(*he)); unsigned int hcode; assert(hash_is_valid(hash)); assert(elem_is_valid(elem)); assert(he != NULL); hcode = elem_hash(elem) % hash->size; he->value.elem_idx.elem = elem; he->value.elem_idx.idx = idx; he->next = hash->bucket[hcode]; hash->bucket[hcode] = he; hash->elems++; }
/* Liefert -1 wenn nicht gefunden. */ int hash_lookup_elem_idx(const Hash* hash, const Elem* elem) { unsigned int hcode = elem_hash(elem) % hash->size; HElem* he; assert(hash_is_valid(hash)); assert(elem_is_valid(elem)); for(he = hash->bucket[hcode]; he != NULL; he = he->next) if (!elem_cmp(he->value.elem_idx.elem, elem)) break; if (he == NULL) return -1; assert(he != NULL); return he->value.elem_idx.idx; }