]> git.lizzy.rs Git - dragonblocks_alpha.git/commitdiff
Move binsearch code to array.c
authorElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 25 Mar 2021 18:18:02 +0000 (19:18 +0100)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 25 Mar 2021 18:18:02 +0000 (19:18 +0100)
src/Makefile
src/array.c
src/array.h
src/binsearch.c [deleted file]
src/binsearch.h [deleted file]
src/map.c
src/shaders.c

index ce4e7bf5654a1b07fd54706f008193de19074af4..d54dd19681c5e462e48ba0bc5896d3a3e771975b 100644 (file)
@@ -1,4 +1,4 @@
-COMMON = array.o binsearch.o list.o map.o signal.o util.o types.o
+COMMON = array.o list.o map.o signal.o util.o types.o
 SERVER = $(COMMON) server.o servercommands.o mapgen.o
 CLIENT = $(COMMON) client.o clientcommands.o mesh.o scene.o mapblock_meshgen.o
 LIBRARIES = -lpthread -lm
index a6678e6eb1be940f1549d82afbb87a940cf1bea1..321d6740d33d49fdc7d9490212c392549d8c57d5 100644 (file)
@@ -1,7 +1,20 @@
+#include <assert.h>
 #include <string.h>
 #include <stdlib.h>
 #include "array.h"
 
+Array array_create(size_t membsiz)
+{
+       return (Array) {
+               .membsiz = membsiz,
+               .siz = 0,
+               .cap = 0,
+               .ptr = NULL,
+               .cmp = NULL,
+       };
+}
+
+
 static void array_realloc(Array *array)
 {
        if (array->siz > array->cap) {
@@ -34,12 +47,27 @@ void array_append(Array *array, void *elem)
        memcpy((char *) array->ptr + oldsiz * array->membsiz, elem, array->membsiz);
 }
 
-Array array_create(size_t membsiz)
+ArraySearchResult array_search(Array *array, void *search)
 {
-       return (Array) {
-               .membsiz = membsiz,
-               .siz = 0,
-               .cap = 0,
-               .ptr = NULL,
-       };
+       assert(array->cmp);
+       size_t min, max, index;
+
+       min = index = 0;
+       max = array->siz;
+
+       while (min < max) {
+               index = min;
+
+               size_t mid = (max + min) / 2;
+               s8 state = array->cmp(search, (char *) array->ptr + mid * array->membsiz);
+
+               if (state == 0)
+                       return (ArraySearchResult) {true, mid};
+               else if (state > 0)
+                       max = mid;
+               else
+                       min = mid;
+       }
+
+       return (ArraySearchResult) {false, index};
 }
index 71ef312955a9d278924bfc1d4b3dacaa3407db03..3bb6256e3bcc35c7072841031f27e542c187745e 100644 (file)
@@ -4,16 +4,27 @@
 #define ARRAY_REALLOC_EXTRA 25
 
 #include <stddef.h>
+#include <stdbool.h>
+#include "types.h"
+
+typedef s8 (*ArrayComparator)(void *search, void *element);
+
+typedef struct {
+       bool success;
+       size_t index;
+} ArraySearchResult;
 
 typedef struct
 {
        size_t membsiz;
        size_t siz, cap;
        void *ptr;
+       ArrayComparator cmp;
 } Array;
 
+Array array_create(size_t membsiz);
 void array_insert(Array *array, void *elem, size_t idx);
 void array_append(Array *array, void *elem);
-Array array_create(size_t membsiz);
+ArraySearchResult array_search(Array *array, void *search);
 
 #endif
diff --git a/src/binsearch.c b/src/binsearch.c
deleted file mode 100644 (file)
index d6b1362..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "binsearch.h"
-
-BinsearchResult binsearch(void *search, void **array, size_t size, BinsearchComparator cmp)
-{
-       size_t min, max, index;
-
-       min = index = 0;
-       max = size;
-
-       while (min < max) {
-               index = min;
-
-               size_t mid = (max + min) / 2;
-               s8 state = cmp(search, array[mid]);
-
-               if (state == 0)
-                       return (BinsearchResult) {true, mid};
-               else if (state > 0)
-                       max = mid;
-               else
-                       min = mid;
-       }
-
-       return (BinsearchResult) {false, index};
-}
diff --git a/src/binsearch.h b/src/binsearch.h
deleted file mode 100644 (file)
index f6337a2..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef _BINSEARCH_H_
-#define _BINSEARCH_H_
-
-#include <stddef.h>
-#include <stdbool.h>
-#include "types.h"
-
-typedef s8 (*BinsearchComparator)(void *search, void *element);
-
-typedef struct {
-       bool success;
-       size_t index;
-} BinsearchResult;
-
-BinsearchResult binsearch(void *search, void **array, size_t size, BinsearchComparator cmp);
-
-#endif
index b239fbd5aad3c4d4041b6253c102e784a6a0cde1..2c8f5ac4d5654ea26e19a3e3d7efc4ff71265913 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -1,15 +1,29 @@
 #include <stdlib.h>
 #include <stdbool.h>
 #include <math.h>
-#include "binsearch.h"
 #include "map.h"
 #include "util.h"
 
-Map *map_create()
+#define CMPBOUNDS(x) x == 0 ? 0 : x > 0 ? 1 : -1
+
+static s8 sector_compare(void *hash, void *sector)
 {
-       Map *map = malloc(sizeof(Map));
-       map->sectors = array_create(sizeof(MapSector *));
-       return map;
+       s64 d = *((u64 *) hash) - ((MapSector *) sector)->hash;
+       return CMPBOUNDS(d);
+}
+
+static s8 block_compare(void *level, void *block)
+{
+       s32 d = *((s32 *) level) - ((MapBlock *) block)->pos.y;
+       return CMPBOUNDS(d);
+}
+
+static MapBlock *allocate_block(v3s32 pos)
+{
+       MapBlock *block = malloc(sizeof(MapBlock));
+       block->pos = pos;
+       block->extra = NULL;
+       return block;
 }
 
 static MapBlock **get_block_ptr(MapSector *sector, size_t idx)
@@ -22,6 +36,14 @@ static MapSector **get_sector_ptr(Map *map, size_t idx)
        return (MapSector **) map->sectors.ptr + idx;
 }
 
