Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool hash_redimensionar(hash_t *hash, size_t tam){
- campo_t* campos_nuevo = malloc(tam * sizeof(campo_t));
- if (!campos_nuevo) return false;
- _inicializar_campos(campos_nuevo, tam);
- for (int i = 0; i < hash->capacidad; i++){
- if (hash->campos[i].estado == VACIO) continue;
- if(hash->campos[i].estado == OCUPADO){
- size_t posicion_nueva = FNV64(hash->campos[i].clave, tam);
- campos_nuevo[posicion_nueva].clave = malloc((strlen(hash->campos[i].clave) + 1)* sizeof(char));
- if (!campos_nuevo[posicion_nueva].clave){
- destruir_campos(campos_nuevo, hash->capacidad, hash->destruir_dato);
- return false;
- }
- strcpy(campos_nuevo[posicion_nueva].clave, hash->campos[i].clave);
- campos_nuevo[posicion_nueva].valor = hash->campos[i].valor;
- campos_nuevo[posicion_nueva].estado = OCUPADO;
- }
- free(hash->campos[i].clave);
- if (hash->campos[i].estado == BORRADO && hash->destruir_dato != NULL) hash->destruir_dato(hash->campos[i].valor);
- }
- free(hash->campos);
- hash->campos = campos_nuevo;
- hash->borrados = 0;
- hash->capacidad = tam;
- return true;
- }
- bool hash_guardar(hash_t *hash, const char *clave, void *dato){
- if ((hash->cantidad + hash->borrados) / hash->capacidad >= HASH_COEF_REDIMENSION && !hash_redimensionar(hash, hash->capacidad * HASH_MODIFICAR_CAPACIDAD)){
- return false;
- }
- unsigned long posicion_clave = FNV64(clave, hash->capacidad);
- while(hash->campos[posicion_clave].estado == OCUPADO && strcmp(hash->campos[posicion_clave].clave, clave) != 0){
- posicion_clave++;
- if(posicion_clave >= hash->capacidad) posicion_clave = 0;
- }
- switch (hash->campos[posicion_clave].estado){
- case OCUPADO:
- if(hash->destruir_dato != NULL) hash->destruir_dato(hash->campos[posicion_clave].valor);
- break;
- case BORRADO:
- if (strcmp(hash->campos[posicion_clave].clave, clave) != 0){
- hash->campos[posicion_clave].clave = realloc(hash->campos[posicion_clave].clave, (strlen(clave) + 1) * sizeof(char));
- if(!hash->campos[posicion_clave].clave) return false;
- strcpy(hash->campos[posicion_clave].clave, clave);
- }
- if(hash->destruir_dato != NULL) hash->destruir_dato(hash->campos[posicion_clave].valor);
- hash->borrados--;
- hash->cantidad++;
- hash->campos[posicion_clave].estado = OCUPADO;
- break;
- case VACIO:
- hash->campos[posicion_clave].clave = malloc((strlen(clave) + 1)* sizeof(char));
- if(!hash->campos[posicion_clave].clave) return false;
- strcpy(hash->campos[posicion_clave].clave, clave);
- hash->campos[posicion_clave].estado = OCUPADO;
- hash->cantidad++;
- break;
- }
- hash->campos[posicion_clave].valor = dato;
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement