Back to home page

Enduro/X

 
 

    


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 } // namespace cgreen
0088 #endif
0089 
0090 /* vim: set ts=4 sw=4 et cindent: */