+Map *map_create()
+{
+       Map *map = malloc(sizeof(Map));
+       map->sectors = array_create(sizeof(MapSector *));
+       map->sectors.cmp = &sector_compare;
+       return map;
+}
+
 void map_delete(Map *map)
 {
        for (size_t s = 0; s < map->sectors.siz; s++) {
@@ -37,18 +59,10 @@ void map_delete(Map *map)
        free(map);
 }
 
-#define CMPBOUNDS(x) x == 0 ? 0 : x > 0 ? 1 : -1
-
-static s8 sector_compare(void *hash, void *sector)
-{
-       s64 d = *((u64 *) hash) - ((MapSector *) sector)->hash;
-       return CMPBOUNDS(d);
-}
-
 MapSector *map_get_sector(Map *map, v2s32 pos, bool create)
 {
        u64 hash = ((u64) pos.x << 32) + (u64) pos.y;
-       BinsearchResult res = binsearch(&hash, map->sectors.ptr, map->sectors.siz, &sector_compare);
+       ArraySearchResult res = array_search(&map->sectors, &hash);
 
        if (res.success)
                return *get_sector_ptr(map, res.index);
@@ -59,33 +73,20 @@ MapSector *map_get_sector(Map *map, v2s32 pos, bool create)
        sector->pos = pos;
        sector->hash = hash;
        sector->blocks = array_create(sizeof(MapBlock *));
+       sector->blocks.cmp = &block_compare;
 
        array_insert(&map->sectors, &sector, res.index);
 
        return sector;
 }
 
-static s8 block_compare(void *level, void *block)
-{
-       s32 d = *((s32 *) level) - ((MapBlock *) block)->pos.y;
-       return CMPBOUNDS(d);
-}
-
-static MapBlock *allocate_block(v3s32 pos)
-{
-       MapBlock *block = malloc(sizeof(MapBlock));
-       block->pos = pos;
-       block->extra = NULL;
-       return block;
-}
-
 MapBlock *map_get_block(Map *map, v3s32 pos, bool create)
 {
        MapSector *sector = map_get_sector(map, (v2s32) {pos.x, pos.z}, create);
        if (! sector)
                return NULL;
 
-       BinsearchResult res = binsearch(&pos.y, sector->blocks.ptr, sector->blocks.siz, &block_compare);
+       ArraySearchResult res = array_search(&sector->blocks, &pos.y);
 
        MapBlock *block = NULL;
 
@@ -108,7 +109,7 @@ MapBlock *map_get_block(Map *map, v3s32 pos, bool create)
 void map_add_block(Map *map, MapBlock *block)
 {
        MapSector *sector = map_get_sector(map, (v2s32) {block->pos.x, block->pos.z}, true);
-       BinsearchResult res = binsearch(&block->pos.y, sector->blocks.ptr, sector->blocks.siz, &block_compare);
+       ArraySearchResult res = array_search(&sector->blocks, &block->pos.y);
        if (res.success) {
                MapBlock **ptr = get_block_ptr(sector, res.index);
                map_free_block(*ptr);
index 8d1c8b69c3fce7bea45c73efd06983e3c419a92f..e4d9753ec5fd8d035a3a7f228f6eb26179a49f6c 100644 (file)
@@ -1 +1 @@
+#include "shaders.h"