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