1 #ifndef ML_ARRAY_H
2 #define ML_ARRAY_H
3 
4 #include "minilang.h"
5 
6 #ifdef	__cplusplus
7 extern "C" {
8 #endif
9 
10 typedef struct {
11 	int Size, Stride;
12 	int *Indices;
13 } ml_array_dimension_t;
14 
15 typedef enum {
16 	ML_ARRAY_FORMAT_NONE,
17 	ML_ARRAY_FORMAT_I8, ML_ARRAY_FORMAT_U8,
18 	ML_ARRAY_FORMAT_I16, ML_ARRAY_FORMAT_U16,
19 	ML_ARRAY_FORMAT_I32, ML_ARRAY_FORMAT_U32,
20 	ML_ARRAY_FORMAT_I64, ML_ARRAY_FORMAT_U64,
21 	ML_ARRAY_FORMAT_F32, ML_ARRAY_FORMAT_F64,
22 #ifdef ML_COMPLEX
23 	ML_ARRAY_FORMAT_C32, ML_ARRAY_FORMAT_C64,
24 #endif
25 	ML_ARRAY_FORMAT_ANY
26 } ml_array_format_t;
27 
28 extern size_t MLArraySizes[];
29 
30 typedef struct {
31 	ml_buffer_t Base;
32 	int Degree;
33 	ml_array_format_t Format;
34 	ml_array_dimension_t Dimensions[];
35 } ml_array_t;
36 
37 extern ml_type_t MLArrayT[];
38 
39 void ml_array_init(stringmap_t *Globals);
40 
41 ml_array_t *ml_array_new(ml_array_format_t Format, int Degree);
42 ml_array_t *ml_array(ml_array_format_t Format, int Degree, ...);
43 int ml_array_degree(ml_value_t *Array);
44 int ml_array_size(ml_value_t *Array, int Dim);
45 ml_value_t *ml_array_index(ml_array_t *Array, int Count, ml_value_t **Indices);
46 
47 #define ML_ARRAY_ACCESSORS(CTYPE) \
48 CTYPE ml_array_get_ ## CTYPE (ml_array_t *Array, ...); \
49 void ml_array_set_ ## CTYPE (CTYPE Value, ml_array_t *Array, ...)
50 
51 ML_ARRAY_ACCESSORS(int8_t);
52 ML_ARRAY_ACCESSORS(uint8_t);
53 ML_ARRAY_ACCESSORS(int16_t);
54 ML_ARRAY_ACCESSORS(uint16_t);
55 ML_ARRAY_ACCESSORS(int32_t);
56 ML_ARRAY_ACCESSORS(uint32_t);
57 ML_ARRAY_ACCESSORS(int64_t);
58 ML_ARRAY_ACCESSORS(uint64_t);
59 ML_ARRAY_ACCESSORS(float);
60 ML_ARRAY_ACCESSORS(double);
61 
62 #ifdef ML_COMPLEX
63 
64 typedef complex float complex_float;
65 typedef complex double complex_double;
66 
67 ML_ARRAY_ACCESSORS(complex_float);
68 ML_ARRAY_ACCESSORS(complex_double);
69 
70 #endif
71 
72 #ifdef	__cplusplus
73 }
74 #endif
75 
76 #endif
77