Merge branch 'hamed' into brian
[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 setVector ## name(Vector ## name *vector, uint index, type item); \
20         uint getSizeVector ## name(Vector ## name *vector);                   \
21         void setSizeVector ## name(Vector ## name *vector, uint size);                          \
22         void deleteVector ## name(Vector ## name *vector);                    \
23         void clearVector ## name(Vector ## name *vector);                     \
24         void deleteVectorArray ## name(Vector ## name *vector);                                                         \
25         type * exposeArray ## name(Vector ## name * vector);                                                                    \
26         void allocInlineVector ## name(Vector ## name * vector, uint capacity); \
27         void allocInlineDefVector ## name(Vector ## name * vector);                                             \
28         void allocInlineVectorArray ## name(Vector ## name * vector, uint capacity, type * array);
29
30 #define VectorImpl(name, type, defcap)                                  \
31         Vector ## name * allocDefVector ## name() {                           \
32                 return allocVector ## name(defcap);                                 \
33         }                                                                     \
34         Vector ## name * allocVector ## name(uint capacity) {                 \
35                 Vector ## name * tmp = (Vector ## name *)ourmalloc(sizeof(Vector ## name));  \
36                 tmp->size = 0;                                                      \
37                 tmp->capacity = capacity;                                           \
38                 tmp->array = (type *) ourmalloc(sizeof(type) * capacity);                                               \
39                 return tmp;                                                         \
40         }                                                                     \
41         Vector ## name * allocVectorArray ## name(uint capacity, type * array)  { \
42                 Vector ## name * tmp = allocVector ## name(capacity);               \
43                 tmp->size=capacity;                                                                                                                                                                                                     \
44                 memcpy(tmp->array, array, capacity * sizeof(type));                                                                     \
45                 return tmp;                                                         \
46         }                                                                     \
47         void popVector ## name(Vector ## name *vector) {                                                                                        \
48                 vector->size--;                                                                                                                                                                                                                 \
49         }                                                                                                                                                                                                                                                                                       \
50         type lastVector ## name(Vector ## name *vector) {                                                                                       \
51                 return vector->array[vector->size-1];                                                                                                                           \
52         }                                                                                                                                                                                                                                                                                       \
53         void setSizeVector ## name(Vector ## name *vector, uint size) {                         \
54                 if (size <= vector->size) {                                                                                                                                                                     \
55                         vector->size=size;                                                                                                                                                                                              \
56                         return;                                                                                                                                                                                                                                         \
57                 } else if (size > vector->capacity) {                                                                                                                           \
58                         vector->array=(type *)ourrealloc(vector->array, size * sizeof(type));   \
59                         vector->capacity=size;                                                                                                                                                                          \
60                 }                                                                                                                                                                                                                                                                               \
61                 bzero(&vector->array[vector->size], (size-vector->size)*sizeof(type)); \
62                 vector->size=size;                                                                                                                                                                                                      \
63         }                                                                                                                                                                                                                                                                                       \
64         void pushVector ## name(Vector ## name *vector, type item) {                                    \
65                 if (vector->size >= vector->capacity) {                                                                                                                 \
66                         uint newcap=vector->capacity << 1;                                                                                                                              \
67                         vector->array=(type *)ourrealloc(vector->array, newcap * sizeof(type)); \
68                         vector->capacity=newcap;                                                                                                                                                                        \
69                 }                                                                   \
70                 vector->array[vector->size++] = item;                               \
71         }                                                                     \
72         type getVector ## name(Vector ## name * vector, uint index) {         \
73                 return vector->array[index];                                        \
74         }                                                                     \
75         void setVector ## name(Vector ## name * vector, uint index, type item) { \
76                 vector->array[index]=item;                                          \
77         }                                                                     \
78         uint getSizeVector ## name(Vector ## name *vector) {                  \
79                 return vector->size;                                                \
80         }                                                                     \
81         void deleteVector ## name(Vector ## name *vector) {                     \
82                 ourfree(vector->array);                                             \
83                 ourfree(vector);                                                    \
84         }                                                                     \
85         void clearVector ## name(Vector ## name *vector) {                     \
86                 vector->size=0;                                                     \
87         }                                                                     \
88         type * exposeArray ## name(Vector ## name * vector) {                 \
89                 return vector->array;                                               \
90         }                                                                                                                                                                                                                                                                                       \
91         void deleteVectorArray ## name(Vector ## name *vector) {                                                        \
92                 ourfree(vector->array);                                             \
93         }                                                                                                                                                                                                                                                                                       \
94         void allocInlineVector ## name(Vector ## name * vector, uint capacity) { \
95                 vector->size = 0;                                                      \
96                 vector->capacity = capacity;                                                                                                                                                                                    \
97                 vector->array = (type *) ourmalloc(sizeof(type) * capacity);                            \
98         }                                                                                                                                                                                                                                                                                       \
99         void allocInlineDefVector ## name(Vector ## name * vector) {                                    \
100                 allocInlineVector ## name(vector, defcap);                                                                                                      \
101         }                                                                                                                                                                                                                                                                                       \
102         void allocInlineVectorArray ## name(Vector ## name * vector, uint capacity, type * array) {     \
103                 allocInlineVector ##name(vector, capacity);                                                                                                     \
104                 vector->size=capacity;                                                                                                                                                                                  \
105                 memcpy(vector->array, array, capacity * sizeof(type));  \
106         }
107 #endif