d0841587608bfb792a2d0b412499e9138938c801
[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         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         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         inline type getArray ## name(Array ## name * This, uint index) {                        \
22                 return This->array[index];                                                                                                                                                                      \
23         }                                                                     \
24         inline void setArray ## name(Array ## name * This, uint index, type item) {     \
25                 This->array[index]=item;                                                                                                                                                                                \
26         }                                                                     \
27         inline uint getSizeArray ## name(Array ## name *This) {                                                         \
28                 return This->size;                                                                                                                                                                                                      \
29         }                                                                     \
30         inline void deleteArray ## name(Array ## name *This) {                                                          \
31                 ourfree(This->array);                                                                                                                                                                                           \
32                 ourfree(This);                                                                                                                                                                                                                  \
33         }                                                                     \
34         inline type * exposeCArray ## name(Array ## name * This) {                                                      \
35                 return This->array;                                                                                                                                                                                                     \
36         }                                                                                                                                                                                                                                                                                       \
37         inline void deleteInlineArray ## name(Array ## name *This) {                                    \
38                 ourfree(This->array);                                                                                                                                                                                           \
39         }                                                                                                                                                                                                                                                                                       \
40         inline void allocInlineArray ## name(Array ## name * This, uint size) {                 \
41                 This->size = size;                                                                                                                                                                                                      \
42                 This->array = (type *) ourcalloc(1, sizeof(type) * size);                                               \
43         }                                                                                                                                                                                                                                                                                       \
44         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