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