Update
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "mcutil/collect/hash_map.h"
|
||||
#include "mcutil/collect/gen_hash_map.h"
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
@@ -7,23 +8,28 @@
|
||||
#include "mcutil/mcutil.h"
|
||||
#include "mcutil/hash/md5.h"
|
||||
|
||||
MCU_API mcu_hash_map_t mcu_hm_new() {
|
||||
return (mcu_hash_map_t){
|
||||
.nodes = MCU_ALLOC(sizeof(mcu_hash_map_node_t)),
|
||||
#define CREATE_HM_NODES_IF_NULL(hm) { if (!(hm)->nodes) (hm)->nodes = MCU_ALLOC(sizeof(mcu_gen_hm_node_t)); }
|
||||
|
||||
MCU_API mcu_gen_hm_t mcu_hm_new() {
|
||||
return (mcu_gen_hm_t){
|
||||
.nodes = MCU_ALLOC(sizeof(mcu_gen_hm_node_t)),
|
||||
};
|
||||
}
|
||||
|
||||
MCU_API void _mcu_hm_insert(mcu_hash_map_t* hm, const void* key, const size_t key_len, const void* value) {
|
||||
MCU_API void _mcu_hm_insert(mcu_gen_hm_t* hm, const void* key, const size_t key_len, const void* value) {
|
||||
assert(hm && "HashMap ptr is null");
|
||||
mcu_md5_context ctx = {0};
|
||||
mcu_md5_init(&ctx);
|
||||
mcu_md5_digest(&ctx, (void*)key, key_len);
|
||||
uint8_t key_res[16];
|
||||
mcu_md5_output(&ctx, key_res);
|
||||
|
||||
mcu_hash_map_node_t* node = hm->nodes;
|
||||
CREATE_HM_NODES_IF_NULL(hm);
|
||||
|
||||
mcu_gen_hm_node_t* node = hm->nodes;
|
||||
while (true) {
|
||||
if (!node->next) {
|
||||
node->next = MCU_ALLOC(sizeof(mcu_hash_map_node_t));
|
||||
node->next = MCU_ALLOC(sizeof(mcu_gen_hm_node_t));
|
||||
node->next->next = NULL;
|
||||
memcpy(node->next->key, key_res, 16);
|
||||
node->next->value = (void*)value;
|
||||
@@ -33,14 +39,16 @@ MCU_API void _mcu_hm_insert(mcu_hash_map_t* hm, const void* key, const size_t ke
|
||||
}
|
||||
}
|
||||
|
||||
MCU_API void* _mcu_hm_get(mcu_hash_map_t* hm, const void* key, const size_t key_len) {
|
||||
MCU_API void* _mcu_hm_get(mcu_gen_hm_t* hm, const void* key, const size_t key_len) {
|
||||
assert(hm && "HashMap ptr is null");
|
||||
mcu_md5_context ctx = {0};
|
||||
mcu_md5_init(&ctx);
|
||||
mcu_md5_digest(&ctx, (void*)key, key_len);
|
||||
uint8_t key_res[16];
|
||||
mcu_md5_output(&ctx, key_res);
|
||||
|
||||
mcu_hash_map_node_t* node = hm->nodes;
|
||||
CREATE_HM_NODES_IF_NULL(hm);
|
||||
mcu_gen_hm_node_t* node = hm->nodes;
|
||||
while (true) {
|
||||
if (memcmp(node->key, key_res, 16) == 0) {
|
||||
return node->value;
|
||||
@@ -51,15 +59,18 @@ MCU_API void* _mcu_hm_get(mcu_hash_map_t* hm, const void* key, const size_t key_
|
||||
}
|
||||
}
|
||||
|
||||
MCU_API void* _mcu_hm_remove(mcu_hash_map_t* hm, const void* key, const size_t key_len) {
|
||||
MCU_API void* _mcu_hm_remove(mcu_gen_hm_t* hm, const void* key, const size_t key_len) {
|
||||
assert(hm && "HashMap ptr is null");
|
||||
mcu_md5_context ctx = {0};
|
||||
mcu_md5_init(&ctx);
|
||||
mcu_md5_digest(&ctx, (void*)key, key_len);
|
||||
uint8_t key_res[16];
|
||||
mcu_md5_output(&ctx, key_res);
|
||||
|
||||
mcu_hash_map_node_t* node = hm->nodes;
|
||||
mcu_hash_map_node_t* prev = hm->nodes;
|
||||
CREATE_HM_NODES_IF_NULL(hm);
|
||||
|
||||
mcu_gen_hm_node_t* node = hm->nodes;
|
||||
mcu_gen_hm_node_t* prev = hm->nodes;
|
||||
while (true) {
|
||||
if (memcmp(node->key, key_res, 16) == 0) {
|
||||
void* val = node->value;
|
||||
@@ -73,8 +84,11 @@ MCU_API void* _mcu_hm_remove(mcu_hash_map_t* hm, const void* key, const size_t k
|
||||
}
|
||||
}
|
||||
|
||||
MCU_API void mcu_free(mcu_hash_map_t* hm) {
|
||||
mcu_hash_map_node_t* node = hm->nodes;
|
||||
MCU_API void mcu_free(mcu_gen_hm_t* hm) {
|
||||
assert(hm && "HashMap ptr is null");
|
||||
mcu_gen_hm_node_t* node = hm->nodes;
|
||||
if (!node) return;
|
||||
|
||||
while (true) {
|
||||
if (node->next) return;
|
||||
MCU_FREE(node);
|
||||
@@ -82,8 +96,10 @@ MCU_API void mcu_free(mcu_hash_map_t* hm) {
|
||||
}
|
||||
}
|
||||
|
||||
MCU_API void mcu_free_all(mcu_hash_map_t* hm) {
|
||||
mcu_hash_map_node_t* node = hm->nodes;
|
||||
MCU_API void mcu_free_all(mcu_gen_hm_t* hm) {
|
||||
assert(hm && "HashMap ptr is null");
|
||||
mcu_gen_hm_node_t* node = hm->nodes;
|
||||
if (!node) return;
|
||||
while (true) {
|
||||
if (node->next) return;
|
||||
MCU_FREE(node);
|
||||
@@ -1,17 +1,20 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include "mcutil/mcutil.h"
|
||||
#include "mcutil/collect/gen_vec.h"
|
||||
|
||||
MCU_API void mcu_gen_vec_init(gen_vec_t* gv) {
|
||||
#define MCU_GEN_VEC_INITIAL_SIZE 32
|
||||
|
||||
MCU_API void mcu_gen_vec_init(mcu_gen_vec_t* gv) {
|
||||
gv->inner = MCU_ALLOC(sizeof(void*)*MCU_GEN_VEC_INITIAL_SIZE);
|
||||
gv->capacity = MCU_GEN_VEC_INITIAL_SIZE;
|
||||
}
|
||||
|
||||
|
||||
MCU_API void mcu_gen_vec_insert_front(gen_vec_t* gv, void* data) {
|
||||
assert(gv && "Null ptr passed as gen_vec_t");
|
||||
MCU_API void mcu_gen_vec_insert_front(mcu_gen_vec_t* gv, void* data) {
|
||||
assert(gv && "Null ptr passed as mcu_gen_vec_t");
|
||||
if (!gv->inner) mcu_gen_vec_init(gv);
|
||||
if (gv->count == gv->capacity) {
|
||||
gv->inner = MCU_REALLOC(gv->inner, (gv->capacity * sizeof(void*)) * 2);
|
||||
@@ -23,34 +26,33 @@ MCU_API void mcu_gen_vec_insert_front(gen_vec_t* gv, void* data) {
|
||||
memcpy(tmp, gv->inner, count);
|
||||
memcpy(gv->inner + sizeof(void*), tmp, count);
|
||||
gv->inner[0] = data;
|
||||
gv->count += 1;
|
||||
MCU_FREE(tmp);
|
||||
}
|
||||
|
||||
MCU_API void mcu_gen_vec_insert_back(gen_vec_t* gv, void* data) {
|
||||
assert(gv && "Null ptr passed as gen_vec_t");
|
||||
MCU_API void mcu_gen_vec_insert_back(mcu_gen_vec_t* gv, void* data) {
|
||||
assert(gv && "Null ptr passed as mcu_gen_vec_t");
|
||||
if (!gv->inner) mcu_gen_vec_init(gv);
|
||||
if (gv->count == gv->capacity) {
|
||||
gv->inner = MCU_REALLOC(gv->inner, (gv->capacity * sizeof(void*)) * 2);
|
||||
gv->inner = MCU_REALLOC(gv->inner, (gv->capacity * 2) * sizeof(void*));
|
||||
gv->capacity *= 2;
|
||||
}
|
||||
gv->inner[gv->count++] = data;
|
||||
}
|
||||
|
||||
MCU_API void* mcu_gen_vec_remove_back(gen_vec_t *gv) {
|
||||
assert(gv && "Null ptr passed as gen_vec_t");
|
||||
MCU_API void* mcu_gen_vec_remove_back(mcu_gen_vec_t *gv) {
|
||||
assert(gv && "Null ptr passed as mcu_gen_vec_t");
|
||||
if (gv->count == 0) return NULL;
|
||||
return gv->inner[gv->count--];
|
||||
}
|
||||
|
||||
MCU_API void* mcu_gen_vec_remove_front(gen_vec_t *gv) {
|
||||
assert(gv && "Null ptr passed as gen_vec_t");
|
||||
MCU_API void* mcu_gen_vec_remove_front(mcu_gen_vec_t *gv) {
|
||||
assert(gv && "Null ptr passed as mcu_gen_vec_t");
|
||||
if (gv->count == 0) return NULL;
|
||||
void* data = gv->inner[0];
|
||||
size_t count = sizeof(void*)*gv->count;
|
||||
void* tmp = MCU_ALLOC(count);
|
||||
memcpy(tmp, gv->inner, count);
|
||||
memcpy(gv->inner - sizeof(void*), tmp, count);
|
||||
MCU_FREE(tmp);
|
||||
for (int i = 0; i < gv->count; i++) {
|
||||
gv->inner[i] = gv->inner[i + 1];
|
||||
}
|
||||
gv->count--;
|
||||
return data;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user