00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef CTRUMP_COMMON_VARRAY_H
00032 #define CTRUMP_COMMON_VARRAY_H
00033
00039 #include <stddef.h>
00040 #include "ctrump/common/dll.h"
00041
00042 #ifdef __cplusplus
00043 extern "C" {
00044 #endif
00045
00046 struct ctrump_mempool;
00047
00051 struct ctrump_varray {
00052 size_t nelem;
00053 size_t size;
00054 size_t elem_size;
00055 void *elements;
00056 };
00057
00064 #define VA_ELEM(t,a,n) (((t*)((a)->elements))[n])
00065
00071 #define VA_TOP(t,a) VA_ELEM(t,a,(a)->nelem-1)
00072
00079 #define VA_ELEM_PTR(t,a,n) (&(((t*)((a)->elements))[n]))
00080
00086 #define VA_LAST_PTR(t,a) (&(((t*)((a)->elements))[(a)->nelem-1]))
00087
00088
00095 #define VA_PUSH(t,a,e) do { if ((a)->nelem>=(a)->size) ctrump_varray_realloc(a); VA_ELEM(t,a,(a)->nelem++) = (e); } while(0)
00096
00102 #define VA_NEWELEM(a) do { if ((a)->nelem>=(a)->size) ctrump_varray_realloc(a); (a)->nelem++; } while(0)
00103
00109 #define VA_NEWELEM_P(a,p) do { if ((a)->nelem>=(a)->size) ctrump_varray_realloc_pool(a,p); (a)->nelem++; } while(0)
00110
00111
00117 #define VA_POP(t,a) VA_ELEM(t, (a), --((a)->nelem))
00118
00119 #define VA_PUSH_P(t,a,e,p) do { if ((a)->nelem>=(a)->size) ctrump_varray_realloc_pool(a,p); VA_ELEM(t,a,(a)->nelem++) = (e); } while(0)
00120
00126 CTRUMP_EXTDEF void ctrump_varray_init(struct ctrump_varray *a, size_t n, size_t es);
00127 CTRUMP_EXTDEF void ctrump_varray_init_pool(struct ctrump_varray *a, size_t n, size_t es,
00128 struct ctrump_mempool *pool);
00129
00134 CTRUMP_EXTDEF void ctrump_varray_realloc(struct ctrump_varray *a);
00135 CTRUMP_EXTDEF void ctrump_varray_realloc_pool(struct ctrump_varray *a,
00136 struct ctrump_mempool *pool);
00137
00145 CTRUMP_EXTDEF void *ctrump_varray_close(struct ctrump_varray *a,
00146 struct ctrump_mempool *p);
00147
00154 CTRUMP_EXTDEF void *ctrump_varray_copy(struct ctrump_varray *a,
00155 struct ctrump_mempool *p);
00156
00160 CTRUMP_EXTDEF void ctrump_varray_discard(struct ctrump_varray *a);
00161
00162 #ifdef __cplusplus
00163 }
00164 #endif
00165
00166 #endif