Container em C

cpp code
A invocação seria algo do tipo:
cpp code
// Cria tabela de dispersão:
hash_t *hash_create (
size_t, // tamanho (em bytes) do tipo do container
size_t); // tamanho da tabela de dispersão (baseada na "função" de dispersão)
// Insere na tabela de dispersão:
int hash_insert (
hash_t *, // tipo
void *, // objeto a ser inserido
unsigned, // chave
void *(*)(void *), // invoca a criação do container que resolve colisão
void (*)(void *, void *, int *, int (*)(const void *, const void *)), // insere no cont.
int (*)(const void *, const void *)); // predicado para comparação
A invocação seria algo do tipo:
cpp code
// Criação da tabela hash:
if(hash_coll_rtype == HASHING_BY_BTREE)
h = hash_create(sizeof(btree_t *), hash_nelements);
else if(hash_coll_rtype == HASHING_BY_SBBTREE)
h = hash_create(sizeof(sbbtree_t *), hash_nelements);
// Inserção na tabela hash:
if(hash_coll_rtype == HASHING_BY_BTREE)
hash_ins = hash_insert (
h,
black_list_arr[idx],
black_list_arr[idx]->key,
(void*(*)(void *))(*btree_create),
(void(*)(void *, void *, int *, int (*)(const void *, const void *)))(*btree_insert),
(int(*)(const void *, const void *))(cmp));
else if(hash_coll_rtype == HASHING_BY_SBBTREE)
hash_ins = hash_insert (
h,
black_list_arr[idx],
black_list_arr[idx]->key,
(void*(*)(void *))(*sbbtree_create),
(void(*)(void *, void *, int *, int (*)(const void *, const void *)))(*sbbtree_insert),
(int(*)(const void *, const void *))(cmp));