From 23896a8a10b4751169e77ea9a7e8dd92c26bdf25 Mon Sep 17 00:00:00 2001 From: Dvir Volk Date: Wed, 29 Jun 2016 17:45:49 +0300 Subject: [PATCH] added vector_pop --- rmutil/vector.c | 45 +++++++++++++++++++++++++-------------------- rmutil/vector.h | 11 +++++++---- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/rmutil/vector.c b/rmutil/vector.c index 73a7fdd..5d4037e 100644 --- a/rmutil/vector.c +++ b/rmutil/vector.c @@ -1,36 +1,45 @@ #include "vector.h" #include - int __vector_PushPtr(Vector *v, void *elem) { if (v->top == v->cap - 1) { - Vector_Resize(v, v->cap ? v->cap*2 : 1); + Vector_Resize(v, v->cap ? v->cap * 2 : 1); } - + __vector_PutPtr(v, v->top, elem); v->top++; return v->top; } - -int Vector_Get(Vector *v, size_t pos, void *ptr) { +inline int Vector_Get(Vector *v, size_t pos, void *ptr) { // return 0 if pos is out of bounds if (pos >= v->top) { return 0; } - + memcpy(ptr, v->data + (pos * v->elemSize), v->elemSize); return 1; } +/* Get the element at the end of the vector, decreasing the size by one */ +inline int Vector_Pop(Vector *v, void *ptr) { + if (v->top > 0) { + if (ptr != NULL) { + Vector_Get(v, v->top - 1, ptr); + } + v->top--; + return 1; + } + return 0; +} int __vector_PutPtr(Vector *v, size_t pos, void *elem) { // resize if pos is out of bounds if (pos >= v->cap) { - Vector_Resize(v, pos+1); + Vector_Resize(v, pos + 1); } - - memcpy(v->data + pos*v->elemSize, elem, v->elemSize); + + memcpy(v->data + pos * v->elemSize, elem, v->elemSize); // move the end offset to pos if we grew if (pos > v->top) { v->top = pos; @@ -38,33 +47,29 @@ int __vector_PutPtr(Vector *v, size_t pos, void *elem) { return 1; } - int Vector_Resize(Vector *v, size_t newcap) { - int oldcap = v->cap; v->cap = newcap; - - v->data = realloc(v->data, v->cap*v->elemSize); - + + v->data = realloc(v->data, v->cap * v->elemSize); + // If we grew: // put all zeros at the newly realloc'd part of the vector if (newcap > oldcap) { - int offset = oldcap*v->elemSize; - memset(v->data + offset, 0, v->cap*v->elemSize - offset); + int offset = oldcap * v->elemSize; + memset(v->data + offset, 0, v->cap * v->elemSize - offset); } return v->cap; } - Vector *__newVectorSize(size_t elemSize, size_t cap) { - Vector *vec = malloc(sizeof(Vector)); vec->data = calloc(cap, elemSize); vec->top = 0; vec->elemSize = elemSize; vec->cap = cap; - - return vec; + + return vec; } void Vector_Free(Vector *v) { diff --git a/rmutil/vector.h b/rmutil/vector.h index 6546742..b255787 100644 --- a/rmutil/vector.h +++ b/rmutil/vector.h @@ -10,10 +10,10 @@ * Works like C++ std::vector with an underlying resizable buffer */ typedef struct { - char *data; - size_t elemSize; - size_t cap; - size_t top; + char *data; + size_t elemSize; + size_t cap; + size_t top; } Vector; @@ -37,6 +37,9 @@ int __vector_PutPtr(Vector *v, size_t pos, void *elem); */ int Vector_Get(Vector *v, size_t pos, void *ptr); +/* Get the element at the end of the vector, decreasing the size by one */ +int Vector_Pop(Vector *v, void *ptr); + //#define Vector_Getx(v, pos, ptr) pos < v->cap ? 1 : 0; *ptr = //*(typeof(ptr))(v->data + v->elemSize*pos)