5 #define VectorDef(name, type) \
6 struct Vector ## name { \
11 typedef struct Vector ## name Vector ## name; \
12 Vector ## name * allocVector ## name(uint capacity); \
13 Vector ## name * allocDefVector ## name(); \
14 Vector ## name * allocVectorArray ## name(uint capacity, type * array); \
15 void pushVector ## name(Vector ## name * vector, type item); \
16 type lastVector ## name(Vector ## name * vector); \
17 void popVector ## name(Vector ## name * vector); \
18 type getVector ## name(Vector ## name * vector, uint index); \
19 void setExpandVector ## name(Vector ## name * vector, uint index, type item); \
20 void setVector ## name(Vector ## name * vector, uint index, type item); \
21 uint getSizeVector ## name(const Vector ## name * vector); \
22 void setSizeVector ## name(Vector ## name * vector, uint size); \
23 void deleteVector ## name(Vector ## name * vector); \
24 void clearVector ## name(Vector ## name * vector); \
25 void deleteVectorArray ## name(Vector ## name * vector); \
26 type *exposeArray ## name(Vector ## name * vector); \
27 void initVector ## name(Vector ## name * vector, uint capacity); \
28 void initDefVector ## name(Vector ## name * vector); \
29 void initVectorArray ## name(Vector ## name * vector, uint capacity, type * array);
31 #define VectorImpl(name, type, defcap) \
32 Vector ## name * allocDefVector ## name() { \
33 return allocVector ## name(defcap); \
35 Vector ## name * allocVector ## name(uint capacity) { \
36 Vector ## name * tmp = (Vector ## name *)ourmalloc(sizeof(Vector ## name)); \
38 tmp->capacity = capacity; \
39 tmp->array = (type *) ourmalloc(sizeof(type) * capacity); \
42 Vector ## name * allocVectorArray ## name(uint capacity, type * array) { \
43 Vector ## name * tmp = allocVector ## name(capacity); \
44 tmp->size = capacity; \
45 memcpy(tmp->array, array, capacity * sizeof(type)); \
48 void popVector ## name(Vector ## name * vector) { \
51 type lastVector ## name(Vector ## name * vector) { \
52 return vector->array[vector->size - 1]; \
54 void setSizeVector ## name(Vector ## name * vector, uint size) { \
55 if (size <= vector->size) { \
56 vector->size = size; \
58 } else if (size > vector->capacity) { \
59 vector->array = (type *)ourrealloc(vector->array, size * sizeof(type)); \
60 vector->capacity = size; \
62 bzero(&vector->array[vector->size], (size - vector->size) * sizeof(type)); \
63 vector->size = size; \
65 void pushVector ## name(Vector ## name * vector, type item) { \
66 if (vector->size >= vector->capacity) { \
67 uint newcap = vector->capacity << 1; \
68 vector->array = (type *)ourrealloc(vector->array, newcap * sizeof(type)); \
69 vector->capacity = newcap; \
71 vector->array[vector->size++] = item; \
73 type getVector ## name(Vector ## name * vector, uint index) { \
74 return vector->array[index]; \
76 void setExpandVector ## name(Vector ## name * vector, uint index, type item) { \
77 if (index >= vector->size) \
78 setSizeVector ## name(vector, index + 1); \
79 setVector ## name(vector, index, item); \
81 void setVector ## name(Vector ## name * vector, uint index, type item) { \
82 vector->array[index] = item; \
84 uint getSizeVector ## name(const Vector ## name * vector) { \
85 return vector->size; \
87 void deleteVector ## name(Vector ## name * vector) { \
88 ourfree(vector->array); \
91 void clearVector ## name(Vector ## name * vector) { \
94 type *exposeArray ## name(Vector ## name * vector) { \
95 return vector->array; \
97 void deleteVectorArray ## name(Vector ## name * vector) { \
98 ourfree(vector->array); \
100 void initVector ## name(Vector ## name * vector, uint capacity) { \
102 vector->capacity = capacity; \
103 vector->array = (type *) ourmalloc(sizeof(type) * capacity); \
105 void initDefVector ## name(Vector ## name * vector) { \
106 initVector ## name(vector, defcap); \
108 void initVectorArray ## name(Vector ## name * vector, uint capacity, type * array) { \
109 initVector ## name(vector, capacity); \
110 vector->size = capacity; \
111 memcpy(vector->array, array, capacity * sizeof(type)); \