0001 #include <cgreen/vector.h>
0002 #include <stdio.h>
0003 #include <stdlib.h>
0004
0005 #ifdef __cplusplus
0006 namespace cgreen {
0007 #endif
0008
0009 struct CgreenVector_ {
0010 int size;
0011 void (*destructor)(void *);
0012 int space;
0013 void **items;
0014 };
0015
0016 static void increase_space(CgreenVector *vector);
0017
0018 CgreenVector *create_cgreen_vector(void (*destructor)(void *)) {
0019 CgreenVector *vector = (CgreenVector *)malloc(sizeof(CgreenVector));
0020 vector->size = 0;
0021 vector->destructor = destructor;
0022 vector->space = 0;
0023 vector->items = NULL;
0024 return vector;
0025 }
0026
0027 void destroy_cgreen_vector(CgreenVector *vector) {
0028 int i;
0029 if (vector->destructor != NULL) {
0030 for (i = 0; i < vector->size; i++) {
0031 (*vector->destructor)(vector->items[i]);
0032 }
0033 }
0034
0035 free(vector->items);
0036 vector->items = NULL;
0037 vector->destructor = NULL;
0038 vector->size = 0;
0039 vector->space = 0;
0040
0041 free(vector);
0042 }
0043
0044 void cgreen_vector_add(CgreenVector *vector, void *item) {
0045 if (vector->size == vector->space) {
0046 increase_space(vector);
0047 }
0048 vector->items[vector->size] = item;
0049 vector->size++;
0050 }
0051
0052 void *cgreen_vector_remove(CgreenVector *vector, int position) {
0053 void *item;
0054 int i;
0055
0056 if (position < 0) {
0057 fprintf(stderr, "negative position disallowed in vector operation\n");
0058 return NULL;
0059 }
0060
0061 item = vector->items[position];
0062
0063 for (i = position; i < vector->size; i++) {
0064 vector->items[i] = vector->items[i + 1];
0065 }
0066
0067 vector->items[vector->size] = NULL;
0068
0069 vector->size--;
0070 return item;
0071 }
0072
0073 void *cgreen_vector_get(const CgreenVector *vector, int position) {
0074 return vector->items[position];
0075 }
0076
0077 int cgreen_vector_size(const CgreenVector *vector) {
0078 return (vector == NULL ? 0 : vector->size);
0079 }
0080
0081 static void increase_space(CgreenVector *vector) {
0082 vector->space += 100;
0083 vector->items = (void**)realloc(vector->items, sizeof(void *) * vector->space);
0084 }
0085
0086 #ifdef __cplusplus
0087 }
0088 #endif
0089
0090