80ec9182c9e1d29ee21acdf6e86af75eb24aa865
[satune.git] / src / Collections / vector.h
1 #ifndef VECTOR_H
2 #define VECTOR_H
3 #include <string.h>
4
5 #define VectorDef(name, type)                                           \
6         struct Vector ## name {                                               \
7                 uint size;                                                          \
8                 uint capacity;                                                      \
9                 type *array;                                                       \
10         };                                                                    \
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);
30
31 #define VectorImpl(name, type, defcap)                                  \
32         Vector ## name * allocDefVector ## name() {                           \
33                 return allocVector ## name(defcap);                                 \
34         }                                                                     \
35         Vector ## name * allocVector ## name(uint capacity) {                 \
36                 Vector ## name * tmp = (Vector ## name *)ourmalloc(sizeof(Vector ## name));  \
37                 tmp->size = 0;                                                      \
38                 tmp->capacity = capacity;                                           \
39                 tmp->array = (type *) ourmalloc(sizeof(type) * capacity);           \
40                 return tmp;                                                         \
41         }                                                                     \
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));                 \
46                 return tmp;                                                         \
47         }                                                                     \
48         void popVector ## name(Vector ## name * vector) {                      \
49                 vector->size--;                                                     \
50         }                                                                     \
51         type lastVector ## name(Vector ## name * vector) {                     \
52                 return vector->array[vector->size - 1];                               \
53         }                                                                     \
54         void setSizeVector ## name(Vector ## name * vector, uint size) {       \
55                 if (size <= vector->size) {                                         \
56                         vector->size = size;                                                \
57                         return;                                                           \
58                 } else if (size > vector->capacity) {                               \
59                         vector->array = (type *)ourrealloc(vector->array, size * sizeof(type)); \
60                         vector->capacity = size;                                            \
61                 }                                                                   \
62                 bzero(&vector->array[vector->size], (size - vector->size) * sizeof(type)); \
63                 vector->size = size;                                                  \
64         }                                                                     \
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;                                          \
70                 }                                                                   \
71                 vector->array[vector->size++] = item;                               \
72         }                                                                     \
73         type getVector ## name(Vector ## name * vector, uint index) {         \
74                 return vector->array[index];                                        \
75         }                                                                     \
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);                             \
80         }                                                                     \
81         void setVector ## name(Vector ## name * vector, uint index, type item) { \
82                 vector->array[index] = item;                                          \
83         }                                                                     \
84         uint getSizeVector ## name(const Vector ## name * vector) {                                             \
85                 return vector->size;                                                \
86         }                                                                     \
87         void deleteVector ## name(Vector ## name * vector) {                     \
88                 ourfree(vector->array);                                             \
89                 ourfree(vector);                                                    \
90         }                                                                     \
91         void clearVector ## name(Vector ## name * vector) {                     \
92                 vector->size = 0;                                                     \
93         }                                                                     \
94         type *exposeArray ## name(Vector ## name * vector) {                 \
95                 return vector->array;                                               \
96         }                                                                     \
97         void deleteVectorArray ## name(Vector ## name * vector) {              \
98                 ourfree(vector->array);                                             \
99         }                                                                     \
100         void initVector ## name(Vector ## name * vector, uint capacity) { \
101                 vector->size = 0;                                                      \
102                 vector->capacity = capacity;                                              \
103                 vector->array = (type *) ourmalloc(sizeof(type) * capacity);        \
104         }                                                                     \
105         void initDefVector ## name(Vector ## name * vector) {         \
106                 initVector ## name(vector, defcap);                         \
107         }                                                                     \
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));  \
112         }
113 #endif