]> git.lizzy.rs Git - nothing.git/commitdiff
(#640) Remove dynarray
authorrexim <reximkut@gmail.com>
Wed, 16 Jan 2019 01:15:47 +0000 (08:15 +0700)
committerrexim <reximkut@gmail.com>
Wed, 16 Jan 2019 01:16:13 +0000 (08:16 +0700)
It's not type safe

CMakeLists.txt
src/algo/dynarray.c [deleted file]
src/algo/dynarray.h [deleted file]
src/game/level/rigid_bodies.c
src/game/level/rigid_bodies.h

index d3771a8a8b8bf8e81635b30f8595914c0a1bd123..b291021f75716ff54f3e2e2b14e10cc36e0ce54a 100644 (file)
@@ -125,8 +125,6 @@ add_executable(nothing
   src/broadcast.h
   src/game/level/rigid_bodies.h
   src/game/level/rigid_bodies.c
-  src/algo/dynarray.h
-  src/algo/dynarray.c
 )
 
 add_executable(repl
diff --git a/src/algo/dynarray.c b/src/algo/dynarray.c
deleted file mode 100644 (file)
index 1203757..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "system/stacktrace.h"
-#include "system/nth_alloc.h"
-#include "dynarray.h"
-
-#define DYNARRAY_INIT_CAPACITY 64
-
-struct DynArrayMeta
-{
-    size_t size;
-    size_t count;
-    size_t capacity;
-};
-
-struct DynArray
-{
-    struct DynArrayMeta meta;
-    char data[];
-};
-
-static inline struct DynArray *dynarray_from_data(void *data)
-{
-    return (struct DynArray*)((char*) data - sizeof(struct DynArrayMeta));
-}
-
-void *create_dynarray(size_t size)
-{
-    struct DynArray *dynarray =
-        nth_alloc(sizeof(struct DynArray) + size * DYNARRAY_INIT_CAPACITY);
-
-    dynarray->meta.size = size;
-    dynarray->meta.count = 0;
-    dynarray->meta.capacity = DYNARRAY_INIT_CAPACITY;
-
-    return dynarray->data;
-}
-
-void destroy_dynarray(void *data)
-{
-    trace_assert(data);
-    struct DynArray *dynarray = dynarray_from_data(data);
-    free(dynarray);
-}
-
-size_t dynarray_count(void *data)
-{
-    trace_assert(data);
-    struct DynArray *dynarray = dynarray_from_data(data);
-    return dynarray->meta.count;
-}
-
-void *dynarray_push(void *data, void *elem)
-{
-    trace_assert(data);
-    trace_assert(elem);
-
-    struct DynArray *dynarray = dynarray_from_data(data);
-
-    if (dynarray->meta.count >= dynarray->meta.capacity) {
-        const size_t new_capacity = dynarray->meta.capacity * 2;
-        struct DynArray * const new_dynarray =
-            nth_realloc(dynarray, sizeof(struct DynArray) + dynarray->meta.size * new_capacity);
-
-        if (new_dynarray == NULL) {
-            return NULL;
-        }
-
-        dynarray = new_dynarray;
-        dynarray->meta.capacity = new_capacity;
-    }
-
-    memcpy(
-        dynarray->data + dynarray->meta.count * dynarray->meta.size,
-        elem,
-        dynarray->meta.size);
-    dynarray->meta.count++;
-
-    return dynarray->data;
-}
diff --git a/src/algo/dynarray.h b/src/algo/dynarray.h
deleted file mode 100644 (file)
index 92fc9d4..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef DYNARRAY_H_
-#define DYNARRAY_H_
-
-void *create_dynarray(size_t size);
-void destroy_dynarray(void *dynarray);
-
-size_t dynarray_count(void *dynarray);
-// TODO(#638): dynarray_push result makes dynarrays not Lt friendly
-void *dynarray_push(void *dynarray, void *elem);
-
-#endif  // DYNARRAY_H_
index 78791ce7c02024b2fed4897d0d333a4fe11907b7..8583c57f020a1e41f2afe6e9fcb399462e509bed 100644 (file)
@@ -1,10 +1,10 @@
 #include <stdlib.h>
+#include <stdbool.h>
 
 #include "system/lt.h"
 #include "system/nth_alloc.h"
 #include "system/stacktrace.h"
 #include "game/camera.h"
-#include "algo/dynarray.h"
 
 #include "./rigid_bodies.h"
 
 
 struct RigidBodies
 {
+    Lt *lt;
+    size_t capacity;
+    size_t count;
+
+    bool *removed;
+    RigidBodyId *ids;
+
     Vec *positions;
     Vec *velocities;
     Vec *movements;
     Vec *sizes;
     Color *colors;
-    int *ground_touches;
+    bool *grounded;
     Vec *forces;
 };
 
-RigidBodies *create_rigid_bodies(void)
+RigidBodies *create_rigid_bodies(size_t capacity)
 {
-    RigidBodies *rigid_bodies = nth_calloc(1, sizeof(RigidBodies));
+    Lt *lt = create_lt();
+    if (lt == NULL) {
+        return NULL;
+    }
+
+    RigidBodies *rigid_bodies = PUSH_LT(lt, nth_calloc(1, sizeof(RigidBodies)), free);
     if (rigid_bodies == NULL) {
-        goto fail;
+        RETURN_LT(lt, NULL);
     }
+    rigid_bodies->lt = lt;
 
-    rigid_bodies->positions = create_dynarray(sizeof(Vec));
+    rigid_bodies->capacity = capacity;
+    rigid_bodies->count = 0;
+
+    rigid_bodies->removed = PUSH_LT(lt, nth_calloc(capacity, sizeof(bool)), free);
+    if (rigid_bodies->removed == NULL) {
+        RETURN_LT(lt, NULL);
+    }
+
+    rigid_bodies->ids = PUSH_LT(lt, nth_calloc(capacity, sizeof(RigidBodyId)), free);
+    if (rigid_bodies->ids == NULL) {
+        RETURN_LT(lt, NULL);
+    }
+
+    for (size_t i = 0; i < capacity; ++i) {
+        rigid_bodies->ids[i] = i;
+    }
+
+    rigid_bodies->positions = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
     if (rigid_bodies->positions == NULL) {
-        goto fail;
+        RETURN_LT(lt, NULL);
     }
 
-    rigid_bodies->velocities = create_dynarray(sizeof(Vec));
+    rigid_bodies->velocities = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
     if (rigid_bodies->velocities == NULL) {
-        goto fail;
+        RETURN_LT(lt, NULL);
     }
 
-    rigid_bodies->movements = create_dynarray(sizeof(Vec));
+    rigid_bodies->movements = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
     if (rigid_bodies->movements == NULL) {
-        goto fail;
+        RETURN_LT(lt, NULL);
     }
 
-    rigid_bodies->sizes = create_dynarray(sizeof(Vec));
+    rigid_bodies->sizes = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
     if (rigid_bodies->sizes == NULL) {
-        goto fail;
+        RETURN_LT(lt, NULL);
     }
 
-    rigid_bodies->colors = create_dynarray(sizeof(Color));
+    rigid_bodies->colors = PUSH_LT(lt, nth_calloc(capacity, sizeof(Color)), free);
     if (rigid_bodies->colors == NULL) {
-        goto fail;
+        RETURN_LT(lt, NULL);
     }
 
-    rigid_bodies->ground_touches = create_dynarray(sizeof(int));
-    if (rigid_bodies->ground_touches == NULL) {
-        goto fail;
+    rigid_bodies->grounded = PUSH_LT(lt, nth_calloc(capacity, sizeof(bool)), free);
+    if (rigid_bodies->grounded == NULL) {
+        RETURN_LT(lt, NULL);
     }
 
-    rigid_bodies->forces = create_dynarray(sizeof(Vec));
+    rigid_bodies->forces = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
     if (rigid_bodies->forces == NULL) {
-        goto fail;
+        RETURN_LT(lt, NULL);
     }
 
     return rigid_bodies;
-
-fail:
-    destroy_rigid_bodies(rigid_bodies);
-    return NULL;
 }
 
 void destroy_rigid_bodies(RigidBodies *rigid_bodies)
 {
-    if (rigid_bodies == NULL) {
-        return;
-    }
-
-    if (rigid_bodies->positions != NULL) {
-        destroy_dynarray(rigid_bodies->positions);
-    }
-
-    if (rigid_bodies->velocities != NULL) {
-        destroy_dynarray(rigid_bodies->velocities);
-    }
-
-    if (rigid_bodies->movements != NULL) {
-        destroy_dynarray(rigid_bodies->movements);
-    }
-
-    if (rigid_bodies->sizes != NULL) {
-        destroy_dynarray(rigid_bodies->sizes);
-    }
-
-    if (rigid_bodies->colors != NULL) {
-        destroy_dynarray(rigid_bodies->colors);
-    }
-
-    if (rigid_bodies->ground_touches != NULL) {
-        destroy_dynarray(rigid_bodies->ground_touches);
-    }
-
-    if (rigid_bodies->forces != NULL) {
-        destroy_dynarray(rigid_bodies->forces);
-    }
-
-    free(rigid_bodies);
+    trace_assert(rigid_bodies);
+    RETURN_LT0(rigid_bodies->lt);
 }
 
 int rigid_bodies_update(RigidBodies *rigid_bodies,
@@ -122,8 +117,7 @@ int rigid_bodies_render(RigidBodies *rigid_bodies,
     trace_assert(rigid_bodies);
     trace_assert(camera);
 
-    const size_t n = dynarray_count(rigid_bodies->positions);
-    for (size_t i = 0; i < n; ++i) {
+    for (size_t i = 0; i < rigid_bodies->count; ++i) {
         if (camera_fill_rect(
                 camera,
                 rect_from_vecs(
index 2f22ffc28f6f21ef040d86cda21b13b3d0676fe8..7995de5d38989d8c6938bc7511b4f63acbd6d623 100644 (file)
@@ -4,9 +4,9 @@
 typedef struct RigidBodies RigidBodies;
 typedef struct Camera Camera;
 
-typedef unsigned int RigidBodyId;
+typedef size_t RigidBodyId;
 
-RigidBodies *create_rigid_bodies(void);
+RigidBodies *create_rigid_bodies(size_t capacity);
 void destroy_rigid_bodies(RigidBodies *rigid_bodies);
 
 int rigid_bodies_update(RigidBodies *rigid_bodies,