parent
53d65a235a
commit
0543d56dd5
@ -0,0 +1,76 @@ |
||||
#include "hashmap.h" |
||||
#include <stdlib.h> |
||||
|
||||
#define HASHMAP_ARRAY_SIZE 512 |
||||
|
||||
struct HASHMAP_ENTRY |
||||
{ |
||||
uint32_t key; |
||||
void* elem; |
||||
struct HASHMAP_ENTRY* next;
|
||||
}; |
||||
|
||||
struct HASHMAP |
||||
{ |
||||
struct HASHMAP_ENTRY** array; |
||||
}; |
||||
|
||||
size_t _hashmap_hash(uint32_t key) |
||||
{ |
||||
return key % HASHMAP_ARRAY_SIZE; |
||||
} |
||||
|
||||
hashmap_t* hashmap_alloc() |
||||
{ |
||||
hashmap_t* tr = malloc(sizeof(hashmap_t)); |
||||
tr->array = calloc(sizeof(struct HASHMAP_ENTRY*), HASHMAP_ARRAY_SIZE); |
||||
return tr; |
||||
} |
||||
|
||||
void hashmap_free(hashmap_t* hashmap) |
||||
{ |
||||
for(size_t i = 0; i < HASHMAP_ARRAY_SIZE; i++) |
||||
{ |
||||
struct HASHMAP_ENTRY* current = hashmap->array[i]; |
||||
|
||||
while(current) |
||||
{ |
||||
struct HASHMAP_ENTRY* old = current; |
||||
current = current->next; |
||||
free(old); |
||||
} |
||||
} |
||||
|
||||
free(hashmap->array); |
||||
free(hashmap); |
||||
} |
||||
|
||||
void hashmap_put(hashmap_t* hashmap, uint32_t key, void* elem) |
||||
{ |
||||
size_t index = _hashmap_hash(key); |
||||
struct HASHMAP_ENTRY** current = &hashmap->array[index]; |
||||
|
||||
while(*current) |
||||
{ |
||||
current = &(*current)->next; |
||||
} |
||||
|
||||
(*current) = malloc(sizeof(struct HASHMAP_ENTRY)); |
||||
(*current)->key = key; |
||||
(*current)->elem = elem; |
||||
(*current)->next = 0; |
||||
} |
||||
|
||||
void* hashmap_get(hashmap_t* hashmap, uint32_t key) |
||||
{ |
||||
size_t index = _hashmap_hash(key); |
||||
struct HASHMAP_ENTRY* current = hashmap->array[index]; |
||||
|
||||
while(current) |
||||
{ |
||||
if(current->key == key) return current->elem; |
||||
current = current->next; |
||||
} |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,15 @@ |
||||
#ifndef HASHMAP_H |
||||
#define HASHMAP_H |
||||
|
||||
#include <stddef.h> |
||||
#include <stdint.h> |
||||
|
||||
typedef struct HASHMAP hashmap_t; |
||||
|
||||
hashmap_t* hashmap_alloc(); |
||||
void hashmap_free(hashmap_t* hashmap); |
||||
|
||||
void hashmap_put(hashmap_t* hashmap, uint32_t key, void* elem); |
||||
void* hashmap_get(hashmap_t* hashmap, uint32_t key); |
||||
|
||||
#endif |
Loading…
Reference in new issue