00001 #include <stdio.h>
00002
00003
00004
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
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #define MAX_COLISIONS_FACTOR 0.2
00027 #define REHASH_MULTIPLIER 1.9150399
00028
00029
00030
00031
00032
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
00042
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
00094
00095 #define HASH_TYPE HashStrInt
00096 #define LISTA_TYPE ListaStrInt
00097 #define POS_HANDLER_TYPE PosHandlerStrInt
00098 #define ITERATOR_TYPE HashStrIntIterator
00099
00100 #define HASH_CREATE hashStrIntCreate
00101 #define HASH_ADD hashStrIntAdd
00102 #define HASH_GET hashStrIntGet
00103 #define HASH_REMOVE hashStrIntRemove
00104 #define HASH_CLEAN hashStrIntClean
00105 #define HASH_DESTROY hashStrIntDestroy
00106 #define HASH_REHASH hashStrIntRehash
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
00116
00117 #define CREATE_ITERATOR createHashStrIntIterator
00118 #define ITERATOR_NEXT hashStrIntIteratorNext
00119 #define ITERATOR_DESTROY hashStrIntIteratorDestroy
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
00268 typedef struct STRUCT_LISTA {
00269 KEY_TYPE key;
00270 VAL_TYPE val;
00271 struct STRUCT_LISTA *next;
00272 } LISTA_TYPE;
00273
00274
00275
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
00290 typedef struct {
00291 int tam;
00292 int chaves;
00293 int colisoes;
00294 LISTA_TYPE **entradas;
00295 #ifdef VAL_VOID
00296 hashSerializeValVoid *serValVoid;
00297 hashDeserializeValVoid *deserValVoid;
00298 #endif
00299 } HASH_TYPE;
00300
00301
00302 typedef struct {
00303 int is_destructor;
00304 int entr_atual;
00305 POS_HANDLER_TYPE elem_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
00327 #define hashGetColisoes(hash) (hash->colisoes)
00328
00329
00330 #define hashGetChaves(hash) (hash->chaves)
00331
00332 void LISTA_DESTROY(LISTA_TYPE *l);
00333
00334
00335 #define posGetKey(pos) (pos->key)
00336
00337
00338 #define posGetValue(pos) (pos->val)
00339
00340
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