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