Add array object to standardize arrays
[satune.git] / src / Collections / vector.h
1 #ifndef VECTOR_H
2 #define VECTOR_H
3 #include <string.h>
4
5 #define VectorDef(name, type, defcap)                                   \
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 getVector ## name(Vector ## name *vector, uint index);           \
17         void setVector ## name(Vector ## name *vector, uint index, type item); \
18         uint getSizeVector ## name(Vector ## name *vector);                   \
19         void deleteVector ## name(Vector ## name *vector);                    \
20         void clearVector ## name(Vector ## name *vector);                     \
21         void deleteVectorArray ## name(Vector ## name *vector);                                                         \
22         type * exposeArray ## name(Vector ## name * vector);                                                                    \
23         void allocInlineVector ## name(Vector ## name * vector, uint capacity); \
24         void allocInlineDefVector ## name(Vector ## name * vector);                                             \
25         void allocInlineVectorArray ## name(Vector ## name * vector, uint capacity, type * array);
26
27 #define VectorImpl(name, type, defcap)                                  \
28         Vector ## name * allocDefVector ## name() {                           \
29                 return allocVector ## name(defcap);                                 \
30         }                                                                     \
31         Vector ## name * allocVector ## name(uint capacity) {                 \
32                 Vector ## name * tmp = (Vector ## name *)ourmalloc(sizeof(type));  \
33                 tmp->size = 0;                                                      \
34                 tmp->capacity = capacity;                                           \
35                 tmp->array = (type *) ourcalloc(1, sizeof(type) * capacity);          \
36                 return tmp;                                                         \
37         }                                                                     \
38         Vector ## name * allocVectorArray ## name(uint capacity, type * array)  { \
39                 Vector ## name * tmp = allocVector ## name(capacity);               \
40                 tmp->size=capacity;                                                                                                                                                                                                     \
41                 memcpy(tmp->array, array, capacity * sizeof(type));                                                                     \
42                 return tmp;                                                         \
43         }                                                                     \
44         void pushVector ## name(Vector ## name *vector, type item) {          \
45                 if (vector->size >= vector->capacity) {                             \
46                         uint newcap=vector->capacity * 2;                                 \
47                         vector->array=(type *)ourrealloc(vector->array, newcap);          \
48                 }                                                                   \
49                 vector->array[vector->size++] = item;                               \
50         }                                                                     \
51         type getVector ## name(Vector ## name * vector, uint index) {         \
52                 return vector->array[index];                                        \
53         }                                                                     \
54         void setVector ## name(Vector ## name * vector, uint index, type item) { \
55                 vector->array[index]=item;                                          \
56         }                                                                     \
57         uint getSizeVector ## name(Vector ## name *vector) {                  \
58                 return vector->size;                                                \
59         }                                                                     \
60         void deleteVector ## name(Vector ## name *vector) {                     \
61                 ourfree(vector->array);                                             \
62                 ourfree(vector);                                                    \
63         }                                                                     \
64         void clearVector ## name(Vector ## name *vector) {                     \
65                 vector->size=0;                                                     \
66         }                                                                     \
67         type * exposeArray ## name(Vector ## name * vector) {                 \
68                 return vector->array;                                               \
69         }                                                                                                                                                                                                                                                                                       \
70         void deleteVectorArray ## name(Vector ## name *vector) {                                                        \
71                 ourfree(vector->array);                                             \
72         }                                                                                                                                                                                                                                                                                       \
73         void allocInlineVector ## name(Vector ## name * vector, uint capacity) { \
74                 vector->size = 0;                                                      \
75                 vector->capacity = capacity;                                                                                                                                                                                    \
76                 vector->array = (type *) ourcalloc(1, sizeof(type) * capacity);                 \
77         }                                                                                                                                                                                                                                                                                       \
78         void allocInlineDefVector ## name(Vector ## name * vector) {                                    \
79                 allocInlineVector ## name(vector, defcap);                                                                                                      \
80         }                                                                                                                                                                                                                                                                                       \
81         void allocInlineVectorArray ## name(Vector ## name * vector, uint capacity, type * array) {     \
82                 allocInlineVector ##name(vector, capacity);                                                                                                     \
83                 vector->size=capacity;                                                                                                                                                                                  \
84                 memcpy(vector->array, array, capacity * sizeof(type));  \
85         }
86 #endif