Exemplo n.º 1
0
/*
 * Inserts element into the map.
 * 
 * @author Lukasz Koprowski <*****@*****.**>
 */
int map_put(snode * root, char * key, int value) {
    if(key[0] == '\0') return SUCCESS;

	snode * node = malloc(sizeof(snode));
	if(node == NULL){
	    error(ERR_NOT_ENOUGH_MEMORY);
	}

	node -> key = get_hashcode(key);
	node -> value = value;
	node -> left = NULL;
	node -> right = NULL;

	snode * fnode = map_find(root, node -> key);
	
	if (fnode -> key == EMPTY_KEY) {
		fnode -> key = node -> key;
		fnode -> value = node -> value;
		free(node);
	} else if (fnode -> key > node -> key) {
		fnode -> right = node;
	} else {
		fnode -> left = node;
	}
	
	return SUCCESS;
}
Exemplo n.º 2
0
static HashEntry* hashmap_lookup(HashTable* table,
        void const* key, size_t ksize,
        int (*equals)(void const* data, void const* key))
{
    const uint32_t hash = get_hashcode(key, ksize);
    const size_t slot = get_index(hash);

    HashEntry* entry = table->slots[slot];
    while (entry) {
        if (equals(entry->data, key)) {
            break;
        }
        entry = entry->next;
    }

    if (entry == NULL) {
        // create a new entry
        entry = DbgAllocLocked(sizeof(HashEntry), 1);
        entry->data = NULL;
        entry->slot = slot;
        entry->prev = NULL;
        entry->next = table->slots[slot];
        if (entry->next != NULL) {
            entry->next->prev = entry;
        }
        table->slots[slot] = entry;
    }
    return entry;
}
Exemplo n.º 3
0
/*
 * Finds value of an element in the map.
 * 
 * @author Lukasz Koprowski <*****@*****.**>
 * @return Either value assigned to the key, or an EMPTY_KEY.
 */
int map_get(snode * root, char * key) {
    long long int hash = get_hashcode(key);
    
    snode * fnode = map_find(root, hash);
    
    if(fnode != NULL && fnode -> key == hash){
        return fnode -> value;
    } else {
        return ERROR;
    }
}