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