Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <assert.h>
- #include <string.h>
- struct vector {
- void (*val_free)(void *);
- uintptr_t *data;
- int cap;
- int len;
- };
- /*********************************************************************
- * *
- * constructor / destructor *
- * *
- *********************************************************************/
- /*************
- * vec_alloc *
- *************/
- struct vector *
- vec_alloc(int cap, void (*val_free)(void *))
- {
- struct vector *vec;
- uintptr_t *data;
- vec = malloc(sizeof(struct vector));
- data = malloc(cap * sizeof(uintptr_t));
- vec->val_free = val_free;
- vec->data = data;
- vec->cap = cap;
- vec->len = 0;
- return vec;
- }
- /************
- * vec_free *
- ************/
- void
- vec_free(struct vector *vec)
- {
- if (vec->val_free) {
- for (int i = 0; i < vec->len; i++) {
- if (vec->data[i])
- vec->val_free((void *)vec->data[i]);
- }
- }
- free(vec->data);
- free(vec);
- }
- /*********************************************************************
- * *
- * insertion *
- * *
- *********************************************************************/
- /************
- * vec_push *
- ************/
- /* pushes item to the back of the vector */
- void
- vec_push(struct vector *vec, uintptr_t src)
- {
- if (vec->len == vec->cap)
- resize(vec, vec->cap * 2);
- vec->len++;
- vec->data[vec->len - 1] = src;
- }
- /*********************************************************************
- * *
- * deletion *
- * *
- *********************************************************************/
- /***********
- * vec_pop *
- ***********/
- /* removes the last item in the vector, copies it to dst */
- uintptr_t
- vec_pop(struct vector *vec)
- {
- uintptr_t res;
- if (vec->len < 3 * vec->cap / 4)
- resize(vec, 3 * vec->cap / 4);
- res = vec->data[vec->len - 1];
- vec->len--;
- return res;
- }
- /*********************************************************************
- * *
- * retrieval *
- * *
- *********************************************************************/
- /************
- * vec_peek *
- ************/
- /* copies the item at an index to dst */
- uintptr_t
- vec_peek(struct vector *vec)
- {
- if (vec->len > 0)
- return vec->data[vec->len - 1];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement