hash.h

Go to the documentation of this file.
00001 #include <stdio.h>
00002 
00003 
00004 // Magic to make this header able to be included several times
00005 #if (defined(KEY_INT) && defined(VAL_VOID) && (!defined(HASH_KEY_INT_VAL_VOID))) || \
00006 (defined(KEY_STRING) && defined(VAL_VOID) && (!defined(HASH_KEY_STRING_VAL_VOID))) || \
00007 (defined(KEY_STRING) && defined(VAL_INT) && (!defined(HASH_KEY_STRING_VAL_INT))) || \
00008 (defined(KEY_INT) && defined(VAL_FLOAT) && (!defined(HASH_KEY_INT_VAL_FLOAT))) || \
00009 (defined(KEY_INT) && defined(VAL_INT)  && (!defined(HASH_KEY_INT_VAL_INT))) || \
00010 (defined(KEY_DSI) && defined(VAL_VOID)  && (!defined(HASH_KEY_DSI_VAL_VOID)))
00011         
00012 /**
00013  * \file hash.h Definição das estruturas de dados e prototipos das 
00014  * funçoes do hash. Para lidar com variações nos tipos de dados sem perder 
00015  * eficiência, o tipo da chave (pode ser string ou inteiro) e o tipo do valor 
00016  * (pode ser inteiro ou void *) são definidos através de ifdefs. O nomes dos 
00017  * tipos de dados e das funções tem no meio o tipo da chave e o tipo do valor
00018  * para não haver conflitos entre diferentes tipos de hash. Um exemplo é 
00019  * hashKVCreate onde K é o tipo da chave que pode ser Int(inteiro) ou 
00020  * Str(String) e V é o tipo do valor que pode ser Int(inteiro) ou Void (void *). 
00021  * Nessa documentação e de hash.c K é Str e V é Int.
00022  *      \sa hash.c
00023  */
00024 
00025 
00026 #define MAX_COLISIONS_FACTOR 0.2 ///< max number of collisions (as factor of hash size) that will trigger a rehash
00027 #define REHASH_MULTIPLIER 1.9150399 ///< constant that the hash size will be multiplyed in case of a rehash
00028 
00029 
00030 /// Definição do tipo da chave que é inteiro se KEY_INT estiver definido,
00031 /// string se KEY_STRING estiver definido ou DataSpaceId se KEY_DSI estiver
00032 /// definido
00033 #ifdef KEY_INT
00034 #define KEY_TYPE int
00035 #elif defined(KEY_STRING)
00036 #define KEY_TYPE char *
00037 #elif defined(KEY_DSI)
00038 #define KEY_TYPE DataSpaceId
00039 #endif
00040 
00041 /// Definição do tipo do valor que é inteiro se VAL_INT estiver definido ou 
00042 /// (void *) se VAL_VOID estiver definido.
00043 #ifdef VAL_INT
00044 #define VAL_TYPE int
00045 #endif
00046 #ifdef VAL_VOID
00047 #define VAL_TYPE void *
00048 #endif
00049 #ifdef VAL_FLOAT
00050 #define VAL_TYPE float
00051 #endif
00052 
00053 
00054 
00055 
00056 #if defined(KEY_INT) && defined(VAL_VOID) 
00057 #define HASH_KEY_INT_VAL_VOID
00058         
00059 #define STRUCT_LISTA listaIntVoid 
00060 
00061 #define HASH_TYPE HashIntVoid 
00062 #define LISTA_TYPE ListaIntVoid 
00063 #define POS_HANDLER_TYPE PosHandlerIntVoid
00064 #define ITERATOR_TYPE HashIntVoidIterator
00065 
00066 #define HASH_CREATE hashIntVoidCreate
00067 #define HASH_ADD hashIntVoidAdd
00068 #define HASH_GET hashIntVoidGet
00069 #define HASH_REMOVE hashIntVoidRemove
00070 #define HASH_CLEAN hashIntVoidClean
00071 #define HASH_DESTROY hashIntVoidDestroy
00072 #define HASH_REHASH hashIntVoidRehash
00073 #define HASH_SERIALIZE hashIntVoidSerialize
00074 #define HASH_DESERIALIZE hashIntVoidDeserialize
00075 
00076 #define WRITE_KEY writeKeyIntVoid
00077 #define READ_KEY readKeyIntVoid
00078 #define WRITE_VALUE writeValueIntVoid
00079 #define READ_VALUE readValueIntVoid
00080 #define SET_SERIALIZER_VAL_VOID setIntVoidSerializer
00081 
00082 #define LISTA_DESTROY listaIntVoidDestroy
00083 
00084 #define CREATE_ITERATOR createHashIntVoidIterator
00085 #define ITERATOR_NEXT hashIntVoidIteratorNext
00086 #define ITERATOR_DESTROY hashIntVoidIteratorDestroy
00087 
00088 #endif
00089 
00090 #if defined(KEY_STRING) && defined(VAL_INT) 
00091 #define HASH_KEY_STRING_VAL_INT 
00092         
00093 #define STRUCT_LISTA listaStrInt ///< Tipo da estrutura da lista encadeada do hash (se for usar essa estrutura, use ListaStrInt.) \sa ListaStrInt 
00094 
00095 #define HASH_TYPE HashStrInt ///< Tipo do hash
00096 #define LISTA_TYPE ListaStrInt ///< Tipo da lista encadeada do hash
00097 #define POS_HANDLER_TYPE PosHandlerStrInt ///< Tipo do handler de uma posição
00098 #define ITERATOR_TYPE HashStrIntIterator ///< Tipo de um iterador
00099 
00100 #define HASH_CREATE hashStrIntCreate ///< Nome da função que cria um hash
00101 #define HASH_ADD hashStrIntAdd ///< Nome da função que adiciona uma chave a um hash
00102 #define HASH_GET hashStrIntGet ///< Nome da função que obtem uma posição do hash
00103 #define HASH_REMOVE hashStrIntRemove ///< Name of the function that removes a key from the hash
00104 #define HASH_CLEAN hashStrIntClean ///< Nome da função que apaga todas as chaves do hash
00105 #define HASH_DESTROY hashStrIntDestroy ///< Nome da função que destrói uma hash
00106 #define HASH_REHASH hashStrIntRehash ///< Name of the function that grows the hash
00107 #define HASH_SERIALIZE hashStrIntSerialize
00108 #define HASH_DESERIALIZE hashStrIntDeserialize
00109 
00110 #define WRITE_KEY writeKeyStrInt
00111 #define READ_KEY readKeyStrInt
00112 #define WRITE_VALUE writeValueStrInt
00113 #define READ_VALUE readValueStrInt
00114 
00115 #define LISTA_DESTROY listaStrIntDestroy ///< Nome da função que destrói a lista encadeada de uma posição do hash
00116 
00117 #define CREATE_ITERATOR createHashStrIntIterator  ///< Nome da função que cria um iterador
00118 #define ITERATOR_NEXT hashStrIntIteratorNext ///< Nome da função que faz o iterador retornar o próximo documento do hash
00119 #define ITERATOR_DESTROY hashStrIntIteratorDestroy ///< Nome da função que destroi um iterador
00120 
00121 #endif
00122 
00123 #if defined(KEY_STRING) && defined(VAL_VOID) 
00124 #define HASH_KEY_STRING_VAL_VOID
00125         
00126 #define STRUCT_LISTA listaStrVoid
00127 
00128 #define HASH_TYPE HashStrVoid
00129 #define LISTA_TYPE ListaStrVoid
00130 #define POS_HANDLER_TYPE PosHandlerStrVoid
00131 #define ITERATOR_TYPE HashStrVoidIterator
00132 
00133 #define HASH_CREATE hashStrVoidCreate
00134 #define HASH_ADD hashStrVoidAdd
00135 #define HASH_GET hashStrVoidGet
00136 #define HASH_REMOVE hashStrVoidRemove
00137 #define HASH_CLEAN hashStrVoidClean
00138 #define HASH_DESTROY hashStrVoidDestroy
00139 #define HASH_REHASH hashStrVoidRehash
00140 #define HASH_SERIALIZE hashStrVoidSerialize
00141 #define HASH_DESERIALIZE hashStrVoidDeserialize
00142 
00143 #define WRITE_KEY writeKeyStrVoid
00144 #define READ_KEY readKeyStrVoid
00145 #define WRITE_VALUE writeValueStrVoid
00146 #define READ_VALUE readValueStrVoid
00147 #define SET_SERIALIZER_VAL_VOID setStrVoidSerializer
00148 
00149 #define LISTA_DESTROY listaStrVoidDestroy
00150 
00151 #define CREATE_ITERATOR createHashStrVoidIterator
00152 #define ITERATOR_NEXT hashStrVoidIteratorNext
00153 #define ITERATOR_DESTROY hashStrVoidIteratorDestroy
00154 
00155 #endif
00156 
00157 #if defined(KEY_INT) && defined(VAL_FLOAT) 
00158 #define HASH_KEY_INT_VAL_FLOAT
00159         
00160 #define STRUCT_LISTA listaIntFloat 
00161 
00162 #define HASH_TYPE HashIntFloat 
00163 #define LISTA_TYPE ListaIntFloat 
00164 #define POS_HANDLER_TYPE PosHandlerIntFloat
00165 #define ITERATOR_TYPE HashIntFloatIterator
00166 
00167 #define HASH_CREATE hashIntFloatCreate
00168 #define HASH_ADD hashIntFloatAdd
00169 #define HASH_GET hashIntFloatGet
00170 #define HASH_REMOVE hashIntFloatRemove
00171 #define HASH_CLEAN hashIntFloatClean
00172 #define HASH_DESTROY hashIntFloatDestroy
00173 #define HASH_REHASH hashIntFloatRehash
00174 #define HASH_SERIALIZE hashIntFloatSerialize
00175 #define HASH_DESERIALIZE hashIntFloatDeserialize
00176 
00177 #define WRITE_KEY writeKeyIntFloat
00178 #define READ_KEY readKeyIntFloat
00179 #define WRITE_VALUE writeValueIntFloat
00180 #define READ_VALUE readValueIntFloat
00181 
00182 #define LISTA_DESTROY listaIntFloatDestroy
00183 
00184 #define CREATE_ITERATOR createHashIntFloatIterator
00185 #define ITERATOR_NEXT hashIntFloatIteratorNext
00186 #define ITERATOR_DESTROY hashIntFloatIteratorDestroy
00187 
00188 #endif
00189 
00190 #if defined(KEY_INT) && defined(VAL_INT) 
00191 #define HASH_KEY_INT_VAL_INT
00192         
00193 #define STRUCT_LISTA listaIntInt 
00194 
00195 #define HASH_TYPE HashIntInt 
00196 #define LISTA_TYPE ListaIntInt 
00197 #define POS_HANDLER_TYPE PosHandlerIntInt
00198 #define ITERATOR_TYPE HashIntIntIterator
00199 
00200 #define HASH_CREATE hashIntIntCreate
00201 #define HASH_ADD hashIntIntAdd
00202 #define HASH_GET hashIntIntGet
00203 #define HASH_REMOVE hashIntIntRemove
00204 #define HASH_CLEAN hashIntIntClean
00205 #define HASH_DESTROY hashIntIntDestroy
00206 #define HASH_REHASH hashIntIntRehash
00207 #define HASH_SERIALIZE hashIntIntSerialize
00208 #define HASH_DESERIALIZE hashIntIntDeserialize
00209 
00210 #define WRITE_KEY writeKeyIntInt
00211 #define READ_KEY readKeyIntInt
00212 #define WRITE_VALUE writeValueIntInt
00213 #define READ_VALUE readValueIntInt
00214 
00215 #define LISTA_DESTROY listaIntIntDestroy
00216 
00217 #define CREATE_ITERATOR createHashIntIntIterator
00218 #define ITERATOR_NEXT hashIntIntIteratorNext
00219 #define ITERATOR_DESTROY hashIntIntIteratorDestroy
00220 
00221 #endif
00222 
00223 
00224 #if defined(KEY_DSI) && defined(VAL_VOID) 
00225 #define HASH_KEY_DSI_VAL_VOID
00226 
00227 #include "DataSpaceId.h"
00228         
00229 #define STRUCT_LISTA listaDSIVoid 
00230 
00231 #define HASH_TYPE HashDSIVoid 
00232 #define LISTA_TYPE ListaDSIVoid 
00233 #define POS_HANDLER_TYPE PosHandlerDSIVoid
00234 #define ITERATOR_TYPE HashDSIVoidIterator
00235 
00236 #define HASH_CREATE hashDSIVoidCreate
00237 #define HASH_ADD hashDSIVoidAdd
00238 #define HASH_GET hashDSIVoidGet
00239 #define HASH_REMOVE hashDSIVoidRemove
00240 #define HASH_CLEAN hashDSIVoidClean
00241 #define HASH_DESTROY hashDSIVoidDestroy
00242 #define HASH_REHASH hashDSIVoidRehash
00243 #define HASH_SERIALIZE hashDSIVoidSerialize
00244 #define HASH_DESERIALIZE hashDSIVoidDeserialize
00245 
00246 #define WRITE_KEY writeKeyDSIVoid
00247 #define READ_KEY readKeyDSIVoid
00248 #define WRITE_VALUE writeValueDSIVoid
00249 #define READ_VALUE readValueDSIVoid
00250 #define SET_SERIALIZER_VAL_VOID setDSIVoidSerializer
00251 
00252 #define LISTA_DESTROY listaDSIVoidDestroy
00253 
00254 #define CREATE_ITERATOR createHashDSIVoidIterator
00255 #define ITERATOR_NEXT hashDSIVoidIteratorNext
00256 #define ITERATOR_DESTROY hashDSIVoidIteratorDestroy
00257 
00258 #endif
00259 
00260 
00261 
00262 
00263 
00264 
00265 
00266 
00267 /// Lista encadeada de uma posição do hash.
00268 typedef struct STRUCT_LISTA {
00269         KEY_TYPE key;           ///< Chave de um elemento da lista
00270         VAL_TYPE val;           ///< Valor de um elemento da lista
00271         struct STRUCT_LISTA *next;      ///< Próximo elemento da lista
00272 } LISTA_TYPE;
00273 
00274 /// Handler para editar uma posição do hash (na verdade um elemento de uma 
00275 /// lista de uma posição do hash)
00276 typedef LISTA_TYPE *POS_HANDLER_TYPE;
00277 
00278 #ifdef VAL_VOID
00279 
00280 #ifndef VOID_SERIALIZER_FUNCS
00281 #define VOID_SERIALIZER_FUNCS
00282 typedef int hashSerializeValVoid(FILE *outputFile, void *arg);
00283 typedef void *VoidPointer;
00284 typedef VoidPointer hashDeserializeValVoid(FILE *inputFile);
00285 #endif
00286 
00287 #endif
00288 
00289 /// Estrutura de dados do hash
00290 typedef struct {
00291         int tam; ///< Tamanho do hash
00292         int chaves; ///< Número de chaves dentro do hash
00293         int colisoes; ///< Numero de colisoes que ocorreram no hash
00294         LISTA_TYPE **entradas; ///< Entradas do hash (cada uma tem um ponteiro para uma lista encadeada)
00295 #ifdef VAL_VOID 
00296         hashSerializeValVoid *serValVoid;
00297         hashDeserializeValVoid *deserValVoid;
00298 #endif
00299 } HASH_TYPE;
00300 
00301 /// Iterador do hash
00302 typedef struct {
00303         int is_destructor; ///< Se for =1 sai destruindo hash a medida que passa por ele
00304         int entr_atual; ///< Entrada atual
00305         POS_HANDLER_TYPE elem_atual; ///< Elemento atual da lista da entrada atual
00306 } ITERATOR_TYPE;
00307 
00308 HASH_TYPE *HASH_CREATE(int sz);
00309 POS_HANDLER_TYPE HASH_ADD(HASH_TYPE *h, KEY_TYPE key);
00310 POS_HANDLER_TYPE HASH_GET(HASH_TYPE *h, KEY_TYPE key);
00311 int HASH_REMOVE(HASH_TYPE *h, KEY_TYPE removedKey);
00312 void HASH_CLEAN(HASH_TYPE *h);
00313 void HASH_DESTROY(HASH_TYPE *h);
00314 void HASH_REHASH(HASH_TYPE *h, int newSize);
00315 int HASH_SERIALIZE(FILE *outputFile, HASH_TYPE *hash);
00316 int HASH_DESERIALIZE(FILE *inputFile, HASH_TYPE *hash);
00317 
00318 int WRITE_KEY(FILE *outputFile, HASH_TYPE *hash, POS_HANDLER_TYPE pos);
00319 int READ_KEY(FILE *inputFile, HASH_TYPE *hash, POS_HANDLER_TYPE pos);
00320 int WRITE_VALUE(FILE *outputFile, HASH_TYPE *hash, POS_HANDLER_TYPE pos);
00321 int READ_VALUE(FILE *inputFile, HASH_TYPE *hash, POS_HANDLER_TYPE pos);
00322 #ifdef VAL_VOID
00323 void SET_SERIALIZER_VAL_VOID(HASH_TYPE *hash, hashSerializeValVoid *serializer, hashDeserializeValVoid *deserializer);
00324 #endif
00325 
00326 /// Retorna o numero de colisões que houve no hash.
00327 #define hashGetColisoes(hash) (hash->colisoes)
00328 
00329 /// Retorna o numero de chaves no hash.
00330 #define hashGetChaves(hash) (hash->chaves)
00331 
00332 void LISTA_DESTROY(LISTA_TYPE *l);
00333 
00334 /// Retorna a chave da posição pos.
00335 #define posGetKey(pos) (pos->key)
00336 
00337 /// Retorna o valor da posição pos.
00338 #define posGetValue(pos) (pos->val)
00339 
00340 /// Altera o valor da posição pos.
00341 #define posSetValue(pos, _val) (pos->val)=(_val)
00342 
00343 ITERATOR_TYPE *CREATE_ITERATOR(HASH_TYPE *hash, int is_destructor);
00344 POS_HANDLER_TYPE ITERATOR_NEXT(ITERATOR_TYPE *hdi, HASH_TYPE *hash);
00345 void ITERATOR_DESTROY(ITERATOR_TYPE *hdi, HASH_TYPE *hash);
00346 
00347 
00348 #ifndef __HASH__IMPLEMENTATION__
00349 
00350 #ifdef VAL_VOID
00351 #undef SERIALIZER_FUNC
00352 #undef DESERIALIZER_FUNC
00353 #undef SET_SERIALIZER_VAL_VOID
00354 #endif
00355 
00356 #undef VAL_TYPE 
00357 #undef KEY_TYPE
00358 
00359 #undef STRUCT_LISTA 
00360 
00361 #undef HASH_TYPE 
00362 #undef LISTA_TYPE 
00363 #undef POS_HANDLER_TYPE
00364 #undef ITERATOR_TYPE 
00365 
00366 #undef HASH_CREATE 
00367 #undef HASH_ADD 
00368 #undef HASH_GET 
00369 #undef HASH_REMOVE 
00370 #undef HASH_CLEAN   
00371 #undef HASH_DESTROY 
00372 #undef HASH_REHASH
00373 #undef HASH_SERIALIZE
00374 #undef HASH_DESERIALIZE
00375 
00376 #undef WRITE_KEY
00377 #undef READ_KEY
00378 #undef WRITE_VALUE
00379 #undef READ_VALUE
00380 
00381 #undef LISTA_DESTROY 
00382 
00383 #undef CREATE_ITERATOR 
00384 #undef ITERATOR_NEXT 
00385 #undef ITERATOR_DESTROY
00386 #endif
00387 
00388 
00389 
00390 
00391 #endif // Matches with the first giant #ifdef

Generated on Tue Jan 17 19:18:38 2006 for Void by  doxygen 1.4.6