bug fixes
[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