Browse Source

Add wrapper library around vc_vector

Nathaniel van Diepen 3 years ago
parent
commit
decb3ed810
5 changed files with 82 additions and 2 deletions
  1. 48 0
      src/lib/vector.c
  2. 27 0
      src/lib/vector.h
  3. 2 2
      src/main.c
  4. 4 0
      src/object.c
  5. 1 0
      src/object.h

+ 48 - 0
src/lib/vector.c

@@ -0,0 +1,48 @@
+#include "vector.h"
+
+bool Vector_push(struct Vector* self, const void* value){
+    return vc_vector_push_back(self->_vector, value);
+}
+void* Vector_pop(struct Vector* self){
+    void* item = vc_vector_end(self->_vector);
+    if(vc_vector_pop_back(self->_vector)){
+        return NULL;
+    }
+    return item;
+}
+bool Vector_replace(struct Vector* self, size_t i, const void* value){
+    return vc_vector_replace(self->_vector, i, value);
+}
+void Vector_clear(struct Vector* self){
+    vc_vector_clear(self->_vector);
+}
+size_t Vector_count(struct Vector* self){
+    return self->_vector->count;
+}
+void Vector_free(struct Vector* self){
+    vc_vector_release(self->_vector);
+    free(self);
+}
+void* Vector_get(Vector* self, size_t i){
+    return vc_vector_at(self->_vector, i);
+}
+
+Vector* new_Vector(int size, size_t obj_size, vc_vector_deleter* deleter){
+    return new_VectorFromVC(vc_vector_create(size, obj_size, deleter));
+}
+Vector* new_VectorFromVC(vc_vector* vector){
+    Vector* self = (Vector*)malloc(sizeof(Vector));
+    self->_vector = vector;
+
+    self->push = &Vector_push;
+    self->pop = &Vector_pop;
+    self->replace = &Vector_replace;
+    self->clear = &Vector_clear;
+    self->count = &Vector_count;
+    self->free = &Vector_free;
+    self->get = &Vector_get;
+    return self;
+}
+Vector* copy_Vector(struct Vector* vector){
+    return new_VectorFromVC(vc_vector_create_copy(vector->_vector));
+}

+ 27 - 0
src/lib/vector.h

@@ -0,0 +1,27 @@
+#ifndef VECTOR_H_
+#define VECTOR_H_
+
+#include "vc_vector.h"
+
+typedef bool (*Vector_func_push)(struct Vector*, const void*);
+typedef bool (*Vector_func_replace)(struct Vector*, size_t, const void*);
+typedef void* (*Vector_func_pop)(struct Vector*);
+typedef void (*Vector_func)(struct Vector*);
+typedef size_t (*Vector_func_count)(struct Vector*);
+typedef void* (*Vector_func_get)(struct Vector*, size_t i);
+
+typedef struct Vector {
+    vc_vector* _vector;
+
+    Vector_func_push push;
+    Vector_func_pop pop;
+    Vector_func_replace replace;
+    Vector_func clear;
+    Vector_func_count count;
+    Vector_func free;
+    Vector_func_get get;
+} Vector;
+
+Vector* new_Vector(int size, size_t obj_size, vc_vector_deleter* deleter);
+Vector* new_VectorFromVC(vc_vector* vector);
+#endif

+ 2 - 2
src/main.c

@@ -4,7 +4,7 @@
 #include <debug.h>
 
 #include "gfx/main_gfx.h"
-#include "lib/vc_vector.h"
+#include "lib/vector.h"
 #include "object.h"
 
 float scale = 3.0;
@@ -98,7 +98,7 @@ int main(void){
             frame = 0;
         }
     }while (! (kb_Data[6] & kb_Clear));
-    free(player);
+    player->free(player);
     gfx_End();
     return 0;
 }

+ 4 - 0
src/object.c

@@ -7,6 +7,9 @@ void Object_draw(Object* self){
         self->sprite, self->x, self->y,
         self->scale.x, self->scale.y);
 }
+void Object_free(Object* self){
+    free(self);
+}
 
 Object* new_Object(int x, int y){
     Object* self = (Object*)malloc(sizeof(Object));
@@ -15,5 +18,6 @@ Object* new_Object(int x, int y){
     self->scale.x = self->scale.y = 1;
     self->update = &Object_update;
     self->draw = &Object_draw;
+    self->free = &Object_free;
     return self;
 }

+ 1 - 0
src/object.h

@@ -16,6 +16,7 @@ typedef struct Object {
 
     Object_func draw;
     Object_func update;
+    Object_func free;
 } Object;
 
 Object* new_Object(int x, int y);