1 #ifndef ISL_MULTI_H
2 #define ISL_MULTI_H
3 
4 #include <isl/val_type.h>
5 #include <isl/space_type.h>
6 #include <isl/list.h>
7 #include <isl/set_type.h>
8 
9 #if defined(__cplusplus)
10 extern "C" {
11 #endif
12 
13 #define ISL_DECLARE_MULTI(BASE)						\
14 isl_ctx *isl_multi_##BASE##_get_ctx(					\
15 	__isl_keep isl_multi_##BASE *multi);				\
16 __isl_export								\
17 __isl_give isl_space *isl_multi_##BASE##_get_space(			\
18 	__isl_keep isl_multi_##BASE *multi);				\
19 __isl_give isl_space *isl_multi_##BASE##_get_domain_space(		\
20 	__isl_keep isl_multi_##BASE *multi);				\
21 __isl_export								\
22 __isl_give isl_##BASE##_list *isl_multi_##BASE##_get_list(		\
23 	__isl_keep isl_multi_##BASE *multi);				\
24 __isl_constructor							\
25 __isl_give isl_multi_##BASE *isl_multi_##BASE##_from_##BASE##_list(	\
26 	__isl_take isl_space *space, __isl_take isl_##BASE##_list *list); \
27 __isl_export								\
28 __isl_give isl_multi_##BASE *isl_space_multi_##BASE(			\
29 	__isl_take isl_space *space, __isl_take isl_##BASE##_list *list); \
30 __isl_give isl_multi_##BASE *isl_multi_##BASE##_copy(			\
31 	__isl_keep isl_multi_##BASE *multi);				\
32 __isl_null isl_multi_##BASE *isl_multi_##BASE##_free(			\
33 	__isl_take isl_multi_##BASE *multi);				\
34 __isl_export								\
35 isl_bool isl_multi_##BASE##_plain_is_equal(				\
36 	__isl_keep isl_multi_##BASE *multi1,				\
37 	__isl_keep isl_multi_##BASE *multi2);				\
38 __isl_give isl_multi_##BASE *isl_multi_##BASE##_reset_user(		\
39 	__isl_take isl_multi_##BASE *multi);				\
40 __isl_export								\
41 isl_size isl_multi_##BASE##_size(__isl_keep isl_multi_##BASE *multi);	\
42 __isl_export								\
43 __isl_give isl_##BASE *isl_multi_##BASE##_get_at(			\
44 	__isl_keep isl_multi_##BASE *multi, int pos);			\
45 __isl_give isl_##BASE *isl_multi_##BASE##_get_##BASE(			\
46 	__isl_keep isl_multi_##BASE *multi, int pos);			\
47 __isl_export								\
48 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_at(			\
49 	__isl_take isl_multi_##BASE *multi, int pos,			\
50 	__isl_take isl_##BASE *el);					\
51 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_##BASE(		\
52 	__isl_take isl_multi_##BASE *multi, int pos,			\
53 	__isl_take isl_##BASE *el);					\
54 __isl_give isl_multi_##BASE *isl_multi_##BASE##_range_splice(		\
55 	__isl_take isl_multi_##BASE *multi1, unsigned pos,		\
56 	__isl_take isl_multi_##BASE *multi2);				\
57 __isl_give isl_multi_##BASE *isl_multi_##BASE##_flatten_range(		\
58 	__isl_take isl_multi_##BASE *multi);				\
59 __isl_export								\
60 __isl_give isl_multi_##BASE *isl_multi_##BASE##_flat_range_product(	\
61 	__isl_take isl_multi_##BASE *multi1,				\
62 	__isl_take isl_multi_##BASE *multi2);				\
63 __isl_export								\
64 __isl_give isl_multi_##BASE *isl_multi_##BASE##_range_product(		\
65 	__isl_take isl_multi_##BASE *multi1,				\
66 	__isl_take isl_multi_##BASE *multi2);				\
67 __isl_give isl_multi_##BASE *isl_multi_##BASE##_factor_range(		\
68 	__isl_take isl_multi_##BASE *multi);				\
69 isl_bool isl_multi_##BASE##_range_is_wrapping(				\
70 	__isl_keep isl_multi_##BASE *multi);				\
71 __isl_give isl_multi_##BASE *isl_multi_##BASE##_range_factor_domain(	\
72 	__isl_take isl_multi_##BASE *multi);				\
73 __isl_give isl_multi_##BASE *isl_multi_##BASE##_range_factor_range(	\
74 	__isl_take isl_multi_##BASE *multi);				\
75 __isl_give isl_multi_##BASE *isl_multi_##BASE##_align_params(		\
76 	__isl_take isl_multi_##BASE *multi,				\
77 	__isl_take isl_space *model);					\
78 __isl_give isl_multi_##BASE *isl_multi_##BASE##_from_range(		\
79 	__isl_take isl_multi_##BASE *multi);
80 
81 #define ISL_DECLARE_MULTI_IDENTITY(BASE)				\
82 __isl_overload								\
83 __isl_give isl_multi_##BASE *isl_multi_##BASE##_identity_multi_##BASE(	\
84 	__isl_take isl_multi_##BASE *multi);				\
85 __isl_give isl_multi_##BASE *isl_multi_##BASE##_identity(		\
86 	__isl_take isl_space *space);					\
87 __isl_overload								\
88 __isl_give isl_multi_##BASE *						\
89 isl_multi_##BASE##_identity_on_domain_space(				\
90 	__isl_take isl_space *space);					\
91 __isl_export								\
92 __isl_give isl_multi_##BASE *						\
93 isl_space_identity_multi_##BASE##_on_domain(				\
94 	__isl_take isl_space *space);
95 
96 #define ISL_DECLARE_MULTI_CMP(BASE)					\
97 int isl_multi_##BASE##_plain_cmp(__isl_keep isl_multi_##BASE *multi1,	\
98 	__isl_keep isl_multi_##BASE *multi2);
99 
100 #define ISL_DECLARE_MULTI_ARITH(BASE)					\
101 __isl_overload								\
102 __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_val(		\
103 	__isl_take isl_multi_##BASE *multi, __isl_take isl_val *v);	\
104 __isl_overload								\
105 __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_down_val(		\
106 	__isl_take isl_multi_##BASE *multi, __isl_take isl_val *v);	\
107 __isl_overload								\
108 __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_multi_val(	\
109 	__isl_take isl_multi_##BASE *multi,				\
110 	__isl_take isl_multi_val *mv);					\
111 __isl_overload								\
112 __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_down_multi_val(	\
113 	__isl_take isl_multi_##BASE *multi,				\
114 	__isl_take isl_multi_val *mv);					\
115 __isl_give isl_multi_##BASE *isl_multi_##BASE##_mod_multi_val(		\
116 	__isl_take isl_multi_##BASE *multi,				\
117 	__isl_take isl_multi_val *mv);					\
118 __isl_export								\
119 __isl_give isl_multi_##BASE *isl_multi_##BASE##_add(			\
120 	__isl_take isl_multi_##BASE *multi1,				\
121 	__isl_take isl_multi_##BASE *multi2);				\
122 __isl_export								\
123 __isl_give isl_multi_##BASE *isl_multi_##BASE##_sub(			\
124 	__isl_take isl_multi_##BASE *multi1,				\
125 	__isl_take isl_multi_##BASE *multi2);				\
126 __isl_export								\
127 __isl_give isl_multi_##BASE *isl_multi_##BASE##_neg(		 	\
128 	__isl_take isl_multi_##BASE *multi);
129 
130 #define ISL_DECLARE_MULTI_MIN_MAX(BASE)					\
131 __isl_export								\
132 __isl_give isl_multi_##BASE *isl_multi_##BASE##_min(			\
133 	__isl_take isl_multi_##BASE *multi1,				\
134 	__isl_take isl_multi_##BASE *multi2);				\
135 __isl_export								\
136 __isl_give isl_multi_##BASE *isl_multi_##BASE##_max(			\
137 	__isl_take isl_multi_##BASE *multi1,				\
138 	__isl_take isl_multi_##BASE *multi2);
139 
140 #define ISL_DECLARE_MULTI_ADD_CONSTANT(BASE)				\
141 __isl_overload								\
142 __isl_give isl_multi_##BASE *isl_multi_##BASE##_add_constant_val(	\
143 	__isl_take isl_multi_##BASE *mpa, __isl_take isl_val *v);	\
144 __isl_overload								\
145 __isl_give isl_multi_##BASE *isl_multi_##BASE##_add_constant_multi_val(	\
146 	__isl_take isl_multi_##BASE *mpa, __isl_take isl_multi_val *mv);
147 
148 #define ISL_DECLARE_MULTI_ZERO(BASE)					\
149 __isl_export								\
150 __isl_give isl_multi_##BASE *isl_multi_##BASE##_zero(			\
151 	__isl_take isl_space *space);					\
152 __isl_export								\
153 __isl_give isl_multi_##BASE *isl_space_zero_multi_##BASE(		\
154 	__isl_take isl_space *space);
155 
156 #define ISL_DECLARE_MULTI_NAN(BASE)					\
157 __isl_export								\
158 isl_bool isl_multi_##BASE##_involves_nan(				\
159 	__isl_keep isl_multi_##BASE *multi);
160 
161 #define ISL_DECLARE_MULTI_DROP_DIMS(BASE)				\
162 isl_size isl_multi_##BASE##_dim(__isl_keep isl_multi_##BASE *multi,	\
163 	enum isl_dim_type type);					\
164 __isl_give isl_multi_##BASE *isl_multi_##BASE##_drop_dims(		\
165 	__isl_take isl_multi_##BASE *multi, enum isl_dim_type type,	\
166 	unsigned first, unsigned n);
167 #define ISL_DECLARE_MULTI_DIMS(BASE)					\
168 ISL_DECLARE_MULTI_DROP_DIMS(BASE)					\
169 isl_bool isl_multi_##BASE##_involves_dims(				\
170 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type,	\
171 	unsigned first, unsigned n);					\
172 __isl_give isl_multi_##BASE *isl_multi_##BASE##_insert_dims(		\
173 	__isl_take isl_multi_##BASE *multi, enum isl_dim_type type,	\
174 	unsigned first, unsigned n);					\
175 __isl_give isl_multi_##BASE *isl_multi_##BASE##_add_dims(		\
176 	__isl_take isl_multi_##BASE *multi, enum isl_dim_type type,	\
177 	unsigned n);							\
178 __isl_give isl_multi_##BASE *						\
179 isl_multi_##BASE##_project_domain_on_params(				\
180 	__isl_take isl_multi_##BASE *multi);
181 
182 #define ISL_DECLARE_MULTI_INSERT_DOMAIN(BASE)				\
183 __isl_export								\
184 __isl_give isl_multi_##BASE *						\
185 isl_multi_##BASE##_insert_domain(__isl_take isl_multi_##BASE *multi,	\
186 	__isl_take isl_space *domain);
187 
188 #define ISL_DECLARE_MULTI_LOCALS(BASE)					\
189 __isl_export								\
190 isl_bool isl_multi_##BASE##_involves_locals(				\
191 	__isl_keep isl_multi_##BASE *multi);
192 
193 #define ISL_DECLARE_MULTI_DIM_ID(BASE)					\
194 int isl_multi_##BASE##_find_dim_by_name(				\
195 	__isl_keep isl_multi_##BASE *multi,				\
196 	enum isl_dim_type type, const char *name);			\
197 int isl_multi_##BASE##_find_dim_by_id(					\
198 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type,	\
199 	__isl_keep isl_id *id);						\
200 __isl_give isl_id *isl_multi_##BASE##_get_dim_id(			\
201 	__isl_keep isl_multi_##BASE *multi,				\
202 	enum isl_dim_type type, unsigned pos);				\
203 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_dim_name(		\
204 	__isl_take isl_multi_##BASE *multi,				\
205 	enum isl_dim_type type, unsigned pos, const char *s);		\
206 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_dim_id(		\
207 	__isl_take isl_multi_##BASE *multi,				\
208 	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
209 
210 #define ISL_DECLARE_MULTI_TUPLE_ID(BASE)				\
211 const char *isl_multi_##BASE##_get_tuple_name(				\
212 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);	\
213 __isl_export								\
214 isl_bool isl_multi_##BASE##_has_range_tuple_id(				\
215 	__isl_keep isl_multi_##BASE *multi);				\
216 isl_bool isl_multi_##BASE##_has_tuple_id(				\
217 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);	\
218 __isl_export								\
219 __isl_give isl_id *isl_multi_##BASE##_get_range_tuple_id(		\
220 	__isl_keep isl_multi_##BASE *multi);				\
221 __isl_give isl_id *isl_multi_##BASE##_get_tuple_id(			\
222 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);	\
223 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_tuple_name(		\
224 	__isl_take isl_multi_##BASE *multi,				\
225 	enum isl_dim_type type, const char *s);				\
226 __isl_overload								\
227 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_range_tuple_id(	\
228 	__isl_take isl_multi_##BASE *multi,  __isl_take isl_id *id);	\
229 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_tuple_id(		\
230 	__isl_take isl_multi_##BASE *multi,				\
231 	enum isl_dim_type type, __isl_take isl_id *id);			\
232 __isl_export								\
233 __isl_give isl_multi_##BASE *isl_multi_##BASE##_reset_range_tuple_id(	\
234 	__isl_take isl_multi_##BASE *multi);				\
235 __isl_give isl_multi_##BASE *isl_multi_##BASE##_reset_tuple_id(		\
236 	__isl_take isl_multi_##BASE *multi, enum isl_dim_type type);
237 
238 #define ISL_DECLARE_MULTI_WITH_DOMAIN(BASE)				\
239 __isl_export								\
240 __isl_give isl_multi_##BASE *isl_multi_##BASE##_product(		\
241 	__isl_take isl_multi_##BASE *multi1,				\
242 	__isl_take isl_multi_##BASE *multi2);				\
243 __isl_give isl_multi_##BASE *isl_multi_##BASE##_splice(			\
244 	__isl_take isl_multi_##BASE *multi1, unsigned in_pos,		\
245 	unsigned out_pos, __isl_take isl_multi_##BASE *multi2);
246 
247 #define ISL_DECLARE_MULTI_BIND_DOMAIN(BASE)				\
248 __isl_export								\
249 __isl_give isl_multi_##BASE *isl_multi_##BASE##_bind_domain(		\
250 	__isl_take isl_multi_##BASE *multi,				\
251 	__isl_take isl_multi_id *tuple);				\
252 __isl_export								\
253 __isl_give isl_multi_##BASE *						\
254 isl_multi_##BASE##_bind_domain_wrapped_domain(				\
255 	__isl_take isl_multi_##BASE *multi,				\
256 	__isl_take isl_multi_id *tuple);
257 
258 #define ISL_DECLARE_MULTI_UNBIND_PARAMS(BASE)				\
259 __isl_export								\
260 __isl_give isl_multi_##BASE *						\
261 isl_multi_##BASE##_unbind_params_insert_domain(				\
262 	__isl_take isl_multi_##BASE *multi,				\
263 	__isl_take isl_multi_id *domain);
264 
265 #define ISL_DECLARE_MULTI_PARAM(BASE)					\
266 __isl_overload								\
267 isl_bool isl_multi_##BASE##_involves_param_id(				\
268 	__isl_keep isl_multi_##BASE *multi, __isl_keep isl_id *id);	\
269 __isl_overload								\
270 isl_bool isl_multi_##BASE##_involves_param_id_list(			\
271 	__isl_keep isl_multi_##BASE *multi,				\
272 	__isl_keep isl_id_list *list);
273 
274 #if defined(__cplusplus)
275 }
276 #endif
277 
278 #endif
279