Merge branch 'master' into brian
[satune.git] / src / Collections / array.h
1 #ifndef ARRAY_H
2 #define ARRAY_H
3
4 #define ArrayDef(name, type)                                                                                                                                                                            \
5         struct Array ## name {                                                                                                                                                                                          \
6                 type * array;                                                       \
7                 uint size;                                                                                                                                                                                                                                      \
8         };                                                                    \
9         typedef struct Array ## name Array ## name;                                                                                                             \
10         static inline Array ## name * allocArray ## name(uint size) {                                                           \
11                 Array ## name * tmp = (Array ## name *)ourmalloc(sizeof(type));                 \
12                 tmp->size = size;                                                                                                                                                                                                               \
13                 tmp->array = (type *) ourcalloc(1, sizeof(type) * size);                                                \
14                 return tmp;                                                         \
15         }                                                                     \
16         static inline Array ## name * allocArrayInit ## name(type * array, uint size)  { \
17                 Array ## name * tmp = allocArray ## name(size);                                                                                 \
18                 memcpy(tmp->array, array, size * sizeof(type));                                                                                 \
19                 return tmp;                                                         \
20         }                                                                     \
21         static inline type getArray ## name(Array ## name * This, uint index) {                 \
22                 return This->array[index];                                                                                                                                                                      \
23         }                                                                     \
24         static inline void setArray ## name(Array ## name * This, uint index, type item) {      \
25                 This->array[index]=item;                                                                                                                                                                                \
26         }                                                                     \
27         static inline uint getSizeArray ## name(Array ## name *This) {                                                          \
28                 return This->size;                                                                                                                                                                                                      \
29         }                                                                     \
30         static inline void deleteArray ## name(Array ## name *This) {                                                           \
31                 ourfree(This->array);                                                                                                                                                                                           \
32                 ourfree(This);                                                                                                                                                                                                                  \
33         }                                                                     \
34         static inline type * exposeCArray ## name(Array ## name * This) {                                                       \
35                 return This->array;                                                                                                                                                                                                     \
36         }                                                                                                                                                                                                                                                                                       \
37         static inline void deleteInlineArray ## name(Array ## name *This) {                                     \
38                 ourfree(This->array);                                                                                                                                                                                           \
39         }                                                                                                                                                                                                                                                                                       \
40         static inline void allocInlineArray ## name(Array ## name * This, uint size) {                  \
41                 This->size = size;                                                                                                                                                                                                      \
42                 This->array = (type *) ourcalloc(1, sizeof(type) * size);                                               \
43         }                                                                                                                                                                                                                                                                                       \
44         static inline void allocInlineArrayInit ## name(Array ## name * This, type *array, uint size) { \
45                 allocInlineArray ##name(This, size);                                                                                                                            \
46                 memcpy(This->array, array, size * sizeof(type));                                                                                \
47         }
48
49 #endif