added vector_pop

master
Dvir Volk 8 years ago
parent 7fe938d82e
commit 23896a8a10

@ -1,10 +1,9 @@
#include "vector.h" #include "vector.h"
#include <stdio.h> #include <stdio.h>
int __vector_PushPtr(Vector *v, void *elem) { int __vector_PushPtr(Vector *v, void *elem) {
if (v->top == v->cap - 1) { 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); __vector_PutPtr(v, v->top, elem);
@ -12,8 +11,7 @@ int __vector_PushPtr(Vector *v, void *elem) {
return v->top; return v->top;
} }
inline int Vector_Get(Vector *v, size_t pos, void *ptr) {
int Vector_Get(Vector *v, size_t pos, void *ptr) {
// return 0 if pos is out of bounds // return 0 if pos is out of bounds
if (pos >= v->top) { if (pos >= v->top) {
return 0; return 0;
@ -23,14 +21,25 @@ int Vector_Get(Vector *v, size_t pos, void *ptr) {
return 1; 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) { int __vector_PutPtr(Vector *v, size_t pos, void *elem) {
// resize if pos is out of bounds // resize if pos is out of bounds
if (pos >= v->cap) { 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 // move the end offset to pos if we grew
if (pos > v->top) { if (pos > v->top) {
v->top = pos; v->top = pos;
@ -38,26 +47,22 @@ int __vector_PutPtr(Vector *v, size_t pos, void *elem) {
return 1; return 1;
} }
int Vector_Resize(Vector *v, size_t newcap) { int Vector_Resize(Vector *v, size_t newcap) {
int oldcap = v->cap; int oldcap = v->cap;
v->cap = newcap; v->cap = newcap;
v->data = realloc(v->data, v->cap*v->elemSize); v->data = realloc(v->data, v->cap * v->elemSize);
// If we grew: // If we grew:
// put all zeros at the newly realloc'd part of the vector // put all zeros at the newly realloc'd part of the vector
if (newcap > oldcap) { if (newcap > oldcap) {
int offset = oldcap*v->elemSize; int offset = oldcap * v->elemSize;
memset(v->data + offset, 0, v->cap*v->elemSize - offset); memset(v->data + offset, 0, v->cap * v->elemSize - offset);
} }
return v->cap; return v->cap;
} }
Vector *__newVectorSize(size_t elemSize, size_t cap) { Vector *__newVectorSize(size_t elemSize, size_t cap) {
Vector *vec = malloc(sizeof(Vector)); Vector *vec = malloc(sizeof(Vector));
vec->data = calloc(cap, elemSize); vec->data = calloc(cap, elemSize);
vec->top = 0; vec->top = 0;

@ -10,10 +10,10 @@
* Works like C++ std::vector with an underlying resizable buffer * Works like C++ std::vector with an underlying resizable buffer
*/ */
typedef struct { typedef struct {
char *data; char *data;
size_t elemSize; size_t elemSize;
size_t cap; size_t cap;
size_t top; size_t top;
} Vector; } 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); 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 = //#define Vector_Getx(v, pos, ptr) pos < v->cap ? 1 : 0; *ptr =
//*(typeof(ptr))(v->data + v->elemSize*pos) //*(typeof(ptr))(v->data + v->elemSize*pos)

Loading…
Cancel
Save