1 #ifndef ASVECTOR_HEADER_FILE_INCLUDED 2 #define ASVECTOR_HEADER_FILE_INCLUDED 3 4 #ifdef __cplusplus 5 extern "C" { 6 #endif 7 8 typedef struct ASVector 9 { 10 void *memory ; 11 size_t allocated, used ; 12 size_t unit ; 13 }ASVector; 14 15 #define DECL_VECTOR(t,v) ASVector v = {NULL,0,0,sizeof(t)} 16 #define DECL_VECTOR_RAW(v) ASVector v = {NULL,0,0,1} 17 #define VECTOR_HEAD(t,v) ((t*)((v).memory)) 18 #define PVECTOR_HEAD(t,v) ((t*)((v)->memory)) 19 #define VECTOR_HEAD_RAW(v) ((v).memory) 20 #define VECTOR_TAIL(t,v) (((t*)((v).memory)) + ((v).used)) 21 #define PVECTOR_TAIL(t,v) (((t*)((v)->memory)) + ((v)->used)) 22 #define VECTOR_TAIL_RAW(v) (((v).memory) + ((v).used*(v).unit)) 23 #define VECTOR_USED(v) ((v).used) 24 #define VECTOR_UNIT(v) ((v).unit) 25 #define PVECTOR_USED(v) ((v)->used) 26 #define PVECTOR_UNIT(v) ((v)->unit) 27 28 ASVector *create_asvector( size_t unit ); 29 void destroy_asvector( ASVector **v ); 30 /* return memory starting address : */ 31 void *alloc_vector( ASVector *v, size_t new_size ); 32 void *realloc_vector( ASVector *v, size_t new_size ); 33 /* If append_vector is used with data == NULL it will only allocate 34 additional space, but will not copy any data. 35 Returns self : */ 36 ASVector *append_vector( ASVector *v, void * data, size_t size ); 37 38 /* returns index on success, -1 on failure */ 39 int vector_insert_elem( ASVector *v, void *data, size_t size, void *sibling, int before ); 40 int vector_relocate_elem (ASVector *v, unsigned int index, unsigned int new_index); 41 inline size_t vector_find_data (ASVector *v, void *data ); 42 int vector_find_elem( ASVector *v, void *data ); 43 /* returns 1 on success, 0 on failure */ 44 int vector_remove_elem( ASVector *v, void *data ); 45 int vector_remove_index( ASVector *v, size_t index ); 46 47 void 48 print_vector( stream_func func, void* stream, ASVector *v, char *name, void (*print_func)( stream_func func, void* stream, void *data ) ); 49 50 51 /* returns nothing : */ 52 void flush_vector( ASVector *v ); /* reset used to 0 */ 53 void free_vector( ASVector *v ); /* free all memory used, except for object itself */ 54 55 #ifdef __cplusplus 56 } 57 #endif 58 59 60 #endif /* #ifndef ASVECTOR_HEADER_FILE_INCLUDED */ 61