Felix Brendel hace 5 años
padre
commit
f3d92bc25e
Se han modificado 4 ficheros con 34 adiciones y 10 borrados
  1. +5
    -5
      bucket_allocator.hpp
  2. +1
    -1
      build.bat
  3. +27
    -0
      hashmap.hpp
  4. +1
    -4
      test.cpp

+ 5
- 5
bucket_allocator.hpp Ver fichero

@@ -35,7 +35,7 @@ class Bucket_Allocator {
}

public:
void alloc(u32 bucket_size, u32 initial_bucket_count) {
void alloc(u32 bucket_size = 16, u32 initial_bucket_count = 8) {
this->free_list.alloc();
this->bucket_size = bucket_size;
next_index_in_latest_bucket = 0;
@@ -54,8 +54,8 @@ public:
free(buckets);
}

template <typename proc>
void for_each(proc p) {
template <typename lambda>
void for_each(lambda p) {
free_list.sort();
type* val;
for (u32 i = 0; i < next_bucket_index; ++i) {
@@ -76,8 +76,8 @@ public:
type* ret;
if (amount == 0) return nullptr;
if (amount == 1) {
if (free_list.next_index != 0) {
return free_list.data[--free_list.next_index];
if (free_list.count != 0) {
return free_list.data[--free_list.count];
}
ret = buckets[next_bucket_index]+next_index_in_latest_bucket;
increment_pointers(1);


+ 1
- 1
build.bat Ver fichero

@@ -23,7 +23,7 @@ g++ -std=c++17 %SRC% -o %BINDIR_WIN%\g++_%EXE_WIN%

echo.
echo cl:
cl %SRC% /nologo /Zi /Fd: %BINDIR_WIN%\cl_%EXE_WIN%.pdb /Fo: %BINDIR_WIN%\ /Fe: %BINDIR_WIN%\cl_%EXE_WIN% /wd4090
cl %SRC% /std:c++latest /nologo /Zi /Fd: %BINDIR_WIN%\cl_%EXE_WIN%.pdb /Fo: %BINDIR_WIN%\ /Fe: %BINDIR_WIN%\cl_%EXE_WIN% /wd4090
%BINDIR_WIN%\cl_%EXE_WIN%

echo.


+ 27
- 0
hashmap.hpp Ver fichero

@@ -7,6 +7,15 @@
#include "arraylist.hpp"


u32 hm_hash(const char* str) {
u32 value = str[0] << 7;
s32 i = 0;
while (str[i]) {
value = (10000003 * value) ^ str[i++];
}
return value ^ i;
}

u32 hm_hash(char* str) {
u32 value = str[0] << 7;
s32 i = 0;
@@ -20,6 +29,12 @@ u32 hm_hash(void* ptr) {
return ((u64)ptr * 2654435761) % 4294967296;
}


inline bool hm_objects_match(const char* a, const char* b) {
return strcmp(a, b) == 0;
}


inline bool hm_objects_match(char* a, char* b) {
return strcmp(a, b) == 0;
}
@@ -150,6 +165,18 @@ struct Hash_Map {
return get_object(key, hm_hash((key_type)key));
}

value_type* get_object_ptr(key_type key, u64 hash_val) {
s32 index = get_index_of_living_cell_if_it_exists(key, hash_val);
if (index != -1) {
return &(data[index].object);
}
return 0;
}

value_type* get_object_ptr(key_type key) {
return get_object_ptr(key, hm_hash((key_type)key));
}


void delete_object(key_type key) {
s32 index = get_index_of_living_cell_if_it_exists(key, hm_hash((key_type)key));


+ 1
- 4
test.cpp Ver fichero

@@ -111,9 +111,6 @@ auto test_hm() -> void {

assert(h2.get_object({.x = 1, .y = 2, .z = 3}) == 1, "value should be correct");
assert(h2.get_object({.x = 3, .y = 3, .z = 3}) == 3, "value should be correct");



}

s32 main(s32 argc, char* argv[]) {
@@ -121,7 +118,7 @@ s32 main(s32 argc, char* argv[]) {

test_hm();

print("done.");

return 0;
}

Cargando…
Cancelar
Guardar