cs_arrays_defs.h
1 /*
2  @copyright Russell Standish 2000-2013
3  @author Russell Standish
4  This file is part of EcoLab
5 
6  Open source licensed under the MIT license. See LICENSE for details.
7 */
8 
9 #define C_defs(name,type)\
10 void *new_##name(int s)\
11 {\
12  name *r;\
13  r=malloc(sizeof(*r));\
14  r->size=s;\
15  if (s==0) return;\
16  r->sh = (shape*) malloc(sizeof(*r->sh));\
17  allocate_shape(r->sh,1,s);\
18  r->list=palloc(*r->sh,sizeof(type));\
19  return r;\
20 }\
21 void delete_##name(name *x) \
22 {\
23  if (x==NULL) return;\
24  if (x->size!=0) \
25  {\
26  pfree(x->list); \
27  deallocate_shape(x->sh);\
28  free(x->sh);\
29  }\
30  free(x);\
31 }\
32 type get_##type(name *x,int i) {return [i](*x->list);}\
33 void put_##type(name *x,int i,type y) {[i](*x->list)=y;}\
34 void copy_##type(name *x,name *y) \
35 { \
36  if (x->size==0) return;\
37  with (*x->sh) *x->list=*y->list;\
38 }\
39 /* vector indexing */\
40 void get_##type##_array(name* r,name* x,iarray* i)\
41 {\
42  if (r->size==0) return;\
43  with (*r->sh)\
44  *r->list = [*i->list](*x->list);\
45 }\
46 void put_##type##_array(name* x,iarray* i,name* y)\
47 {\
48  if (y->size==0) return;\
49  with (*y->sh)\
50  [*i->list](*x->list) = *y->list;\
51 }\
52 void broadcast_##type(name* x,type y)\
53 {\
54  if (x->size==0) return;\
55  with(*x->sh)\
56  *x->list=y;\
57 }\
58 void name##_plus(name* r,name* x,name* y)\
59 {\
60  if (r->size==0) return;\
61  with (*r->sh)\
62  *r->list = *x->list + *y->list;\
63 }\
64 void name##_minus(name* r,name* x,name* y)\
65 {\
66  if (r->size==0) return;\
67  with (*r->sh)\
68  *r->list = *x->list - *y->list;\
69 }\
70 void name##_mul(name* r,name* x,name* y)\
71 {\
72  if (r->size==0) return;\
73  with (*r->sh)\
74  *r->list = *x->list * *y->list;\
75 }\
76 void name##_div(name* r,name* x,name* y)\
77 {\
78  if (r->size==0) return;\
79  with (*r->sh)\
80  *r->list = *x->list / *y->list;\
81 }\
82 void name##_cat(name* r,name* x,name* y)\
83 {\
84  if (x->size!=0) \
85  {\
86  with (*x->sh)\
87  [pcoord(0)]*r->list = *x->list;\
88  }\
89  if (y->size==0) return;\
90  with (*y->sh)\
91  [pcoord(0)+x->size]*r->list = *y->list;\
92 }\
93 void name##_lt(iarray *r, name *x,name*y)\
94 {\
95  if (r->size==0) return;\
96  with (*r->sh)\
97  *r->list = *x->list < *y->list;\
98 }\
99 void name##_le(iarray *r, name *x, name *y)\
100 {\
101  if (r->size==0) return;\
102  with (*r->sh)\
103  *r->list = *x->list <= *y->list;\
104 }\
105 void name##_gt(iarray *r, name *x,name *y)\
106 {\
107  if (r->size==0) return;\
108  with (*r->sh)\
109  *r->list = *x->list > *y->list;\
110 }\
111 void name##_ge(iarray *r, name *x,name *y)\
112 {\
113  if (r->size==0) return;\
114  with (*r->sh)\
115  *r->list = *x->list >= *y->list;\
116 }\
117 void name##_eq(iarray *r,name *x, name *y)\
118 {\
119  if (r->size==0) return;\
120  with (*r->sh)\
121  *r->list = *x->list == *y->list;\
122 }\
123 void name##_ne(iarray *r, name *x, name *y)\
124 {\
125  if (r->size==0) return;\
126  with (*r->sh)\
127  *r->list = *x->list != *y->list;\
128 }\
129 
130 C_defs(array,double)
131 C_defs(iarray,int)