Merge branch 'main' into input-rework
This commit is contained in:
commit
8a6296e518
10
premake5.lua
10
premake5.lua
|
@ -9,8 +9,12 @@ project "fencer"
|
||||||
files { "src/**.c" }
|
files { "src/**.c" }
|
||||||
links { "SDL2", "SDL2_image", "cjson", "m" }
|
links { "SDL2", "SDL2_image", "cjson", "m" }
|
||||||
buildoptions { "-Wall", "-DVMATH_SDL=1" }
|
buildoptions { "-Wall", "-DVMATH_SDL=1" }
|
||||||
filter { "configurations:Debug" }
|
|
||||||
buildoptions { "-g3" }
|
|
||||||
targetdir "bin/"
|
targetdir "bin/"
|
||||||
filter { "configurations:Release" }
|
filter "configurations:Debug"
|
||||||
|
defines { "DEBUG" }
|
||||||
|
buildoptions { "-g3" }
|
||||||
|
symbols "On"
|
||||||
|
filter "configurations:Release"
|
||||||
buildoptions { "-g0" }
|
buildoptions { "-g0" }
|
||||||
|
defines { "NDEBUG" }
|
||||||
|
optimize "On"
|
||||||
|
|
|
@ -93,8 +93,6 @@ size_t list_add(List* self, void* item) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void list_insert(List* self, void* item, size_t at) {
|
void list_insert(List* self, void* item, size_t at) {
|
||||||
ASSERT_RETURN(at < self->len,, "Index %zu out of bounds", at);
|
|
||||||
|
|
||||||
list_reserve(self, self->len + 1);
|
list_reserve(self, self->len + 1);
|
||||||
|
|
||||||
if(at == self->len - 1) {
|
if(at == self->len - 1) {
|
||||||
|
@ -113,6 +111,7 @@ void list_insert(List* self, void* item, size_t at) {
|
||||||
uint8_t* end = data.as_byte + self->element_size * self->len;
|
uint8_t* end = data.as_byte + self->element_size * self->len;
|
||||||
memmove(into, from, end - from);
|
memmove(into, from, end - from);
|
||||||
memcpy(from, item, self->element_size);
|
memcpy(from, item, self->element_size);
|
||||||
|
++self->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void list_erase(List* self, size_t at) {
|
void list_erase(List* self, size_t at) {
|
||||||
|
|
81
src/map.c
81
src/map.c
|
@ -1,81 +0,0 @@
|
||||||
#include "map.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "math.h"
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
HashMap hash_map_from_sizes(size_t ksize, size_t vsize, HashFn hasher) {
|
|
||||||
return (HashMap) {
|
|
||||||
.data = list_init(ksize + vsize + sizeof(uintptr_t)),
|
|
||||||
.hasher = hasher,
|
|
||||||
.key_size = ksize,
|
|
||||||
.value_size = vsize,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
void hash_map_empty(HashMap* self) {
|
|
||||||
list_empty(&self->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
uintptr_t _internal_get_hash(HashMap* self, size_t at) {
|
|
||||||
return *list_at_as(uintptr_t, &self->data, at);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
void* _internal_get_key(HashMap* self, size_t at) {
|
|
||||||
return (void*)(list_at_as(uint8_t, &self->data, at) + sizeof(uintptr_t) + self->value_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
void* _internal_get_value(HashMap* self, size_t at) {
|
|
||||||
return (void*)(list_at_as(uint8_t, &self->data, at) + sizeof(uintptr_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
size_t _internal_search(HashMap* self, uintptr_t hash) {
|
|
||||||
int left = 0;
|
|
||||||
int right = self->data.len - 1;
|
|
||||||
int m;
|
|
||||||
|
|
||||||
while(left <= right) {
|
|
||||||
m = floor((float)(left + right) / 2.0);
|
|
||||||
if(*list_at_as(uintptr_t, &self->data, m) < hash) {
|
|
||||||
left = m + 1;
|
|
||||||
} else if(*list_at_as(uintptr_t, &self->data, m) > hash) {
|
|
||||||
right = m - 1;
|
|
||||||
} else {
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return self->data.len;
|
|
||||||
}
|
|
||||||
|
|
||||||
void hash_map_insert(HashMap* self, void* key, void* value) {
|
|
||||||
const uintptr_t hash = self->hasher(key);
|
|
||||||
const size_t target_index = _internal_search(self, hash);
|
|
||||||
|
|
||||||
list_reserve(&self->data, self->data.len + 1);
|
|
||||||
self->data.len += 1;
|
|
||||||
|
|
||||||
uint8_t* target_address = list_at(&self->data, target_index);
|
|
||||||
|
|
||||||
uintptr_t* target_hash = (uintptr_t*)target_address;
|
|
||||||
uint8_t* target_value = target_address + sizeof(uintptr_t);
|
|
||||||
uint8_t* target_key = target_value + self->value_size;
|
|
||||||
|
|
||||||
*target_hash = hash;
|
|
||||||
memcpy(target_value, value, self->value_size);
|
|
||||||
memcpy(target_key, key, self->key_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void hash_map_erase(HashMap* self, void* key) {
|
|
||||||
const size_t target_index = _internal_search(self, self->hasher(key));
|
|
||||||
ASSERT_RETURN(target_index < self->data.len,, "Attempted to erase a hashmap by a key that is not in the hashmap");
|
|
||||||
list_erase(&self->data, target_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* hash_map_at(HashMap* self, void* key) {
|
|
||||||
const size_t target_index = _internal_search(self, self->hasher(key));
|
|
||||||
return list_at(&self->data, target_index);
|
|
||||||
}
|
|
28
src/map.h
28
src/map.h
|
@ -1,28 +0,0 @@
|
||||||
#ifndef _fencer_hashmap_h
|
|
||||||
#define _fencer_hashmap_h
|
|
||||||
|
|
||||||
#include "stdint.h"
|
|
||||||
#include "list.h"
|
|
||||||
|
|
||||||
typedef uintptr_t (*HashFn)(void*);
|
|
||||||
|
|
||||||
typedef struct HashMap {
|
|
||||||
HashFn hasher;
|
|
||||||
List data;
|
|
||||||
size_t key_size;
|
|
||||||
size_t value_size;
|
|
||||||
} HashMap;
|
|
||||||
|
|
||||||
extern HashMap hash_map_from_sizes(size_t key_size, size_t value_size, HashFn hasher);
|
|
||||||
extern void hash_map_empty(HashMap* self);
|
|
||||||
extern void hash_map_insert(HashMap* self, void* key, void* value);
|
|
||||||
extern void hash_map_erase(HashMap* self, void* key);
|
|
||||||
extern void* hash_map_at(HashMap* self, void* key);
|
|
||||||
|
|
||||||
#define hash_map_at_as(__Type, __Map, __Key)\
|
|
||||||
((__Type*)hash_map_at(__Map, __Key))
|
|
||||||
|
|
||||||
#define hash_map_from_types(__KType, __VType, __Hasher)\
|
|
||||||
(hash_map_from_sizes(sizeof(__KType), sizeof(_VType), __Hasher))
|
|
||||||
|
|
||||||
#endif // !_fencer_hashmap_h
|
|
Loading…
Reference in a new issue