From 0203426f6ba8198759f07fe2ff66858c464b1890 Mon Sep 17 00:00:00 2001 From: Unknown <0.tamas.marton@gmail.com> Date: Thu, 2 May 2019 07:51:37 +0100 Subject: [PATCH] added simple map implementation for descriptor sets --- driver/map.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ driver/map.h | 34 +++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 driver/map.c create mode 100644 driver/map.h diff --git a/driver/map.c b/driver/map.c new file mode 100644 index 0000000..e7bc5d5 --- /dev/null +++ b/driver/map.c @@ -0,0 +1,65 @@ +#include "map.h" + +uint32_t getIndex(uint32_t key, uint32_t maxData) +{ + //multiplicative hash + //with power of 2 W + uint32_t a = 0x678DDE6F; + return ((a * key) >> (32 - maxData)) % maxData; +} + +void* getMapElement(map m, uint32_t key) +{ + assert(m.maxData > 0); + assert(m.elements); + uint32_t index = getIndex(key, m.maxData); + //linear open addressing + while(m.elements[index].key != key && m.elements[index].data != 0){index = (index + 1) % m.maxData;} + return m.elements[index].data; +} + +void setMapElement(map* m, uint32_t key, void* data) +{ + assert(m); + assert(m->elements); + assert(m->maxData > 0); + uint32_t index = getIndex(key, m->maxData); + while(m->elements[index].key != key && m->elements[index].data != 0){index = (index + 1) % m->maxData;} + m->elements[index].data = data; + m->elements[index].key = key; +} + +void deleteMapElement(map* m, uint32_t key) +{ + assert(m); + assert(m->elements); + assert(m->maxData > 0); + uint32_t index = getIndex(key, m->maxData); + while(m->elements[index].key != key){++index;} + m->elements[index].data = 0; +} + +map createMap(void* buf, uint32_t maxData) +{ + map m = + { + .elements = buf, + .maxData = maxData + }; + + //lazy hashing + //0 means bucket is empty + for(uint32_t c = 0; c < m.maxData; ++c) + { + m.elements[c].data = 0; + } + + return m; +} + +void destroyMap(map* m) +{ + //actual memory freeing is done by caller + m->elements = 0; + m->maxData = 0; +} \ No newline at end of file diff --git a/driver/map.h b/driver/map.h new file mode 100644 index 0000000..bdda595 --- /dev/null +++ b/driver/map.h @@ -0,0 +1,34 @@ +#pragma once + +#if defined (__cplusplus) +extern "C" { +#endif + +#include +#include "CustomAssert.h" + +typedef struct +{ + void* data; + uint32_t key; +} mapElem; + +typedef struct +{ + mapElem* elements; + uint32_t maxData; +} map; + +void* getMapElement(map m, uint32_t key); +void setMapElement(map* m, uint32_t key, void* data); +void deleteMapElement(map* m, uint32_t key); +map createMap(void* buf, uint32_t maxData); +void destroyMap(map* m); + + +#if defined (__cplusplus) +} +#endif + + +