1/// These are automatically generated templated C++ bindings for isl.
2///
3/// isl is a library for computing with integer sets and maps described by
4/// Presburger formulas. On top of this, isl provides various tools for
5/// polyhedral compilation, ranging from dependence analysis over scheduling
6/// to AST generation.
7
8#ifndef ISL_TYPED_CPP
9#define ISL_TYPED_CPP
10
11#include <type_traits>
12
13#include <isl/cpp.h>
14
15namespace isl {
16namespace typed {
17
18template <typename Domain, typename Range>
19struct pair {};
20
21struct Anonymous;
22
23
24template <typename...>
25struct aff;
26
27template <typename...Ts>
28using aff_on = aff<Ts..., Anonymous>;
29
30template <typename...>
31struct aff_list;
32
33template <typename...Ts>
34using aff_list_on = aff_list<Ts..., Anonymous>;
35
36template <typename...>
37struct basic_map;
38
39template <typename...>
40struct basic_set;
41
42template <typename...>
43struct fixed_box;
44
45template <typename...>
46struct id;
47
48template <typename...>
49struct id_list;
50
51template <typename...>
52struct map;
53
54template <typename...>
55struct map_list;
56
57template <typename...>
58struct multi_aff;
59
60template <typename...>
61struct multi_id;
62
63template <typename...>
64struct multi_pw_aff;
65
66template <typename...>
67struct multi_union_pw_aff;
68
69template <typename...>
70struct multi_val;
71
72template <typename...>
73struct point;
74
75template <typename...>
76struct pw_aff;
77
78template <typename...Ts>
79using pw_aff_on = pw_aff<Ts..., Anonymous>;
80
81template <typename...>
82struct pw_aff_list;
83
84template <typename...Ts>
85using pw_aff_list_on = pw_aff_list<Ts..., Anonymous>;
86
87template <typename...>
88struct pw_multi_aff;
89
90template <typename...>
91struct pw_multi_aff_list;
92
93template <typename...>
94struct set;
95
96template <typename...>
97struct set_list;
98
99template <typename...>
100struct space;
101
102template <typename...>
103struct union_map;
104
105template <typename...>
106struct union_pw_aff;
107
108template <typename...Ts>
109using union_pw_aff_on = union_pw_aff<Ts..., Anonymous>;
110
111template <typename...>
112struct union_pw_aff_list;
113
114template <typename...Ts>
115using union_pw_aff_list_on = union_pw_aff_list<Ts..., Anonymous>;
116
117template <typename...>
118struct union_pw_multi_aff;
119
120template <typename...>
121struct union_set;
122
123template <typename...>
124struct union_set_list;
125
126template <typename...>
127struct val;
128
129template <typename...>
130struct val_list;
131
132template <>
133struct aff<Anonymous> : public isl::aff {
134  template <typename...>
135  friend struct aff;
136  template <typename...>
137  friend struct aff_list;
138  template <typename...>
139  friend struct basic_map;
140  template <typename...>
141  friend struct basic_set;
142  template <typename...>
143  friend struct fixed_box;
144  template <typename...>
145  friend struct id;
146  template <typename...>
147  friend struct id_list;
148  template <typename...>
149  friend struct map;
150  template <typename...>
151  friend struct map_list;
152  template <typename...>
153  friend struct multi_aff;
154  template <typename...>
155  friend struct multi_id;
156  template <typename...>
157  friend struct multi_pw_aff;
158  template <typename...>
159  friend struct multi_union_pw_aff;
160  template <typename...>
161  friend struct multi_val;
162  template <typename...>
163  friend struct point;
164  template <typename...>
165  friend struct pw_aff;
166  template <typename...>
167  friend struct pw_aff_list;
168  template <typename...>
169  friend struct pw_multi_aff;
170  template <typename...>
171  friend struct pw_multi_aff_list;
172  template <typename...>
173  friend struct set;
174  template <typename...>
175  friend struct set_list;
176  template <typename...>
177  friend struct space;
178  template <typename...>
179  friend struct union_map;
180  template <typename...>
181  friend struct union_pw_aff;
182  template <typename...>
183  friend struct union_pw_aff_list;
184  template <typename...>
185  friend struct union_pw_multi_aff;
186  template <typename...>
187  friend struct union_set;
188  template <typename...>
189  friend struct union_set_list;
190  template <typename...>
191  friend struct val;
192  template <typename...>
193  friend struct val_list;
194
195  aff() = default;
196  aff(const isl::aff &obj) : isl::aff(obj) {}
197  static aff from(const isl::aff &obj) {
198    return aff(obj);
199  }
200  inline explicit aff(const isl::ctx &ctx, const std::string &str);
201  inline typed::aff<Anonymous> add(const typed::aff<Anonymous> &aff2) const;
202  inline typed::multi_aff<Anonymous> add(const typed::multi_aff<Anonymous> &multi2) const;
203  inline typed::multi_pw_aff<Anonymous> add(const typed::multi_pw_aff<Anonymous> &multi2) const;
204  inline typed::multi_union_pw_aff<Anonymous> add(const typed::multi_union_pw_aff<Anonymous> &multi2) const;
205  inline typed::pw_aff<Anonymous> add(const typed::pw_aff<Anonymous> &pwaff2) const;
206  inline typed::pw_multi_aff<Anonymous> add(const typed::pw_multi_aff<Anonymous> &pma2) const;
207  inline typed::union_pw_aff<Anonymous> add(const typed::union_pw_aff<Anonymous> &upa2) const;
208  inline typed::union_pw_multi_aff<Anonymous> add(const typed::union_pw_multi_aff<Anonymous> &upma2) const;
209  inline typed::aff<Anonymous> add_constant(const typed::val<Anonymous> &v) const;
210  inline typed::aff<Anonymous> add_constant(long v) const;
211  inline typed::multi_aff<Anonymous> add_constant(const typed::multi_val<Anonymous> &mv) const;
212  template <typename Range>
213  inline typed::union_pw_multi_aff<Range> apply(const typed::union_pw_multi_aff<Anonymous, Range> &upma2) const;
214  inline typed::aff<Anonymous> as_aff() const;
215  inline typed::map<Anonymous> as_map() const = delete;
216  inline typed::multi_aff<Anonymous> as_multi_aff() const;
217  inline typed::multi_union_pw_aff<Anonymous> as_multi_union_pw_aff() const;
218  inline typed::pw_multi_aff<Anonymous> as_pw_multi_aff() const;
219  inline typed::set<Anonymous> as_set() const;
220  inline typed::union_map<Anonymous> as_union_map() const = delete;
221  inline typed::aff<Anonymous> at(int pos) const;
222  inline typed::basic_set<> bind(const typed::id<Anonymous> &id) const;
223  inline typed::basic_set<> bind(const std::string &id) const;
224  inline typed::basic_set<> bind(const typed::multi_id<Anonymous> &tuple) const;
225  inline typed::pw_aff<Anonymous> bind_domain(const typed::multi_id<> &tuple) const = delete;
226  inline typed::pw_aff<Anonymous> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
227  inline typed::aff<Anonymous> ceil() const;
228  inline typed::pw_aff<Anonymous> coalesce() const;
229  inline typed::pw_aff<Anonymous> cond(const typed::pw_aff<Anonymous> &pwaff_true, const typed::pw_aff<Anonymous> &pwaff_false) const;
230  inline typed::multi_val<Anonymous> constant_multi_val() const;
231  inline typed::val<Anonymous> constant_val() const;
232  inline typed::val<Anonymous> get_constant_val() const = delete;
233  inline typed::set<> domain() const;
234  inline typed::aff<Anonymous> domain_reverse() const = delete;
235  inline typed::pw_aff<Anonymous> drop_unused_params() const;
236  inline typed::pw_multi_aff<Anonymous> extract_pw_multi_aff(const typed::space<Anonymous> &space) const;
237  inline typed::aff<Anonymous> floor() const;
238  inline typed::set<Anonymous> ge_set(const typed::aff<> &aff2) const = delete;
239  inline typed::set<Anonymous> ge_set(const typed::pw_aff<> &pwaff2) const = delete;
240  inline typed::aff<Anonymous> gist(const typed::set<> &context) const;
241  inline typed::union_pw_aff<Anonymous> gist(const typed::union_set<> &context) const;
242  inline typed::aff<Anonymous> gist(const typed::basic_set<> &context) const;
243  inline typed::aff<Anonymous> gist(const typed::point<> &context) const;
244  inline typed::aff<Anonymous> gist_params(const typed::set<> &context) const;
245  inline typed::aff<Anonymous> gist_params(const typed::basic_set<> &context) const;
246  inline typed::aff<Anonymous> gist_params(const typed::point<> &context) const;
247  inline typed::set<Anonymous> gt_set(const typed::aff<> &aff2) const = delete;
248  inline typed::set<Anonymous> gt_set(const typed::pw_aff<> &pwaff2) const = delete;
249  inline typed::multi_aff<Anonymous, Anonymous> identity() const;
250  template <typename Domain>
251  inline typed::pw_aff<Domain, Anonymous> insert_domain(const typed::space<Domain> &domain) const;
252  inline typed::pw_aff<Anonymous> intersect_domain(const typed::set<> &set) const = delete;
253  inline typed::union_pw_aff<Anonymous> intersect_domain(const typed::space<> &space) const = delete;
254  inline typed::union_pw_aff<Anonymous> intersect_domain(const typed::union_set<> &uset) const = delete;
255  inline typed::union_pw_aff<Anonymous> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
256  inline typed::pw_aff<Anonymous> intersect_params(const typed::set<> &set) const;
257  inline typed::set<Anonymous> le_set(const typed::aff<> &aff2) const = delete;
258  inline typed::set<Anonymous> le_set(const typed::pw_aff<> &pwaff2) const = delete;
259  inline typed::aff_list<Anonymous> list() const;
260  inline typed::set<Anonymous> lt_set(const typed::aff<> &aff2) const = delete;
261  inline typed::set<Anonymous> lt_set(const typed::pw_aff<> &pwaff2) const = delete;
262  inline typed::multi_pw_aff<Anonymous> max(const typed::multi_pw_aff<Anonymous> &multi2) const;
263  inline typed::pw_aff<Anonymous> max(const typed::pw_aff<Anonymous> &pwaff2) const;
264  inline typed::multi_val<Anonymous> max_multi_val() const;
265  inline typed::val<Anonymous> max_val() const;
266  inline typed::multi_pw_aff<Anonymous> min(const typed::multi_pw_aff<Anonymous> &multi2) const;
267  inline typed::pw_aff<Anonymous> min(const typed::pw_aff<Anonymous> &pwaff2) const;
268  inline typed::multi_val<Anonymous> min_multi_val() const;
269  inline typed::val<Anonymous> min_val() const;
270  inline typed::aff<Anonymous> mod(const typed::val<Anonymous> &mod) const;
271  inline typed::aff<Anonymous> mod(long mod) const;
272  inline typed::aff<Anonymous> neg() const;
273  inline typed::set<> params() const;
274  inline typed::pw_multi_aff<Anonymous> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
275  inline typed::union_pw_multi_aff<Anonymous> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
276  template <typename Range>
277  inline typed::multi_aff<pair<Anonymous, Range>> product(const typed::multi_aff<Range> &multi2) const;
278  template <typename Range>
279  inline typed::multi_pw_aff<pair<Anonymous, Range>> product(const typed::multi_pw_aff<Range> &multi2) const;
280  template <typename Range>
281  inline typed::pw_multi_aff<pair<Anonymous, Range>> product(const typed::pw_multi_aff<Range> &pma2) const;
282  inline typed::aff<Anonymous> pullback(const typed::multi_aff<> &ma) const = delete;
283  inline typed::pw_aff<Anonymous> pullback(const typed::multi_pw_aff<> &mpa) const = delete;
284  inline typed::pw_aff<Anonymous> pullback(const typed::pw_multi_aff<> &pma) const = delete;
285  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_multi_aff<> &upma) const = delete;
286  inline typed::aff<Anonymous> pullback(const typed::aff<> &ma) const = delete;
287  inline typed::pw_multi_aff_list<Anonymous> pw_multi_aff_list() const;
288  inline typed::pw_multi_aff<Anonymous> range_factor_domain() const = delete;
289  inline typed::pw_multi_aff<Anonymous> range_factor_range() const = delete;
290  inline typed::multi_aff<Anonymous> range_product(const typed::multi_aff<> &multi2) const = delete;
291  inline typed::multi_pw_aff<Anonymous> range_product(const typed::multi_pw_aff<> &multi2) const = delete;
292  inline typed::multi_union_pw_aff<Anonymous> range_product(const typed::multi_union_pw_aff<> &multi2) const = delete;
293  inline typed::pw_multi_aff<Anonymous> range_product(const typed::pw_multi_aff<> &pma2) const = delete;
294  inline typed::union_pw_multi_aff<Anonymous> range_product(const typed::union_pw_multi_aff<> &upma2) const = delete;
295  inline typed::aff<Anonymous> scale(const typed::val<Anonymous> &v) const;
296  inline typed::aff<Anonymous> scale(long v) const;
297  inline typed::multi_aff<Anonymous> scale(const typed::multi_val<Anonymous> &mv) const;
298  inline typed::aff<Anonymous> scale_down(const typed::val<Anonymous> &v) const;
299  inline typed::aff<Anonymous> scale_down(long v) const;
300  inline typed::multi_aff<Anonymous> scale_down(const typed::multi_val<Anonymous> &mv) const;
301  inline typed::multi_aff<Anonymous> set_at(int pos, const typed::aff<Anonymous> &el) const;
302  inline typed::multi_pw_aff<Anonymous> set_at(int pos, const typed::pw_aff<Anonymous> &el) const;
303  inline typed::multi_union_pw_aff<Anonymous> set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const;
304  template <typename Domain2>
305  inline typed::multi_aff<Domain2> set_range_tuple(const typed::id<Anonymous> &id) const;
306  template <typename Domain2>
307  inline typed::multi_aff<Domain2> set_range_tuple(const std::string &id) const;
308  inline typed::space<Anonymous> space() const;
309  inline typed::aff<Anonymous> sub(const typed::aff<Anonymous> &aff2) const;
310  inline typed::multi_aff<Anonymous> sub(const typed::multi_aff<Anonymous> &multi2) const;
311  inline typed::multi_pw_aff<Anonymous> sub(const typed::multi_pw_aff<Anonymous> &multi2) const;
312  inline typed::multi_union_pw_aff<Anonymous> sub(const typed::multi_union_pw_aff<Anonymous> &multi2) const;
313  inline typed::pw_aff<Anonymous> sub(const typed::pw_aff<Anonymous> &pwaff2) const;
314  inline typed::pw_multi_aff<Anonymous> sub(const typed::pw_multi_aff<Anonymous> &pma2) const;
315  inline typed::union_pw_aff<Anonymous> sub(const typed::union_pw_aff<Anonymous> &upa2) const;
316  inline typed::union_pw_multi_aff<Anonymous> sub(const typed::union_pw_multi_aff<Anonymous> &upma2) const;
317  inline typed::pw_aff<Anonymous> subtract_domain(const typed::set<> &set) const = delete;
318  inline typed::union_pw_aff<Anonymous> subtract_domain(const typed::space<> &space) const = delete;
319  inline typed::union_pw_aff<Anonymous> subtract_domain(const typed::union_set<> &uset) const = delete;
320  inline typed::multi_pw_aff<Anonymous> to_multi_pw_aff() const;
321  inline typed::multi_union_pw_aff<Anonymous> to_multi_union_pw_aff() const;
322  inline typed::pw_multi_aff<Anonymous> to_pw_multi_aff() const;
323  inline typed::union_pw_aff<Anonymous> to_union_pw_aff() const;
324  inline typed::union_pw_multi_aff<Anonymous> to_union_pw_multi_aff() const;
325  template <typename Domain>
326  inline typed::aff<Domain, Anonymous> unbind_params_insert_domain(const typed::multi_id<Domain> &domain) const;
327  inline typed::multi_pw_aff<Anonymous> union_add(const typed::multi_pw_aff<Anonymous> &mpa2) const;
328  inline typed::multi_union_pw_aff<Anonymous> union_add(const typed::multi_union_pw_aff<Anonymous> &mupa2) const;
329  inline typed::pw_aff<Anonymous> union_add(const typed::pw_aff<Anonymous> &pwaff2) const;
330  inline typed::pw_multi_aff<Anonymous> union_add(const typed::pw_multi_aff<Anonymous> &pma2) const;
331  inline typed::union_pw_aff<Anonymous> union_add(const typed::union_pw_aff<Anonymous> &upa2) const;
332  inline typed::union_pw_multi_aff<Anonymous> union_add(const typed::union_pw_multi_aff<Anonymous> &upma2) const;
333};
334
335template <typename Domain>
336struct aff<Domain, Anonymous> : public isl::aff {
337  template <typename...>
338  friend struct aff;
339  template <typename...>
340  friend struct aff_list;
341  template <typename...>
342  friend struct basic_map;
343  template <typename...>
344  friend struct basic_set;
345  template <typename...>
346  friend struct fixed_box;
347  template <typename...>
348  friend struct id;
349  template <typename...>
350  friend struct id_list;
351  template <typename...>
352  friend struct map;
353  template <typename...>
354  friend struct map_list;
355  template <typename...>
356  friend struct multi_aff;
357  template <typename...>
358  friend struct multi_id;
359  template <typename...>
360  friend struct multi_pw_aff;
361  template <typename...>
362  friend struct multi_union_pw_aff;
363  template <typename...>
364  friend struct multi_val;
365  template <typename...>
366  friend struct point;
367  template <typename...>
368  friend struct pw_aff;
369  template <typename...>
370  friend struct pw_aff_list;
371  template <typename...>
372  friend struct pw_multi_aff;
373  template <typename...>
374  friend struct pw_multi_aff_list;
375  template <typename...>
376  friend struct set;
377  template <typename...>
378  friend struct set_list;
379  template <typename...>
380  friend struct space;
381  template <typename...>
382  friend struct union_map;
383  template <typename...>
384  friend struct union_pw_aff;
385  template <typename...>
386  friend struct union_pw_aff_list;
387  template <typename...>
388  friend struct union_pw_multi_aff;
389  template <typename...>
390  friend struct union_set;
391  template <typename...>
392  friend struct union_set_list;
393  template <typename...>
394  friend struct val;
395  template <typename...>
396  friend struct val_list;
397
398  aff() = default;
399  template <typename Arg1,
400            typename std::enable_if<
401              std::is_base_of<Domain, Arg1>{},
402            bool>::type = true>
403  aff(const aff<Arg1, Anonymous> &obj) : isl::aff(obj) {}
404 private:
405  template <typename base,
406            typename std::enable_if<
407              std::is_same<base, isl::aff>{}, bool>::type = true>
408  aff(const base &obj) : isl::aff(obj) {}
409 public:
410  static aff from(const isl::aff &obj) {
411    return aff(obj);
412  }
413  inline explicit aff(const isl::ctx &ctx, const std::string &str);
414  inline typed::aff<Domain, Anonymous> add(const typed::aff<Domain, Anonymous> &aff2) const;
415  inline typed::multi_aff<Domain, Anonymous> add(const typed::multi_aff<Domain, Anonymous> &multi2) const;
416  inline typed::multi_pw_aff<Domain, Anonymous> add(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const;
417  inline typed::multi_union_pw_aff<Domain, Anonymous> add(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const;
418  inline typed::pw_aff<Domain, Anonymous> add(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
419  inline typed::pw_multi_aff<Domain, Anonymous> add(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const;
420  inline typed::union_pw_aff<Domain, Anonymous> add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const;
421  inline typed::union_pw_multi_aff<Domain, Anonymous> add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const;
422  inline typed::aff<Domain, Anonymous> add_constant(const typed::val<Anonymous> &v) const;
423  inline typed::aff<Domain, Anonymous> add_constant(long v) const;
424  inline typed::multi_aff<Domain, Anonymous> add_constant(const typed::multi_val<Anonymous> &mv) const;
425  template <typename Range2>
426  inline typed::union_pw_multi_aff<Domain, Range2> apply(const typed::union_pw_multi_aff<Anonymous, Range2> &upma2) const;
427  inline typed::aff<Domain, Anonymous> as_aff() const;
428  inline typed::map<Domain, Anonymous> as_map() const;
429  inline typed::multi_aff<Domain, Anonymous> as_multi_aff() const;
430  inline typed::multi_union_pw_aff<Domain, Anonymous> as_multi_union_pw_aff() const;
431  inline typed::pw_multi_aff<Domain, Anonymous> as_pw_multi_aff() const;
432  inline typed::set<Domain, Anonymous> as_set() const = delete;
433  inline typed::union_map<Domain, Anonymous> as_union_map() const;
434  inline typed::aff<Domain, Anonymous> at(int pos) const;
435  inline typed::basic_set<Domain> bind(const typed::id<Anonymous> &id) const;
436  inline typed::basic_set<Domain> bind(const std::string &id) const;
437  inline typed::basic_set<Domain> bind(const typed::multi_id<Anonymous> &tuple) const;
438  inline typed::pw_aff<Anonymous> bind_domain(const typed::multi_id<Domain> &tuple) const;
439  inline typed::pw_aff<Domain, Anonymous> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
440  inline typed::aff<Domain, Anonymous> ceil() const;
441  inline typed::pw_aff<Domain, Anonymous> coalesce() const;
442  inline typed::pw_aff<Domain, Anonymous> cond(const typed::pw_aff<Domain, Anonymous> &pwaff_true, const typed::pw_aff<Domain, Anonymous> &pwaff_false) const;
443  inline typed::multi_val<Anonymous> constant_multi_val() const;
444  inline typed::val<Anonymous> constant_val() const;
445  inline typed::val<Domain, Anonymous> get_constant_val() const = delete;
446  inline typed::set<Domain> domain() const;
447  inline typed::aff<Domain, Anonymous> domain_reverse() const = delete;
448  inline typed::pw_aff<Domain, Anonymous> drop_unused_params() const;
449  inline typed::pw_multi_aff<Domain, Anonymous> extract_pw_multi_aff(const typed::space<Domain, Anonymous> &space) const;
450  inline typed::aff<Domain, Anonymous> floor() const;
451  inline typed::set<Domain> ge_set(const typed::aff<Domain, Anonymous> &aff2) const;
452  inline typed::set<Domain> ge_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
453  inline typed::aff<Domain, Anonymous> gist(const typed::set<Domain> &context) const;
454  inline typed::union_pw_aff<Domain, Anonymous> gist(const typed::union_set<Domain> &context) const;
455  inline typed::aff<Domain, Anonymous> gist(const typed::basic_set<Domain> &context) const;
456  inline typed::aff<Domain, Anonymous> gist(const typed::point<Domain> &context) const;
457  inline typed::aff<Domain, Anonymous> gist_params(const typed::set<> &context) const;
458  inline typed::aff<Domain, Anonymous> gist_params(const typed::basic_set<> &context) const;
459  inline typed::aff<Domain, Anonymous> gist_params(const typed::point<> &context) const;
460  inline typed::set<Domain> gt_set(const typed::aff<Domain, Anonymous> &aff2) const;
461  inline typed::set<Domain> gt_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
462  inline typed::multi_aff<Domain, Anonymous> identity() const;
463  inline typed::pw_aff<Domain, Anonymous> insert_domain(const typed::space<> &domain) const = delete;
464  inline typed::pw_aff<Domain, Anonymous> intersect_domain(const typed::set<Domain> &set) const;
465  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain(const typed::space<Domain> &space) const;
466  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain(const typed::union_set<Domain> &uset) const;
467  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
468  inline typed::pw_aff<Domain, Anonymous> intersect_params(const typed::set<> &set) const;
469  inline typed::set<Domain> le_set(const typed::aff<Domain, Anonymous> &aff2) const;
470  inline typed::set<Domain> le_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
471  inline typed::aff_list<Domain, Anonymous> list() const;
472  inline typed::set<Domain> lt_set(const typed::aff<Domain, Anonymous> &aff2) const;
473  inline typed::set<Domain> lt_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
474  inline typed::multi_pw_aff<Domain, Anonymous> max(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const;
475  inline typed::pw_aff<Domain, Anonymous> max(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
476  inline typed::multi_val<Anonymous> max_multi_val() const;
477  inline typed::val<Anonymous> max_val() const;
478  inline typed::multi_pw_aff<Domain, Anonymous> min(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const;
479  inline typed::pw_aff<Domain, Anonymous> min(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
480  inline typed::multi_val<Anonymous> min_multi_val() const;
481  inline typed::val<Anonymous> min_val() const;
482  inline typed::aff<Domain, Anonymous> mod(const typed::val<Anonymous> &mod) const;
483  inline typed::aff<Domain, Anonymous> mod(long mod) const;
484  inline typed::aff<Domain, Anonymous> neg() const;
485  inline typed::set<> params() const;
486  inline typed::pw_multi_aff<Domain, Anonymous> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
487  inline typed::union_pw_multi_aff<Domain, Anonymous> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
488  template <typename Domain2, typename Range2>
489  inline typed::multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> product(const typed::multi_aff<Domain2, Range2> &multi2) const;
490  template <typename Domain2, typename Range2>
491  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const;
492  template <typename Domain2, typename Range2>
493  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> product(const typed::pw_multi_aff<Domain2, Range2> &pma2) const;
494  template <typename Domain2>
495  inline typed::aff<Domain2, Anonymous> pullback(const typed::multi_aff<Domain2, Domain> &ma) const;
496  inline typed::aff<Anonymous> pullback(const typed::multi_aff<Domain> &ma) const;
497  template <typename Domain2>
498  inline typed::pw_aff<Domain2, Anonymous> pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
499  inline typed::pw_aff<Anonymous> pullback(const typed::multi_pw_aff<Domain> &mpa) const;
500  template <typename Domain2>
501  inline typed::pw_aff<Domain2, Anonymous> pullback(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
502  inline typed::pw_aff<Anonymous> pullback(const typed::pw_multi_aff<Domain> &pma) const;
503  template <typename Domain2>
504  inline typed::union_pw_aff<Domain2, Anonymous> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
505  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_multi_aff<Domain> &upma) const;
506  template <typename Domain2>
507  inline typed::aff<Domain2, Anonymous> pullback(const typed::aff<Domain2, Domain> &ma) const;
508  inline typed::aff<Anonymous> pullback(const typed::aff<Domain> &ma) const;
509  inline typed::pw_multi_aff_list<Domain, Anonymous> pw_multi_aff_list() const;
510  inline typed::pw_multi_aff<Domain, Anonymous> range_factor_domain() const = delete;
511  inline typed::pw_multi_aff<Domain, Anonymous> range_factor_range() const = delete;
512  template <typename Range2>
513  inline typed::multi_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::multi_aff<Domain, Range2> &multi2) const;
514  template <typename Range2>
515  inline typed::multi_pw_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const;
516  template <typename Range2>
517  inline typed::multi_union_pw_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const;
518  template <typename Range2>
519  inline typed::pw_multi_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::pw_multi_aff<Domain, Range2> &pma2) const;
520  template <typename Range2>
521  inline typed::union_pw_multi_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const;
522  inline typed::aff<Domain, Anonymous> scale(const typed::val<Anonymous> &v) const;
523  inline typed::aff<Domain, Anonymous> scale(long v) const;
524  inline typed::multi_aff<Domain, Anonymous> scale(const typed::multi_val<Anonymous> &mv) const;
525  inline typed::aff<Domain, Anonymous> scale_down(const typed::val<Anonymous> &v) const;
526  inline typed::aff<Domain, Anonymous> scale_down(long v) const;
527  inline typed::multi_aff<Domain, Anonymous> scale_down(const typed::multi_val<Anonymous> &mv) const;
528  inline typed::multi_aff<Domain, Anonymous> set_at(int pos, const typed::aff<Domain, Anonymous> &el) const;
529  inline typed::multi_pw_aff<Domain, Anonymous> set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const;
530  inline typed::multi_union_pw_aff<Domain, Anonymous> set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const;
531  template <typename Range2>
532  inline typed::multi_aff<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
533  template <typename Range2>
534  inline typed::multi_aff<Domain, Range2> set_range_tuple(const std::string &id) const;
535  inline typed::space<Domain, Anonymous> space() const;
536  inline typed::aff<Domain, Anonymous> sub(const typed::aff<Domain, Anonymous> &aff2) const;
537  inline typed::multi_aff<Domain, Anonymous> sub(const typed::multi_aff<Domain, Anonymous> &multi2) const;
538  inline typed::multi_pw_aff<Domain, Anonymous> sub(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const;
539  inline typed::multi_union_pw_aff<Domain, Anonymous> sub(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const;
540  inline typed::pw_aff<Domain, Anonymous> sub(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
541  inline typed::pw_multi_aff<Domain, Anonymous> sub(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const;
542  inline typed::union_pw_aff<Domain, Anonymous> sub(const typed::union_pw_aff<Domain, Anonymous> &upa2) const;
543  inline typed::union_pw_multi_aff<Domain, Anonymous> sub(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const;
544  inline typed::pw_aff<Domain, Anonymous> subtract_domain(const typed::set<Domain> &set) const;
545  inline typed::union_pw_aff<Domain, Anonymous> subtract_domain(const typed::space<Domain> &space) const;
546  inline typed::union_pw_aff<Domain, Anonymous> subtract_domain(const typed::union_set<Domain> &uset) const;
547  inline typed::multi_pw_aff<Domain, Anonymous> to_multi_pw_aff() const;
548  inline typed::multi_union_pw_aff<Domain, Anonymous> to_multi_union_pw_aff() const;
549  inline typed::pw_multi_aff<Domain, Anonymous> to_pw_multi_aff() const;
550  inline typed::union_pw_aff<Domain, Anonymous> to_union_pw_aff() const;
551  inline typed::union_pw_multi_aff<Domain, Anonymous> to_union_pw_multi_aff() const;
552  inline typed::aff<Domain, Anonymous> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
553  inline typed::multi_pw_aff<Domain, Anonymous> union_add(const typed::multi_pw_aff<Domain, Anonymous> &mpa2) const;
554  inline typed::multi_union_pw_aff<Domain, Anonymous> union_add(const typed::multi_union_pw_aff<Domain, Anonymous> &mupa2) const;
555  inline typed::pw_aff<Domain, Anonymous> union_add(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
556  inline typed::pw_multi_aff<Domain, Anonymous> union_add(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const;
557  inline typed::union_pw_aff<Domain, Anonymous> union_add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const;
558  inline typed::union_pw_multi_aff<Domain, Anonymous> union_add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const;
559};
560
561template <typename Domain2, typename Range2>
562struct aff<pair<Domain2, Range2>, Anonymous> : public isl::aff {
563  template <typename...>
564  friend struct aff;
565  template <typename...>
566  friend struct aff_list;
567  template <typename...>
568  friend struct basic_map;
569  template <typename...>
570  friend struct basic_set;
571  template <typename...>
572  friend struct fixed_box;
573  template <typename...>
574  friend struct id;
575  template <typename...>
576  friend struct id_list;
577  template <typename...>
578  friend struct map;
579  template <typename...>
580  friend struct map_list;
581  template <typename...>
582  friend struct multi_aff;
583  template <typename...>
584  friend struct multi_id;
585  template <typename...>
586  friend struct multi_pw_aff;
587  template <typename...>
588  friend struct multi_union_pw_aff;
589  template <typename...>
590  friend struct multi_val;
591  template <typename...>
592  friend struct point;
593  template <typename...>
594  friend struct pw_aff;
595  template <typename...>
596  friend struct pw_aff_list;
597  template <typename...>
598  friend struct pw_multi_aff;
599  template <typename...>
600  friend struct pw_multi_aff_list;
601  template <typename...>
602  friend struct set;
603  template <typename...>
604  friend struct set_list;
605  template <typename...>
606  friend struct space;
607  template <typename...>
608  friend struct union_map;
609  template <typename...>
610  friend struct union_pw_aff;
611  template <typename...>
612  friend struct union_pw_aff_list;
613  template <typename...>
614  friend struct union_pw_multi_aff;
615  template <typename...>
616  friend struct union_set;
617  template <typename...>
618  friend struct union_set_list;
619  template <typename...>
620  friend struct val;
621  template <typename...>
622  friend struct val_list;
623
624  aff() = default;
625  template <typename Arg1, typename Arg2,
626            typename std::enable_if<
627              std::is_base_of<Domain2, Arg1>{} &&
628              std::is_base_of<Range2, Arg2>{},
629            bool>::type = true>
630  aff(const aff<pair<Arg1, Arg2>, Anonymous> &obj) : isl::aff(obj) {}
631 private:
632  template <typename base,
633            typename std::enable_if<
634              std::is_same<base, isl::aff>{}, bool>::type = true>
635  aff(const base &obj) : isl::aff(obj) {}
636 public:
637  static aff from(const isl::aff &obj) {
638    return aff(obj);
639  }
640  inline explicit aff(const isl::ctx &ctx, const std::string &str);
641  inline typed::aff<pair<Domain2, Range2>, Anonymous> add(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const;
642  inline typed::multi_aff<pair<Domain2, Range2>, Anonymous> add(const typed::multi_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
643  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> add(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
644  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
645  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> add(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
646  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> add(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const;
647  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> add(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const;
648  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const;
649  inline typed::aff<pair<Domain2, Range2>, Anonymous> add_constant(const typed::val<Anonymous> &v) const;
650  inline typed::aff<pair<Domain2, Range2>, Anonymous> add_constant(long v) const;
651  inline typed::multi_aff<pair<Domain2, Range2>, Anonymous> add_constant(const typed::multi_val<Anonymous> &mv) const;
652  template <typename Arg1>
653  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1> apply(const typed::union_pw_multi_aff<Anonymous, Arg1> &upma2) const;
654  inline typed::aff<pair<Domain2, Range2>, Anonymous> as_aff() const;
655  inline typed::map<pair<Domain2, Range2>, Anonymous> as_map() const;
656  inline typed::multi_aff<pair<Domain2, Range2>, Anonymous> as_multi_aff() const;
657  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> as_multi_union_pw_aff() const;
658  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> as_pw_multi_aff() const;
659  inline typed::set<pair<Domain2, Range2>, Anonymous> as_set() const = delete;
660  inline typed::union_map<pair<Domain2, Range2>, Anonymous> as_union_map() const;
661  inline typed::aff<pair<Domain2, Range2>, Anonymous> at(int pos) const;
662  inline typed::basic_set<pair<Domain2, Range2>> bind(const typed::id<Anonymous> &id) const;
663  inline typed::basic_set<pair<Domain2, Range2>> bind(const std::string &id) const;
664  inline typed::basic_set<pair<Domain2, Range2>> bind(const typed::multi_id<Anonymous> &tuple) const;
665  inline typed::pw_aff<Anonymous> bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const;
666  inline typed::pw_aff<Range2, Anonymous> bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const;
667  inline typed::aff<pair<Domain2, Range2>, Anonymous> ceil() const;
668  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> coalesce() const;
669  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> cond(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff_true, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff_false) const;
670  inline typed::multi_val<Anonymous> constant_multi_val() const;
671  inline typed::val<Anonymous> constant_val() const;
672  inline typed::val<pair<Domain2, Range2>, Anonymous> get_constant_val() const = delete;
673  inline typed::set<pair<Domain2, Range2>> domain() const;
674  inline typed::aff<pair<Range2, Domain2>, Anonymous> domain_reverse() const;
675  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> drop_unused_params() const;
676  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> extract_pw_multi_aff(const typed::space<pair<Domain2, Range2>, Anonymous> &space) const;
677  inline typed::aff<pair<Domain2, Range2>, Anonymous> floor() const;
678  inline typed::set<pair<Domain2, Range2>> ge_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const;
679  inline typed::set<pair<Domain2, Range2>> ge_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
680  inline typed::aff<pair<Domain2, Range2>, Anonymous> gist(const typed::set<pair<Domain2, Range2>> &context) const;
681  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> gist(const typed::union_set<pair<Domain2, Range2>> &context) const;
682  inline typed::aff<pair<Domain2, Range2>, Anonymous> gist(const typed::basic_set<pair<Domain2, Range2>> &context) const;
683  inline typed::aff<pair<Domain2, Range2>, Anonymous> gist(const typed::point<pair<Domain2, Range2>> &context) const;
684  inline typed::aff<pair<Domain2, Range2>, Anonymous> gist_params(const typed::set<> &context) const;
685  inline typed::aff<pair<Domain2, Range2>, Anonymous> gist_params(const typed::basic_set<> &context) const;
686  inline typed::aff<pair<Domain2, Range2>, Anonymous> gist_params(const typed::point<> &context) const;
687  inline typed::set<pair<Domain2, Range2>> gt_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const;
688  inline typed::set<pair<Domain2, Range2>> gt_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
689  inline typed::multi_aff<pair<Domain2, Range2>, Anonymous> identity() const;
690  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> insert_domain(const typed::space<> &domain) const = delete;
691  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain(const typed::set<pair<Domain2, Range2>> &set) const;
692  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain(const typed::space<pair<Domain2, Range2>> &space) const;
693  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const;
694  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain_wrapped_domain(const typed::union_set<Domain2> &uset) const;
695  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> intersect_params(const typed::set<> &set) const;
696  inline typed::set<pair<Domain2, Range2>> le_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const;
697  inline typed::set<pair<Domain2, Range2>> le_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
698  inline typed::aff_list<pair<Domain2, Range2>, Anonymous> list() const;
699  inline typed::set<pair<Domain2, Range2>> lt_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const;
700  inline typed::set<pair<Domain2, Range2>> lt_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
701  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> max(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
702  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> max(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
703  inline typed::multi_val<Anonymous> max_multi_val() const;
704  inline typed::val<Anonymous> max_val() const;
705  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> min(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
706  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> min(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
707  inline typed::multi_val<Anonymous> min_multi_val() const;
708  inline typed::val<Anonymous> min_val() const;
709  inline typed::aff<pair<Domain2, Range2>, Anonymous> mod(const typed::val<Anonymous> &mod) const;
710  inline typed::aff<pair<Domain2, Range2>, Anonymous> mod(long mod) const;
711  inline typed::aff<pair<Domain2, Range2>, Anonymous> neg() const;
712  inline typed::set<> params() const;
713  template <typename Domain3>
714  inline typed::pw_multi_aff<pair<Domain3, Range2>, Anonymous> preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain2> &pma2) const;
715  template <typename Domain3>
716  inline typed::union_pw_multi_aff<pair<Domain3, Range2>, Anonymous> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain2> &upma2) const;
717  template <typename Arg1, typename Arg2>
718  inline typed::multi_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> product(const typed::multi_aff<Arg1, Arg2> &multi2) const;
719  template <typename Arg1, typename Arg2>
720  inline typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> product(const typed::multi_pw_aff<Arg1, Arg2> &multi2) const;
721  template <typename Arg1, typename Arg2>
722  inline typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> product(const typed::pw_multi_aff<Arg1, Arg2> &pma2) const;
723  template <typename Arg1>
724  inline typed::aff<Arg1, Anonymous> pullback(const typed::multi_aff<Arg1, pair<Domain2, Range2>> &ma) const;
725  inline typed::aff<Anonymous> pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma) const;
726  template <typename Arg1>
727  inline typed::pw_aff<Arg1, Anonymous> pullback(const typed::multi_pw_aff<Arg1, pair<Domain2, Range2>> &mpa) const;
728  inline typed::pw_aff<Anonymous> pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa) const;
729  template <typename Arg1>
730  inline typed::pw_aff<Arg1, Anonymous> pullback(const typed::pw_multi_aff<Arg1, pair<Domain2, Range2>> &pma) const;
731  inline typed::pw_aff<Anonymous> pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma) const;
732  template <typename Arg1>
733  inline typed::union_pw_aff<Arg1, Anonymous> pullback(const typed::union_pw_multi_aff<Arg1, pair<Domain2, Range2>> &upma) const;
734  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma) const;
735  template <typename Arg1>
736  inline typed::aff<Arg1, Anonymous> pullback(const typed::aff<Arg1, pair<Domain2, Range2>> &ma) const;
737  inline typed::aff<Anonymous> pullback(const typed::aff<pair<Domain2, Range2>> &ma) const;
738  inline typed::pw_multi_aff_list<pair<Domain2, Range2>, Anonymous> pw_multi_aff_list() const;
739  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> range_factor_domain() const = delete;
740  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> range_factor_range() const = delete;
741  template <typename Arg1>
742  inline typed::multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> range_product(const typed::multi_aff<pair<Domain2, Range2>, Arg1> &multi2) const;
743  template <typename Arg1>
744  inline typed::multi_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg1> &multi2) const;
745  template <typename Arg1>
746  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg1> &multi2) const;
747  template <typename Arg1>
748  inline typed::pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> &pma2) const;
749  template <typename Arg1>
750  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> range_product(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1> &upma2) const;
751  inline typed::aff<pair<Domain2, Range2>, Anonymous> scale(const typed::val<Anonymous> &v) const;
752  inline typed::aff<pair<Domain2, Range2>, Anonymous> scale(long v) const;
753  inline typed::multi_aff<pair<Domain2, Range2>, Anonymous> scale(const typed::multi_val<Anonymous> &mv) const;
754  inline typed::aff<pair<Domain2, Range2>, Anonymous> scale_down(const typed::val<Anonymous> &v) const;
755  inline typed::aff<pair<Domain2, Range2>, Anonymous> scale_down(long v) const;
756  inline typed::multi_aff<pair<Domain2, Range2>, Anonymous> scale_down(const typed::multi_val<Anonymous> &mv) const;
757  inline typed::multi_aff<pair<Domain2, Range2>, Anonymous> set_at(int pos, const typed::aff<pair<Domain2, Range2>, Anonymous> &el) const;
758  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
759  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
760  template <typename Arg1>
761  inline typed::multi_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const typed::id<Anonymous> &id) const;
762  template <typename Arg1>
763  inline typed::multi_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const std::string &id) const;
764  inline typed::space<pair<Domain2, Range2>, Anonymous> space() const;
765  inline typed::aff<pair<Domain2, Range2>, Anonymous> sub(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const;
766  inline typed::multi_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::multi_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
767  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
768  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
769  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
770  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const;
771  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const;
772  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const;
773  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> subtract_domain(const typed::set<pair<Domain2, Range2>> &set) const;
774  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> subtract_domain(const typed::space<pair<Domain2, Range2>> &space) const;
775  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> subtract_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const;
776  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> to_multi_pw_aff() const;
777  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> to_multi_union_pw_aff() const;
778  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> to_pw_multi_aff() const;
779  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> to_union_pw_aff() const;
780  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> to_union_pw_multi_aff() const;
781  inline typed::aff<pair<Domain2, Range2>, Anonymous> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
782  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &mpa2) const;
783  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &mupa2) const;
784  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
785  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const;
786  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const;
787  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const;
788};
789
790template <>
791struct aff_list<Anonymous> : public isl::aff_list {
792  template <typename...>
793  friend struct aff;
794  template <typename...>
795  friend struct aff_list;
796  template <typename...>
797  friend struct basic_map;
798  template <typename...>
799  friend struct basic_set;
800  template <typename...>
801  friend struct fixed_box;
802  template <typename...>
803  friend struct id;
804  template <typename...>
805  friend struct id_list;
806  template <typename...>
807  friend struct map;
808  template <typename...>
809  friend struct map_list;
810  template <typename...>
811  friend struct multi_aff;
812  template <typename...>
813  friend struct multi_id;
814  template <typename...>
815  friend struct multi_pw_aff;
816  template <typename...>
817  friend struct multi_union_pw_aff;
818  template <typename...>
819  friend struct multi_val;
820  template <typename...>
821  friend struct point;
822  template <typename...>
823  friend struct pw_aff;
824  template <typename...>
825  friend struct pw_aff_list;
826  template <typename...>
827  friend struct pw_multi_aff;
828  template <typename...>
829  friend struct pw_multi_aff_list;
830  template <typename...>
831  friend struct set;
832  template <typename...>
833  friend struct set_list;
834  template <typename...>
835  friend struct space;
836  template <typename...>
837  friend struct union_map;
838  template <typename...>
839  friend struct union_pw_aff;
840  template <typename...>
841  friend struct union_pw_aff_list;
842  template <typename...>
843  friend struct union_pw_multi_aff;
844  template <typename...>
845  friend struct union_set;
846  template <typename...>
847  friend struct union_set_list;
848  template <typename...>
849  friend struct val;
850  template <typename...>
851  friend struct val_list;
852
853  aff_list() = default;
854  aff_list(const isl::aff_list &obj) : isl::aff_list(obj) {}
855  static aff_list from(const isl::aff_list &obj) {
856    return aff_list(obj);
857  }
858  inline explicit aff_list(const isl::ctx &ctx, int n);
859  inline explicit aff_list(const typed::aff<Anonymous> &el);
860  inline explicit aff_list(const isl::ctx &ctx, const std::string &str);
861  inline typed::aff_list<Anonymous> add(const typed::aff<Anonymous> &el) const;
862  inline typed::aff<Anonymous> at(int index) const;
863  inline typed::aff<Anonymous> get_at(int index) const = delete;
864  inline typed::aff_list<Anonymous> drop(unsigned int first, unsigned int n) const;
865  inline void foreach(const std::function<void(typed::aff<Anonymous>)> &fn) const;
866  inline void foreach_scc(const std::function<bool(typed::aff<Anonymous>, typed::aff<Anonymous>)> &follows, const std::function<void(typed::aff_list<Anonymous>)> &fn) const;
867  inline typed::aff_list<Anonymous> set_at(int index, const typed::aff<Anonymous> &el) const;
868};
869
870template <typename Domain>
871struct aff_list<Domain, Anonymous> : public isl::aff_list {
872  template <typename...>
873  friend struct aff;
874  template <typename...>
875  friend struct aff_list;
876  template <typename...>
877  friend struct basic_map;
878  template <typename...>
879  friend struct basic_set;
880  template <typename...>
881  friend struct fixed_box;
882  template <typename...>
883  friend struct id;
884  template <typename...>
885  friend struct id_list;
886  template <typename...>
887  friend struct map;
888  template <typename...>
889  friend struct map_list;
890  template <typename...>
891  friend struct multi_aff;
892  template <typename...>
893  friend struct multi_id;
894  template <typename...>
895  friend struct multi_pw_aff;
896  template <typename...>
897  friend struct multi_union_pw_aff;
898  template <typename...>
899  friend struct multi_val;
900  template <typename...>
901  friend struct point;
902  template <typename...>
903  friend struct pw_aff;
904  template <typename...>
905  friend struct pw_aff_list;
906  template <typename...>
907  friend struct pw_multi_aff;
908  template <typename...>
909  friend struct pw_multi_aff_list;
910  template <typename...>
911  friend struct set;
912  template <typename...>
913  friend struct set_list;
914  template <typename...>
915  friend struct space;
916  template <typename...>
917  friend struct union_map;
918  template <typename...>
919  friend struct union_pw_aff;
920  template <typename...>
921  friend struct union_pw_aff_list;
922  template <typename...>
923  friend struct union_pw_multi_aff;
924  template <typename...>
925  friend struct union_set;
926  template <typename...>
927  friend struct union_set_list;
928  template <typename...>
929  friend struct val;
930  template <typename...>
931  friend struct val_list;
932
933  aff_list() = default;
934  template <typename Arg1,
935            typename std::enable_if<
936              std::is_base_of<Domain, Arg1>{},
937            bool>::type = true>
938  aff_list(const aff_list<Arg1, Anonymous> &obj) : isl::aff_list(obj) {}
939 private:
940  template <typename base,
941            typename std::enable_if<
942              std::is_same<base, isl::aff_list>{}, bool>::type = true>
943  aff_list(const base &obj) : isl::aff_list(obj) {}
944 public:
945  static aff_list from(const isl::aff_list &obj) {
946    return aff_list(obj);
947  }
948  inline explicit aff_list(const isl::ctx &ctx, int n);
949  inline explicit aff_list(const typed::aff<Domain, Anonymous> &el);
950  inline explicit aff_list(const isl::ctx &ctx, const std::string &str);
951  inline typed::aff_list<Domain, Anonymous> add(const typed::aff<Domain, Anonymous> &el) const;
952  inline typed::aff<Domain, Anonymous> at(int index) const;
953  inline typed::aff<Domain, Anonymous> get_at(int index) const = delete;
954  inline typed::aff_list<Domain, Anonymous> drop(unsigned int first, unsigned int n) const;
955  inline void foreach(const std::function<void(typed::aff<Domain, Anonymous>)> &fn) const;
956  inline void foreach_scc(const std::function<bool(typed::aff<Domain, Anonymous>, typed::aff<Domain, Anonymous>)> &follows, const std::function<void(typed::aff_list<Domain, Anonymous>)> &fn) const;
957  inline typed::aff_list<Domain, Anonymous> set_at(int index, const typed::aff<Domain, Anonymous> &el) const;
958};
959
960template <typename Domain, typename Range>
961struct basic_map<Domain, Range> : public isl::basic_map {
962  template <typename...>
963  friend struct aff;
964  template <typename...>
965  friend struct aff_list;
966  template <typename...>
967  friend struct basic_map;
968  template <typename...>
969  friend struct basic_set;
970  template <typename...>
971  friend struct fixed_box;
972  template <typename...>
973  friend struct id;
974  template <typename...>
975  friend struct id_list;
976  template <typename...>
977  friend struct map;
978  template <typename...>
979  friend struct map_list;
980  template <typename...>
981  friend struct multi_aff;
982  template <typename...>
983  friend struct multi_id;
984  template <typename...>
985  friend struct multi_pw_aff;
986  template <typename...>
987  friend struct multi_union_pw_aff;
988  template <typename...>
989  friend struct multi_val;
990  template <typename...>
991  friend struct point;
992  template <typename...>
993  friend struct pw_aff;
994  template <typename...>
995  friend struct pw_aff_list;
996  template <typename...>
997  friend struct pw_multi_aff;
998  template <typename...>
999  friend struct pw_multi_aff_list;
1000  template <typename...>
1001  friend struct set;
1002  template <typename...>
1003  friend struct set_list;
1004  template <typename...>
1005  friend struct space;
1006  template <typename...>
1007  friend struct union_map;
1008  template <typename...>
1009  friend struct union_pw_aff;
1010  template <typename...>
1011  friend struct union_pw_aff_list;
1012  template <typename...>
1013  friend struct union_pw_multi_aff;
1014  template <typename...>
1015  friend struct union_set;
1016  template <typename...>
1017  friend struct union_set_list;
1018  template <typename...>
1019  friend struct val;
1020  template <typename...>
1021  friend struct val_list;
1022
1023  basic_map() = default;
1024  template <typename Arg1, typename Arg2,
1025            typename std::enable_if<
1026              std::is_base_of<Domain, Arg1>{} &&
1027              std::is_base_of<Range, Arg2>{},
1028            bool>::type = true>
1029  basic_map(const basic_map<Arg1, Arg2> &obj) : isl::basic_map(obj) {}
1030 private:
1031  template <typename base,
1032            typename std::enable_if<
1033              std::is_same<base, isl::basic_map>{}, bool>::type = true>
1034  basic_map(const base &obj) : isl::basic_map(obj) {}
1035 public:
1036  static basic_map from(const isl::basic_map &obj) {
1037    return basic_map(obj);
1038  }
1039  inline explicit basic_map(const isl::ctx &ctx, const std::string &str);
1040  template <typename Domain2>
1041  inline typed::basic_map<Domain2, Range> apply_domain(const typed::basic_map<Domain, Domain2> &bmap2) const;
1042  template <typename Domain2>
1043  inline typed::map<Domain2, Range> apply_domain(const typed::map<Domain, Domain2> &map2) const;
1044  template <typename Domain2>
1045  inline typed::union_map<Domain2, Range> apply_domain(const typed::union_map<Domain, Domain2> &umap2) const;
1046  template <typename Range2>
1047  inline typed::basic_map<Domain, Range2> apply_range(const typed::basic_map<Range, Range2> &bmap2) const;
1048  template <typename Range2>
1049  inline typed::map<Domain, Range2> apply_range(const typed::map<Range, Range2> &map2) const;
1050  template <typename Range2>
1051  inline typed::union_map<Domain, Range2> apply_range(const typed::union_map<Range, Range2> &umap2) const;
1052  inline typed::map<Domain, Range> as_map() const;
1053  inline typed::multi_union_pw_aff<Domain, Range> as_multi_union_pw_aff() const;
1054  inline typed::pw_multi_aff<Domain, Range> as_pw_multi_aff() const;
1055  inline typed::union_pw_multi_aff<Domain, Range> as_union_pw_multi_aff() const;
1056  inline typed::set<Range> bind_domain(const typed::multi_id<Domain> &tuple) const;
1057  inline typed::set<Domain> bind_range(const typed::multi_id<Range> &tuple) const;
1058  inline typed::map<Domain, Range> coalesce() const;
1059  inline typed::map<Domain, Range> curry() const = delete;
1060  inline typed::basic_set<Domain, Range> deltas() const = delete;
1061  inline typed::basic_map<Domain, Range> detect_equalities() const;
1062  inline typed::set<Domain> domain() const;
1063  inline typed::map<Domain, Range> domain_factor_domain() const = delete;
1064  inline typed::map<Domain, Range> domain_factor_range() const = delete;
1065  inline typed::union_map<pair<Domain, Range>, Domain> domain_map() const;
1066  inline typed::union_pw_multi_aff<pair<Domain, Range>, Domain> domain_map_union_pw_multi_aff() const;
1067  template <typename Domain2>
1068  inline typed::map<pair<Domain, Domain2>, Range> domain_product(const typed::map<Domain2, Range> &map2) const;
1069  template <typename Domain2>
1070  inline typed::union_map<pair<Domain, Domain2>, Range> domain_product(const typed::union_map<Domain2, Range> &umap2) const;
1071  inline typed::map<Domain, Range> domain_reverse() const = delete;
1072  inline typed::map<Domain, Range> drop_unused_params() const;
1073  inline typed::map<Domain, Range> eq_at(const typed::multi_pw_aff<> &mpa) const = delete;
1074  inline typed::union_map<Domain, Range> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
1075  inline bool every_map(const std::function<bool(typed::map<Domain, Range>)> &test) const;
1076  inline typed::map<Domain, Range> extract_map(const typed::space<Domain, Range> &space) const;
1077  inline typed::basic_map<Domain, Range> flatten_domain() const = delete;
1078  inline typed::basic_map<Domain, Range> flatten_range() const = delete;
1079  inline void foreach_basic_map(const std::function<void(typed::basic_map<Domain, Range>)> &fn) const;
1080  inline void foreach_map(const std::function<void(typed::map<Domain, Range>)> &fn) const;
1081  inline typed::basic_map<Domain, Range> gist(const typed::basic_map<Domain, Range> &context) const;
1082  inline typed::map<Domain, Range> gist(const typed::map<Domain, Range> &context) const;
1083  inline typed::union_map<Domain, Range> gist(const typed::union_map<Domain, Range> &context) const;
1084  inline typed::map<Domain, Range> gist_domain(const typed::set<Domain> &context) const;
1085  inline typed::union_map<Domain, Range> gist_domain(const typed::union_set<Domain> &uset) const;
1086  inline typed::map<Domain, Range> gist_params(const typed::set<> &context) const;
1087  inline typed::basic_map<Domain, Range> intersect(const typed::basic_map<Domain, Range> &bmap2) const;
1088  inline typed::map<Domain, Range> intersect(const typed::map<Domain, Range> &map2) const;
1089  inline typed::union_map<Domain, Range> intersect(const typed::union_map<Domain, Range> &umap2) const;
1090  inline typed::basic_map<Domain, Range> intersect_domain(const typed::basic_set<Domain> &bset) const;
1091  inline typed::map<Domain, Range> intersect_domain(const typed::set<Domain> &set) const;
1092  inline typed::union_map<Domain, Range> intersect_domain(const typed::space<Domain> &space) const;
1093  inline typed::union_map<Domain, Range> intersect_domain(const typed::union_set<Domain> &uset) const;
1094  inline typed::basic_map<Domain, Range> intersect_domain(const typed::point<Domain> &bset) const;
1095  inline typed::map<Domain, Range> intersect_domain_wrapped_domain(const typed::set<> &domain) const = delete;
1096  inline typed::union_map<Domain, Range> intersect_domain_wrapped_domain(const typed::union_set<> &domain) const = delete;
1097  inline typed::map<Domain, Range> intersect_params(const typed::set<> &params) const;
1098  inline typed::basic_map<Domain, Range> intersect_range(const typed::basic_set<Range> &bset) const;
1099  inline typed::map<Domain, Range> intersect_range(const typed::set<Range> &set) const;
1100  inline typed::union_map<Domain, Range> intersect_range(const typed::space<Range> &space) const;
1101  inline typed::union_map<Domain, Range> intersect_range(const typed::union_set<Range> &uset) const;
1102  inline typed::basic_map<Domain, Range> intersect_range(const typed::point<Range> &bset) const;
1103  inline typed::map<Domain, Range> intersect_range_wrapped_domain(const typed::set<> &domain) const = delete;
1104  inline typed::union_map<Domain, Range> intersect_range_wrapped_domain(const typed::union_set<> &domain) const = delete;
1105  inline typed::map<Domain, Range> lex_ge_at(const typed::multi_pw_aff<> &mpa) const = delete;
1106  inline typed::map<Domain, Range> lex_gt_at(const typed::multi_pw_aff<> &mpa) const = delete;
1107  inline typed::map<Domain, Range> lex_le_at(const typed::multi_pw_aff<> &mpa) const = delete;
1108  inline typed::map<Domain, Range> lex_lt_at(const typed::multi_pw_aff<> &mpa) const = delete;
1109  inline typed::map<Domain, Range> lexmax() const;
1110  inline typed::pw_multi_aff<Domain, Range> lexmax_pw_multi_aff() const;
1111  inline typed::map<Domain, Range> lexmin() const;
1112  inline typed::pw_multi_aff<Domain, Range> lexmin_pw_multi_aff() const;
1113  inline typed::map<Domain, Range> lower_bound(const typed::multi_pw_aff<Domain, Range> &lower) const;
1114  inline typed::map_list<Domain, Range> map_list() const;
1115  inline typed::multi_pw_aff<Domain, Range> max_multi_pw_aff() const;
1116  inline typed::multi_pw_aff<Domain, Range> min_multi_pw_aff() const;
1117  inline typed::set<> params() const;
1118  template <typename Domain2>
1119  inline typed::map<Domain2, Range> preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const;
1120  template <typename Domain2>
1121  inline typed::map<Domain2, Range> preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
1122  template <typename Domain2>
1123  inline typed::map<Domain2, Range> preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
1124  template <typename Domain2>
1125  inline typed::union_map<Domain2, Range> preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
1126  template <typename Range2>
1127  inline typed::map<Domain, Range2> preimage_range(const typed::multi_aff<Range2, Range> &ma) const;
1128  template <typename Range2>
1129  inline typed::map<Domain, Range2> preimage_range(const typed::pw_multi_aff<Range2, Range> &pma) const;
1130  template <typename Range2>
1131  inline typed::union_map<Domain, Range2> preimage_range(const typed::union_pw_multi_aff<Range2, Range> &upma) const;
1132  template <typename Domain2, typename Range2>
1133  inline typed::map<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::map<Domain2, Range2> &map2) const;
1134  template <typename Domain2, typename Range2>
1135  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::union_map<Domain2, Range2> &umap2) const;
1136  inline typed::map<Domain, Range> project_out_all_params() const;
1137  inline typed::map<Domain, Range> project_out_param(const typed::id<Anonymous> &id) const;
1138  inline typed::map<Domain, Range> project_out_param(const std::string &id) const;
1139  inline typed::map<Domain, Range> project_out_param(const typed::id_list<Anonymous> &list) const;
1140  inline typed::set<Range> range() const;
1141  inline typed::map<Domain, Range> range_factor_domain() const = delete;
1142  inline typed::map<Domain, Range> range_factor_range() const = delete;
1143  inline typed::fixed_box<Domain, Range> range_lattice_tile() const;
1144  inline typed::union_map<pair<Domain, Range>, Range> range_map() const;
1145  template <typename Range2>
1146  inline typed::map<Domain, pair<Range, Range2>> range_product(const typed::map<Domain, Range2> &map2) const;
1147  template <typename Range2>
1148  inline typed::union_map<Domain, pair<Range, Range2>> range_product(const typed::union_map<Domain, Range2> &umap2) const;
1149  inline typed::map<Domain, Range> range_reverse() const = delete;
1150  inline typed::fixed_box<Domain, Range> range_simple_fixed_box_hull() const;
1151  inline typed::basic_map<Range, Domain> reverse() const;
1152  template <typename Domain2>
1153  inline typed::map<Domain2, Range> set_domain_tuple(const typed::id<Anonymous> &id) const;
1154  template <typename Domain2>
1155  inline typed::map<Domain2, Range> set_domain_tuple(const std::string &id) const;
1156  template <typename Range2>
1157  inline typed::map<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
1158  template <typename Range2>
1159  inline typed::map<Domain, Range2> set_range_tuple(const std::string &id) const;
1160  inline typed::space<Domain, Range> space() const;
1161  inline typed::map<Domain, Range> subtract(const typed::map<Domain, Range> &map2) const;
1162  inline typed::union_map<Domain, Range> subtract(const typed::union_map<Domain, Range> &umap2) const;
1163  inline typed::union_map<Domain, Range> subtract_domain(const typed::union_set<Domain> &dom) const;
1164  inline typed::union_map<Domain, Range> subtract_range(const typed::union_set<Range> &dom) const;
1165  inline typed::union_map<Domain, Range> to_union_map() const;
1166  inline typed::map<Domain, Range> uncurry() const = delete;
1167  inline typed::map<Domain, Range> unite(const typed::basic_map<Domain, Range> &bmap2) const;
1168  inline typed::map<Domain, Range> unite(const typed::map<Domain, Range> &map2) const;
1169  inline typed::union_map<Domain, Range> unite(const typed::union_map<Domain, Range> &umap2) const;
1170  inline typed::map<Domain, Range> upper_bound(const typed::multi_pw_aff<Domain, Range> &upper) const;
1171  inline typed::set<pair<Domain, Range>> wrap() const;
1172};
1173
1174template <typename Domain, typename Range, typename Range2>
1175struct basic_map<pair<Domain, Range>, Range2> : public isl::basic_map {
1176  template <typename...>
1177  friend struct aff;
1178  template <typename...>
1179  friend struct aff_list;
1180  template <typename...>
1181  friend struct basic_map;
1182  template <typename...>
1183  friend struct basic_set;
1184  template <typename...>
1185  friend struct fixed_box;
1186  template <typename...>
1187  friend struct id;
1188  template <typename...>
1189  friend struct id_list;
1190  template <typename...>
1191  friend struct map;
1192  template <typename...>
1193  friend struct map_list;
1194  template <typename...>
1195  friend struct multi_aff;
1196  template <typename...>
1197  friend struct multi_id;
1198  template <typename...>
1199  friend struct multi_pw_aff;
1200  template <typename...>
1201  friend struct multi_union_pw_aff;
1202  template <typename...>
1203  friend struct multi_val;
1204  template <typename...>
1205  friend struct point;
1206  template <typename...>
1207  friend struct pw_aff;
1208  template <typename...>
1209  friend struct pw_aff_list;
1210  template <typename...>
1211  friend struct pw_multi_aff;
1212  template <typename...>
1213  friend struct pw_multi_aff_list;
1214  template <typename...>
1215  friend struct set;
1216  template <typename...>
1217  friend struct set_list;
1218  template <typename...>
1219  friend struct space;
1220  template <typename...>
1221  friend struct union_map;
1222  template <typename...>
1223  friend struct union_pw_aff;
1224  template <typename...>
1225  friend struct union_pw_aff_list;
1226  template <typename...>
1227  friend struct union_pw_multi_aff;
1228  template <typename...>
1229  friend struct union_set;
1230  template <typename...>
1231  friend struct union_set_list;
1232  template <typename...>
1233  friend struct val;
1234  template <typename...>
1235  friend struct val_list;
1236
1237  basic_map() = default;
1238  template <typename Arg1, typename Arg2, typename Arg3,
1239            typename std::enable_if<
1240              std::is_base_of<Domain, Arg1>{} &&
1241              std::is_base_of<Range, Arg2>{} &&
1242              std::is_base_of<Range2, Arg3>{},
1243            bool>::type = true>
1244  basic_map(const basic_map<pair<Arg1, Arg2>, Arg3> &obj) : isl::basic_map(obj) {}
1245 private:
1246  template <typename base,
1247            typename std::enable_if<
1248              std::is_same<base, isl::basic_map>{}, bool>::type = true>
1249  basic_map(const base &obj) : isl::basic_map(obj) {}
1250 public:
1251  static basic_map from(const isl::basic_map &obj) {
1252    return basic_map(obj);
1253  }
1254  inline explicit basic_map(const isl::ctx &ctx, const std::string &str);
1255  template <typename Domain2>
1256  inline typed::basic_map<Domain2, Range2> apply_domain(const typed::basic_map<pair<Domain, Range>, Domain2> &bmap2) const;
1257  template <typename Domain2>
1258  inline typed::map<Domain2, Range2> apply_domain(const typed::map<pair<Domain, Range>, Domain2> &map2) const;
1259  template <typename Domain2>
1260  inline typed::union_map<Domain2, Range2> apply_domain(const typed::union_map<pair<Domain, Range>, Domain2> &umap2) const;
1261  template <typename Arg3>
1262  inline typed::basic_map<pair<Domain, Range>, Arg3> apply_range(const typed::basic_map<Range2, Arg3> &bmap2) const;
1263  template <typename Arg3>
1264  inline typed::map<pair<Domain, Range>, Arg3> apply_range(const typed::map<Range2, Arg3> &map2) const;
1265  template <typename Arg3>
1266  inline typed::union_map<pair<Domain, Range>, Arg3> apply_range(const typed::union_map<Range2, Arg3> &umap2) const;
1267  inline typed::map<pair<Domain, Range>, Range2> as_map() const;
1268  inline typed::multi_union_pw_aff<pair<Domain, Range>, Range2> as_multi_union_pw_aff() const;
1269  inline typed::pw_multi_aff<pair<Domain, Range>, Range2> as_pw_multi_aff() const;
1270  inline typed::union_pw_multi_aff<pair<Domain, Range>, Range2> as_union_pw_multi_aff() const;
1271  inline typed::set<Range2> bind_domain(const typed::multi_id<pair<Domain, Range>> &tuple) const;
1272  inline typed::set<pair<Domain, Range>> bind_range(const typed::multi_id<Range2> &tuple) const;
1273  inline typed::map<pair<Domain, Range>, Range2> coalesce() const;
1274  inline typed::map<Domain, pair<Range, Range2>> curry() const;
1275  inline typed::basic_set<pair<Domain, Range>, Range2> deltas() const = delete;
1276  inline typed::basic_map<pair<Domain, Range>, Range2> detect_equalities() const;
1277  inline typed::set<pair<Domain, Range>> domain() const;
1278  inline typed::map<Domain, Range2> domain_factor_domain() const;
1279  inline typed::map<Range, Range2> domain_factor_range() const;
1280  inline typed::union_map<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> domain_map() const;
1281  inline typed::union_pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> domain_map_union_pw_multi_aff() const;
1282  template <typename Domain2>
1283  inline typed::map<pair<pair<Domain, Range>, Domain2>, Range2> domain_product(const typed::map<Domain2, Range2> &map2) const;
1284  template <typename Domain2>
1285  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> domain_product(const typed::union_map<Domain2, Range2> &umap2) const;
1286  inline typed::map<pair<Range, Domain>, Range2> domain_reverse() const;
1287  inline typed::map<pair<Domain, Range>, Range2> drop_unused_params() const;
1288  inline typed::map<pair<Domain, Range>, Range2> eq_at(const typed::multi_pw_aff<> &mpa) const = delete;
1289  inline typed::union_map<pair<Domain, Range>, Range2> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
1290  inline bool every_map(const std::function<bool(typed::map<pair<Domain, Range>, Range2>)> &test) const;
1291  inline typed::map<pair<Domain, Range>, Range2> extract_map(const typed::space<pair<Domain, Range>, Range2> &space) const;
1292  inline typed::basic_map<Anonymous, Range2> flatten_domain() const;
1293  inline typed::basic_map<pair<Domain, Range>, Range2> flatten_range() const = delete;
1294  inline void foreach_basic_map(const std::function<void(typed::basic_map<pair<Domain, Range>, Range2>)> &fn) const;
1295  inline void foreach_map(const std::function<void(typed::map<pair<Domain, Range>, Range2>)> &fn) const;
1296  inline typed::basic_map<pair<Domain, Range>, Range2> gist(const typed::basic_map<pair<Domain, Range>, Range2> &context) const;
1297  inline typed::map<pair<Domain, Range>, Range2> gist(const typed::map<pair<Domain, Range>, Range2> &context) const;
1298  inline typed::union_map<pair<Domain, Range>, Range2> gist(const typed::union_map<pair<Domain, Range>, Range2> &context) const;
1299  inline typed::map<pair<Domain, Range>, Range2> gist_domain(const typed::set<pair<Domain, Range>> &context) const;
1300  inline typed::union_map<pair<Domain, Range>, Range2> gist_domain(const typed::union_set<pair<Domain, Range>> &uset) const;
1301  inline typed::map<pair<Domain, Range>, Range2> gist_params(const typed::set<> &context) const;
1302  inline typed::basic_map<pair<Domain, Range>, Range2> intersect(const typed::basic_map<pair<Domain, Range>, Range2> &bmap2) const;
1303  inline typed::map<pair<Domain, Range>, Range2> intersect(const typed::map<pair<Domain, Range>, Range2> &map2) const;
1304  inline typed::union_map<pair<Domain, Range>, Range2> intersect(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const;
1305  inline typed::basic_map<pair<Domain, Range>, Range2> intersect_domain(const typed::basic_set<pair<Domain, Range>> &bset) const;
1306  inline typed::map<pair<Domain, Range>, Range2> intersect_domain(const typed::set<pair<Domain, Range>> &set) const;
1307  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain(const typed::space<pair<Domain, Range>> &space) const;
1308  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain(const typed::union_set<pair<Domain, Range>> &uset) const;
1309  inline typed::basic_map<pair<Domain, Range>, Range2> intersect_domain(const typed::point<pair<Domain, Range>> &bset) const;
1310  inline typed::map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::set<Domain> &domain) const;
1311  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::union_set<Domain> &domain) const;
1312  inline typed::map<pair<Domain, Range>, Range2> intersect_params(const typed::set<> &params) const;
1313  inline typed::basic_map<pair<Domain, Range>, Range2> intersect_range(const typed::basic_set<Range2> &bset) const;
1314  inline typed::map<pair<Domain, Range>, Range2> intersect_range(const typed::set<Range2> &set) const;
1315  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range(const typed::space<Range2> &space) const;
1316  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range(const typed::union_set<Range2> &uset) const;
1317  inline typed::basic_map<pair<Domain, Range>, Range2> intersect_range(const typed::point<Range2> &bset) const;
1318  inline typed::map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::set<> &domain) const = delete;
1319  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::union_set<> &domain) const = delete;
1320  inline typed::map<pair<Domain, Range>, Range2> lex_ge_at(const typed::multi_pw_aff<> &mpa) const = delete;
1321  inline typed::map<pair<Domain, Range>, Range2> lex_gt_at(const typed::multi_pw_aff<> &mpa) const = delete;
1322  inline typed::map<pair<Domain, Range>, Range2> lex_le_at(const typed::multi_pw_aff<> &mpa) const = delete;
1323  inline typed::map<pair<Domain, Range>, Range2> lex_lt_at(const typed::multi_pw_aff<> &mpa) const = delete;
1324  inline typed::map<pair<Domain, Range>, Range2> lexmax() const;
1325  inline typed::pw_multi_aff<pair<Domain, Range>, Range2> lexmax_pw_multi_aff() const;
1326  inline typed::map<pair<Domain, Range>, Range2> lexmin() const;
1327  inline typed::pw_multi_aff<pair<Domain, Range>, Range2> lexmin_pw_multi_aff() const;
1328  inline typed::map<pair<Domain, Range>, Range2> lower_bound(const typed::multi_pw_aff<pair<Domain, Range>, Range2> &lower) const;
1329  inline typed::map_list<pair<Domain, Range>, Range2> map_list() const;
1330  inline typed::multi_pw_aff<pair<Domain, Range>, Range2> max_multi_pw_aff() const;
1331  inline typed::multi_pw_aff<pair<Domain, Range>, Range2> min_multi_pw_aff() const;
1332  inline typed::set<> params() const;
1333  template <typename Domain2>
1334  inline typed::map<Domain2, Range2> preimage_domain(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const;
1335  template <typename Domain2>
1336  inline typed::map<Domain2, Range2> preimage_domain(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const;
1337  template <typename Domain2>
1338  inline typed::map<Domain2, Range2> preimage_domain(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const;
1339  template <typename Domain2>
1340  inline typed::union_map<Domain2, Range2> preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const;
1341  template <typename Arg3>
1342  inline typed::map<pair<Domain, Range>, Arg3> preimage_range(const typed::multi_aff<Arg3, Range2> &ma) const;
1343  template <typename Arg3>
1344  inline typed::map<pair<Domain, Range>, Arg3> preimage_range(const typed::pw_multi_aff<Arg3, Range2> &pma) const;
1345  template <typename Arg3>
1346  inline typed::union_map<pair<Domain, Range>, Arg3> preimage_range(const typed::union_pw_multi_aff<Arg3, Range2> &upma) const;
1347  template <typename Domain2, typename Arg3>
1348  inline typed::map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> product(const typed::map<Domain2, Arg3> &map2) const;
1349  template <typename Domain2, typename Arg3>
1350  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> product(const typed::union_map<Domain2, Arg3> &umap2) const;
1351  inline typed::map<pair<Domain, Range>, Range2> project_out_all_params() const;
1352  inline typed::map<pair<Domain, Range>, Range2> project_out_param(const typed::id<Anonymous> &id) const;
1353  inline typed::map<pair<Domain, Range>, Range2> project_out_param(const std::string &id) const;
1354  inline typed::map<pair<Domain, Range>, Range2> project_out_param(const typed::id_list<Anonymous> &list) const;
1355  inline typed::set<Range2> range() const;
1356  inline typed::map<pair<Domain, Range>, Range2> range_factor_domain() const = delete;
1357  inline typed::map<pair<Domain, Range>, Range2> range_factor_range() const = delete;
1358  inline typed::fixed_box<pair<Domain, Range>, Range2> range_lattice_tile() const;
1359  inline typed::union_map<pair<pair<Domain, Range>, Range2>, Range2> range_map() const;
1360  template <typename Arg3>
1361  inline typed::map<pair<Domain, Range>, pair<Range2, Arg3>> range_product(const typed::map<pair<Domain, Range>, Arg3> &map2) const;
1362  template <typename Arg3>
1363  inline typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> range_product(const typed::union_map<pair<Domain, Range>, Arg3> &umap2) const;
1364  inline typed::map<pair<Domain, Range>, Range2> range_reverse() const = delete;
1365  inline typed::fixed_box<pair<Domain, Range>, Range2> range_simple_fixed_box_hull() const;
1366  inline typed::basic_map<Range2, pair<Domain, Range>> reverse() const;
1367  inline typed::map<pair<Domain, Range>, Range2> set_domain_tuple(const typed::id<> &id) const = delete;
1368  inline typed::map<pair<Domain, Range>, Range2> set_domain_tuple(const std::string &id) const = delete;
1369  template <typename Arg2>
1370  inline typed::map<pair<Domain, Range>, Arg2> set_range_tuple(const typed::id<Anonymous> &id) const;
1371  template <typename Arg2>
1372  inline typed::map<pair<Domain, Range>, Arg2> set_range_tuple(const std::string &id) const;
1373  inline typed::space<pair<Domain, Range>, Range2> space() const;
1374  inline typed::map<pair<Domain, Range>, Range2> subtract(const typed::map<pair<Domain, Range>, Range2> &map2) const;
1375  inline typed::union_map<pair<Domain, Range>, Range2> subtract(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const;
1376  inline typed::union_map<pair<Domain, Range>, Range2> subtract_domain(const typed::union_set<pair<Domain, Range>> &dom) const;
1377  inline typed::union_map<pair<Domain, Range>, Range2> subtract_range(const typed::union_set<Range2> &dom) const;
1378  inline typed::union_map<pair<Domain, Range>, Range2> to_union_map() const;
1379  inline typed::map<pair<Domain, Range>, Range2> uncurry() const = delete;
1380  inline typed::map<pair<Domain, Range>, Range2> unite(const typed::basic_map<pair<Domain, Range>, Range2> &bmap2) const;
1381  inline typed::map<pair<Domain, Range>, Range2> unite(const typed::map<pair<Domain, Range>, Range2> &map2) const;
1382  inline typed::union_map<pair<Domain, Range>, Range2> unite(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const;
1383  inline typed::map<pair<Domain, Range>, Range2> upper_bound(const typed::multi_pw_aff<pair<Domain, Range>, Range2> &upper) const;
1384  inline typed::set<pair<pair<Domain, Range>, Range2>> wrap() const;
1385};
1386
1387template <typename Domain>
1388struct basic_map<Domain, Domain> : public isl::basic_map {
1389  template <typename...>
1390  friend struct aff;
1391  template <typename...>
1392  friend struct aff_list;
1393  template <typename...>
1394  friend struct basic_map;
1395  template <typename...>
1396  friend struct basic_set;
1397  template <typename...>
1398  friend struct fixed_box;
1399  template <typename...>
1400  friend struct id;
1401  template <typename...>
1402  friend struct id_list;
1403  template <typename...>
1404  friend struct map;
1405  template <typename...>
1406  friend struct map_list;
1407  template <typename...>
1408  friend struct multi_aff;
1409  template <typename...>
1410  friend struct multi_id;
1411  template <typename...>
1412  friend struct multi_pw_aff;
1413  template <typename...>
1414  friend struct multi_union_pw_aff;
1415  template <typename...>
1416  friend struct multi_val;
1417  template <typename...>
1418  friend struct point;
1419  template <typename...>
1420  friend struct pw_aff;
1421  template <typename...>
1422  friend struct pw_aff_list;
1423  template <typename...>
1424  friend struct pw_multi_aff;
1425  template <typename...>
1426  friend struct pw_multi_aff_list;
1427  template <typename...>
1428  friend struct set;
1429  template <typename...>
1430  friend struct set_list;
1431  template <typename...>
1432  friend struct space;
1433  template <typename...>
1434  friend struct union_map;
1435  template <typename...>
1436  friend struct union_pw_aff;
1437  template <typename...>
1438  friend struct union_pw_aff_list;
1439  template <typename...>
1440  friend struct union_pw_multi_aff;
1441  template <typename...>
1442  friend struct union_set;
1443  template <typename...>
1444  friend struct union_set_list;
1445  template <typename...>
1446  friend struct val;
1447  template <typename...>
1448  friend struct val_list;
1449
1450  basic_map() = default;
1451  template <typename Arg1,
1452            typename std::enable_if<
1453              std::is_base_of<Domain, Arg1>{},
1454            bool>::type = true>
1455  basic_map(const basic_map<Arg1, Arg1> &obj) : isl::basic_map(obj) {}
1456 private:
1457  template <typename base,
1458            typename std::enable_if<
1459              std::is_same<base, isl::basic_map>{}, bool>::type = true>
1460  basic_map(const base &obj) : isl::basic_map(obj) {}
1461 public:
1462  static basic_map from(const isl::basic_map &obj) {
1463    return basic_map(obj);
1464  }
1465  inline explicit basic_map(const isl::ctx &ctx, const std::string &str);
1466  template <typename Domain2>
1467  inline typed::basic_map<Domain2, Domain> apply_domain(const typed::basic_map<Domain, Domain2> &bmap2) const;
1468  template <typename Domain2>
1469  inline typed::map<Domain2, Domain> apply_domain(const typed::map<Domain, Domain2> &map2) const;
1470  template <typename Domain2>
1471  inline typed::union_map<Domain2, Domain> apply_domain(const typed::union_map<Domain, Domain2> &umap2) const;
1472  template <typename Range2>
1473  inline typed::basic_map<Domain, Range2> apply_range(const typed::basic_map<Domain, Range2> &bmap2) const;
1474  template <typename Range2>
1475  inline typed::map<Domain, Range2> apply_range(const typed::map<Domain, Range2> &map2) const;
1476  template <typename Range2>
1477  inline typed::union_map<Domain, Range2> apply_range(const typed::union_map<Domain, Range2> &umap2) const;
1478  inline typed::map<Domain, Domain> as_map() const;
1479  inline typed::multi_union_pw_aff<Domain, Domain> as_multi_union_pw_aff() const;
1480  inline typed::pw_multi_aff<Domain, Domain> as_pw_multi_aff() const;
1481  inline typed::union_pw_multi_aff<Domain, Domain> as_union_pw_multi_aff() const;
1482  inline typed::set<Domain> bind_domain(const typed::multi_id<Domain> &tuple) const;
1483  inline typed::set<Domain> bind_range(const typed::multi_id<Domain> &tuple) const;
1484  inline typed::map<Domain, Domain> coalesce() const;
1485  inline typed::map<Domain, Domain> curry() const = delete;
1486  inline typed::basic_set<Domain> deltas() const;
1487  inline typed::basic_map<Domain, Domain> detect_equalities() const;
1488  inline typed::set<Domain> domain() const;
1489  inline typed::map<Domain, Domain> domain_factor_domain() const = delete;
1490  inline typed::map<Domain, Domain> domain_factor_range() const = delete;
1491  inline typed::union_map<pair<Domain, Domain>, Domain> domain_map() const;
1492  inline typed::union_pw_multi_aff<pair<Domain, Domain>, Domain> domain_map_union_pw_multi_aff() const;
1493  template <typename Domain2>
1494  inline typed::map<pair<Domain, Domain2>, Domain> domain_product(const typed::map<Domain2, Domain> &map2) const;
1495  template <typename Domain2>
1496  inline typed::union_map<pair<Domain, Domain2>, Domain> domain_product(const typed::union_map<Domain2, Domain> &umap2) const;
1497  inline typed::map<Domain, Domain> domain_reverse() const = delete;
1498  inline typed::map<Domain, Domain> drop_unused_params() const;
1499  template <typename Range>
1500  inline typed::map<Domain, Domain> eq_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
1501  template <typename Range>
1502  inline typed::union_map<Domain, Domain> eq_at(const typed::multi_union_pw_aff<Domain, Range> &mupa) const;
1503  inline bool every_map(const std::function<bool(typed::map<Domain, Domain>)> &test) const;
1504  inline typed::map<Domain, Domain> extract_map(const typed::space<Domain, Domain> &space) const;
1505  inline typed::basic_map<Domain, Domain> flatten_domain() const = delete;
1506  inline typed::basic_map<Domain, Domain> flatten_range() const = delete;
1507  inline void foreach_basic_map(const std::function<void(typed::basic_map<Domain, Domain>)> &fn) const;
1508  inline void foreach_map(const std::function<void(typed::map<Domain, Domain>)> &fn) const;
1509  inline typed::basic_map<Domain, Domain> gist(const typed::basic_map<Domain, Domain> &context) const;
1510  inline typed::map<Domain, Domain> gist(const typed::map<Domain, Domain> &context) const;
1511  inline typed::union_map<Domain, Domain> gist(const typed::union_map<Domain, Domain> &context) const;
1512  inline typed::map<Domain, Domain> gist_domain(const typed::set<Domain> &context) const;
1513  inline typed::union_map<Domain, Domain> gist_domain(const typed::union_set<Domain> &uset) const;
1514  inline typed::map<Domain, Domain> gist_params(const typed::set<> &context) const;
1515  inline typed::basic_map<Domain, Domain> intersect(const typed::basic_map<Domain, Domain> &bmap2) const;
1516  inline typed::map<Domain, Domain> intersect(const typed::map<Domain, Domain> &map2) const;
1517  inline typed::union_map<Domain, Domain> intersect(const typed::union_map<Domain, Domain> &umap2) const;
1518  inline typed::basic_map<Domain, Domain> intersect_domain(const typed::basic_set<Domain> &bset) const;
1519  inline typed::map<Domain, Domain> intersect_domain(const typed::set<Domain> &set) const;
1520  inline typed::union_map<Domain, Domain> intersect_domain(const typed::space<Domain> &space) const;
1521  inline typed::union_map<Domain, Domain> intersect_domain(const typed::union_set<Domain> &uset) const;
1522  inline typed::basic_map<Domain, Domain> intersect_domain(const typed::point<Domain> &bset) const;
1523  inline typed::map<Domain, Domain> intersect_domain_wrapped_domain(const typed::set<> &domain) const = delete;
1524  inline typed::union_map<Domain, Domain> intersect_domain_wrapped_domain(const typed::union_set<> &domain) const = delete;
1525  inline typed::map<Domain, Domain> intersect_params(const typed::set<> &params) const;
1526  inline typed::basic_map<Domain, Domain> intersect_range(const typed::basic_set<Domain> &bset) const;
1527  inline typed::map<Domain, Domain> intersect_range(const typed::set<Domain> &set) const;
1528  inline typed::union_map<Domain, Domain> intersect_range(const typed::space<Domain> &space) const;
1529  inline typed::union_map<Domain, Domain> intersect_range(const typed::union_set<Domain> &uset) const;
1530  inline typed::basic_map<Domain, Domain> intersect_range(const typed::point<Domain> &bset) const;
1531  inline typed::map<Domain, Domain> intersect_range_wrapped_domain(const typed::set<> &domain) const = delete;
1532  inline typed::union_map<Domain, Domain> intersect_range_wrapped_domain(const typed::union_set<> &domain) const = delete;
1533  template <typename Range>
1534  inline typed::map<Domain, Domain> lex_ge_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
1535  template <typename Range>
1536  inline typed::map<Domain, Domain> lex_gt_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
1537  template <typename Range>
1538  inline typed::map<Domain, Domain> lex_le_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
1539  template <typename Range>
1540  inline typed::map<Domain, Domain> lex_lt_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
1541  inline typed::map<Domain, Domain> lexmax() const;
1542  inline typed::pw_multi_aff<Domain, Domain> lexmax_pw_multi_aff() const;
1543  inline typed::map<Domain, Domain> lexmin() const;
1544  inline typed::pw_multi_aff<Domain, Domain> lexmin_pw_multi_aff() const;
1545  inline typed::map<Domain, Domain> lower_bound(const typed::multi_pw_aff<Domain, Domain> &lower) const;
1546  inline typed::map_list<Domain, Domain> map_list() const;
1547  inline typed::multi_pw_aff<Domain, Domain> max_multi_pw_aff() const;
1548  inline typed::multi_pw_aff<Domain, Domain> min_multi_pw_aff() const;
1549  inline typed::set<> params() const;
1550  template <typename Domain2>
1551  inline typed::map<Domain2, Domain> preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const;
1552  template <typename Domain2>
1553  inline typed::map<Domain2, Domain> preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
1554  template <typename Domain2>
1555  inline typed::map<Domain2, Domain> preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
1556  template <typename Domain2>
1557  inline typed::union_map<Domain2, Domain> preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
1558  template <typename Range2>
1559  inline typed::map<Domain, Range2> preimage_range(const typed::multi_aff<Range2, Domain> &ma) const;
1560  template <typename Range2>
1561  inline typed::map<Domain, Range2> preimage_range(const typed::pw_multi_aff<Range2, Domain> &pma) const;
1562  template <typename Range2>
1563  inline typed::union_map<Domain, Range2> preimage_range(const typed::union_pw_multi_aff<Range2, Domain> &upma) const;
1564  template <typename Domain2, typename Range2>
1565  inline typed::map<pair<Domain, Domain2>, pair<Domain, Range2>> product(const typed::map<Domain2, Range2> &map2) const;
1566  template <typename Domain2, typename Range2>
1567  inline typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> product(const typed::union_map<Domain2, Range2> &umap2) const;
1568  inline typed::map<Domain, Domain> project_out_all_params() const;
1569  inline typed::map<Domain, Domain> project_out_param(const typed::id<Anonymous> &id) const;
1570  inline typed::map<Domain, Domain> project_out_param(const std::string &id) const;
1571  inline typed::map<Domain, Domain> project_out_param(const typed::id_list<Anonymous> &list) const;
1572  inline typed::set<Domain> range() const;
1573  inline typed::map<Domain, Domain> range_factor_domain() const = delete;
1574  inline typed::map<Domain, Domain> range_factor_range() const = delete;
1575  inline typed::fixed_box<Domain, Domain> range_lattice_tile() const;
1576  inline typed::union_map<pair<Domain, Domain>, Domain> range_map() const;
1577  template <typename Range2>
1578  inline typed::map<Domain, pair<Domain, Range2>> range_product(const typed::map<Domain, Range2> &map2) const;
1579  template <typename Range2>
1580  inline typed::union_map<Domain, pair<Domain, Range2>> range_product(const typed::union_map<Domain, Range2> &umap2) const;
1581  inline typed::map<Domain, Domain> range_reverse() const = delete;
1582  inline typed::fixed_box<Domain, Domain> range_simple_fixed_box_hull() const;
1583  inline typed::basic_map<Domain, Domain> reverse() const;
1584  template <typename Domain2>
1585  inline typed::map<Domain2, Domain> set_domain_tuple(const typed::id<Anonymous> &id) const;
1586  template <typename Domain2>
1587  inline typed::map<Domain2, Domain> set_domain_tuple(const std::string &id) const;
1588  template <typename Range2>
1589  inline typed::map<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
1590  template <typename Range2>
1591  inline typed::map<Domain, Range2> set_range_tuple(const std::string &id) const;
1592  inline typed::space<Domain, Domain> space() const;
1593  inline typed::map<Domain, Domain> subtract(const typed::map<Domain, Domain> &map2) const;
1594  inline typed::union_map<Domain, Domain> subtract(const typed::union_map<Domain, Domain> &umap2) const;
1595  inline typed::union_map<Domain, Domain> subtract_domain(const typed::union_set<Domain> &dom) const;
1596  inline typed::union_map<Domain, Domain> subtract_range(const typed::union_set<Domain> &dom) const;
1597  inline typed::union_map<Domain, Domain> to_union_map() const;
1598  inline typed::map<Domain, Domain> uncurry() const = delete;
1599  inline typed::map<Domain, Domain> unite(const typed::basic_map<Domain, Domain> &bmap2) const;
1600  inline typed::map<Domain, Domain> unite(const typed::map<Domain, Domain> &map2) const;
1601  inline typed::union_map<Domain, Domain> unite(const typed::union_map<Domain, Domain> &umap2) const;
1602  inline typed::map<Domain, Domain> upper_bound(const typed::multi_pw_aff<Domain, Domain> &upper) const;
1603  inline typed::set<pair<Domain, Domain>> wrap() const;
1604};
1605
1606template <typename Domain, typename Range, typename Range2>
1607struct basic_map<Domain, pair<Range, Range2>> : public isl::basic_map {
1608  template <typename...>
1609  friend struct aff;
1610  template <typename...>
1611  friend struct aff_list;
1612  template <typename...>
1613  friend struct basic_map;
1614  template <typename...>
1615  friend struct basic_set;
1616  template <typename...>
1617  friend struct fixed_box;
1618  template <typename...>
1619  friend struct id;
1620  template <typename...>
1621  friend struct id_list;
1622  template <typename...>
1623  friend struct map;
1624  template <typename...>
1625  friend struct map_list;
1626  template <typename...>
1627  friend struct multi_aff;
1628  template <typename...>
1629  friend struct multi_id;
1630  template <typename...>
1631  friend struct multi_pw_aff;
1632  template <typename...>
1633  friend struct multi_union_pw_aff;
1634  template <typename...>
1635  friend struct multi_val;
1636  template <typename...>
1637  friend struct point;
1638  template <typename...>
1639  friend struct pw_aff;
1640  template <typename...>
1641  friend struct pw_aff_list;
1642  template <typename...>
1643  friend struct pw_multi_aff;
1644  template <typename...>
1645  friend struct pw_multi_aff_list;
1646  template <typename...>
1647  friend struct set;
1648  template <typename...>
1649  friend struct set_list;
1650  template <typename...>
1651  friend struct space;
1652  template <typename...>
1653  friend struct union_map;
1654  template <typename...>
1655  friend struct union_pw_aff;
1656  template <typename...>
1657  friend struct union_pw_aff_list;
1658  template <typename...>
1659  friend struct union_pw_multi_aff;
1660  template <typename...>
1661  friend struct union_set;
1662  template <typename...>
1663  friend struct union_set_list;
1664  template <typename...>
1665  friend struct val;
1666  template <typename...>
1667  friend struct val_list;
1668
1669  basic_map() = default;
1670  template <typename Arg1, typename Arg2, typename Arg3,
1671            typename std::enable_if<
1672              std::is_base_of<Domain, Arg1>{} &&
1673              std::is_base_of<Range, Arg2>{} &&
1674              std::is_base_of<Range2, Arg3>{},
1675            bool>::type = true>
1676  basic_map(const basic_map<Arg1, pair<Arg2, Arg3>> &obj) : isl::basic_map(obj) {}
1677 private:
1678  template <typename base,
1679            typename std::enable_if<
1680              std::is_same<base, isl::basic_map>{}, bool>::type = true>
1681  basic_map(const base &obj) : isl::basic_map(obj) {}
1682 public:
1683  static basic_map from(const isl::basic_map &obj) {
1684    return basic_map(obj);
1685  }
1686  inline explicit basic_map(const isl::ctx &ctx, const std::string &str);
1687  template <typename Domain2>
1688  inline typed::basic_map<Domain2, pair<Range, Range2>> apply_domain(const typed::basic_map<Domain, Domain2> &bmap2) const;
1689  template <typename Domain2>
1690  inline typed::map<Domain2, pair<Range, Range2>> apply_domain(const typed::map<Domain, Domain2> &map2) const;
1691  template <typename Domain2>
1692  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::union_map<Domain, Domain2> &umap2) const;
1693  template <typename Arg3>
1694  inline typed::basic_map<Domain, Arg3> apply_range(const typed::basic_map<pair<Range, Range2>, Arg3> &bmap2) const;
1695  template <typename Arg3>
1696  inline typed::map<Domain, Arg3> apply_range(const typed::map<pair<Range, Range2>, Arg3> &map2) const;
1697  template <typename Arg3>
1698  inline typed::union_map<Domain, Arg3> apply_range(const typed::union_map<pair<Range, Range2>, Arg3> &umap2) const;
1699  inline typed::map<Domain, pair<Range, Range2>> as_map() const;
1700  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> as_multi_union_pw_aff() const;
1701  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> as_pw_multi_aff() const;
1702  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> as_union_pw_multi_aff() const;
1703  inline typed::set<pair<Range, Range2>> bind_domain(const typed::multi_id<Domain> &tuple) const;
1704  inline typed::set<Domain> bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const;
1705  inline typed::map<Domain, pair<Range, Range2>> coalesce() const;
1706  inline typed::map<Domain, pair<Range, Range2>> curry() const = delete;
1707  inline typed::basic_set<Domain, pair<Range, Range2>> deltas() const = delete;
1708  inline typed::basic_map<Domain, pair<Range, Range2>> detect_equalities() const;
1709  inline typed::set<Domain> domain() const;
1710  inline typed::map<Domain, pair<Range, Range2>> domain_factor_domain() const = delete;
1711  inline typed::map<Domain, pair<Range, Range2>> domain_factor_range() const = delete;
1712  inline typed::union_map<pair<Domain, pair<Range, Range2>>, Domain> domain_map() const;
1713  inline typed::union_pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain> domain_map_union_pw_multi_aff() const;
1714  template <typename Domain2>
1715  inline typed::map<pair<Domain, Domain2>, pair<Range, Range2>> domain_product(const typed::map<Domain2, pair<Range, Range2>> &map2) const;
1716  template <typename Domain2>
1717  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const;
1718  inline typed::map<Domain, pair<Range, Range2>> domain_reverse() const = delete;
1719  inline typed::map<Domain, pair<Range, Range2>> drop_unused_params() const;
1720  inline typed::map<Domain, pair<Range, Range2>> eq_at(const typed::multi_pw_aff<> &mpa) const = delete;
1721  inline typed::union_map<Domain, pair<Range, Range2>> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
1722  inline bool every_map(const std::function<bool(typed::map<Domain, pair<Range, Range2>>)> &test) const;
1723  inline typed::map<Domain, pair<Range, Range2>> extract_map(const typed::space<Domain, pair<Range, Range2>> &space) const;
1724  inline typed::basic_map<Domain, pair<Range, Range2>> flatten_domain() const = delete;
1725  inline typed::basic_map<Domain, Anonymous> flatten_range() const;
1726  inline void foreach_basic_map(const std::function<void(typed::basic_map<Domain, pair<Range, Range2>>)> &fn) const;
1727  inline void foreach_map(const std::function<void(typed::map<Domain, pair<Range, Range2>>)> &fn) const;
1728  inline typed::basic_map<Domain, pair<Range, Range2>> gist(const typed::basic_map<Domain, pair<Range, Range2>> &context) const;
1729  inline typed::map<Domain, pair<Range, Range2>> gist(const typed::map<Domain, pair<Range, Range2>> &context) const;
1730  inline typed::union_map<Domain, pair<Range, Range2>> gist(const typed::union_map<Domain, pair<Range, Range2>> &context) const;
1731  inline typed::map<Domain, pair<Range, Range2>> gist_domain(const typed::set<Domain> &context) const;
1732  inline typed::union_map<Domain, pair<Range, Range2>> gist_domain(const typed::union_set<Domain> &uset) const;
1733  inline typed::map<Domain, pair<Range, Range2>> gist_params(const typed::set<> &context) const;
1734  inline typed::basic_map<Domain, pair<Range, Range2>> intersect(const typed::basic_map<Domain, pair<Range, Range2>> &bmap2) const;
1735  inline typed::map<Domain, pair<Range, Range2>> intersect(const typed::map<Domain, pair<Range, Range2>> &map2) const;
1736  inline typed::union_map<Domain, pair<Range, Range2>> intersect(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const;
1737  inline typed::basic_map<Domain, pair<Range, Range2>> intersect_domain(const typed::basic_set<Domain> &bset) const;
1738  inline typed::map<Domain, pair<Range, Range2>> intersect_domain(const typed::set<Domain> &set) const;
1739  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain(const typed::space<Domain> &space) const;
1740  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain(const typed::union_set<Domain> &uset) const;
1741  inline typed::basic_map<Domain, pair<Range, Range2>> intersect_domain(const typed::point<Domain> &bset) const;
1742  inline typed::map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::set<> &domain) const = delete;
1743  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<> &domain) const = delete;
1744  inline typed::map<Domain, pair<Range, Range2>> intersect_params(const typed::set<> &params) const;
1745  inline typed::basic_map<Domain, pair<Range, Range2>> intersect_range(const typed::basic_set<pair<Range, Range2>> &bset) const;
1746  inline typed::map<Domain, pair<Range, Range2>> intersect_range(const typed::set<pair<Range, Range2>> &set) const;
1747  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range(const typed::space<pair<Range, Range2>> &space) const;
1748  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const;
1749  inline typed::basic_map<Domain, pair<Range, Range2>> intersect_range(const typed::point<pair<Range, Range2>> &bset) const;
1750  inline typed::map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::set<Range> &domain) const;
1751  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const;
1752  inline typed::map<Domain, pair<Range, Range2>> lex_ge_at(const typed::multi_pw_aff<> &mpa) const = delete;
1753  inline typed::map<Domain, pair<Range, Range2>> lex_gt_at(const typed::multi_pw_aff<> &mpa) const = delete;
1754  inline typed::map<Domain, pair<Range, Range2>> lex_le_at(const typed::multi_pw_aff<> &mpa) const = delete;
1755  inline typed::map<Domain, pair<Range, Range2>> lex_lt_at(const typed::multi_pw_aff<> &mpa) const = delete;
1756  inline typed::map<Domain, pair<Range, Range2>> lexmax() const;
1757  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> lexmax_pw_multi_aff() const;
1758  inline typed::map<Domain, pair<Range, Range2>> lexmin() const;
1759  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> lexmin_pw_multi_aff() const;
1760  inline typed::map<Domain, pair<Range, Range2>> lower_bound(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &lower) const;
1761  inline typed::map_list<Domain, pair<Range, Range2>> map_list() const;
1762  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> max_multi_pw_aff() const;
1763  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> min_multi_pw_aff() const;
1764  inline typed::set<> params() const;
1765  template <typename Domain2>
1766  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const;
1767  template <typename Domain2>
1768  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
1769  template <typename Domain2>
1770  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
1771  template <typename Domain2>
1772  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
1773  template <typename Arg3>
1774  inline typed::map<Domain, Arg3> preimage_range(const typed::multi_aff<Arg3, pair<Range, Range2>> &ma) const;
1775  template <typename Arg3>
1776  inline typed::map<Domain, Arg3> preimage_range(const typed::pw_multi_aff<Arg3, pair<Range, Range2>> &pma) const;
1777  template <typename Arg3>
1778  inline typed::union_map<Domain, Arg3> preimage_range(const typed::union_pw_multi_aff<Arg3, pair<Range, Range2>> &upma) const;
1779  template <typename Domain2, typename Arg3>
1780  inline typed::map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::map<Domain2, Arg3> &map2) const;
1781  template <typename Domain2, typename Arg3>
1782  inline typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::union_map<Domain2, Arg3> &umap2) const;
1783  inline typed::map<Domain, pair<Range, Range2>> project_out_all_params() const;
1784  inline typed::map<Domain, pair<Range, Range2>> project_out_param(const typed::id<Anonymous> &id) const;
1785  inline typed::map<Domain, pair<Range, Range2>> project_out_param(const std::string &id) const;
1786  inline typed::map<Domain, pair<Range, Range2>> project_out_param(const typed::id_list<Anonymous> &list) const;
1787  inline typed::set<pair<Range, Range2>> range() const;
1788  inline typed::map<Domain, Range> range_factor_domain() const;
1789  inline typed::map<Domain, Range2> range_factor_range() const;
1790  inline typed::fixed_box<Domain, pair<Range, Range2>> range_lattice_tile() const;
1791  inline typed::union_map<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> range_map() const;
1792  template <typename Arg3>
1793  inline typed::map<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::map<Domain, Arg3> &map2) const;
1794  template <typename Arg3>
1795  inline typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::union_map<Domain, Arg3> &umap2) const;
1796  inline typed::map<Domain, pair<Range2, Range>> range_reverse() const;
1797  inline typed::fixed_box<Domain, pair<Range, Range2>> range_simple_fixed_box_hull() const;
1798  inline typed::basic_map<pair<Range, Range2>, Domain> reverse() const;
1799  template <typename Domain2>
1800  inline typed::map<Domain2, pair<Range, Range2>> set_domain_tuple(const typed::id<Anonymous> &id) const;
1801  template <typename Domain2>
1802  inline typed::map<Domain2, pair<Range, Range2>> set_domain_tuple(const std::string &id) const;
1803  inline typed::map<Domain, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
1804  inline typed::map<Domain, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
1805  inline typed::space<Domain, pair<Range, Range2>> space() const;
1806  inline typed::map<Domain, pair<Range, Range2>> subtract(const typed::map<Domain, pair<Range, Range2>> &map2) const;
1807  inline typed::union_map<Domain, pair<Range, Range2>> subtract(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const;
1808  inline typed::union_map<Domain, pair<Range, Range2>> subtract_domain(const typed::union_set<Domain> &dom) const;
1809  inline typed::union_map<Domain, pair<Range, Range2>> subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const;
1810  inline typed::union_map<Domain, pair<Range, Range2>> to_union_map() const;
1811  inline typed::map<pair<Domain, Range>, Range2> uncurry() const;
1812  inline typed::map<Domain, pair<Range, Range2>> unite(const typed::basic_map<Domain, pair<Range, Range2>> &bmap2) const;
1813  inline typed::map<Domain, pair<Range, Range2>> unite(const typed::map<Domain, pair<Range, Range2>> &map2) const;
1814  inline typed::union_map<Domain, pair<Range, Range2>> unite(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const;
1815  inline typed::map<Domain, pair<Range, Range2>> upper_bound(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &upper) const;
1816  inline typed::set<pair<Domain, pair<Range, Range2>>> wrap() const;
1817};
1818
1819template <typename T1, typename T2>
1820struct basic_map<pair<T1, T2>, pair<T1, T2>> : public isl::basic_map {
1821  template <typename...>
1822  friend struct aff;
1823  template <typename...>
1824  friend struct aff_list;
1825  template <typename...>
1826  friend struct basic_map;
1827  template <typename...>
1828  friend struct basic_set;
1829  template <typename...>
1830  friend struct fixed_box;
1831  template <typename...>
1832  friend struct id;
1833  template <typename...>
1834  friend struct id_list;
1835  template <typename...>
1836  friend struct map;
1837  template <typename...>
1838  friend struct map_list;
1839  template <typename...>
1840  friend struct multi_aff;
1841  template <typename...>
1842  friend struct multi_id;
1843  template <typename...>
1844  friend struct multi_pw_aff;
1845  template <typename...>
1846  friend struct multi_union_pw_aff;
1847  template <typename...>
1848  friend struct multi_val;
1849  template <typename...>
1850  friend struct point;
1851  template <typename...>
1852  friend struct pw_aff;
1853  template <typename...>
1854  friend struct pw_aff_list;
1855  template <typename...>
1856  friend struct pw_multi_aff;
1857  template <typename...>
1858  friend struct pw_multi_aff_list;
1859  template <typename...>
1860  friend struct set;
1861  template <typename...>
1862  friend struct set_list;
1863  template <typename...>
1864  friend struct space;
1865  template <typename...>
1866  friend struct union_map;
1867  template <typename...>
1868  friend struct union_pw_aff;
1869  template <typename...>
1870  friend struct union_pw_aff_list;
1871  template <typename...>
1872  friend struct union_pw_multi_aff;
1873  template <typename...>
1874  friend struct union_set;
1875  template <typename...>
1876  friend struct union_set_list;
1877  template <typename...>
1878  friend struct val;
1879  template <typename...>
1880  friend struct val_list;
1881
1882  basic_map() = default;
1883  template <typename Arg1, typename Arg2,
1884            typename std::enable_if<
1885              std::is_base_of<T1, Arg1>{} &&
1886              std::is_base_of<T2, Arg2>{},
1887            bool>::type = true>
1888  basic_map(const basic_map<pair<Arg1, Arg2>, pair<Arg1, Arg2>> &obj) : isl::basic_map(obj) {}
1889 private:
1890  template <typename base,
1891            typename std::enable_if<
1892              std::is_same<base, isl::basic_map>{}, bool>::type = true>
1893  basic_map(const base &obj) : isl::basic_map(obj) {}
1894 public:
1895  static basic_map from(const isl::basic_map &obj) {
1896    return basic_map(obj);
1897  }
1898  inline explicit basic_map(const isl::ctx &ctx, const std::string &str);
1899  template <typename Domain2>
1900  inline typed::basic_map<Domain2, pair<T1, T2>> apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &bmap2) const;
1901  template <typename Domain2>
1902  inline typed::map<Domain2, pair<T1, T2>> apply_domain(const typed::map<pair<T1, T2>, Domain2> &map2) const;
1903  template <typename Domain2>
1904  inline typed::union_map<Domain2, pair<T1, T2>> apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const;
1905  template <typename Range2>
1906  inline typed::basic_map<pair<T1, T2>, Range2> apply_range(const typed::basic_map<pair<T1, T2>, Range2> &bmap2) const;
1907  template <typename Range2>
1908  inline typed::map<pair<T1, T2>, Range2> apply_range(const typed::map<pair<T1, T2>, Range2> &map2) const;
1909  template <typename Range2>
1910  inline typed::union_map<pair<T1, T2>, Range2> apply_range(const typed::union_map<pair<T1, T2>, Range2> &umap2) const;
1911  inline typed::map<pair<T1, T2>, pair<T1, T2>> as_map() const;
1912  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<T1, T2>> as_multi_union_pw_aff() const;
1913  inline typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> as_pw_multi_aff() const;
1914  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<T1, T2>> as_union_pw_multi_aff() const;
1915  inline typed::set<pair<T1, T2>> bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const;
1916  inline typed::set<pair<T1, T2>> bind_range(const typed::multi_id<pair<T1, T2>> &tuple) const;
1917  inline typed::map<pair<T1, T2>, pair<T1, T2>> coalesce() const;
1918  inline typed::map<T1, pair<T2, pair<T1, T2>>> curry() const;
1919  inline typed::basic_set<pair<T1, T2>> deltas() const;
1920  inline typed::basic_map<pair<T1, T2>, pair<T1, T2>> detect_equalities() const;
1921  inline typed::set<pair<T1, T2>> domain() const;
1922  inline typed::map<T1, pair<T1, T2>> domain_factor_domain() const;
1923  inline typed::map<T2, pair<T1, T2>> domain_factor_range() const;
1924  inline typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> domain_map() const;
1925  inline typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> domain_map_union_pw_multi_aff() const;
1926  template <typename Domain2>
1927  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> domain_product(const typed::map<Domain2, pair<T1, T2>> &map2) const;
1928  template <typename Domain2>
1929  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> domain_product(const typed::union_map<Domain2, pair<T1, T2>> &umap2) const;
1930  inline typed::map<pair<T2, T1>, pair<T1, T2>> domain_reverse() const;
1931  inline typed::map<pair<T1, T2>, pair<T1, T2>> drop_unused_params() const;
1932  template <typename Range>
1933  inline typed::map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
1934  template <typename Range>
1935  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::multi_union_pw_aff<pair<T1, T2>, Range> &mupa) const;
1936  inline bool every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<T1, T2>>)> &test) const;
1937  inline typed::map<pair<T1, T2>, pair<T1, T2>> extract_map(const typed::space<pair<T1, T2>, pair<T1, T2>> &space) const;
1938  inline typed::basic_map<Anonymous, pair<T1, T2>> flatten_domain() const;
1939  inline typed::basic_map<pair<T1, T2>, Anonymous> flatten_range() const;
1940  inline void foreach_basic_map(const std::function<void(typed::basic_map<pair<T1, T2>, pair<T1, T2>>)> &fn) const;
1941  inline void foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<T1, T2>>)> &fn) const;
1942  inline typed::basic_map<pair<T1, T2>, pair<T1, T2>> gist(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &context) const;
1943  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist(const typed::map<pair<T1, T2>, pair<T1, T2>> &context) const;
1944  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &context) const;
1945  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::set<pair<T1, T2>> &context) const;
1946  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::union_set<pair<T1, T2>> &uset) const;
1947  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist_params(const typed::set<> &context) const;
1948  inline typed::basic_map<pair<T1, T2>, pair<T1, T2>> intersect(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &bmap2) const;
1949  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const;
1950  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
1951  inline typed::basic_map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::basic_set<pair<T1, T2>> &bset) const;
1952  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::set<pair<T1, T2>> &set) const;
1953  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::space<pair<T1, T2>> &space) const;
1954  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const;
1955  inline typed::basic_map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::point<pair<T1, T2>> &bset) const;
1956  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::set<T1> &domain) const;
1957  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const;
1958  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_params(const typed::set<> &params) const;
1959  inline typed::basic_map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::basic_set<pair<T1, T2>> &bset) const;
1960  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::set<pair<T1, T2>> &set) const;
1961  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::space<pair<T1, T2>> &space) const;
1962  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::union_set<pair<T1, T2>> &uset) const;
1963  inline typed::basic_map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::point<pair<T1, T2>> &bset) const;
1964  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::set<T1> &domain) const;
1965  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::union_set<T1> &domain) const;
1966  template <typename Range>
1967  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_ge_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
1968  template <typename Range>
1969  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_gt_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
1970  template <typename Range>
1971  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_le_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
1972  template <typename Range>
1973  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_lt_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
1974  inline typed::map<pair<T1, T2>, pair<T1, T2>> lexmax() const;
1975  inline typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> lexmax_pw_multi_aff() const;
1976  inline typed::map<pair<T1, T2>, pair<T1, T2>> lexmin() const;
1977  inline typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> lexmin_pw_multi_aff() const;
1978  inline typed::map<pair<T1, T2>, pair<T1, T2>> lower_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> &lower) const;
1979  inline typed::map_list<pair<T1, T2>, pair<T1, T2>> map_list() const;
1980  inline typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> max_multi_pw_aff() const;
1981  inline typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> min_multi_pw_aff() const;
1982  inline typed::set<> params() const;
1983  template <typename Domain2>
1984  inline typed::map<Domain2, pair<T1, T2>> preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const;
1985  template <typename Domain2>
1986  inline typed::map<Domain2, pair<T1, T2>> preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const;
1987  template <typename Domain2>
1988  inline typed::map<Domain2, pair<T1, T2>> preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const;
1989  template <typename Domain2>
1990  inline typed::union_map<Domain2, pair<T1, T2>> preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const;
1991  template <typename Range2>
1992  inline typed::map<pair<T1, T2>, Range2> preimage_range(const typed::multi_aff<Range2, pair<T1, T2>> &ma) const;
1993  template <typename Range2>
1994  inline typed::map<pair<T1, T2>, Range2> preimage_range(const typed::pw_multi_aff<Range2, pair<T1, T2>> &pma) const;
1995  template <typename Range2>
1996  inline typed::union_map<pair<T1, T2>, Range2> preimage_range(const typed::union_pw_multi_aff<Range2, pair<T1, T2>> &upma) const;
1997  template <typename Domain2, typename Range2>
1998  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> product(const typed::map<Domain2, Range2> &map2) const;
1999  template <typename Domain2, typename Range2>
2000  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> product(const typed::union_map<Domain2, Range2> &umap2) const;
2001  inline typed::map<pair<T1, T2>, pair<T1, T2>> project_out_all_params() const;
2002  inline typed::map<pair<T1, T2>, pair<T1, T2>> project_out_param(const typed::id<Anonymous> &id) const;
2003  inline typed::map<pair<T1, T2>, pair<T1, T2>> project_out_param(const std::string &id) const;
2004  inline typed::map<pair<T1, T2>, pair<T1, T2>> project_out_param(const typed::id_list<Anonymous> &list) const;
2005  inline typed::set<pair<T1, T2>> range() const;
2006  inline typed::map<pair<T1, T2>, T1> range_factor_domain() const;
2007  inline typed::map<pair<T1, T2>, T2> range_factor_range() const;
2008  inline typed::fixed_box<pair<T1, T2>, pair<T1, T2>> range_lattice_tile() const;
2009  inline typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> range_map() const;
2010  template <typename Range2>
2011  inline typed::map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> range_product(const typed::map<pair<T1, T2>, Range2> &map2) const;
2012  template <typename Range2>
2013  inline typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> range_product(const typed::union_map<pair<T1, T2>, Range2> &umap2) const;
2014  inline typed::map<pair<T1, T2>, pair<T2, T1>> range_reverse() const;
2015  inline typed::fixed_box<pair<T1, T2>, pair<T1, T2>> range_simple_fixed_box_hull() const;
2016  inline typed::basic_map<pair<T1, T2>, pair<T1, T2>> reverse() const;
2017  inline typed::map<pair<T1, T2>, pair<T1, T2>> set_domain_tuple(const typed::id<> &id) const = delete;
2018  inline typed::map<pair<T1, T2>, pair<T1, T2>> set_domain_tuple(const std::string &id) const = delete;
2019  inline typed::map<pair<T1, T2>, pair<T1, T2>> set_range_tuple(const typed::id<> &id) const = delete;
2020  inline typed::map<pair<T1, T2>, pair<T1, T2>> set_range_tuple(const std::string &id) const = delete;
2021  inline typed::space<pair<T1, T2>, pair<T1, T2>> space() const;
2022  inline typed::map<pair<T1, T2>, pair<T1, T2>> subtract(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const;
2023  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
2024  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const;
2025  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_range(const typed::union_set<pair<T1, T2>> &dom) const;
2026  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> to_union_map() const;
2027  inline typed::map<pair<pair<T1, T2>, T1>, T2> uncurry() const;
2028  inline typed::map<pair<T1, T2>, pair<T1, T2>> unite(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &bmap2) const;
2029  inline typed::map<pair<T1, T2>, pair<T1, T2>> unite(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const;
2030  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> unite(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
2031  inline typed::map<pair<T1, T2>, pair<T1, T2>> upper_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> &upper) const;
2032  inline typed::set<pair<pair<T1, T2>, pair<T1, T2>>> wrap() const;
2033};
2034
2035template <typename T1, typename T2, typename Range, typename Range2>
2036struct basic_map<pair<T1, T2>, pair<Range, Range2>> : public isl::basic_map {
2037  template <typename...>
2038  friend struct aff;
2039  template <typename...>
2040  friend struct aff_list;
2041  template <typename...>
2042  friend struct basic_map;
2043  template <typename...>
2044  friend struct basic_set;
2045  template <typename...>
2046  friend struct fixed_box;
2047  template <typename...>
2048  friend struct id;
2049  template <typename...>
2050  friend struct id_list;
2051  template <typename...>
2052  friend struct map;
2053  template <typename...>
2054  friend struct map_list;
2055  template <typename...>
2056  friend struct multi_aff;
2057  template <typename...>
2058  friend struct multi_id;
2059  template <typename...>
2060  friend struct multi_pw_aff;
2061  template <typename...>
2062  friend struct multi_union_pw_aff;
2063  template <typename...>
2064  friend struct multi_val;
2065  template <typename...>
2066  friend struct point;
2067  template <typename...>
2068  friend struct pw_aff;
2069  template <typename...>
2070  friend struct pw_aff_list;
2071  template <typename...>
2072  friend struct pw_multi_aff;
2073  template <typename...>
2074  friend struct pw_multi_aff_list;
2075  template <typename...>
2076  friend struct set;
2077  template <typename...>
2078  friend struct set_list;
2079  template <typename...>
2080  friend struct space;
2081  template <typename...>
2082  friend struct union_map;
2083  template <typename...>
2084  friend struct union_pw_aff;
2085  template <typename...>
2086  friend struct union_pw_aff_list;
2087  template <typename...>
2088  friend struct union_pw_multi_aff;
2089  template <typename...>
2090  friend struct union_set;
2091  template <typename...>
2092  friend struct union_set_list;
2093  template <typename...>
2094  friend struct val;
2095  template <typename...>
2096  friend struct val_list;
2097
2098  basic_map() = default;
2099  template <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
2100            typename std::enable_if<
2101              std::is_base_of<T1, Arg1>{} &&
2102              std::is_base_of<T2, Arg2>{} &&
2103              std::is_base_of<Range, Arg3>{} &&
2104              std::is_base_of<Range2, Arg4>{},
2105            bool>::type = true>
2106  basic_map(const basic_map<pair<Arg1, Arg2>, pair<Arg3, Arg4>> &obj) : isl::basic_map(obj) {}
2107 private:
2108  template <typename base,
2109            typename std::enable_if<
2110              std::is_same<base, isl::basic_map>{}, bool>::type = true>
2111  basic_map(const base &obj) : isl::basic_map(obj) {}
2112 public:
2113  static basic_map from(const isl::basic_map &obj) {
2114    return basic_map(obj);
2115  }
2116  inline explicit basic_map(const isl::ctx &ctx, const std::string &str);
2117  template <typename Domain2>
2118  inline typed::basic_map<Domain2, pair<Range, Range2>> apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &bmap2) const;
2119  template <typename Domain2>
2120  inline typed::map<Domain2, pair<Range, Range2>> apply_domain(const typed::map<pair<T1, T2>, Domain2> &map2) const;
2121  template <typename Domain2>
2122  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const;
2123  template <typename Arg2>
2124  inline typed::basic_map<pair<T1, T2>, Arg2> apply_range(const typed::basic_map<pair<Range, Range2>, Arg2> &bmap2) const;
2125  template <typename Arg2>
2126  inline typed::map<pair<T1, T2>, Arg2> apply_range(const typed::map<pair<Range, Range2>, Arg2> &map2) const;
2127  template <typename Arg2>
2128  inline typed::union_map<pair<T1, T2>, Arg2> apply_range(const typed::union_map<pair<Range, Range2>, Arg2> &umap2) const;
2129  inline typed::map<pair<T1, T2>, pair<Range, Range2>> as_map() const;
2130  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> as_multi_union_pw_aff() const;
2131  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> as_pw_multi_aff() const;
2132  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> as_union_pw_multi_aff() const;
2133  inline typed::set<pair<Range, Range2>> bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const;
2134  inline typed::set<pair<T1, T2>> bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const;
2135  inline typed::map<pair<T1, T2>, pair<Range, Range2>> coalesce() const;
2136  inline typed::map<T1, pair<T2, pair<Range, Range2>>> curry() const;
2137  inline typed::basic_set<pair<T1, T2>, pair<Range, Range2>> deltas() const = delete;
2138  inline typed::basic_map<pair<T1, T2>, pair<Range, Range2>> detect_equalities() const;
2139  inline typed::set<pair<T1, T2>> domain() const;
2140  inline typed::map<T1, pair<Range, Range2>> domain_factor_domain() const;
2141  inline typed::map<T2, pair<Range, Range2>> domain_factor_range() const;
2142  inline typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> domain_map() const;
2143  inline typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> domain_map_union_pw_multi_aff() const;
2144  template <typename Domain2>
2145  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> domain_product(const typed::map<Domain2, pair<Range, Range2>> &map2) const;
2146  template <typename Domain2>
2147  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const;
2148  inline typed::map<pair<T2, T1>, pair<Range, Range2>> domain_reverse() const;
2149  inline typed::map<pair<T1, T2>, pair<Range, Range2>> drop_unused_params() const;
2150  inline typed::map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::multi_pw_aff<> &mpa) const = delete;
2151  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
2152  inline bool every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &test) const;
2153  inline typed::map<pair<T1, T2>, pair<Range, Range2>> extract_map(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const;
2154  inline typed::basic_map<Anonymous, pair<Range, Range2>> flatten_domain() const;
2155  inline typed::basic_map<pair<T1, T2>, Anonymous> flatten_range() const;
2156  inline void foreach_basic_map(const std::function<void(typed::basic_map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const;
2157  inline void foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const;
2158  inline typed::basic_map<pair<T1, T2>, pair<Range, Range2>> gist(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &context) const;
2159  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist(const typed::map<pair<T1, T2>, pair<Range, Range2>> &context) const;
2160  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &context) const;
2161  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::set<pair<T1, T2>> &context) const;
2162  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::union_set<pair<T1, T2>> &uset) const;
2163  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::set<> &context) const;
2164  inline typed::basic_map<pair<T1, T2>, pair<Range, Range2>> intersect(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &bmap2) const;
2165  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const;
2166  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
2167  inline typed::basic_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::basic_set<pair<T1, T2>> &bset) const;
2168  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::set<pair<T1, T2>> &set) const;
2169  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::space<pair<T1, T2>> &space) const;
2170  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const;
2171  inline typed::basic_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::point<pair<T1, T2>> &bset) const;
2172  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::set<T1> &domain) const;
2173  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const;
2174  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::set<> &params) const;
2175  inline typed::basic_map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::basic_set<pair<Range, Range2>> &bset) const;
2176  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::set<pair<Range, Range2>> &set) const;
2177  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::space<pair<Range, Range2>> &space) const;
2178  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const;
2179  inline typed::basic_map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::point<pair<Range, Range2>> &bset) const;
2180  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::set<Range> &domain) const;
2181  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const;
2182  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_ge_at(const typed::multi_pw_aff<> &mpa) const = delete;
2183  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_gt_at(const typed::multi_pw_aff<> &mpa) const = delete;
2184  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_le_at(const typed::multi_pw_aff<> &mpa) const = delete;
2185  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_lt_at(const typed::multi_pw_aff<> &mpa) const = delete;
2186  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lexmax() const;
2187  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> lexmax_pw_multi_aff() const;
2188  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lexmin() const;
2189  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> lexmin_pw_multi_aff() const;
2190  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lower_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const;
2191  inline typed::map_list<pair<T1, T2>, pair<Range, Range2>> map_list() const;
2192  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> max_multi_pw_aff() const;
2193  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> min_multi_pw_aff() const;
2194  inline typed::set<> params() const;
2195  template <typename Domain2>
2196  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const;
2197  template <typename Domain2>
2198  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const;
2199  template <typename Domain2>
2200  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const;
2201  template <typename Domain2>
2202  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const;
2203  template <typename Arg2>
2204  inline typed::map<pair<T1, T2>, Arg2> preimage_range(const typed::multi_aff<Arg2, pair<Range, Range2>> &ma) const;
2205  template <typename Arg2>
2206  inline typed::map<pair<T1, T2>, Arg2> preimage_range(const typed::pw_multi_aff<Arg2, pair<Range, Range2>> &pma) const;
2207  template <typename Arg2>
2208  inline typed::union_map<pair<T1, T2>, Arg2> preimage_range(const typed::union_pw_multi_aff<Arg2, pair<Range, Range2>> &upma) const;
2209  template <typename Domain2, typename Arg2>
2210  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::map<Domain2, Arg2> &map2) const;
2211  template <typename Domain2, typename Arg2>
2212  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::union_map<Domain2, Arg2> &umap2) const;
2213  inline typed::map<pair<T1, T2>, pair<Range, Range2>> project_out_all_params() const;
2214  inline typed::map<pair<T1, T2>, pair<Range, Range2>> project_out_param(const typed::id<Anonymous> &id) const;
2215  inline typed::map<pair<T1, T2>, pair<Range, Range2>> project_out_param(const std::string &id) const;
2216  inline typed::map<pair<T1, T2>, pair<Range, Range2>> project_out_param(const typed::id_list<Anonymous> &list) const;
2217  inline typed::set<pair<Range, Range2>> range() const;
2218  inline typed::map<pair<T1, T2>, Range> range_factor_domain() const;
2219  inline typed::map<pair<T1, T2>, Range2> range_factor_range() const;
2220  inline typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> range_lattice_tile() const;
2221  inline typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> range_map() const;
2222  template <typename Arg2>
2223  inline typed::map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::map<pair<T1, T2>, Arg2> &map2) const;
2224  template <typename Arg2>
2225  inline typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::union_map<pair<T1, T2>, Arg2> &umap2) const;
2226  inline typed::map<pair<T1, T2>, pair<Range2, Range>> range_reverse() const;
2227  inline typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> range_simple_fixed_box_hull() const;
2228  inline typed::basic_map<pair<Range, Range2>, pair<T1, T2>> reverse() const;
2229  inline typed::map<pair<T1, T2>, pair<Range, Range2>> set_domain_tuple(const typed::id<> &id) const = delete;
2230  inline typed::map<pair<T1, T2>, pair<Range, Range2>> set_domain_tuple(const std::string &id) const = delete;
2231  inline typed::map<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
2232  inline typed::map<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
2233  inline typed::space<pair<T1, T2>, pair<Range, Range2>> space() const;
2234  inline typed::map<pair<T1, T2>, pair<Range, Range2>> subtract(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const;
2235  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
2236  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const;
2237  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const;
2238  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> to_union_map() const;
2239  inline typed::map<pair<pair<T1, T2>, Range>, Range2> uncurry() const;
2240  inline typed::map<pair<T1, T2>, pair<Range, Range2>> unite(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &bmap2) const;
2241  inline typed::map<pair<T1, T2>, pair<Range, Range2>> unite(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const;
2242  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> unite(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
2243  inline typed::map<pair<T1, T2>, pair<Range, Range2>> upper_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const;
2244  inline typed::set<pair<pair<T1, T2>, pair<Range, Range2>>> wrap() const;
2245};
2246
2247template <>
2248struct basic_set<> : public isl::basic_set {
2249  template <typename...>
2250  friend struct aff;
2251  template <typename...>
2252  friend struct aff_list;
2253  template <typename...>
2254  friend struct basic_map;
2255  template <typename...>
2256  friend struct basic_set;
2257  template <typename...>
2258  friend struct fixed_box;
2259  template <typename...>
2260  friend struct id;
2261  template <typename...>
2262  friend struct id_list;
2263  template <typename...>
2264  friend struct map;
2265  template <typename...>
2266  friend struct map_list;
2267  template <typename...>
2268  friend struct multi_aff;
2269  template <typename...>
2270  friend struct multi_id;
2271  template <typename...>
2272  friend struct multi_pw_aff;
2273  template <typename...>
2274  friend struct multi_union_pw_aff;
2275  template <typename...>
2276  friend struct multi_val;
2277  template <typename...>
2278  friend struct point;
2279  template <typename...>
2280  friend struct pw_aff;
2281  template <typename...>
2282  friend struct pw_aff_list;
2283  template <typename...>
2284  friend struct pw_multi_aff;
2285  template <typename...>
2286  friend struct pw_multi_aff_list;
2287  template <typename...>
2288  friend struct set;
2289  template <typename...>
2290  friend struct set_list;
2291  template <typename...>
2292  friend struct space;
2293  template <typename...>
2294  friend struct union_map;
2295  template <typename...>
2296  friend struct union_pw_aff;
2297  template <typename...>
2298  friend struct union_pw_aff_list;
2299  template <typename...>
2300  friend struct union_pw_multi_aff;
2301  template <typename...>
2302  friend struct union_set;
2303  template <typename...>
2304  friend struct union_set_list;
2305  template <typename...>
2306  friend struct val;
2307  template <typename...>
2308  friend struct val_list;
2309
2310  basic_set() = default;
2311 private:
2312  template <typename base,
2313            typename std::enable_if<
2314              std::is_same<base, isl::basic_set>{}, bool>::type = true>
2315  basic_set(const base &obj) : isl::basic_set(obj) {}
2316 public:
2317  static basic_set from(const isl::basic_set &obj) {
2318    return basic_set(obj);
2319  }
2320  inline /* implicit */ basic_set(const typed::point<> &pnt);
2321  inline explicit basic_set(const isl::ctx &ctx, const std::string &str);
2322  inline typed::basic_set<> apply(const typed::basic_map<> &bmap) const = delete;
2323  inline typed::set<> apply(const typed::map<> &map) const = delete;
2324  inline typed::union_set<> apply(const typed::union_map<> &umap) const = delete;
2325  inline typed::pw_multi_aff<> as_pw_multi_aff() const = delete;
2326  inline typed::set<> as_set() const = delete;
2327  inline typed::set<> bind(const typed::multi_id<> &tuple) const = delete;
2328  inline typed::set<> coalesce() const;
2329  inline typed::basic_set<> detect_equalities() const;
2330  inline typed::set<> drop_unused_params() const;
2331  inline bool every_set(const std::function<bool(typed::set<>)> &test) const;
2332  inline typed::set<> extract_set(const typed::space<> &space) const;
2333  inline void foreach_basic_set(const std::function<void(typed::basic_set<>)> &fn) const;
2334  inline void foreach_point(const std::function<void(typed::point<>)> &fn) const;
2335  inline void foreach_set(const std::function<void(typed::set<>)> &fn) const;
2336  inline typed::basic_set<> gist(const typed::basic_set<> &context) const;
2337  inline typed::set<> gist(const typed::set<> &context) const;
2338  inline typed::union_set<> gist(const typed::union_set<> &context) const;
2339  inline typed::basic_set<> gist(const typed::point<> &context) const;
2340  inline typed::set<> gist_params(const typed::set<> &context) const = delete;
2341  inline typed::map<> identity() const = delete;
2342  inline typed::pw_aff<Anonymous> indicator_function() const;
2343  inline typed::map<> insert_domain(const typed::space<> &domain) const = delete;
2344  inline typed::basic_set<> intersect(const typed::basic_set<> &bset2) const;
2345  inline typed::set<> intersect(const typed::set<> &set2) const;
2346  inline typed::union_set<> intersect(const typed::union_set<> &uset2) const;
2347  inline typed::basic_set<> intersect(const typed::point<> &bset2) const;
2348  inline typed::basic_set<> intersect_params(const typed::basic_set<> &bset2) const = delete;
2349  inline typed::set<> intersect_params(const typed::set<> &params) const = delete;
2350  inline typed::basic_set<> intersect_params(const typed::point<> &bset2) const = delete;
2351  inline typed::fixed_box<> lattice_tile() const = delete;
2352  inline typed::set<> lexmax() const = delete;
2353  inline typed::pw_multi_aff<> lexmax_pw_multi_aff() const = delete;
2354  inline typed::set<> lexmin() const = delete;
2355  inline typed::pw_multi_aff<> lexmin_pw_multi_aff() const = delete;
2356  inline typed::set<> lower_bound(const typed::multi_pw_aff<> &lower) const = delete;
2357  inline typed::set<> lower_bound(const typed::multi_val<> &lower) const = delete;
2358  inline typed::multi_pw_aff<> max_multi_pw_aff() const = delete;
2359  inline typed::val<> max_val(const typed::aff<> &obj) const = delete;
2360  inline typed::multi_pw_aff<> min_multi_pw_aff() const = delete;
2361  inline typed::val<> min_val(const typed::aff<> &obj) const = delete;
2362  inline typed::pw_aff<Anonymous> param_pw_aff_on_domain(const typed::id<Anonymous> &id) const;
2363  inline typed::pw_aff<Anonymous> param_pw_aff_on_domain(const std::string &id) const;
2364  inline typed::basic_set<> params() const = delete;
2365  inline typed::multi_val<> plain_multi_val_if_fixed() const = delete;
2366  inline typed::set<> preimage(const typed::multi_aff<> &ma) const = delete;
2367  inline typed::set<> preimage(const typed::multi_pw_aff<> &mpa) const = delete;
2368  inline typed::set<> preimage(const typed::pw_multi_aff<> &pma) const = delete;
2369  inline typed::union_set<> preimage(const typed::union_pw_multi_aff<> &upma) const = delete;
2370  inline typed::set<> product(const typed::set<> &set2) const = delete;
2371  inline typed::set<> project_out_all_params() const;
2372  inline typed::set<> project_out_param(const typed::id<Anonymous> &id) const;
2373  inline typed::set<> project_out_param(const std::string &id) const;
2374  inline typed::set<> project_out_param(const typed::id_list<Anonymous> &list) const;
2375  inline typed::pw_aff<Anonymous> pw_aff_on_domain(const typed::val<Anonymous> &v) const;
2376  inline typed::pw_aff<Anonymous> pw_aff_on_domain(long v) const;
2377  template <typename Domain>
2378  inline typed::pw_multi_aff<Domain> pw_multi_aff_on_domain(const typed::multi_val<Domain> &mv) const;
2379  inline typed::set_list<> set_list() const;
2380  inline typed::fixed_box<> simple_fixed_box_hull() const = delete;
2381  inline typed::space<> space() const;
2382  inline typed::set<> subtract(const typed::set<> &set2) const;
2383  inline typed::union_set<> subtract(const typed::union_set<> &uset2) const;
2384  inline typed::set<> to_set() const;
2385  inline typed::union_set<> to_union_set() const;
2386  inline typed::map<> translation() const = delete;
2387  template <typename Domain>
2388  inline typed::set<Domain> unbind_params(const typed::multi_id<Domain> &tuple) const;
2389  inline typed::map<> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
2390  inline typed::set<> unite(const typed::basic_set<> &bset2) const;
2391  inline typed::set<> unite(const typed::set<> &set2) const;
2392  inline typed::union_set<> unite(const typed::union_set<> &uset2) const;
2393  inline typed::set<> unite(const typed::point<> &bset2) const;
2394  inline typed::map<> unwrap() const = delete;
2395  inline typed::set<> upper_bound(const typed::multi_pw_aff<> &upper) const = delete;
2396  inline typed::set<> upper_bound(const typed::multi_val<> &upper) const = delete;
2397  inline typed::set<> wrapped_reverse() const = delete;
2398};
2399
2400template <typename Domain>
2401struct basic_set<Domain> : public isl::basic_set {
2402  template <typename...>
2403  friend struct aff;
2404  template <typename...>
2405  friend struct aff_list;
2406  template <typename...>
2407  friend struct basic_map;
2408  template <typename...>
2409  friend struct basic_set;
2410  template <typename...>
2411  friend struct fixed_box;
2412  template <typename...>
2413  friend struct id;
2414  template <typename...>
2415  friend struct id_list;
2416  template <typename...>
2417  friend struct map;
2418  template <typename...>
2419  friend struct map_list;
2420  template <typename...>
2421  friend struct multi_aff;
2422  template <typename...>
2423  friend struct multi_id;
2424  template <typename...>
2425  friend struct multi_pw_aff;
2426  template <typename...>
2427  friend struct multi_union_pw_aff;
2428  template <typename...>
2429  friend struct multi_val;
2430  template <typename...>
2431  friend struct point;
2432  template <typename...>
2433  friend struct pw_aff;
2434  template <typename...>
2435  friend struct pw_aff_list;
2436  template <typename...>
2437  friend struct pw_multi_aff;
2438  template <typename...>
2439  friend struct pw_multi_aff_list;
2440  template <typename...>
2441  friend struct set;
2442  template <typename...>
2443  friend struct set_list;
2444  template <typename...>
2445  friend struct space;
2446  template <typename...>
2447  friend struct union_map;
2448  template <typename...>
2449  friend struct union_pw_aff;
2450  template <typename...>
2451  friend struct union_pw_aff_list;
2452  template <typename...>
2453  friend struct union_pw_multi_aff;
2454  template <typename...>
2455  friend struct union_set;
2456  template <typename...>
2457  friend struct union_set_list;
2458  template <typename...>
2459  friend struct val;
2460  template <typename...>
2461  friend struct val_list;
2462
2463  basic_set() = default;
2464  template <typename Arg1,
2465            typename std::enable_if<
2466              std::is_base_of<Domain, Arg1>{},
2467            bool>::type = true>
2468  basic_set(const basic_set<Arg1> &obj) : isl::basic_set(obj) {}
2469 private:
2470  template <typename base,
2471            typename std::enable_if<
2472              std::is_same<base, isl::basic_set>{}, bool>::type = true>
2473  basic_set(const base &obj) : isl::basic_set(obj) {}
2474 public:
2475  static basic_set from(const isl::basic_set &obj) {
2476    return basic_set(obj);
2477  }
2478  inline /* implicit */ basic_set(const typed::point<Domain> &pnt);
2479  inline explicit basic_set(const isl::ctx &ctx, const std::string &str);
2480  template <typename Range>
2481  inline typed::basic_set<Range> apply(const typed::basic_map<Domain, Range> &bmap) const;
2482  template <typename Range>
2483  inline typed::set<Range> apply(const typed::map<Domain, Range> &map) const;
2484  template <typename Range>
2485  inline typed::union_set<Range> apply(const typed::union_map<Domain, Range> &umap) const;
2486  inline typed::pw_multi_aff<Domain> as_pw_multi_aff() const;
2487  inline typed::set<Domain> as_set() const;
2488  inline typed::set<> bind(const typed::multi_id<Domain> &tuple) const;
2489  inline typed::set<Domain> coalesce() const;
2490  inline typed::basic_set<Domain> detect_equalities() const;
2491  inline typed::set<Domain> drop_unused_params() const;
2492  inline bool every_set(const std::function<bool(typed::set<Domain>)> &test) const;
2493  inline typed::set<Domain> extract_set(const typed::space<Domain> &space) const;
2494  inline void foreach_basic_set(const std::function<void(typed::basic_set<Domain>)> &fn) const;
2495  inline void foreach_point(const std::function<void(typed::point<Domain>)> &fn) const;
2496  inline void foreach_set(const std::function<void(typed::set<Domain>)> &fn) const;
2497  inline typed::basic_set<Domain> gist(const typed::basic_set<Domain> &context) const;
2498  inline typed::set<Domain> gist(const typed::set<Domain> &context) const;
2499  inline typed::union_set<Domain> gist(const typed::union_set<Domain> &context) const;
2500  inline typed::basic_set<Domain> gist(const typed::point<Domain> &context) const;
2501  inline typed::set<Domain> gist_params(const typed::set<> &context) const;
2502  inline typed::map<Domain, Domain> identity() const;
2503  inline typed::pw_aff<Domain, Anonymous> indicator_function() const;
2504  template <typename Arg1>
2505  inline typed::map<Arg1, Domain> insert_domain(const typed::space<Arg1> &domain) const;
2506  inline typed::basic_set<Domain> intersect(const typed::basic_set<Domain> &bset2) const;
2507  inline typed::set<Domain> intersect(const typed::set<Domain> &set2) const;
2508  inline typed::union_set<Domain> intersect(const typed::union_set<Domain> &uset2) const;
2509  inline typed::basic_set<Domain> intersect(const typed::point<Domain> &bset2) const;
2510  inline typed::basic_set<Domain> intersect_params(const typed::basic_set<> &bset2) const;
2511  inline typed::set<Domain> intersect_params(const typed::set<> &params) const;
2512  inline typed::basic_set<Domain> intersect_params(const typed::point<> &bset2) const;
2513  inline typed::fixed_box<Domain> lattice_tile() const;
2514  inline typed::set<Domain> lexmax() const;
2515  inline typed::pw_multi_aff<Domain> lexmax_pw_multi_aff() const;
2516  inline typed::set<Domain> lexmin() const;
2517  inline typed::pw_multi_aff<Domain> lexmin_pw_multi_aff() const;
2518  inline typed::set<Domain> lower_bound(const typed::multi_pw_aff<Domain> &lower) const;
2519  inline typed::set<Domain> lower_bound(const typed::multi_val<Domain> &lower) const;
2520  inline typed::multi_pw_aff<Domain> max_multi_pw_aff() const;
2521  inline typed::val<Domain> max_val(const typed::aff<> &obj) const = delete;
2522  inline typed::multi_pw_aff<Domain> min_multi_pw_aff() const;
2523  inline typed::val<Domain> min_val(const typed::aff<> &obj) const = delete;
2524  inline typed::pw_aff<Domain, Anonymous> param_pw_aff_on_domain(const typed::id<Anonymous> &id) const;
2525  inline typed::pw_aff<Domain, Anonymous> param_pw_aff_on_domain(const std::string &id) const;
2526  inline typed::basic_set<> params() const;
2527  inline typed::multi_val<Domain> plain_multi_val_if_fixed() const;
2528  template <typename Domain2>
2529  inline typed::set<Domain2> preimage(const typed::multi_aff<Domain2, Domain> &ma) const;
2530  template <typename Domain2>
2531  inline typed::set<Domain2> preimage(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
2532  template <typename Domain2>
2533  inline typed::set<Domain2> preimage(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
2534  template <typename Domain2>
2535  inline typed::union_set<Domain2> preimage(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
2536  template <typename Range>
2537  inline typed::set<pair<Domain, Range>> product(const typed::set<Range> &set2) const;
2538  inline typed::set<Domain> project_out_all_params() const;
2539  inline typed::set<Domain> project_out_param(const typed::id<Anonymous> &id) const;
2540  inline typed::set<Domain> project_out_param(const std::string &id) const;
2541  inline typed::set<Domain> project_out_param(const typed::id_list<Anonymous> &list) const;
2542  inline typed::pw_aff<Domain, Anonymous> pw_aff_on_domain(const typed::val<Anonymous> &v) const;
2543  inline typed::pw_aff<Domain, Anonymous> pw_aff_on_domain(long v) const;
2544  template <typename Range>
2545  inline typed::pw_multi_aff<Domain, Range> pw_multi_aff_on_domain(const typed::multi_val<Range> &mv) const;
2546  inline typed::set_list<Domain> set_list() const;
2547  inline typed::fixed_box<Domain> simple_fixed_box_hull() const;
2548  inline typed::space<Domain> space() const;
2549  inline typed::set<Domain> subtract(const typed::set<Domain> &set2) const;
2550  inline typed::union_set<Domain> subtract(const typed::union_set<Domain> &uset2) const;
2551  inline typed::set<Domain> to_set() const;
2552  inline typed::union_set<Domain> to_union_set() const;
2553  inline typed::map<Domain, Domain> translation() const;
2554  inline typed::set<Domain> unbind_params(const typed::multi_id<> &tuple) const = delete;
2555  template <typename Arg1>
2556  inline typed::map<Arg1, Domain> unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const;
2557  inline typed::set<Domain> unite(const typed::basic_set<Domain> &bset2) const;
2558  inline typed::set<Domain> unite(const typed::set<Domain> &set2) const;
2559  inline typed::union_set<Domain> unite(const typed::union_set<Domain> &uset2) const;
2560  inline typed::set<Domain> unite(const typed::point<Domain> &bset2) const;
2561  inline typed::map<Domain> unwrap() const = delete;
2562  inline typed::set<Domain> upper_bound(const typed::multi_pw_aff<Domain> &upper) const;
2563  inline typed::set<Domain> upper_bound(const typed::multi_val<Domain> &upper) const;
2564  inline typed::set<Domain> wrapped_reverse() const = delete;
2565};
2566
2567template <typename Domain, typename Range>
2568struct basic_set<pair<Domain, Range>> : public isl::basic_set {
2569  template <typename...>
2570  friend struct aff;
2571  template <typename...>
2572  friend struct aff_list;
2573  template <typename...>
2574  friend struct basic_map;
2575  template <typename...>
2576  friend struct basic_set;
2577  template <typename...>
2578  friend struct fixed_box;
2579  template <typename...>
2580  friend struct id;
2581  template <typename...>
2582  friend struct id_list;
2583  template <typename...>
2584  friend struct map;
2585  template <typename...>
2586  friend struct map_list;
2587  template <typename...>
2588  friend struct multi_aff;
2589  template <typename...>
2590  friend struct multi_id;
2591  template <typename...>
2592  friend struct multi_pw_aff;
2593  template <typename...>
2594  friend struct multi_union_pw_aff;
2595  template <typename...>
2596  friend struct multi_val;
2597  template <typename...>
2598  friend struct point;
2599  template <typename...>
2600  friend struct pw_aff;
2601  template <typename...>
2602  friend struct pw_aff_list;
2603  template <typename...>
2604  friend struct pw_multi_aff;
2605  template <typename...>
2606  friend struct pw_multi_aff_list;
2607  template <typename...>
2608  friend struct set;
2609  template <typename...>
2610  friend struct set_list;
2611  template <typename...>
2612  friend struct space;
2613  template <typename...>
2614  friend struct union_map;
2615  template <typename...>
2616  friend struct union_pw_aff;
2617  template <typename...>
2618  friend struct union_pw_aff_list;
2619  template <typename...>
2620  friend struct union_pw_multi_aff;
2621  template <typename...>
2622  friend struct union_set;
2623  template <typename...>
2624  friend struct union_set_list;
2625  template <typename...>
2626  friend struct val;
2627  template <typename...>
2628  friend struct val_list;
2629
2630  basic_set() = default;
2631  template <typename Arg1, typename Arg2,
2632            typename std::enable_if<
2633              std::is_base_of<Domain, Arg1>{} &&
2634              std::is_base_of<Range, Arg2>{},
2635            bool>::type = true>
2636  basic_set(const basic_set<pair<Arg1, Arg2>> &obj) : isl::basic_set(obj) {}
2637 private:
2638  template <typename base,
2639            typename std::enable_if<
2640              std::is_same<base, isl::basic_set>{}, bool>::type = true>
2641  basic_set(const base &obj) : isl::basic_set(obj) {}
2642 public:
2643  static basic_set from(const isl::basic_set &obj) {
2644    return basic_set(obj);
2645  }
2646  inline /* implicit */ basic_set(const typed::point<pair<Domain, Range>> &pnt);
2647  inline explicit basic_set(const isl::ctx &ctx, const std::string &str);
2648  template <typename Arg2>
2649  inline typed::basic_set<Arg2> apply(const typed::basic_map<pair<Domain, Range>, Arg2> &bmap) const;
2650  template <typename Arg2>
2651  inline typed::set<Arg2> apply(const typed::map<pair<Domain, Range>, Arg2> &map) const;
2652  template <typename Arg2>
2653  inline typed::union_set<Arg2> apply(const typed::union_map<pair<Domain, Range>, Arg2> &umap) const;
2654  inline typed::pw_multi_aff<pair<Domain, Range>> as_pw_multi_aff() const;
2655  inline typed::set<pair<Domain, Range>> as_set() const;
2656  inline typed::set<> bind(const typed::multi_id<pair<Domain, Range>> &tuple) const;
2657  inline typed::set<pair<Domain, Range>> coalesce() const;
2658  inline typed::basic_set<pair<Domain, Range>> detect_equalities() const;
2659  inline typed::set<pair<Domain, Range>> drop_unused_params() const;
2660  inline bool every_set(const std::function<bool(typed::set<pair<Domain, Range>>)> &test) const;
2661  inline typed::set<pair<Domain, Range>> extract_set(const typed::space<pair<Domain, Range>> &space) const;
2662  inline void foreach_basic_set(const std::function<void(typed::basic_set<pair<Domain, Range>>)> &fn) const;
2663  inline void foreach_point(const std::function<void(typed::point<pair<Domain, Range>>)> &fn) const;
2664  inline void foreach_set(const std::function<void(typed::set<pair<Domain, Range>>)> &fn) const;
2665  inline typed::basic_set<pair<Domain, Range>> gist(const typed::basic_set<pair<Domain, Range>> &context) const;
2666  inline typed::set<pair<Domain, Range>> gist(const typed::set<pair<Domain, Range>> &context) const;
2667  inline typed::union_set<pair<Domain, Range>> gist(const typed::union_set<pair<Domain, Range>> &context) const;
2668  inline typed::basic_set<pair<Domain, Range>> gist(const typed::point<pair<Domain, Range>> &context) const;
2669  inline typed::set<pair<Domain, Range>> gist_params(const typed::set<> &context) const;
2670  inline typed::map<pair<Domain, Range>, pair<Domain, Range>> identity() const;
2671  inline typed::pw_aff<pair<Domain, Range>, Anonymous> indicator_function() const;
2672  template <typename Arg2>
2673  inline typed::map<Arg2, pair<Domain, Range>> insert_domain(const typed::space<Arg2> &domain) const;
2674  inline typed::basic_set<pair<Domain, Range>> intersect(const typed::basic_set<pair<Domain, Range>> &bset2) const;
2675  inline typed::set<pair<Domain, Range>> intersect(const typed::set<pair<Domain, Range>> &set2) const;
2676  inline typed::union_set<pair<Domain, Range>> intersect(const typed::union_set<pair<Domain, Range>> &uset2) const;
2677  inline typed::basic_set<pair<Domain, Range>> intersect(const typed::point<pair<Domain, Range>> &bset2) const;
2678  inline typed::basic_set<pair<Domain, Range>> intersect_params(const typed::basic_set<> &bset2) const;
2679  inline typed::set<pair<Domain, Range>> intersect_params(const typed::set<> &params) const;
2680  inline typed::basic_set<pair<Domain, Range>> intersect_params(const typed::point<> &bset2) const;
2681  inline typed::fixed_box<pair<Domain, Range>> lattice_tile() const;
2682  inline typed::set<pair<Domain, Range>> lexmax() const;
2683  inline typed::pw_multi_aff<pair<Domain, Range>> lexmax_pw_multi_aff() const;
2684  inline typed::set<pair<Domain, Range>> lexmin() const;
2685  inline typed::pw_multi_aff<pair<Domain, Range>> lexmin_pw_multi_aff() const;
2686  inline typed::set<pair<Domain, Range>> lower_bound(const typed::multi_pw_aff<pair<Domain, Range>> &lower) const;
2687  inline typed::set<pair<Domain, Range>> lower_bound(const typed::multi_val<pair<Domain, Range>> &lower) const;
2688  inline typed::multi_pw_aff<pair<Domain, Range>> max_multi_pw_aff() const;
2689  inline typed::val<pair<Domain, Range>> max_val(const typed::aff<> &obj) const = delete;
2690  inline typed::multi_pw_aff<pair<Domain, Range>> min_multi_pw_aff() const;
2691  inline typed::val<pair<Domain, Range>> min_val(const typed::aff<> &obj) const = delete;
2692  inline typed::pw_aff<pair<Domain, Range>, Anonymous> param_pw_aff_on_domain(const typed::id<Anonymous> &id) const;
2693  inline typed::pw_aff<pair<Domain, Range>, Anonymous> param_pw_aff_on_domain(const std::string &id) const;
2694  inline typed::basic_set<> params() const;
2695  inline typed::multi_val<pair<Domain, Range>> plain_multi_val_if_fixed() const;
2696  template <typename Domain2>
2697  inline typed::set<Domain2> preimage(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const;
2698  template <typename Domain2>
2699  inline typed::set<Domain2> preimage(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const;
2700  template <typename Domain2>
2701  inline typed::set<Domain2> preimage(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const;
2702  template <typename Domain2>
2703  inline typed::union_set<Domain2> preimage(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const;
2704  template <typename Arg2>
2705  inline typed::set<pair<pair<Domain, Range>, Arg2>> product(const typed::set<Arg2> &set2) const;
2706  inline typed::set<pair<Domain, Range>> project_out_all_params() const;
2707  inline typed::set<pair<Domain, Range>> project_out_param(const typed::id<Anonymous> &id) const;
2708  inline typed::set<pair<Domain, Range>> project_out_param(const std::string &id) const;
2709  inline typed::set<pair<Domain, Range>> project_out_param(const typed::id_list<Anonymous> &list) const;
2710  inline typed::pw_aff<pair<Domain, Range>, Anonymous> pw_aff_on_domain(const typed::val<Anonymous> &v) const;
2711  inline typed::pw_aff<pair<Domain, Range>, Anonymous> pw_aff_on_domain(long v) const;
2712  template <typename Arg2>
2713  inline typed::pw_multi_aff<pair<Domain, Range>, Arg2> pw_multi_aff_on_domain(const typed::multi_val<Arg2> &mv) const;
2714  inline typed::set_list<pair<Domain, Range>> set_list() const;
2715  inline typed::fixed_box<pair<Domain, Range>> simple_fixed_box_hull() const;
2716  inline typed::space<pair<Domain, Range>> space() const;
2717  inline typed::set<pair<Domain, Range>> subtract(const typed::set<pair<Domain, Range>> &set2) const;
2718  inline typed::union_set<pair<Domain, Range>> subtract(const typed::union_set<pair<Domain, Range>> &uset2) const;
2719  inline typed::set<pair<Domain, Range>> to_set() const;
2720  inline typed::union_set<pair<Domain, Range>> to_union_set() const;
2721  inline typed::map<pair<Domain, Range>, pair<Domain, Range>> translation() const;
2722  inline typed::set<pair<Domain, Range>> unbind_params(const typed::multi_id<> &tuple) const = delete;
2723  template <typename Arg2>
2724  inline typed::map<Arg2, pair<Domain, Range>> unbind_params_insert_domain(const typed::multi_id<Arg2> &domain) const;
2725  inline typed::set<pair<Domain, Range>> unite(const typed::basic_set<pair<Domain, Range>> &bset2) const;
2726  inline typed::set<pair<Domain, Range>> unite(const typed::set<pair<Domain, Range>> &set2) const;
2727  inline typed::union_set<pair<Domain, Range>> unite(const typed::union_set<pair<Domain, Range>> &uset2) const;
2728  inline typed::set<pair<Domain, Range>> unite(const typed::point<pair<Domain, Range>> &bset2) const;
2729  inline typed::map<Domain, Range> unwrap() const;
2730  inline typed::set<pair<Domain, Range>> upper_bound(const typed::multi_pw_aff<pair<Domain, Range>> &upper) const;
2731  inline typed::set<pair<Domain, Range>> upper_bound(const typed::multi_val<pair<Domain, Range>> &upper) const;
2732  inline typed::set<pair<Range, Domain>> wrapped_reverse() const;
2733};
2734
2735template <typename Domain>
2736struct fixed_box<Domain> : public isl::fixed_box {
2737  template <typename...>
2738  friend struct aff;
2739  template <typename...>
2740  friend struct aff_list;
2741  template <typename...>
2742  friend struct basic_map;
2743  template <typename...>
2744  friend struct basic_set;
2745  template <typename...>
2746  friend struct fixed_box;
2747  template <typename...>
2748  friend struct id;
2749  template <typename...>
2750  friend struct id_list;
2751  template <typename...>
2752  friend struct map;
2753  template <typename...>
2754  friend struct map_list;
2755  template <typename...>
2756  friend struct multi_aff;
2757  template <typename...>
2758  friend struct multi_id;
2759  template <typename...>
2760  friend struct multi_pw_aff;
2761  template <typename...>
2762  friend struct multi_union_pw_aff;
2763  template <typename...>
2764  friend struct multi_val;
2765  template <typename...>
2766  friend struct point;
2767  template <typename...>
2768  friend struct pw_aff;
2769  template <typename...>
2770  friend struct pw_aff_list;
2771  template <typename...>
2772  friend struct pw_multi_aff;
2773  template <typename...>
2774  friend struct pw_multi_aff_list;
2775  template <typename...>
2776  friend struct set;
2777  template <typename...>
2778  friend struct set_list;
2779  template <typename...>
2780  friend struct space;
2781  template <typename...>
2782  friend struct union_map;
2783  template <typename...>
2784  friend struct union_pw_aff;
2785  template <typename...>
2786  friend struct union_pw_aff_list;
2787  template <typename...>
2788  friend struct union_pw_multi_aff;
2789  template <typename...>
2790  friend struct union_set;
2791  template <typename...>
2792  friend struct union_set_list;
2793  template <typename...>
2794  friend struct val;
2795  template <typename...>
2796  friend struct val_list;
2797
2798  fixed_box() = default;
2799  template <typename Arg1,
2800            typename std::enable_if<
2801              std::is_base_of<Domain, Arg1>{},
2802            bool>::type = true>
2803  fixed_box(const fixed_box<Arg1> &obj) : isl::fixed_box(obj) {}
2804 private:
2805  template <typename base,
2806            typename std::enable_if<
2807              std::is_same<base, isl::fixed_box>{}, bool>::type = true>
2808  fixed_box(const base &obj) : isl::fixed_box(obj) {}
2809 public:
2810  static fixed_box from(const isl::fixed_box &obj) {
2811    return fixed_box(obj);
2812  }
2813  inline explicit fixed_box(const isl::ctx &ctx, const std::string &str);
2814  inline typed::multi_aff<Domain> offset() const;
2815  inline typed::multi_aff<Domain> get_offset() const = delete;
2816  inline typed::multi_val<Domain> size() const;
2817  inline typed::multi_val<Domain> get_size() const = delete;
2818  inline typed::space<Domain> space() const;
2819  inline typed::space<Domain> get_space() const = delete;
2820};
2821
2822template <typename Domain, typename Range>
2823struct fixed_box<Domain, Range> : public isl::fixed_box {
2824  template <typename...>
2825  friend struct aff;
2826  template <typename...>
2827  friend struct aff_list;
2828  template <typename...>
2829  friend struct basic_map;
2830  template <typename...>
2831  friend struct basic_set;
2832  template <typename...>
2833  friend struct fixed_box;
2834  template <typename...>
2835  friend struct id;
2836  template <typename...>
2837  friend struct id_list;
2838  template <typename...>
2839  friend struct map;
2840  template <typename...>
2841  friend struct map_list;
2842  template <typename...>
2843  friend struct multi_aff;
2844  template <typename...>
2845  friend struct multi_id;
2846  template <typename...>
2847  friend struct multi_pw_aff;
2848  template <typename...>
2849  friend struct multi_union_pw_aff;
2850  template <typename...>
2851  friend struct multi_val;
2852  template <typename...>
2853  friend struct point;
2854  template <typename...>
2855  friend struct pw_aff;
2856  template <typename...>
2857  friend struct pw_aff_list;
2858  template <typename...>
2859  friend struct pw_multi_aff;
2860  template <typename...>
2861  friend struct pw_multi_aff_list;
2862  template <typename...>
2863  friend struct set;
2864  template <typename...>
2865  friend struct set_list;
2866  template <typename...>
2867  friend struct space;
2868  template <typename...>
2869  friend struct union_map;
2870  template <typename...>
2871  friend struct union_pw_aff;
2872  template <typename...>
2873  friend struct union_pw_aff_list;
2874  template <typename...>
2875  friend struct union_pw_multi_aff;
2876  template <typename...>
2877  friend struct union_set;
2878  template <typename...>
2879  friend struct union_set_list;
2880  template <typename...>
2881  friend struct val;
2882  template <typename...>
2883  friend struct val_list;
2884
2885  fixed_box() = default;
2886  template <typename Arg1, typename Arg2,
2887            typename std::enable_if<
2888              std::is_base_of<Domain, Arg1>{} &&
2889              std::is_base_of<Range, Arg2>{},
2890            bool>::type = true>
2891  fixed_box(const fixed_box<Arg1, Arg2> &obj) : isl::fixed_box(obj) {}
2892 private:
2893  template <typename base,
2894            typename std::enable_if<
2895              std::is_same<base, isl::fixed_box>{}, bool>::type = true>
2896  fixed_box(const base &obj) : isl::fixed_box(obj) {}
2897 public:
2898  static fixed_box from(const isl::fixed_box &obj) {
2899    return fixed_box(obj);
2900  }
2901  inline explicit fixed_box(const isl::ctx &ctx, const std::string &str);
2902  inline typed::multi_aff<Domain, Range> offset() const;
2903  inline typed::multi_aff<Domain, Range> get_offset() const = delete;
2904  inline typed::multi_val<Range> size() const;
2905  inline typed::multi_val<Domain, Range> get_size() const = delete;
2906  inline typed::space<Domain, Range> space() const;
2907  inline typed::space<Domain, Range> get_space() const = delete;
2908};
2909
2910template <>
2911struct id<Anonymous> : public isl::id {
2912  template <typename...>
2913  friend struct aff;
2914  template <typename...>
2915  friend struct aff_list;
2916  template <typename...>
2917  friend struct basic_map;
2918  template <typename...>
2919  friend struct basic_set;
2920  template <typename...>
2921  friend struct fixed_box;
2922  template <typename...>
2923  friend struct id;
2924  template <typename...>
2925  friend struct id_list;
2926  template <typename...>
2927  friend struct map;
2928  template <typename...>
2929  friend struct map_list;
2930  template <typename...>
2931  friend struct multi_aff;
2932  template <typename...>
2933  friend struct multi_id;
2934  template <typename...>
2935  friend struct multi_pw_aff;
2936  template <typename...>
2937  friend struct multi_union_pw_aff;
2938  template <typename...>
2939  friend struct multi_val;
2940  template <typename...>
2941  friend struct point;
2942  template <typename...>
2943  friend struct pw_aff;
2944  template <typename...>
2945  friend struct pw_aff_list;
2946  template <typename...>
2947  friend struct pw_multi_aff;
2948  template <typename...>
2949  friend struct pw_multi_aff_list;
2950  template <typename...>
2951  friend struct set;
2952  template <typename...>
2953  friend struct set_list;
2954  template <typename...>
2955  friend struct space;
2956  template <typename...>
2957  friend struct union_map;
2958  template <typename...>
2959  friend struct union_pw_aff;
2960  template <typename...>
2961  friend struct union_pw_aff_list;
2962  template <typename...>
2963  friend struct union_pw_multi_aff;
2964  template <typename...>
2965  friend struct union_set;
2966  template <typename...>
2967  friend struct union_set_list;
2968  template <typename...>
2969  friend struct val;
2970  template <typename...>
2971  friend struct val_list;
2972
2973  id() = default;
2974  id(const isl::id &obj) : isl::id(obj) {}
2975  static id from(const isl::id &obj) {
2976    return id(obj);
2977  }
2978  inline explicit id(const isl::ctx &ctx, const std::string &str);
2979  inline std::string get_name() const = delete;
2980};
2981
2982template <>
2983struct id_list<Anonymous> : public isl::id_list {
2984  template <typename...>
2985  friend struct aff;
2986  template <typename...>
2987  friend struct aff_list;
2988  template <typename...>
2989  friend struct basic_map;
2990  template <typename...>
2991  friend struct basic_set;
2992  template <typename...>
2993  friend struct fixed_box;
2994  template <typename...>
2995  friend struct id;
2996  template <typename...>
2997  friend struct id_list;
2998  template <typename...>
2999  friend struct map;
3000  template <typename...>
3001  friend struct map_list;
3002  template <typename...>
3003  friend struct multi_aff;
3004  template <typename...>
3005  friend struct multi_id;
3006  template <typename...>
3007  friend struct multi_pw_aff;
3008  template <typename...>
3009  friend struct multi_union_pw_aff;
3010  template <typename...>
3011  friend struct multi_val;
3012  template <typename...>
3013  friend struct point;
3014  template <typename...>
3015  friend struct pw_aff;
3016  template <typename...>
3017  friend struct pw_aff_list;
3018  template <typename...>
3019  friend struct pw_multi_aff;
3020  template <typename...>
3021  friend struct pw_multi_aff_list;
3022  template <typename...>
3023  friend struct set;
3024  template <typename...>
3025  friend struct set_list;
3026  template <typename...>
3027  friend struct space;
3028  template <typename...>
3029  friend struct union_map;
3030  template <typename...>
3031  friend struct union_pw_aff;
3032  template <typename...>
3033  friend struct union_pw_aff_list;
3034  template <typename...>
3035  friend struct union_pw_multi_aff;
3036  template <typename...>
3037  friend struct union_set;
3038  template <typename...>
3039  friend struct union_set_list;
3040  template <typename...>
3041  friend struct val;
3042  template <typename...>
3043  friend struct val_list;
3044
3045  id_list() = default;
3046  id_list(const isl::id_list &obj) : isl::id_list(obj) {}
3047  static id_list from(const isl::id_list &obj) {
3048    return id_list(obj);
3049  }
3050  inline explicit id_list(const isl::ctx &ctx, int n);
3051  inline explicit id_list(const typed::id<Anonymous> &el);
3052  inline explicit id_list(const isl::ctx &ctx, const std::string &str);
3053  inline typed::id_list<Anonymous> add(const typed::id<Anonymous> &el) const;
3054  inline typed::id_list<Anonymous> add(const std::string &el) const;
3055  inline typed::id<Anonymous> at(int index) const;
3056  inline typed::id<Anonymous> get_at(int index) const = delete;
3057  inline typed::id_list<Anonymous> drop(unsigned int first, unsigned int n) const;
3058  inline void foreach(const std::function<void(typed::id<Anonymous>)> &fn) const;
3059  inline void foreach_scc(const std::function<bool(typed::id<Anonymous>, typed::id<Anonymous>)> &follows, const std::function<void(typed::id_list<Anonymous>)> &fn) const;
3060  inline typed::id_list<Anonymous> set_at(int index, const typed::id<Anonymous> &el) const;
3061  inline typed::id_list<Anonymous> set_at(int index, const std::string &el) const;
3062};
3063
3064template <typename Domain, typename Range>
3065struct map<Domain, Range> : public isl::map {
3066  template <typename...>
3067  friend struct aff;
3068  template <typename...>
3069  friend struct aff_list;
3070  template <typename...>
3071  friend struct basic_map;
3072  template <typename...>
3073  friend struct basic_set;
3074  template <typename...>
3075  friend struct fixed_box;
3076  template <typename...>
3077  friend struct id;
3078  template <typename...>
3079  friend struct id_list;
3080  template <typename...>
3081  friend struct map;
3082  template <typename...>
3083  friend struct map_list;
3084  template <typename...>
3085  friend struct multi_aff;
3086  template <typename...>
3087  friend struct multi_id;
3088  template <typename...>
3089  friend struct multi_pw_aff;
3090  template <typename...>
3091  friend struct multi_union_pw_aff;
3092  template <typename...>
3093  friend struct multi_val;
3094  template <typename...>
3095  friend struct point;
3096  template <typename...>
3097  friend struct pw_aff;
3098  template <typename...>
3099  friend struct pw_aff_list;
3100  template <typename...>
3101  friend struct pw_multi_aff;
3102  template <typename...>
3103  friend struct pw_multi_aff_list;
3104  template <typename...>
3105  friend struct set;
3106  template <typename...>
3107  friend struct set_list;
3108  template <typename...>
3109  friend struct space;
3110  template <typename...>
3111  friend struct union_map;
3112  template <typename...>
3113  friend struct union_pw_aff;
3114  template <typename...>
3115  friend struct union_pw_aff_list;
3116  template <typename...>
3117  friend struct union_pw_multi_aff;
3118  template <typename...>
3119  friend struct union_set;
3120  template <typename...>
3121  friend struct union_set_list;
3122  template <typename...>
3123  friend struct val;
3124  template <typename...>
3125  friend struct val_list;
3126
3127  map() = default;
3128  template <typename Arg1, typename Arg2,
3129            typename std::enable_if<
3130              std::is_base_of<Domain, Arg1>{} &&
3131              std::is_base_of<Range, Arg2>{},
3132            bool>::type = true>
3133  map(const map<Arg1, Arg2> &obj) : isl::map(obj) {}
3134 private:
3135  template <typename base,
3136            typename std::enable_if<
3137              std::is_same<base, isl::map>{}, bool>::type = true>
3138  map(const base &obj) : isl::map(obj) {}
3139 public:
3140  static map from(const isl::map &obj) {
3141    return map(obj);
3142  }
3143  inline /* implicit */ map(const typed::basic_map<Domain, Range> &bmap);
3144  inline explicit map(const isl::ctx &ctx, const std::string &str);
3145  template <typename Domain2>
3146  inline typed::map<Domain2, Range> apply_domain(const typed::map<Domain, Domain2> &map2) const;
3147  template <typename Domain2>
3148  inline typed::union_map<Domain2, Range> apply_domain(const typed::union_map<Domain, Domain2> &umap2) const;
3149  template <typename Domain2>
3150  inline typed::map<Domain2, Range> apply_domain(const typed::basic_map<Domain, Domain2> &map2) const;
3151  template <typename Range2>
3152  inline typed::map<Domain, Range2> apply_range(const typed::map<Range, Range2> &map2) const;
3153  template <typename Range2>
3154  inline typed::union_map<Domain, Range2> apply_range(const typed::union_map<Range, Range2> &umap2) const;
3155  template <typename Range2>
3156  inline typed::map<Domain, Range2> apply_range(const typed::basic_map<Range, Range2> &map2) const;
3157  inline typed::map<Domain, Range> as_map() const;
3158  inline typed::multi_union_pw_aff<Domain, Range> as_multi_union_pw_aff() const;
3159  inline typed::pw_multi_aff<Domain, Range> as_pw_multi_aff() const;
3160  inline typed::union_pw_multi_aff<Domain, Range> as_union_pw_multi_aff() const;
3161  inline typed::set<Range> bind_domain(const typed::multi_id<Domain> &tuple) const;
3162  inline typed::set<Domain> bind_range(const typed::multi_id<Range> &tuple) const;
3163  inline typed::map<Domain, Range> coalesce() const;
3164  inline typed::map<Domain, Range> curry() const = delete;
3165  inline typed::set<Domain, Range> deltas() const = delete;
3166  inline typed::map<Domain, Range> detect_equalities() const;
3167  inline typed::set<Domain> domain() const;
3168  inline typed::map<Domain, Range> domain_factor_domain() const = delete;
3169  inline typed::map<Domain, Range> domain_factor_range() const = delete;
3170  inline typed::union_map<pair<Domain, Range>, Domain> domain_map() const;
3171  inline typed::union_pw_multi_aff<pair<Domain, Range>, Domain> domain_map_union_pw_multi_aff() const;
3172  template <typename Domain2>
3173  inline typed::map<pair<Domain, Domain2>, Range> domain_product(const typed::map<Domain2, Range> &map2) const;
3174  template <typename Domain2>
3175  inline typed::union_map<pair<Domain, Domain2>, Range> domain_product(const typed::union_map<Domain2, Range> &umap2) const;
3176  template <typename Domain2>
3177  inline typed::map<pair<Domain, Domain2>, Range> domain_product(const typed::basic_map<Domain2, Range> &map2) const;
3178  inline typed::map<Domain, Range> domain_reverse() const = delete;
3179  inline typed::id<Domain, Range> get_domain_tuple_id() const = delete;
3180  inline typed::map<Domain, Range> drop_unused_params() const;
3181  inline typed::map<Domain, Range> eq_at(const typed::multi_pw_aff<> &mpa) const = delete;
3182  inline typed::union_map<Domain, Range> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
3183  inline typed::map<Domain, Range> eq_at(const typed::aff<> &mpa) const = delete;
3184  inline typed::map<Domain, Range> eq_at(const typed::multi_aff<> &mpa) const = delete;
3185  inline typed::map<Domain, Range> eq_at(const typed::pw_aff<> &mpa) const = delete;
3186  inline typed::map<Domain, Range> eq_at(const typed::pw_multi_aff<> &mpa) const = delete;
3187  inline bool every_map(const std::function<bool(typed::map<Domain, Range>)> &test) const;
3188  inline typed::map<Domain, Range> extract_map(const typed::space<Domain, Range> &space) const;
3189  inline typed::map<Domain, Range> flatten_domain() const = delete;
3190  inline typed::map<Domain, Range> flatten_range() const = delete;
3191  inline void foreach_basic_map(const std::function<void(typed::basic_map<Domain, Range>)> &fn) const;
3192  inline void foreach_map(const std::function<void(typed::map<Domain, Range>)> &fn) const;
3193  inline typed::map<Domain, Range> gist(const typed::map<Domain, Range> &context) const;
3194  inline typed::union_map<Domain, Range> gist(const typed::union_map<Domain, Range> &context) const;
3195  inline typed::map<Domain, Range> gist(const typed::basic_map<Domain, Range> &context) const;
3196  inline typed::map<Domain, Range> gist_domain(const typed::set<Domain> &context) const;
3197  inline typed::union_map<Domain, Range> gist_domain(const typed::union_set<Domain> &uset) const;
3198  inline typed::map<Domain, Range> gist_domain(const typed::basic_set<Domain> &context) const;
3199  inline typed::map<Domain, Range> gist_domain(const typed::point<Domain> &context) const;
3200  inline typed::map<Domain, Range> gist_params(const typed::set<> &context) const;
3201  inline typed::map<Domain, Range> gist_params(const typed::basic_set<> &context) const;
3202  inline typed::map<Domain, Range> gist_params(const typed::point<> &context) const;
3203  inline typed::map<Domain, Range> intersect(const typed::map<Domain, Range> &map2) const;
3204  inline typed::union_map<Domain, Range> intersect(const typed::union_map<Domain, Range> &umap2) const;
3205  inline typed::map<Domain, Range> intersect(const typed::basic_map<Domain, Range> &map2) const;
3206  inline typed::map<Domain, Range> intersect_domain(const typed::set<Domain> &set) const;
3207  inline typed::union_map<Domain, Range> intersect_domain(const typed::space<Domain> &space) const;
3208  inline typed::union_map<Domain, Range> intersect_domain(const typed::union_set<Domain> &uset) const;
3209  inline typed::map<Domain, Range> intersect_domain(const typed::basic_set<Domain> &set) const;
3210  inline typed::map<Domain, Range> intersect_domain(const typed::point<Domain> &set) const;
3211  inline typed::map<Domain, Range> intersect_domain_wrapped_domain(const typed::set<> &domain) const = delete;
3212  inline typed::union_map<Domain, Range> intersect_domain_wrapped_domain(const typed::union_set<> &domain) const = delete;
3213  inline typed::map<Domain, Range> intersect_domain_wrapped_domain(const typed::basic_set<> &domain) const = delete;
3214  inline typed::map<Domain, Range> intersect_domain_wrapped_domain(const typed::point<> &domain) const = delete;
3215  inline typed::map<Domain, Range> intersect_params(const typed::set<> &params) const;
3216  inline typed::map<Domain, Range> intersect_params(const typed::basic_set<> &params) const;
3217  inline typed::map<Domain, Range> intersect_params(const typed::point<> &params) const;
3218  inline typed::map<Domain, Range> intersect_range(const typed::set<Range> &set) const;
3219  inline typed::union_map<Domain, Range> intersect_range(const typed::space<Range> &space) const;
3220  inline typed::union_map<Domain, Range> intersect_range(const typed::union_set<Range> &uset) const;
3221  inline typed::map<Domain, Range> intersect_range(const typed::basic_set<Range> &set) const;
3222  inline typed::map<Domain, Range> intersect_range(const typed::point<Range> &set) const;
3223  inline typed::map<Domain, Range> intersect_range_wrapped_domain(const typed::set<> &domain) const = delete;
3224  inline typed::union_map<Domain, Range> intersect_range_wrapped_domain(const typed::union_set<> &domain) const = delete;
3225  inline typed::map<Domain, Range> intersect_range_wrapped_domain(const typed::basic_set<> &domain) const = delete;
3226  inline typed::map<Domain, Range> intersect_range_wrapped_domain(const typed::point<> &domain) const = delete;
3227  inline typed::map<Domain, Range> lex_ge_at(const typed::multi_pw_aff<> &mpa) const = delete;
3228  inline typed::map<Domain, Range> lex_ge_at(const typed::aff<> &mpa) const = delete;
3229  inline typed::map<Domain, Range> lex_ge_at(const typed::multi_aff<> &mpa) const = delete;
3230  inline typed::map<Domain, Range> lex_ge_at(const typed::pw_aff<> &mpa) const = delete;
3231  inline typed::map<Domain, Range> lex_ge_at(const typed::pw_multi_aff<> &mpa) const = delete;
3232  inline typed::map<Domain, Range> lex_gt_at(const typed::multi_pw_aff<> &mpa) const = delete;
3233  inline typed::map<Domain, Range> lex_gt_at(const typed::aff<> &mpa) const = delete;
3234  inline typed::map<Domain, Range> lex_gt_at(const typed::multi_aff<> &mpa) const = delete;
3235  inline typed::map<Domain, Range> lex_gt_at(const typed::pw_aff<> &mpa) const = delete;
3236  inline typed::map<Domain, Range> lex_gt_at(const typed::pw_multi_aff<> &mpa) const = delete;
3237  inline typed::map<Domain, Range> lex_le_at(const typed::multi_pw_aff<> &mpa) const = delete;
3238  inline typed::map<Domain, Range> lex_le_at(const typed::aff<> &mpa) const = delete;
3239  inline typed::map<Domain, Range> lex_le_at(const typed::multi_aff<> &mpa) const = delete;
3240  inline typed::map<Domain, Range> lex_le_at(const typed::pw_aff<> &mpa) const = delete;
3241  inline typed::map<Domain, Range> lex_le_at(const typed::pw_multi_aff<> &mpa) const = delete;
3242  inline typed::map<Domain, Range> lex_lt_at(const typed::multi_pw_aff<> &mpa) const = delete;
3243  inline typed::map<Domain, Range> lex_lt_at(const typed::aff<> &mpa) const = delete;
3244  inline typed::map<Domain, Range> lex_lt_at(const typed::multi_aff<> &mpa) const = delete;
3245  inline typed::map<Domain, Range> lex_lt_at(const typed::pw_aff<> &mpa) const = delete;
3246  inline typed::map<Domain, Range> lex_lt_at(const typed::pw_multi_aff<> &mpa) const = delete;
3247  inline typed::map<Domain, Range> lexmax() const;
3248  inline typed::pw_multi_aff<Domain, Range> lexmax_pw_multi_aff() const;
3249  inline typed::map<Domain, Range> lexmin() const;
3250  inline typed::pw_multi_aff<Domain, Range> lexmin_pw_multi_aff() const;
3251  inline typed::map<Domain, Range> lower_bound(const typed::multi_pw_aff<Domain, Range> &lower) const;
3252  inline typed::map<Domain, Range> lower_bound(const typed::aff<Domain, Range> &lower) const;
3253  inline typed::map<Domain, Range> lower_bound(const typed::multi_aff<Domain, Range> &lower) const;
3254  inline typed::map<Domain, Range> lower_bound(const typed::pw_aff<Domain, Range> &lower) const;
3255  inline typed::map<Domain, Range> lower_bound(const typed::pw_multi_aff<Domain, Range> &lower) const;
3256  inline typed::map_list<Domain, Range> map_list() const;
3257  inline typed::multi_pw_aff<Domain, Range> max_multi_pw_aff() const;
3258  inline typed::multi_pw_aff<Domain, Range> min_multi_pw_aff() const;
3259  inline typed::set<> params() const;
3260  template <typename Domain2>
3261  inline typed::map<Domain2, Range> preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const;
3262  template <typename Domain2>
3263  inline typed::map<Domain2, Range> preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
3264  template <typename Domain2>
3265  inline typed::map<Domain2, Range> preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
3266  template <typename Domain2>
3267  inline typed::union_map<Domain2, Range> preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
3268  template <typename Range2>
3269  inline typed::map<Domain, Range2> preimage_range(const typed::multi_aff<Range2, Range> &ma) const;
3270  template <typename Range2>
3271  inline typed::map<Domain, Range2> preimage_range(const typed::pw_multi_aff<Range2, Range> &pma) const;
3272  template <typename Range2>
3273  inline typed::union_map<Domain, Range2> preimage_range(const typed::union_pw_multi_aff<Range2, Range> &upma) const;
3274  template <typename Domain2, typename Range2>
3275  inline typed::map<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::map<Domain2, Range2> &map2) const;
3276  template <typename Domain2, typename Range2>
3277  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::union_map<Domain2, Range2> &umap2) const;
3278  template <typename Domain2, typename Range2>
3279  inline typed::map<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::basic_map<Domain2, Range2> &map2) const;
3280  inline typed::map<Domain, Range> project_out_all_params() const;
3281  inline typed::map<Domain, Range> project_out_param(const typed::id<Anonymous> &id) const;
3282  inline typed::map<Domain, Range> project_out_param(const std::string &id) const;
3283  inline typed::map<Domain, Range> project_out_param(const typed::id_list<Anonymous> &list) const;
3284  inline typed::set<Range> range() const;
3285  inline typed::map<Domain, Range> range_factor_domain() const = delete;
3286  inline typed::map<Domain, Range> range_factor_range() const = delete;
3287  inline typed::fixed_box<Domain, Range> range_lattice_tile() const;
3288  inline typed::fixed_box<Domain, Range> get_range_lattice_tile() const = delete;
3289  inline typed::union_map<pair<Domain, Range>, Range> range_map() const;
3290  template <typename Range2>
3291  inline typed::map<Domain, pair<Range, Range2>> range_product(const typed::map<Domain, Range2> &map2) const;
3292  template <typename Range2>
3293  inline typed::union_map<Domain, pair<Range, Range2>> range_product(const typed::union_map<Domain, Range2> &umap2) const;
3294  template <typename Range2>
3295  inline typed::map<Domain, pair<Range, Range2>> range_product(const typed::basic_map<Domain, Range2> &map2) const;
3296  inline typed::map<Domain, Range> range_reverse() const = delete;
3297  inline typed::fixed_box<Domain, Range> range_simple_fixed_box_hull() const;
3298  inline typed::fixed_box<Domain, Range> get_range_simple_fixed_box_hull() const = delete;
3299  inline typed::id<Domain, Range> get_range_tuple_id() const = delete;
3300  inline typed::map<Range, Domain> reverse() const;
3301  template <typename Domain2>
3302  inline typed::map<Domain2, Range> set_domain_tuple(const typed::id<Anonymous> &id) const;
3303  template <typename Domain2>
3304  inline typed::map<Domain2, Range> set_domain_tuple(const std::string &id) const;
3305  template <typename Range2>
3306  inline typed::map<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
3307  template <typename Range2>
3308  inline typed::map<Domain, Range2> set_range_tuple(const std::string &id) const;
3309  inline typed::space<Domain, Range> space() const;
3310  inline typed::space<Domain, Range> get_space() const = delete;
3311  inline typed::map<Domain, Range> subtract(const typed::map<Domain, Range> &map2) const;
3312  inline typed::union_map<Domain, Range> subtract(const typed::union_map<Domain, Range> &umap2) const;
3313  inline typed::map<Domain, Range> subtract(const typed::basic_map<Domain, Range> &map2) const;
3314  inline typed::union_map<Domain, Range> subtract_domain(const typed::union_set<Domain> &dom) const;
3315  inline typed::union_map<Domain, Range> subtract_range(const typed::union_set<Range> &dom) const;
3316  inline typed::union_map<Domain, Range> to_union_map() const;
3317  inline typed::map<Domain, Range> uncurry() const = delete;
3318  inline typed::map<Domain, Range> unite(const typed::map<Domain, Range> &map2) const;
3319  inline typed::union_map<Domain, Range> unite(const typed::union_map<Domain, Range> &umap2) const;
3320  inline typed::map<Domain, Range> unite(const typed::basic_map<Domain, Range> &map2) const;
3321  static inline typed::map<Domain, Range> universe(const typed::space<Domain, Range> &space);
3322  inline typed::map<Domain, Range> upper_bound(const typed::multi_pw_aff<Domain, Range> &upper) const;
3323  inline typed::map<Domain, Range> upper_bound(const typed::aff<Domain, Range> &upper) const;
3324  inline typed::map<Domain, Range> upper_bound(const typed::multi_aff<Domain, Range> &upper) const;
3325  inline typed::map<Domain, Range> upper_bound(const typed::pw_aff<Domain, Range> &upper) const;
3326  inline typed::map<Domain, Range> upper_bound(const typed::pw_multi_aff<Domain, Range> &upper) const;
3327  inline typed::set<pair<Domain, Range>> wrap() const;
3328};
3329
3330template <typename Domain, typename Range, typename Range2>
3331struct map<pair<Domain, Range>, Range2> : public isl::map {
3332  template <typename...>
3333  friend struct aff;
3334  template <typename...>
3335  friend struct aff_list;
3336  template <typename...>
3337  friend struct basic_map;
3338  template <typename...>
3339  friend struct basic_set;
3340  template <typename...>
3341  friend struct fixed_box;
3342  template <typename...>
3343  friend struct id;
3344  template <typename...>
3345  friend struct id_list;
3346  template <typename...>
3347  friend struct map;
3348  template <typename...>
3349  friend struct map_list;
3350  template <typename...>
3351  friend struct multi_aff;
3352  template <typename...>
3353  friend struct multi_id;
3354  template <typename...>
3355  friend struct multi_pw_aff;
3356  template <typename...>
3357  friend struct multi_union_pw_aff;
3358  template <typename...>
3359  friend struct multi_val;
3360  template <typename...>
3361  friend struct point;
3362  template <typename...>
3363  friend struct pw_aff;
3364  template <typename...>
3365  friend struct pw_aff_list;
3366  template <typename...>
3367  friend struct pw_multi_aff;
3368  template <typename...>
3369  friend struct pw_multi_aff_list;
3370  template <typename...>
3371  friend struct set;
3372  template <typename...>
3373  friend struct set_list;
3374  template <typename...>
3375  friend struct space;
3376  template <typename...>
3377  friend struct union_map;
3378  template <typename...>
3379  friend struct union_pw_aff;
3380  template <typename...>
3381  friend struct union_pw_aff_list;
3382  template <typename...>
3383  friend struct union_pw_multi_aff;
3384  template <typename...>
3385  friend struct union_set;
3386  template <typename...>
3387  friend struct union_set_list;
3388  template <typename...>
3389  friend struct val;
3390  template <typename...>
3391  friend struct val_list;
3392
3393  map() = default;
3394  template <typename Arg1, typename Arg2, typename Arg3,
3395            typename std::enable_if<
3396              std::is_base_of<Domain, Arg1>{} &&
3397              std::is_base_of<Range, Arg2>{} &&
3398              std::is_base_of<Range2, Arg3>{},
3399            bool>::type = true>
3400  map(const map<pair<Arg1, Arg2>, Arg3> &obj) : isl::map(obj) {}
3401 private:
3402  template <typename base,
3403            typename std::enable_if<
3404              std::is_same<base, isl::map>{}, bool>::type = true>
3405  map(const base &obj) : isl::map(obj) {}
3406 public:
3407  static map from(const isl::map &obj) {
3408    return map(obj);
3409  }
3410  inline /* implicit */ map(const typed::basic_map<pair<Domain, Range>, Range2> &bmap);
3411  inline explicit map(const isl::ctx &ctx, const std::string &str);
3412  template <typename Domain2>
3413  inline typed::map<Domain2, Range2> apply_domain(const typed::map<pair<Domain, Range>, Domain2> &map2) const;
3414  template <typename Domain2>
3415  inline typed::union_map<Domain2, Range2> apply_domain(const typed::union_map<pair<Domain, Range>, Domain2> &umap2) const;
3416  template <typename Domain2>
3417  inline typed::map<Domain2, Range2> apply_domain(const typed::basic_map<pair<Domain, Range>, Domain2> &map2) const;
3418  template <typename Arg3>
3419  inline typed::map<pair<Domain, Range>, Arg3> apply_range(const typed::map<Range2, Arg3> &map2) const;
3420  template <typename Arg3>
3421  inline typed::union_map<pair<Domain, Range>, Arg3> apply_range(const typed::union_map<Range2, Arg3> &umap2) const;
3422  template <typename Arg3>
3423  inline typed::map<pair<Domain, Range>, Arg3> apply_range(const typed::basic_map<Range2, Arg3> &map2) const;
3424  inline typed::map<pair<Domain, Range>, Range2> as_map() const;
3425  inline typed::multi_union_pw_aff<pair<Domain, Range>, Range2> as_multi_union_pw_aff() const;
3426  inline typed::pw_multi_aff<pair<Domain, Range>, Range2> as_pw_multi_aff() const;
3427  inline typed::union_pw_multi_aff<pair<Domain, Range>, Range2> as_union_pw_multi_aff() const;
3428  inline typed::set<Range2> bind_domain(const typed::multi_id<pair<Domain, Range>> &tuple) const;
3429  inline typed::set<pair<Domain, Range>> bind_range(const typed::multi_id<Range2> &tuple) const;
3430  inline typed::map<pair<Domain, Range>, Range2> coalesce() const;
3431  inline typed::map<Domain, pair<Range, Range2>> curry() const;
3432  inline typed::set<pair<Domain, Range>, Range2> deltas() const = delete;
3433  inline typed::map<pair<Domain, Range>, Range2> detect_equalities() const;
3434  inline typed::set<pair<Domain, Range>> domain() const;
3435  inline typed::map<Domain, Range2> domain_factor_domain() const;
3436  inline typed::map<Range, Range2> domain_factor_range() const;
3437  inline typed::union_map<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> domain_map() const;
3438  inline typed::union_pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> domain_map_union_pw_multi_aff() const;
3439  template <typename Domain2>
3440  inline typed::map<pair<pair<Domain, Range>, Domain2>, Range2> domain_product(const typed::map<Domain2, Range2> &map2) const;
3441  template <typename Domain2>
3442  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> domain_product(const typed::union_map<Domain2, Range2> &umap2) const;
3443  template <typename Domain2>
3444  inline typed::map<pair<pair<Domain, Range>, Domain2>, Range2> domain_product(const typed::basic_map<Domain2, Range2> &map2) const;
3445  inline typed::map<pair<Range, Domain>, Range2> domain_reverse() const;
3446  inline typed::id<pair<Domain, Range>, Range2> get_domain_tuple_id() const = delete;
3447  inline typed::map<pair<Domain, Range>, Range2> drop_unused_params() const;
3448  inline typed::map<pair<Domain, Range>, Range2> eq_at(const typed::multi_pw_aff<> &mpa) const = delete;
3449  inline typed::union_map<pair<Domain, Range>, Range2> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
3450  inline typed::map<pair<Domain, Range>, Range2> eq_at(const typed::aff<> &mpa) const = delete;
3451  inline typed::map<pair<Domain, Range>, Range2> eq_at(const typed::multi_aff<> &mpa) const = delete;
3452  inline typed::map<pair<Domain, Range>, Range2> eq_at(const typed::pw_aff<> &mpa) const = delete;
3453  inline typed::map<pair<Domain, Range>, Range2> eq_at(const typed::pw_multi_aff<> &mpa) const = delete;
3454  inline bool every_map(const std::function<bool(typed::map<pair<Domain, Range>, Range2>)> &test) const;
3455  inline typed::map<pair<Domain, Range>, Range2> extract_map(const typed::space<pair<Domain, Range>, Range2> &space) const;
3456  inline typed::map<Anonymous, Range2> flatten_domain() const;
3457  inline typed::map<pair<Domain, Range>, Range2> flatten_range() const = delete;
3458  inline void foreach_basic_map(const std::function<void(typed::basic_map<pair<Domain, Range>, Range2>)> &fn) const;
3459  inline void foreach_map(const std::function<void(typed::map<pair<Domain, Range>, Range2>)> &fn) const;
3460  inline typed::map<pair<Domain, Range>, Range2> gist(const typed::map<pair<Domain, Range>, Range2> &context) const;
3461  inline typed::union_map<pair<Domain, Range>, Range2> gist(const typed::union_map<pair<Domain, Range>, Range2> &context) const;
3462  inline typed::map<pair<Domain, Range>, Range2> gist(const typed::basic_map<pair<Domain, Range>, Range2> &context) const;
3463  inline typed::map<pair<Domain, Range>, Range2> gist_domain(const typed::set<pair<Domain, Range>> &context) const;
3464  inline typed::union_map<pair<Domain, Range>, Range2> gist_domain(const typed::union_set<pair<Domain, Range>> &uset) const;
3465  inline typed::map<pair<Domain, Range>, Range2> gist_domain(const typed::basic_set<pair<Domain, Range>> &context) const;
3466  inline typed::map<pair<Domain, Range>, Range2> gist_domain(const typed::point<pair<Domain, Range>> &context) const;
3467  inline typed::map<pair<Domain, Range>, Range2> gist_params(const typed::set<> &context) const;
3468  inline typed::map<pair<Domain, Range>, Range2> gist_params(const typed::basic_set<> &context) const;
3469  inline typed::map<pair<Domain, Range>, Range2> gist_params(const typed::point<> &context) const;
3470  inline typed::map<pair<Domain, Range>, Range2> intersect(const typed::map<pair<Domain, Range>, Range2> &map2) const;
3471  inline typed::union_map<pair<Domain, Range>, Range2> intersect(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const;
3472  inline typed::map<pair<Domain, Range>, Range2> intersect(const typed::basic_map<pair<Domain, Range>, Range2> &map2) const;
3473  inline typed::map<pair<Domain, Range>, Range2> intersect_domain(const typed::set<pair<Domain, Range>> &set) const;
3474  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain(const typed::space<pair<Domain, Range>> &space) const;
3475  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain(const typed::union_set<pair<Domain, Range>> &uset) const;
3476  inline typed::map<pair<Domain, Range>, Range2> intersect_domain(const typed::basic_set<pair<Domain, Range>> &set) const;
3477  inline typed::map<pair<Domain, Range>, Range2> intersect_domain(const typed::point<pair<Domain, Range>> &set) const;
3478  inline typed::map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::set<Domain> &domain) const;
3479  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::union_set<Domain> &domain) const;
3480  inline typed::map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::basic_set<Domain> &domain) const;
3481  inline typed::map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::point<Domain> &domain) const;
3482  inline typed::map<pair<Domain, Range>, Range2> intersect_params(const typed::set<> &params) const;
3483  inline typed::map<pair<Domain, Range>, Range2> intersect_params(const typed::basic_set<> &params) const;
3484  inline typed::map<pair<Domain, Range>, Range2> intersect_params(const typed::point<> &params) const;
3485  inline typed::map<pair<Domain, Range>, Range2> intersect_range(const typed::set<Range2> &set) const;
3486  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range(const typed::space<Range2> &space) const;
3487  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range(const typed::union_set<Range2> &uset) const;
3488  inline typed::map<pair<Domain, Range>, Range2> intersect_range(const typed::basic_set<Range2> &set) const;
3489  inline typed::map<pair<Domain, Range>, Range2> intersect_range(const typed::point<Range2> &set) const;
3490  inline typed::map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::set<> &domain) const = delete;
3491  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::union_set<> &domain) const = delete;
3492  inline typed::map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::basic_set<> &domain) const = delete;
3493  inline typed::map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::point<> &domain) const = delete;
3494  inline typed::map<pair<Domain, Range>, Range2> lex_ge_at(const typed::multi_pw_aff<> &mpa) const = delete;
3495  inline typed::map<pair<Domain, Range>, Range2> lex_ge_at(const typed::aff<> &mpa) const = delete;
3496  inline typed::map<pair<Domain, Range>, Range2> lex_ge_at(const typed::multi_aff<> &mpa) const = delete;
3497  inline typed::map<pair<Domain, Range>, Range2> lex_ge_at(const typed::pw_aff<> &mpa) const = delete;
3498  inline typed::map<pair<Domain, Range>, Range2> lex_ge_at(const typed::pw_multi_aff<> &mpa) const = delete;
3499  inline typed::map<pair<Domain, Range>, Range2> lex_gt_at(const typed::multi_pw_aff<> &mpa) const = delete;
3500  inline typed::map<pair<Domain, Range>, Range2> lex_gt_at(const typed::aff<> &mpa) const = delete;
3501  inline typed::map<pair<Domain, Range>, Range2> lex_gt_at(const typed::multi_aff<> &mpa) const = delete;
3502  inline typed::map<pair<Domain, Range>, Range2> lex_gt_at(const typed::pw_aff<> &mpa) const = delete;
3503  inline typed::map<pair<Domain, Range>, Range2> lex_gt_at(const typed::pw_multi_aff<> &mpa) const = delete;
3504  inline typed::map<pair<Domain, Range>, Range2> lex_le_at(const typed::multi_pw_aff<> &mpa) const = delete;
3505  inline typed::map<pair<Domain, Range>, Range2> lex_le_at(const typed::aff<> &mpa) const = delete;
3506  inline typed::map<pair<Domain, Range>, Range2> lex_le_at(const typed::multi_aff<> &mpa) const = delete;
3507  inline typed::map<pair<Domain, Range>, Range2> lex_le_at(const typed::pw_aff<> &mpa) const = delete;
3508  inline typed::map<pair<Domain, Range>, Range2> lex_le_at(const typed::pw_multi_aff<> &mpa) const = delete;
3509  inline typed::map<pair<Domain, Range>, Range2> lex_lt_at(const typed::multi_pw_aff<> &mpa) const = delete;
3510  inline typed::map<pair<Domain, Range>, Range2> lex_lt_at(const typed::aff<> &mpa) const = delete;
3511  inline typed::map<pair<Domain, Range>, Range2> lex_lt_at(const typed::multi_aff<> &mpa) const = delete;
3512  inline typed::map<pair<Domain, Range>, Range2> lex_lt_at(const typed::pw_aff<> &mpa) const = delete;
3513  inline typed::map<pair<Domain, Range>, Range2> lex_lt_at(const typed::pw_multi_aff<> &mpa) const = delete;
3514  inline typed::map<pair<Domain, Range>, Range2> lexmax() const;
3515  inline typed::pw_multi_aff<pair<Domain, Range>, Range2> lexmax_pw_multi_aff() const;
3516  inline typed::map<pair<Domain, Range>, Range2> lexmin() const;
3517  inline typed::pw_multi_aff<pair<Domain, Range>, Range2> lexmin_pw_multi_aff() const;
3518  inline typed::map<pair<Domain, Range>, Range2> lower_bound(const typed::multi_pw_aff<pair<Domain, Range>, Range2> &lower) const;
3519  inline typed::map<pair<Domain, Range>, Range2> lower_bound(const typed::aff<pair<Domain, Range>, Range2> &lower) const;
3520  inline typed::map<pair<Domain, Range>, Range2> lower_bound(const typed::multi_aff<pair<Domain, Range>, Range2> &lower) const;
3521  inline typed::map<pair<Domain, Range>, Range2> lower_bound(const typed::pw_aff<pair<Domain, Range>, Range2> &lower) const;
3522  inline typed::map<pair<Domain, Range>, Range2> lower_bound(const typed::pw_multi_aff<pair<Domain, Range>, Range2> &lower) const;
3523  inline typed::map_list<pair<Domain, Range>, Range2> map_list() const;
3524  inline typed::multi_pw_aff<pair<Domain, Range>, Range2> max_multi_pw_aff() const;
3525  inline typed::multi_pw_aff<pair<Domain, Range>, Range2> min_multi_pw_aff() const;
3526  inline typed::set<> params() const;
3527  template <typename Domain2>
3528  inline typed::map<Domain2, Range2> preimage_domain(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const;
3529  template <typename Domain2>
3530  inline typed::map<Domain2, Range2> preimage_domain(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const;
3531  template <typename Domain2>
3532  inline typed::map<Domain2, Range2> preimage_domain(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const;
3533  template <typename Domain2>
3534  inline typed::union_map<Domain2, Range2> preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const;
3535  template <typename Arg3>
3536  inline typed::map<pair<Domain, Range>, Arg3> preimage_range(const typed::multi_aff<Arg3, Range2> &ma) const;
3537  template <typename Arg3>
3538  inline typed::map<pair<Domain, Range>, Arg3> preimage_range(const typed::pw_multi_aff<Arg3, Range2> &pma) const;
3539  template <typename Arg3>
3540  inline typed::union_map<pair<Domain, Range>, Arg3> preimage_range(const typed::union_pw_multi_aff<Arg3, Range2> &upma) const;
3541  template <typename Domain2, typename Arg3>
3542  inline typed::map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> product(const typed::map<Domain2, Arg3> &map2) const;
3543  template <typename Domain2, typename Arg3>
3544  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> product(const typed::union_map<Domain2, Arg3> &umap2) const;
3545  template <typename Domain2, typename Arg3>
3546  inline typed::map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> product(const typed::basic_map<Domain2, Arg3> &map2) const;
3547  inline typed::map<pair<Domain, Range>, Range2> project_out_all_params() const;
3548  inline typed::map<pair<Domain, Range>, Range2> project_out_param(const typed::id<Anonymous> &id) const;
3549  inline typed::map<pair<Domain, Range>, Range2> project_out_param(const std::string &id) const;
3550  inline typed::map<pair<Domain, Range>, Range2> project_out_param(const typed::id_list<Anonymous> &list) const;
3551  inline typed::set<Range2> range() const;
3552  inline typed::map<pair<Domain, Range>, Range2> range_factor_domain() const = delete;
3553  inline typed::map<pair<Domain, Range>, Range2> range_factor_range() const = delete;
3554  inline typed::fixed_box<pair<Domain, Range>, Range2> range_lattice_tile() const;
3555  inline typed::fixed_box<pair<Domain, Range>, Range2> get_range_lattice_tile() const = delete;
3556  inline typed::union_map<pair<pair<Domain, Range>, Range2>, Range2> range_map() const;
3557  template <typename Arg3>
3558  inline typed::map<pair<Domain, Range>, pair<Range2, Arg3>> range_product(const typed::map<pair<Domain, Range>, Arg3> &map2) const;
3559  template <typename Arg3>
3560  inline typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> range_product(const typed::union_map<pair<Domain, Range>, Arg3> &umap2) const;
3561  template <typename Arg3>
3562  inline typed::map<pair<Domain, Range>, pair<Range2, Arg3>> range_product(const typed::basic_map<pair<Domain, Range>, Arg3> &map2) const;
3563  inline typed::map<pair<Domain, Range>, Range2> range_reverse() const = delete;
3564  inline typed::fixed_box<pair<Domain, Range>, Range2> range_simple_fixed_box_hull() const;
3565  inline typed::fixed_box<pair<Domain, Range>, Range2> get_range_simple_fixed_box_hull() const = delete;
3566  inline typed::id<pair<Domain, Range>, Range2> get_range_tuple_id() const = delete;
3567  inline typed::map<Range2, pair<Domain, Range>> reverse() const;
3568  inline typed::map<pair<Domain, Range>, Range2> set_domain_tuple(const typed::id<> &id) const = delete;
3569  inline typed::map<pair<Domain, Range>, Range2> set_domain_tuple(const std::string &id) const = delete;
3570  template <typename Arg2>
3571  inline typed::map<pair<Domain, Range>, Arg2> set_range_tuple(const typed::id<Anonymous> &id) const;
3572  template <typename Arg2>
3573  inline typed::map<pair<Domain, Range>, Arg2> set_range_tuple(const std::string &id) const;
3574  inline typed::space<pair<Domain, Range>, Range2> space() const;
3575  inline typed::space<pair<Domain, Range>, Range2> get_space() const = delete;
3576  inline typed::map<pair<Domain, Range>, Range2> subtract(const typed::map<pair<Domain, Range>, Range2> &map2) const;
3577  inline typed::union_map<pair<Domain, Range>, Range2> subtract(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const;
3578  inline typed::map<pair<Domain, Range>, Range2> subtract(const typed::basic_map<pair<Domain, Range>, Range2> &map2) const;
3579  inline typed::union_map<pair<Domain, Range>, Range2> subtract_domain(const typed::union_set<pair<Domain, Range>> &dom) const;
3580  inline typed::union_map<pair<Domain, Range>, Range2> subtract_range(const typed::union_set<Range2> &dom) const;
3581  inline typed::union_map<pair<Domain, Range>, Range2> to_union_map() const;
3582  inline typed::map<pair<Domain, Range>, Range2> uncurry() const = delete;
3583  inline typed::map<pair<Domain, Range>, Range2> unite(const typed::map<pair<Domain, Range>, Range2> &map2) const;
3584  inline typed::union_map<pair<Domain, Range>, Range2> unite(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const;
3585  inline typed::map<pair<Domain, Range>, Range2> unite(const typed::basic_map<pair<Domain, Range>, Range2> &map2) const;
3586  static inline typed::map<pair<Domain, Range>, Range2> universe(const typed::space<pair<Domain, Range>, Range2> &space);
3587  inline typed::map<pair<Domain, Range>, Range2> upper_bound(const typed::multi_pw_aff<pair<Domain, Range>, Range2> &upper) const;
3588  inline typed::map<pair<Domain, Range>, Range2> upper_bound(const typed::aff<pair<Domain, Range>, Range2> &upper) const;
3589  inline typed::map<pair<Domain, Range>, Range2> upper_bound(const typed::multi_aff<pair<Domain, Range>, Range2> &upper) const;
3590  inline typed::map<pair<Domain, Range>, Range2> upper_bound(const typed::pw_aff<pair<Domain, Range>, Range2> &upper) const;
3591  inline typed::map<pair<Domain, Range>, Range2> upper_bound(const typed::pw_multi_aff<pair<Domain, Range>, Range2> &upper) const;
3592  inline typed::set<pair<pair<Domain, Range>, Range2>> wrap() const;
3593};
3594
3595template <typename Domain>
3596struct map<Domain, Domain> : public isl::map {
3597  template <typename...>
3598  friend struct aff;
3599  template <typename...>
3600  friend struct aff_list;
3601  template <typename...>
3602  friend struct basic_map;
3603  template <typename...>
3604  friend struct basic_set;
3605  template <typename...>
3606  friend struct fixed_box;
3607  template <typename...>
3608  friend struct id;
3609  template <typename...>
3610  friend struct id_list;
3611  template <typename...>
3612  friend struct map;
3613  template <typename...>
3614  friend struct map_list;
3615  template <typename...>
3616  friend struct multi_aff;
3617  template <typename...>
3618  friend struct multi_id;
3619  template <typename...>
3620  friend struct multi_pw_aff;
3621  template <typename...>
3622  friend struct multi_union_pw_aff;
3623  template <typename...>
3624  friend struct multi_val;
3625  template <typename...>
3626  friend struct point;
3627  template <typename...>
3628  friend struct pw_aff;
3629  template <typename...>
3630  friend struct pw_aff_list;
3631  template <typename...>
3632  friend struct pw_multi_aff;
3633  template <typename...>
3634  friend struct pw_multi_aff_list;
3635  template <typename...>
3636  friend struct set;
3637  template <typename...>
3638  friend struct set_list;
3639  template <typename...>
3640  friend struct space;
3641  template <typename...>
3642  friend struct union_map;
3643  template <typename...>
3644  friend struct union_pw_aff;
3645  template <typename...>
3646  friend struct union_pw_aff_list;
3647  template <typename...>
3648  friend struct union_pw_multi_aff;
3649  template <typename...>
3650  friend struct union_set;
3651  template <typename...>
3652  friend struct union_set_list;
3653  template <typename...>
3654  friend struct val;
3655  template <typename...>
3656  friend struct val_list;
3657
3658  map() = default;
3659  template <typename Arg1,
3660            typename std::enable_if<
3661              std::is_base_of<Domain, Arg1>{},
3662            bool>::type = true>
3663  map(const map<Arg1, Arg1> &obj) : isl::map(obj) {}
3664 private:
3665  template <typename base,
3666            typename std::enable_if<
3667              std::is_same<base, isl::map>{}, bool>::type = true>
3668  map(const base &obj) : isl::map(obj) {}
3669 public:
3670  static map from(const isl::map &obj) {
3671    return map(obj);
3672  }
3673  inline /* implicit */ map(const typed::basic_map<Domain, Domain> &bmap);
3674  inline explicit map(const isl::ctx &ctx, const std::string &str);
3675  template <typename Domain2>
3676  inline typed::map<Domain2, Domain> apply_domain(const typed::map<Domain, Domain2> &map2) const;
3677  template <typename Domain2>
3678  inline typed::union_map<Domain2, Domain> apply_domain(const typed::union_map<Domain, Domain2> &umap2) const;
3679  template <typename Domain2>
3680  inline typed::map<Domain2, Domain> apply_domain(const typed::basic_map<Domain, Domain2> &map2) const;
3681  template <typename Range2>
3682  inline typed::map<Domain, Range2> apply_range(const typed::map<Domain, Range2> &map2) const;
3683  template <typename Range2>
3684  inline typed::union_map<Domain, Range2> apply_range(const typed::union_map<Domain, Range2> &umap2) const;
3685  template <typename Range2>
3686  inline typed::map<Domain, Range2> apply_range(const typed::basic_map<Domain, Range2> &map2) const;
3687  inline typed::map<Domain, Domain> as_map() const;
3688  inline typed::multi_union_pw_aff<Domain, Domain> as_multi_union_pw_aff() const;
3689  inline typed::pw_multi_aff<Domain, Domain> as_pw_multi_aff() const;
3690  inline typed::union_pw_multi_aff<Domain, Domain> as_union_pw_multi_aff() const;
3691  inline typed::set<Domain> bind_domain(const typed::multi_id<Domain> &tuple) const;
3692  inline typed::set<Domain> bind_range(const typed::multi_id<Domain> &tuple) const;
3693  inline typed::map<Domain, Domain> coalesce() const;
3694  inline typed::map<Domain, Domain> curry() const = delete;
3695  inline typed::set<Domain> deltas() const;
3696  inline typed::map<Domain, Domain> detect_equalities() const;
3697  inline typed::set<Domain> domain() const;
3698  inline typed::map<Domain, Domain> domain_factor_domain() const = delete;
3699  inline typed::map<Domain, Domain> domain_factor_range() const = delete;
3700  inline typed::union_map<pair<Domain, Domain>, Domain> domain_map() const;
3701  inline typed::union_pw_multi_aff<pair<Domain, Domain>, Domain> domain_map_union_pw_multi_aff() const;
3702  template <typename Domain2>
3703  inline typed::map<pair<Domain, Domain2>, Domain> domain_product(const typed::map<Domain2, Domain> &map2) const;
3704  template <typename Domain2>
3705  inline typed::union_map<pair<Domain, Domain2>, Domain> domain_product(const typed::union_map<Domain2, Domain> &umap2) const;
3706  template <typename Domain2>
3707  inline typed::map<pair<Domain, Domain2>, Domain> domain_product(const typed::basic_map<Domain2, Domain> &map2) const;
3708  inline typed::map<Domain, Domain> domain_reverse() const = delete;
3709  inline typed::id<Domain, Domain> get_domain_tuple_id() const = delete;
3710  inline typed::map<Domain, Domain> drop_unused_params() const;
3711  template <typename Range>
3712  inline typed::map<Domain, Domain> eq_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
3713  template <typename Range>
3714  inline typed::union_map<Domain, Domain> eq_at(const typed::multi_union_pw_aff<Domain, Range> &mupa) const;
3715  inline typed::map<Domain, Domain> eq_at(const typed::aff<Domain, Anonymous> &mpa) const;
3716  template <typename Range>
3717  inline typed::map<Domain, Domain> eq_at(const typed::multi_aff<Domain, Range> &mpa) const;
3718  inline typed::map<Domain, Domain> eq_at(const typed::pw_aff<Domain, Anonymous> &mpa) const;
3719  template <typename Range>
3720  inline typed::map<Domain, Domain> eq_at(const typed::pw_multi_aff<Domain, Range> &mpa) const;
3721  inline bool every_map(const std::function<bool(typed::map<Domain, Domain>)> &test) const;
3722  inline typed::map<Domain, Domain> extract_map(const typed::space<Domain, Domain> &space) const;
3723  inline typed::map<Domain, Domain> flatten_domain() const = delete;
3724  inline typed::map<Domain, Domain> flatten_range() const = delete;
3725  inline void foreach_basic_map(const std::function<void(typed::basic_map<Domain, Domain>)> &fn) const;
3726  inline void foreach_map(const std::function<void(typed::map<Domain, Domain>)> &fn) const;
3727  inline typed::map<Domain, Domain> gist(const typed::map<Domain, Domain> &context) const;
3728  inline typed::union_map<Domain, Domain> gist(const typed::union_map<Domain, Domain> &context) const;
3729  inline typed::map<Domain, Domain> gist(const typed::basic_map<Domain, Domain> &context) const;
3730  inline typed::map<Domain, Domain> gist_domain(const typed::set<Domain> &context) const;
3731  inline typed::union_map<Domain, Domain> gist_domain(const typed::union_set<Domain> &uset) const;
3732  inline typed::map<Domain, Domain> gist_domain(const typed::basic_set<Domain> &context) const;
3733  inline typed::map<Domain, Domain> gist_domain(const typed::point<Domain> &context) const;
3734  inline typed::map<Domain, Domain> gist_params(const typed::set<> &context) const;
3735  inline typed::map<Domain, Domain> gist_params(const typed::basic_set<> &context) const;
3736  inline typed::map<Domain, Domain> gist_params(const typed::point<> &context) const;
3737  inline typed::map<Domain, Domain> intersect(const typed::map<Domain, Domain> &map2) const;
3738  inline typed::union_map<Domain, Domain> intersect(const typed::union_map<Domain, Domain> &umap2) const;
3739  inline typed::map<Domain, Domain> intersect(const typed::basic_map<Domain, Domain> &map2) const;
3740  inline typed::map<Domain, Domain> intersect_domain(const typed::set<Domain> &set) const;
3741  inline typed::union_map<Domain, Domain> intersect_domain(const typed::space<Domain> &space) const;
3742  inline typed::union_map<Domain, Domain> intersect_domain(const typed::union_set<Domain> &uset) const;
3743  inline typed::map<Domain, Domain> intersect_domain(const typed::basic_set<Domain> &set) const;
3744  inline typed::map<Domain, Domain> intersect_domain(const typed::point<Domain> &set) const;
3745  inline typed::map<Domain, Domain> intersect_domain_wrapped_domain(const typed::set<> &domain) const = delete;
3746  inline typed::union_map<Domain, Domain> intersect_domain_wrapped_domain(const typed::union_set<> &domain) const = delete;
3747  inline typed::map<Domain, Domain> intersect_domain_wrapped_domain(const typed::basic_set<> &domain) const = delete;
3748  inline typed::map<Domain, Domain> intersect_domain_wrapped_domain(const typed::point<> &domain) const = delete;
3749  inline typed::map<Domain, Domain> intersect_params(const typed::set<> &params) const;
3750  inline typed::map<Domain, Domain> intersect_params(const typed::basic_set<> &params) const;
3751  inline typed::map<Domain, Domain> intersect_params(const typed::point<> &params) const;
3752  inline typed::map<Domain, Domain> intersect_range(const typed::set<Domain> &set) const;
3753  inline typed::union_map<Domain, Domain> intersect_range(const typed::space<Domain> &space) const;
3754  inline typed::union_map<Domain, Domain> intersect_range(const typed::union_set<Domain> &uset) const;
3755  inline typed::map<Domain, Domain> intersect_range(const typed::basic_set<Domain> &set) const;
3756  inline typed::map<Domain, Domain> intersect_range(const typed::point<Domain> &set) const;
3757  inline typed::map<Domain, Domain> intersect_range_wrapped_domain(const typed::set<> &domain) const = delete;
3758  inline typed::union_map<Domain, Domain> intersect_range_wrapped_domain(const typed::union_set<> &domain) const = delete;
3759  inline typed::map<Domain, Domain> intersect_range_wrapped_domain(const typed::basic_set<> &domain) const = delete;
3760  inline typed::map<Domain, Domain> intersect_range_wrapped_domain(const typed::point<> &domain) const = delete;
3761  template <typename Range>
3762  inline typed::map<Domain, Domain> lex_ge_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
3763  inline typed::map<Domain, Domain> lex_ge_at(const typed::aff<Domain, Anonymous> &mpa) const;
3764  template <typename Range>
3765  inline typed::map<Domain, Domain> lex_ge_at(const typed::multi_aff<Domain, Range> &mpa) const;
3766  inline typed::map<Domain, Domain> lex_ge_at(const typed::pw_aff<Domain, Anonymous> &mpa) const;
3767  template <typename Range>
3768  inline typed::map<Domain, Domain> lex_ge_at(const typed::pw_multi_aff<Domain, Range> &mpa) const;
3769  template <typename Range>
3770  inline typed::map<Domain, Domain> lex_gt_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
3771  inline typed::map<Domain, Domain> lex_gt_at(const typed::aff<Domain, Anonymous> &mpa) const;
3772  template <typename Range>
3773  inline typed::map<Domain, Domain> lex_gt_at(const typed::multi_aff<Domain, Range> &mpa) const;
3774  inline typed::map<Domain, Domain> lex_gt_at(const typed::pw_aff<Domain, Anonymous> &mpa) const;
3775  template <typename Range>
3776  inline typed::map<Domain, Domain> lex_gt_at(const typed::pw_multi_aff<Domain, Range> &mpa) const;
3777  template <typename Range>
3778  inline typed::map<Domain, Domain> lex_le_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
3779  inline typed::map<Domain, Domain> lex_le_at(const typed::aff<Domain, Anonymous> &mpa) const;
3780  template <typename Range>
3781  inline typed::map<Domain, Domain> lex_le_at(const typed::multi_aff<Domain, Range> &mpa) const;
3782  inline typed::map<Domain, Domain> lex_le_at(const typed::pw_aff<Domain, Anonymous> &mpa) const;
3783  template <typename Range>
3784  inline typed::map<Domain, Domain> lex_le_at(const typed::pw_multi_aff<Domain, Range> &mpa) const;
3785  template <typename Range>
3786  inline typed::map<Domain, Domain> lex_lt_at(const typed::multi_pw_aff<Domain, Range> &mpa) const;
3787  inline typed::map<Domain, Domain> lex_lt_at(const typed::aff<Domain, Anonymous> &mpa) const;
3788  template <typename Range>
3789  inline typed::map<Domain, Domain> lex_lt_at(const typed::multi_aff<Domain, Range> &mpa) const;
3790  inline typed::map<Domain, Domain> lex_lt_at(const typed::pw_aff<Domain, Anonymous> &mpa) const;
3791  template <typename Range>
3792  inline typed::map<Domain, Domain> lex_lt_at(const typed::pw_multi_aff<Domain, Range> &mpa) const;
3793  inline typed::map<Domain, Domain> lexmax() const;
3794  inline typed::pw_multi_aff<Domain, Domain> lexmax_pw_multi_aff() const;
3795  inline typed::map<Domain, Domain> lexmin() const;
3796  inline typed::pw_multi_aff<Domain, Domain> lexmin_pw_multi_aff() const;
3797  inline typed::map<Domain, Domain> lower_bound(const typed::multi_pw_aff<Domain, Domain> &lower) const;
3798  inline typed::map<Domain, Domain> lower_bound(const typed::aff<Domain, Domain> &lower) const;
3799  inline typed::map<Domain, Domain> lower_bound(const typed::multi_aff<Domain, Domain> &lower) const;
3800  inline typed::map<Domain, Domain> lower_bound(const typed::pw_aff<Domain, Domain> &lower) const;
3801  inline typed::map<Domain, Domain> lower_bound(const typed::pw_multi_aff<Domain, Domain> &lower) const;
3802  inline typed::map_list<Domain, Domain> map_list() const;
3803  inline typed::multi_pw_aff<Domain, Domain> max_multi_pw_aff() const;
3804  inline typed::multi_pw_aff<Domain, Domain> min_multi_pw_aff() const;
3805  inline typed::set<> params() const;
3806  template <typename Domain2>
3807  inline typed::map<Domain2, Domain> preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const;
3808  template <typename Domain2>
3809  inline typed::map<Domain2, Domain> preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
3810  template <typename Domain2>
3811  inline typed::map<Domain2, Domain> preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
3812  template <typename Domain2>
3813  inline typed::union_map<Domain2, Domain> preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
3814  template <typename Range2>
3815  inline typed::map<Domain, Range2> preimage_range(const typed::multi_aff<Range2, Domain> &ma) const;
3816  template <typename Range2>
3817  inline typed::map<Domain, Range2> preimage_range(const typed::pw_multi_aff<Range2, Domain> &pma) const;
3818  template <typename Range2>
3819  inline typed::union_map<Domain, Range2> preimage_range(const typed::union_pw_multi_aff<Range2, Domain> &upma) const;
3820  template <typename Domain2, typename Range2>
3821  inline typed::map<pair<Domain, Domain2>, pair<Domain, Range2>> product(const typed::map<Domain2, Range2> &map2) const;
3822  template <typename Domain2, typename Range2>
3823  inline typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> product(const typed::union_map<Domain2, Range2> &umap2) const;
3824  template <typename Domain2, typename Range2>
3825  inline typed::map<pair<Domain, Domain2>, pair<Domain, Range2>> product(const typed::basic_map<Domain2, Range2> &map2) const;
3826  inline typed::map<Domain, Domain> project_out_all_params() const;
3827  inline typed::map<Domain, Domain> project_out_param(const typed::id<Anonymous> &id) const;
3828  inline typed::map<Domain, Domain> project_out_param(const std::string &id) const;
3829  inline typed::map<Domain, Domain> project_out_param(const typed::id_list<Anonymous> &list) const;
3830  inline typed::set<Domain> range() const;
3831  inline typed::map<Domain, Domain> range_factor_domain() const = delete;
3832  inline typed::map<Domain, Domain> range_factor_range() const = delete;
3833  inline typed::fixed_box<Domain, Domain> range_lattice_tile() const;
3834  inline typed::fixed_box<Domain, Domain> get_range_lattice_tile() const = delete;
3835  inline typed::union_map<pair<Domain, Domain>, Domain> range_map() const;
3836  template <typename Range2>
3837  inline typed::map<Domain, pair<Domain, Range2>> range_product(const typed::map<Domain, Range2> &map2) const;
3838  template <typename Range2>
3839  inline typed::union_map<Domain, pair<Domain, Range2>> range_product(const typed::union_map<Domain, Range2> &umap2) const;
3840  template <typename Range2>
3841  inline typed::map<Domain, pair<Domain, Range2>> range_product(const typed::basic_map<Domain, Range2> &map2) const;
3842  inline typed::map<Domain, Domain> range_reverse() const = delete;
3843  inline typed::fixed_box<Domain, Domain> range_simple_fixed_box_hull() const;
3844  inline typed::fixed_box<Domain, Domain> get_range_simple_fixed_box_hull() const = delete;
3845  inline typed::id<Domain, Domain> get_range_tuple_id() const = delete;
3846  inline typed::map<Domain, Domain> reverse() const;
3847  template <typename Domain2>
3848  inline typed::map<Domain2, Domain> set_domain_tuple(const typed::id<Anonymous> &id) const;
3849  template <typename Domain2>
3850  inline typed::map<Domain2, Domain> set_domain_tuple(const std::string &id) const;
3851  template <typename Range2>
3852  inline typed::map<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
3853  template <typename Range2>
3854  inline typed::map<Domain, Range2> set_range_tuple(const std::string &id) const;
3855  inline typed::space<Domain, Domain> space() const;
3856  inline typed::space<Domain, Domain> get_space() const = delete;
3857  inline typed::map<Domain, Domain> subtract(const typed::map<Domain, Domain> &map2) const;
3858  inline typed::union_map<Domain, Domain> subtract(const typed::union_map<Domain, Domain> &umap2) const;
3859  inline typed::map<Domain, Domain> subtract(const typed::basic_map<Domain, Domain> &map2) const;
3860  inline typed::union_map<Domain, Domain> subtract_domain(const typed::union_set<Domain> &dom) const;
3861  inline typed::union_map<Domain, Domain> subtract_range(const typed::union_set<Domain> &dom) const;
3862  inline typed::union_map<Domain, Domain> to_union_map() const;
3863  inline typed::map<Domain, Domain> uncurry() const = delete;
3864  inline typed::map<Domain, Domain> unite(const typed::map<Domain, Domain> &map2) const;
3865  inline typed::union_map<Domain, Domain> unite(const typed::union_map<Domain, Domain> &umap2) const;
3866  inline typed::map<Domain, Domain> unite(const typed::basic_map<Domain, Domain> &map2) const;
3867  static inline typed::map<Domain, Domain> universe(const typed::space<Domain, Domain> &space);
3868  inline typed::map<Domain, Domain> upper_bound(const typed::multi_pw_aff<Domain, Domain> &upper) const;
3869  inline typed::map<Domain, Domain> upper_bound(const typed::aff<Domain, Domain> &upper) const;
3870  inline typed::map<Domain, Domain> upper_bound(const typed::multi_aff<Domain, Domain> &upper) const;
3871  inline typed::map<Domain, Domain> upper_bound(const typed::pw_aff<Domain, Domain> &upper) const;
3872  inline typed::map<Domain, Domain> upper_bound(const typed::pw_multi_aff<Domain, Domain> &upper) const;
3873  inline typed::set<pair<Domain, Domain>> wrap() const;
3874};
3875
3876template <typename Domain, typename Range, typename Range2>
3877struct map<Domain, pair<Range, Range2>> : public isl::map {
3878  template <typename...>
3879  friend struct aff;
3880  template <typename...>
3881  friend struct aff_list;
3882  template <typename...>
3883  friend struct basic_map;
3884  template <typename...>
3885  friend struct basic_set;
3886  template <typename...>
3887  friend struct fixed_box;
3888  template <typename...>
3889  friend struct id;
3890  template <typename...>
3891  friend struct id_list;
3892  template <typename...>
3893  friend struct map;
3894  template <typename...>
3895  friend struct map_list;
3896  template <typename...>
3897  friend struct multi_aff;
3898  template <typename...>
3899  friend struct multi_id;
3900  template <typename...>
3901  friend struct multi_pw_aff;
3902  template <typename...>
3903  friend struct multi_union_pw_aff;
3904  template <typename...>
3905  friend struct multi_val;
3906  template <typename...>
3907  friend struct point;
3908  template <typename...>
3909  friend struct pw_aff;
3910  template <typename...>
3911  friend struct pw_aff_list;
3912  template <typename...>
3913  friend struct pw_multi_aff;
3914  template <typename...>
3915  friend struct pw_multi_aff_list;
3916  template <typename...>
3917  friend struct set;
3918  template <typename...>
3919  friend struct set_list;
3920  template <typename...>
3921  friend struct space;
3922  template <typename...>
3923  friend struct union_map;
3924  template <typename...>
3925  friend struct union_pw_aff;
3926  template <typename...>
3927  friend struct union_pw_aff_list;
3928  template <typename...>
3929  friend struct union_pw_multi_aff;
3930  template <typename...>
3931  friend struct union_set;
3932  template <typename...>
3933  friend struct union_set_list;
3934  template <typename...>
3935  friend struct val;
3936  template <typename...>
3937  friend struct val_list;
3938
3939  map() = default;
3940  template <typename Arg1, typename Arg2, typename Arg3,
3941            typename std::enable_if<
3942              std::is_base_of<Domain, Arg1>{} &&
3943              std::is_base_of<Range, Arg2>{} &&
3944              std::is_base_of<Range2, Arg3>{},
3945            bool>::type = true>
3946  map(const map<Arg1, pair<Arg2, Arg3>> &obj) : isl::map(obj) {}
3947 private:
3948  template <typename base,
3949            typename std::enable_if<
3950              std::is_same<base, isl::map>{}, bool>::type = true>
3951  map(const base &obj) : isl::map(obj) {}
3952 public:
3953  static map from(const isl::map &obj) {
3954    return map(obj);
3955  }
3956  inline /* implicit */ map(const typed::basic_map<Domain, pair<Range, Range2>> &bmap);
3957  inline explicit map(const isl::ctx &ctx, const std::string &str);
3958  template <typename Domain2>
3959  inline typed::map<Domain2, pair<Range, Range2>> apply_domain(const typed::map<Domain, Domain2> &map2) const;
3960  template <typename Domain2>
3961  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::union_map<Domain, Domain2> &umap2) const;
3962  template <typename Domain2>
3963  inline typed::map<Domain2, pair<Range, Range2>> apply_domain(const typed::basic_map<Domain, Domain2> &map2) const;
3964  template <typename Arg3>
3965  inline typed::map<Domain, Arg3> apply_range(const typed::map<pair<Range, Range2>, Arg3> &map2) const;
3966  template <typename Arg3>
3967  inline typed::union_map<Domain, Arg3> apply_range(const typed::union_map<pair<Range, Range2>, Arg3> &umap2) const;
3968  template <typename Arg3>
3969  inline typed::map<Domain, Arg3> apply_range(const typed::basic_map<pair<Range, Range2>, Arg3> &map2) const;
3970  inline typed::map<Domain, pair<Range, Range2>> as_map() const;
3971  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> as_multi_union_pw_aff() const;
3972  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> as_pw_multi_aff() const;
3973  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> as_union_pw_multi_aff() const;
3974  inline typed::set<pair<Range, Range2>> bind_domain(const typed::multi_id<Domain> &tuple) const;
3975  inline typed::set<Domain> bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const;
3976  inline typed::map<Domain, pair<Range, Range2>> coalesce() const;
3977  inline typed::map<Domain, pair<Range, Range2>> curry() const = delete;
3978  inline typed::set<Domain, pair<Range, Range2>> deltas() const = delete;
3979  inline typed::map<Domain, pair<Range, Range2>> detect_equalities() const;
3980  inline typed::set<Domain> domain() const;
3981  inline typed::map<Domain, pair<Range, Range2>> domain_factor_domain() const = delete;
3982  inline typed::map<Domain, pair<Range, Range2>> domain_factor_range() const = delete;
3983  inline typed::union_map<pair<Domain, pair<Range, Range2>>, Domain> domain_map() const;
3984  inline typed::union_pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain> domain_map_union_pw_multi_aff() const;
3985  template <typename Domain2>
3986  inline typed::map<pair<Domain, Domain2>, pair<Range, Range2>> domain_product(const typed::map<Domain2, pair<Range, Range2>> &map2) const;
3987  template <typename Domain2>
3988  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const;
3989  template <typename Domain2>
3990  inline typed::map<pair<Domain, Domain2>, pair<Range, Range2>> domain_product(const typed::basic_map<Domain2, pair<Range, Range2>> &map2) const;
3991  inline typed::map<Domain, pair<Range, Range2>> domain_reverse() const = delete;
3992  inline typed::id<Domain, pair<Range, Range2>> get_domain_tuple_id() const = delete;
3993  inline typed::map<Domain, pair<Range, Range2>> drop_unused_params() const;
3994  inline typed::map<Domain, pair<Range, Range2>> eq_at(const typed::multi_pw_aff<> &mpa) const = delete;
3995  inline typed::union_map<Domain, pair<Range, Range2>> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
3996  inline typed::map<Domain, pair<Range, Range2>> eq_at(const typed::aff<> &mpa) const = delete;
3997  inline typed::map<Domain, pair<Range, Range2>> eq_at(const typed::multi_aff<> &mpa) const = delete;
3998  inline typed::map<Domain, pair<Range, Range2>> eq_at(const typed::pw_aff<> &mpa) const = delete;
3999  inline typed::map<Domain, pair<Range, Range2>> eq_at(const typed::pw_multi_aff<> &mpa) const = delete;
4000  inline bool every_map(const std::function<bool(typed::map<Domain, pair<Range, Range2>>)> &test) const;
4001  inline typed::map<Domain, pair<Range, Range2>> extract_map(const typed::space<Domain, pair<Range, Range2>> &space) const;
4002  inline typed::map<Domain, pair<Range, Range2>> flatten_domain() const = delete;
4003  inline typed::map<Domain, Anonymous> flatten_range() const;
4004  inline void foreach_basic_map(const std::function<void(typed::basic_map<Domain, pair<Range, Range2>>)> &fn) const;
4005  inline void foreach_map(const std::function<void(typed::map<Domain, pair<Range, Range2>>)> &fn) const;
4006  inline typed::map<Domain, pair<Range, Range2>> gist(const typed::map<Domain, pair<Range, Range2>> &context) const;
4007  inline typed::union_map<Domain, pair<Range, Range2>> gist(const typed::union_map<Domain, pair<Range, Range2>> &context) const;
4008  inline typed::map<Domain, pair<Range, Range2>> gist(const typed::basic_map<Domain, pair<Range, Range2>> &context) const;
4009  inline typed::map<Domain, pair<Range, Range2>> gist_domain(const typed::set<Domain> &context) const;
4010  inline typed::union_map<Domain, pair<Range, Range2>> gist_domain(const typed::union_set<Domain> &uset) const;
4011  inline typed::map<Domain, pair<Range, Range2>> gist_domain(const typed::basic_set<Domain> &context) const;
4012  inline typed::map<Domain, pair<Range, Range2>> gist_domain(const typed::point<Domain> &context) const;
4013  inline typed::map<Domain, pair<Range, Range2>> gist_params(const typed::set<> &context) const;
4014  inline typed::map<Domain, pair<Range, Range2>> gist_params(const typed::basic_set<> &context) const;
4015  inline typed::map<Domain, pair<Range, Range2>> gist_params(const typed::point<> &context) const;
4016  inline typed::map<Domain, pair<Range, Range2>> intersect(const typed::map<Domain, pair<Range, Range2>> &map2) const;
4017  inline typed::union_map<Domain, pair<Range, Range2>> intersect(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const;
4018  inline typed::map<Domain, pair<Range, Range2>> intersect(const typed::basic_map<Domain, pair<Range, Range2>> &map2) const;
4019  inline typed::map<Domain, pair<Range, Range2>> intersect_domain(const typed::set<Domain> &set) const;
4020  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain(const typed::space<Domain> &space) const;
4021  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain(const typed::union_set<Domain> &uset) const;
4022  inline typed::map<Domain, pair<Range, Range2>> intersect_domain(const typed::basic_set<Domain> &set) const;
4023  inline typed::map<Domain, pair<Range, Range2>> intersect_domain(const typed::point<Domain> &set) const;
4024  inline typed::map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::set<> &domain) const = delete;
4025  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<> &domain) const = delete;
4026  inline typed::map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::basic_set<> &domain) const = delete;
4027  inline typed::map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::point<> &domain) const = delete;
4028  inline typed::map<Domain, pair<Range, Range2>> intersect_params(const typed::set<> &params) const;
4029  inline typed::map<Domain, pair<Range, Range2>> intersect_params(const typed::basic_set<> &params) const;
4030  inline typed::map<Domain, pair<Range, Range2>> intersect_params(const typed::point<> &params) const;
4031  inline typed::map<Domain, pair<Range, Range2>> intersect_range(const typed::set<pair<Range, Range2>> &set) const;
4032  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range(const typed::space<pair<Range, Range2>> &space) const;
4033  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const;
4034  inline typed::map<Domain, pair<Range, Range2>> intersect_range(const typed::basic_set<pair<Range, Range2>> &set) const;
4035  inline typed::map<Domain, pair<Range, Range2>> intersect_range(const typed::point<pair<Range, Range2>> &set) const;
4036  inline typed::map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::set<Range> &domain) const;
4037  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const;
4038  inline typed::map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::basic_set<Range> &domain) const;
4039  inline typed::map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::point<Range> &domain) const;
4040  inline typed::map<Domain, pair<Range, Range2>> lex_ge_at(const typed::multi_pw_aff<> &mpa) const = delete;
4041  inline typed::map<Domain, pair<Range, Range2>> lex_ge_at(const typed::aff<> &mpa) const = delete;
4042  inline typed::map<Domain, pair<Range, Range2>> lex_ge_at(const typed::multi_aff<> &mpa) const = delete;
4043  inline typed::map<Domain, pair<Range, Range2>> lex_ge_at(const typed::pw_aff<> &mpa) const = delete;
4044  inline typed::map<Domain, pair<Range, Range2>> lex_ge_at(const typed::pw_multi_aff<> &mpa) const = delete;
4045  inline typed::map<Domain, pair<Range, Range2>> lex_gt_at(const typed::multi_pw_aff<> &mpa) const = delete;
4046  inline typed::map<Domain, pair<Range, Range2>> lex_gt_at(const typed::aff<> &mpa) const = delete;
4047  inline typed::map<Domain, pair<Range, Range2>> lex_gt_at(const typed::multi_aff<> &mpa) const = delete;
4048  inline typed::map<Domain, pair<Range, Range2>> lex_gt_at(const typed::pw_aff<> &mpa) const = delete;
4049  inline typed::map<Domain, pair<Range, Range2>> lex_gt_at(const typed::pw_multi_aff<> &mpa) const = delete;
4050  inline typed::map<Domain, pair<Range, Range2>> lex_le_at(const typed::multi_pw_aff<> &mpa) const = delete;
4051  inline typed::map<Domain, pair<Range, Range2>> lex_le_at(const typed::aff<> &mpa) const = delete;
4052  inline typed::map<Domain, pair<Range, Range2>> lex_le_at(const typed::multi_aff<> &mpa) const = delete;
4053  inline typed::map<Domain, pair<Range, Range2>> lex_le_at(const typed::pw_aff<> &mpa) const = delete;
4054  inline typed::map<Domain, pair<Range, Range2>> lex_le_at(const typed::pw_multi_aff<> &mpa) const = delete;
4055  inline typed::map<Domain, pair<Range, Range2>> lex_lt_at(const typed::multi_pw_aff<> &mpa) const = delete;
4056  inline typed::map<Domain, pair<Range, Range2>> lex_lt_at(const typed::aff<> &mpa) const = delete;
4057  inline typed::map<Domain, pair<Range, Range2>> lex_lt_at(const typed::multi_aff<> &mpa) const = delete;
4058  inline typed::map<Domain, pair<Range, Range2>> lex_lt_at(const typed::pw_aff<> &mpa) const = delete;
4059  inline typed::map<Domain, pair<Range, Range2>> lex_lt_at(const typed::pw_multi_aff<> &mpa) const = delete;
4060  inline typed::map<Domain, pair<Range, Range2>> lexmax() const;
4061  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> lexmax_pw_multi_aff() const;
4062  inline typed::map<Domain, pair<Range, Range2>> lexmin() const;
4063  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> lexmin_pw_multi_aff() const;
4064  inline typed::map<Domain, pair<Range, Range2>> lower_bound(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &lower) const;
4065  inline typed::map<Domain, pair<Range, Range2>> lower_bound(const typed::aff<Domain, pair<Range, Range2>> &lower) const;
4066  inline typed::map<Domain, pair<Range, Range2>> lower_bound(const typed::multi_aff<Domain, pair<Range, Range2>> &lower) const;
4067  inline typed::map<Domain, pair<Range, Range2>> lower_bound(const typed::pw_aff<Domain, pair<Range, Range2>> &lower) const;
4068  inline typed::map<Domain, pair<Range, Range2>> lower_bound(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &lower) const;
4069  inline typed::map_list<Domain, pair<Range, Range2>> map_list() const;
4070  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> max_multi_pw_aff() const;
4071  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> min_multi_pw_aff() const;
4072  inline typed::set<> params() const;
4073  template <typename Domain2>
4074  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const;
4075  template <typename Domain2>
4076  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
4077  template <typename Domain2>
4078  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
4079  template <typename Domain2>
4080  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
4081  template <typename Arg3>
4082  inline typed::map<Domain, Arg3> preimage_range(const typed::multi_aff<Arg3, pair<Range, Range2>> &ma) const;
4083  template <typename Arg3>
4084  inline typed::map<Domain, Arg3> preimage_range(const typed::pw_multi_aff<Arg3, pair<Range, Range2>> &pma) const;
4085  template <typename Arg3>
4086  inline typed::union_map<Domain, Arg3> preimage_range(const typed::union_pw_multi_aff<Arg3, pair<Range, Range2>> &upma) const;
4087  template <typename Domain2, typename Arg3>
4088  inline typed::map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::map<Domain2, Arg3> &map2) const;
4089  template <typename Domain2, typename Arg3>
4090  inline typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::union_map<Domain2, Arg3> &umap2) const;
4091  template <typename Domain2, typename Arg3>
4092  inline typed::map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::basic_map<Domain2, Arg3> &map2) const;
4093  inline typed::map<Domain, pair<Range, Range2>> project_out_all_params() const;
4094  inline typed::map<Domain, pair<Range, Range2>> project_out_param(const typed::id<Anonymous> &id) const;
4095  inline typed::map<Domain, pair<Range, Range2>> project_out_param(const std::string &id) const;
4096  inline typed::map<Domain, pair<Range, Range2>> project_out_param(const typed::id_list<Anonymous> &list) const;
4097  inline typed::set<pair<Range, Range2>> range() const;
4098  inline typed::map<Domain, Range> range_factor_domain() const;
4099  inline typed::map<Domain, Range2> range_factor_range() const;
4100  inline typed::fixed_box<Domain, pair<Range, Range2>> range_lattice_tile() const;
4101  inline typed::fixed_box<Domain, pair<Range, Range2>> get_range_lattice_tile() const = delete;
4102  inline typed::union_map<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> range_map() const;
4103  template <typename Arg3>
4104  inline typed::map<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::map<Domain, Arg3> &map2) const;
4105  template <typename Arg3>
4106  inline typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::union_map<Domain, Arg3> &umap2) const;
4107  template <typename Arg3>
4108  inline typed::map<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::basic_map<Domain, Arg3> &map2) const;
4109  inline typed::map<Domain, pair<Range2, Range>> range_reverse() const;
4110  inline typed::fixed_box<Domain, pair<Range, Range2>> range_simple_fixed_box_hull() const;
4111  inline typed::fixed_box<Domain, pair<Range, Range2>> get_range_simple_fixed_box_hull() const = delete;
4112  inline typed::id<Domain, pair<Range, Range2>> get_range_tuple_id() const = delete;
4113  inline typed::map<pair<Range, Range2>, Domain> reverse() const;
4114  template <typename Domain2>
4115  inline typed::map<Domain2, pair<Range, Range2>> set_domain_tuple(const typed::id<Anonymous> &id) const;
4116  template <typename Domain2>
4117  inline typed::map<Domain2, pair<Range, Range2>> set_domain_tuple(const std::string &id) const;
4118  inline typed::map<Domain, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
4119  inline typed::map<Domain, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
4120  inline typed::space<Domain, pair<Range, Range2>> space() const;
4121  inline typed::space<Domain, pair<Range, Range2>> get_space() const = delete;
4122  inline typed::map<Domain, pair<Range, Range2>> subtract(const typed::map<Domain, pair<Range, Range2>> &map2) const;
4123  inline typed::union_map<Domain, pair<Range, Range2>> subtract(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const;
4124  inline typed::map<Domain, pair<Range, Range2>> subtract(const typed::basic_map<Domain, pair<Range, Range2>> &map2) const;
4125  inline typed::union_map<Domain, pair<Range, Range2>> subtract_domain(const typed::union_set<Domain> &dom) const;
4126  inline typed::union_map<Domain, pair<Range, Range2>> subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const;
4127  inline typed::union_map<Domain, pair<Range, Range2>> to_union_map() const;
4128  inline typed::map<pair<Domain, Range>, Range2> uncurry() const;
4129  inline typed::map<Domain, pair<Range, Range2>> unite(const typed::map<Domain, pair<Range, Range2>> &map2) const;
4130  inline typed::union_map<Domain, pair<Range, Range2>> unite(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const;
4131  inline typed::map<Domain, pair<Range, Range2>> unite(const typed::basic_map<Domain, pair<Range, Range2>> &map2) const;
4132  static inline typed::map<Domain, pair<Range, Range2>> universe(const typed::space<Domain, pair<Range, Range2>> &space);
4133  inline typed::map<Domain, pair<Range, Range2>> upper_bound(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &upper) const;
4134  inline typed::map<Domain, pair<Range, Range2>> upper_bound(const typed::aff<Domain, pair<Range, Range2>> &upper) const;
4135  inline typed::map<Domain, pair<Range, Range2>> upper_bound(const typed::multi_aff<Domain, pair<Range, Range2>> &upper) const;
4136  inline typed::map<Domain, pair<Range, Range2>> upper_bound(const typed::pw_aff<Domain, pair<Range, Range2>> &upper) const;
4137  inline typed::map<Domain, pair<Range, Range2>> upper_bound(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &upper) const;
4138  inline typed::set<pair<Domain, pair<Range, Range2>>> wrap() const;
4139};
4140
4141template <typename T1, typename T2>
4142struct map<pair<T1, T2>, pair<T1, T2>> : public isl::map {
4143  template <typename...>
4144  friend struct aff;
4145  template <typename...>
4146  friend struct aff_list;
4147  template <typename...>
4148  friend struct basic_map;
4149  template <typename...>
4150  friend struct basic_set;
4151  template <typename...>
4152  friend struct fixed_box;
4153  template <typename...>
4154  friend struct id;
4155  template <typename...>
4156  friend struct id_list;
4157  template <typename...>
4158  friend struct map;
4159  template <typename...>
4160  friend struct map_list;
4161  template <typename...>
4162  friend struct multi_aff;
4163  template <typename...>
4164  friend struct multi_id;
4165  template <typename...>
4166  friend struct multi_pw_aff;
4167  template <typename...>
4168  friend struct multi_union_pw_aff;
4169  template <typename...>
4170  friend struct multi_val;
4171  template <typename...>
4172  friend struct point;
4173  template <typename...>
4174  friend struct pw_aff;
4175  template <typename...>
4176  friend struct pw_aff_list;
4177  template <typename...>
4178  friend struct pw_multi_aff;
4179  template <typename...>
4180  friend struct pw_multi_aff_list;
4181  template <typename...>
4182  friend struct set;
4183  template <typename...>
4184  friend struct set_list;
4185  template <typename...>
4186  friend struct space;
4187  template <typename...>
4188  friend struct union_map;
4189  template <typename...>
4190  friend struct union_pw_aff;
4191  template <typename...>
4192  friend struct union_pw_aff_list;
4193  template <typename...>
4194  friend struct union_pw_multi_aff;
4195  template <typename...>
4196  friend struct union_set;
4197  template <typename...>
4198  friend struct union_set_list;
4199  template <typename...>
4200  friend struct val;
4201  template <typename...>
4202  friend struct val_list;
4203
4204  map() = default;
4205  template <typename Arg1, typename Arg2,
4206            typename std::enable_if<
4207              std::is_base_of<T1, Arg1>{} &&
4208              std::is_base_of<T2, Arg2>{},
4209            bool>::type = true>
4210  map(const map<pair<Arg1, Arg2>, pair<Arg1, Arg2>> &obj) : isl::map(obj) {}
4211 private:
4212  template <typename base,
4213            typename std::enable_if<
4214              std::is_same<base, isl::map>{}, bool>::type = true>
4215  map(const base &obj) : isl::map(obj) {}
4216 public:
4217  static map from(const isl::map &obj) {
4218    return map(obj);
4219  }
4220  inline /* implicit */ map(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &bmap);
4221  inline explicit map(const isl::ctx &ctx, const std::string &str);
4222  template <typename Domain2>
4223  inline typed::map<Domain2, pair<T1, T2>> apply_domain(const typed::map<pair<T1, T2>, Domain2> &map2) const;
4224  template <typename Domain2>
4225  inline typed::union_map<Domain2, pair<T1, T2>> apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const;
4226  template <typename Domain2>
4227  inline typed::map<Domain2, pair<T1, T2>> apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &map2) const;
4228  template <typename Range2>
4229  inline typed::map<pair<T1, T2>, Range2> apply_range(const typed::map<pair<T1, T2>, Range2> &map2) const;
4230  template <typename Range2>
4231  inline typed::union_map<pair<T1, T2>, Range2> apply_range(const typed::union_map<pair<T1, T2>, Range2> &umap2) const;
4232  template <typename Range2>
4233  inline typed::map<pair<T1, T2>, Range2> apply_range(const typed::basic_map<pair<T1, T2>, Range2> &map2) const;
4234  inline typed::map<pair<T1, T2>, pair<T1, T2>> as_map() const;
4235  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<T1, T2>> as_multi_union_pw_aff() const;
4236  inline typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> as_pw_multi_aff() const;
4237  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<T1, T2>> as_union_pw_multi_aff() const;
4238  inline typed::set<pair<T1, T2>> bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const;
4239  inline typed::set<pair<T1, T2>> bind_range(const typed::multi_id<pair<T1, T2>> &tuple) const;
4240  inline typed::map<pair<T1, T2>, pair<T1, T2>> coalesce() const;
4241  inline typed::map<T1, pair<T2, pair<T1, T2>>> curry() const;
4242  inline typed::set<pair<T1, T2>> deltas() const;
4243  inline typed::map<pair<T1, T2>, pair<T1, T2>> detect_equalities() const;
4244  inline typed::set<pair<T1, T2>> domain() const;
4245  inline typed::map<T1, pair<T1, T2>> domain_factor_domain() const;
4246  inline typed::map<T2, pair<T1, T2>> domain_factor_range() const;
4247  inline typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> domain_map() const;
4248  inline typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> domain_map_union_pw_multi_aff() const;
4249  template <typename Domain2>
4250  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> domain_product(const typed::map<Domain2, pair<T1, T2>> &map2) const;
4251  template <typename Domain2>
4252  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> domain_product(const typed::union_map<Domain2, pair<T1, T2>> &umap2) const;
4253  template <typename Domain2>
4254  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> domain_product(const typed::basic_map<Domain2, pair<T1, T2>> &map2) const;
4255  inline typed::map<pair<T2, T1>, pair<T1, T2>> domain_reverse() const;
4256  inline typed::id<pair<T1, T2>, pair<T1, T2>> get_domain_tuple_id() const = delete;
4257  inline typed::map<pair<T1, T2>, pair<T1, T2>> drop_unused_params() const;
4258  template <typename Range>
4259  inline typed::map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
4260  template <typename Range>
4261  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::multi_union_pw_aff<pair<T1, T2>, Range> &mupa) const;
4262  inline typed::map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const;
4263  template <typename Range>
4264  inline typed::map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const;
4265  inline typed::map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const;
4266  template <typename Range>
4267  inline typed::map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const;
4268  inline bool every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<T1, T2>>)> &test) const;
4269  inline typed::map<pair<T1, T2>, pair<T1, T2>> extract_map(const typed::space<pair<T1, T2>, pair<T1, T2>> &space) const;
4270  inline typed::map<Anonymous, pair<T1, T2>> flatten_domain() const;
4271  inline typed::map<pair<T1, T2>, Anonymous> flatten_range() const;
4272  inline void foreach_basic_map(const std::function<void(typed::basic_map<pair<T1, T2>, pair<T1, T2>>)> &fn) const;
4273  inline void foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<T1, T2>>)> &fn) const;
4274  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist(const typed::map<pair<T1, T2>, pair<T1, T2>> &context) const;
4275  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &context) const;
4276  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &context) const;
4277  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::set<pair<T1, T2>> &context) const;
4278  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::union_set<pair<T1, T2>> &uset) const;
4279  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::basic_set<pair<T1, T2>> &context) const;
4280  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::point<pair<T1, T2>> &context) const;
4281  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist_params(const typed::set<> &context) const;
4282  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist_params(const typed::basic_set<> &context) const;
4283  inline typed::map<pair<T1, T2>, pair<T1, T2>> gist_params(const typed::point<> &context) const;
4284  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const;
4285  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
4286  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &map2) const;
4287  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::set<pair<T1, T2>> &set) const;
4288  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::space<pair<T1, T2>> &space) const;
4289  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const;
4290  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::basic_set<pair<T1, T2>> &set) const;
4291  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::point<pair<T1, T2>> &set) const;
4292  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::set<T1> &domain) const;
4293  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const;
4294  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::basic_set<T1> &domain) const;
4295  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::point<T1> &domain) const;
4296  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_params(const typed::set<> &params) const;
4297  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_params(const typed::basic_set<> &params) const;
4298  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_params(const typed::point<> &params) const;
4299  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::set<pair<T1, T2>> &set) const;
4300  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::space<pair<T1, T2>> &space) const;
4301  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::union_set<pair<T1, T2>> &uset) const;
4302  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::basic_set<pair<T1, T2>> &set) const;
4303  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::point<pair<T1, T2>> &set) const;
4304  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::set<T1> &domain) const;
4305  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::union_set<T1> &domain) const;
4306  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::basic_set<T1> &domain) const;
4307  inline typed::map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::point<T1> &domain) const;
4308  template <typename Range>
4309  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_ge_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
4310  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_ge_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const;
4311  template <typename Range>
4312  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_ge_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const;
4313  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_ge_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const;
4314  template <typename Range>
4315  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_ge_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const;
4316  template <typename Range>
4317  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_gt_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
4318  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_gt_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const;
4319  template <typename Range>
4320  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_gt_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const;
4321  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_gt_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const;
4322  template <typename Range>
4323  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_gt_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const;
4324  template <typename Range>
4325  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_le_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
4326  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_le_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const;
4327  template <typename Range>
4328  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_le_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const;
4329  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_le_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const;
4330  template <typename Range>
4331  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_le_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const;
4332  template <typename Range>
4333  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_lt_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const;
4334  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_lt_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const;
4335  template <typename Range>
4336  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_lt_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const;
4337  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_lt_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const;
4338  template <typename Range>
4339  inline typed::map<pair<T1, T2>, pair<T1, T2>> lex_lt_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const;
4340  inline typed::map<pair<T1, T2>, pair<T1, T2>> lexmax() const;
4341  inline typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> lexmax_pw_multi_aff() const;
4342  inline typed::map<pair<T1, T2>, pair<T1, T2>> lexmin() const;
4343  inline typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> lexmin_pw_multi_aff() const;
4344  inline typed::map<pair<T1, T2>, pair<T1, T2>> lower_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> &lower) const;
4345  inline typed::map<pair<T1, T2>, pair<T1, T2>> lower_bound(const typed::aff<pair<T1, T2>, pair<T1, T2>> &lower) const;
4346  inline typed::map<pair<T1, T2>, pair<T1, T2>> lower_bound(const typed::multi_aff<pair<T1, T2>, pair<T1, T2>> &lower) const;
4347  inline typed::map<pair<T1, T2>, pair<T1, T2>> lower_bound(const typed::pw_aff<pair<T1, T2>, pair<T1, T2>> &lower) const;
4348  inline typed::map<pair<T1, T2>, pair<T1, T2>> lower_bound(const typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> &lower) const;
4349  inline typed::map_list<pair<T1, T2>, pair<T1, T2>> map_list() const;
4350  inline typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> max_multi_pw_aff() const;
4351  inline typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> min_multi_pw_aff() const;
4352  inline typed::set<> params() const;
4353  template <typename Domain2>
4354  inline typed::map<Domain2, pair<T1, T2>> preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const;
4355  template <typename Domain2>
4356  inline typed::map<Domain2, pair<T1, T2>> preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const;
4357  template <typename Domain2>
4358  inline typed::map<Domain2, pair<T1, T2>> preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const;
4359  template <typename Domain2>
4360  inline typed::union_map<Domain2, pair<T1, T2>> preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const;
4361  template <typename Range2>
4362  inline typed::map<pair<T1, T2>, Range2> preimage_range(const typed::multi_aff<Range2, pair<T1, T2>> &ma) const;
4363  template <typename Range2>
4364  inline typed::map<pair<T1, T2>, Range2> preimage_range(const typed::pw_multi_aff<Range2, pair<T1, T2>> &pma) const;
4365  template <typename Range2>
4366  inline typed::union_map<pair<T1, T2>, Range2> preimage_range(const typed::union_pw_multi_aff<Range2, pair<T1, T2>> &upma) const;
4367  template <typename Domain2, typename Range2>
4368  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> product(const typed::map<Domain2, Range2> &map2) const;
4369  template <typename Domain2, typename Range2>
4370  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> product(const typed::union_map<Domain2, Range2> &umap2) const;
4371  template <typename Domain2, typename Range2>
4372  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> product(const typed::basic_map<Domain2, Range2> &map2) const;
4373  inline typed::map<pair<T1, T2>, pair<T1, T2>> project_out_all_params() const;
4374  inline typed::map<pair<T1, T2>, pair<T1, T2>> project_out_param(const typed::id<Anonymous> &id) const;
4375  inline typed::map<pair<T1, T2>, pair<T1, T2>> project_out_param(const std::string &id) const;
4376  inline typed::map<pair<T1, T2>, pair<T1, T2>> project_out_param(const typed::id_list<Anonymous> &list) const;
4377  inline typed::set<pair<T1, T2>> range() const;
4378  inline typed::map<pair<T1, T2>, T1> range_factor_domain() const;
4379  inline typed::map<pair<T1, T2>, T2> range_factor_range() const;
4380  inline typed::fixed_box<pair<T1, T2>, pair<T1, T2>> range_lattice_tile() const;
4381  inline typed::fixed_box<pair<T1, T2>, pair<T1, T2>> get_range_lattice_tile() const = delete;
4382  inline typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> range_map() const;
4383  template <typename Range2>
4384  inline typed::map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> range_product(const typed::map<pair<T1, T2>, Range2> &map2) const;
4385  template <typename Range2>
4386  inline typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> range_product(const typed::union_map<pair<T1, T2>, Range2> &umap2) const;
4387  template <typename Range2>
4388  inline typed::map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> range_product(const typed::basic_map<pair<T1, T2>, Range2> &map2) const;
4389  inline typed::map<pair<T1, T2>, pair<T2, T1>> range_reverse() const;
4390  inline typed::fixed_box<pair<T1, T2>, pair<T1, T2>> range_simple_fixed_box_hull() const;
4391  inline typed::fixed_box<pair<T1, T2>, pair<T1, T2>> get_range_simple_fixed_box_hull() const = delete;
4392  inline typed::id<pair<T1, T2>, pair<T1, T2>> get_range_tuple_id() const = delete;
4393  inline typed::map<pair<T1, T2>, pair<T1, T2>> reverse() const;
4394  inline typed::map<pair<T1, T2>, pair<T1, T2>> set_domain_tuple(const typed::id<> &id) const = delete;
4395  inline typed::map<pair<T1, T2>, pair<T1, T2>> set_domain_tuple(const std::string &id) const = delete;
4396  inline typed::map<pair<T1, T2>, pair<T1, T2>> set_range_tuple(const typed::id<> &id) const = delete;
4397  inline typed::map<pair<T1, T2>, pair<T1, T2>> set_range_tuple(const std::string &id) const = delete;
4398  inline typed::space<pair<T1, T2>, pair<T1, T2>> space() const;
4399  inline typed::space<pair<T1, T2>, pair<T1, T2>> get_space() const = delete;
4400  inline typed::map<pair<T1, T2>, pair<T1, T2>> subtract(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const;
4401  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
4402  inline typed::map<pair<T1, T2>, pair<T1, T2>> subtract(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &map2) const;
4403  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const;
4404  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_range(const typed::union_set<pair<T1, T2>> &dom) const;
4405  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> to_union_map() const;
4406  inline typed::map<pair<pair<T1, T2>, T1>, T2> uncurry() const;
4407  inline typed::map<pair<T1, T2>, pair<T1, T2>> unite(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const;
4408  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> unite(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
4409  inline typed::map<pair<T1, T2>, pair<T1, T2>> unite(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &map2) const;
4410  static inline typed::map<pair<T1, T2>, pair<T1, T2>> universe(const typed::space<pair<T1, T2>, pair<T1, T2>> &space);
4411  inline typed::map<pair<T1, T2>, pair<T1, T2>> upper_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> &upper) const;
4412  inline typed::map<pair<T1, T2>, pair<T1, T2>> upper_bound(const typed::aff<pair<T1, T2>, pair<T1, T2>> &upper) const;
4413  inline typed::map<pair<T1, T2>, pair<T1, T2>> upper_bound(const typed::multi_aff<pair<T1, T2>, pair<T1, T2>> &upper) const;
4414  inline typed::map<pair<T1, T2>, pair<T1, T2>> upper_bound(const typed::pw_aff<pair<T1, T2>, pair<T1, T2>> &upper) const;
4415  inline typed::map<pair<T1, T2>, pair<T1, T2>> upper_bound(const typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> &upper) const;
4416  inline typed::set<pair<pair<T1, T2>, pair<T1, T2>>> wrap() const;
4417};
4418
4419template <typename T1, typename T2, typename Range, typename Range2>
4420struct map<pair<T1, T2>, pair<Range, Range2>> : public isl::map {
4421  template <typename...>
4422  friend struct aff;
4423  template <typename...>
4424  friend struct aff_list;
4425  template <typename...>
4426  friend struct basic_map;
4427  template <typename...>
4428  friend struct basic_set;
4429  template <typename...>
4430  friend struct fixed_box;
4431  template <typename...>
4432  friend struct id;
4433  template <typename...>
4434  friend struct id_list;
4435  template <typename...>
4436  friend struct map;
4437  template <typename...>
4438  friend struct map_list;
4439  template <typename...>
4440  friend struct multi_aff;
4441  template <typename...>
4442  friend struct multi_id;
4443  template <typename...>
4444  friend struct multi_pw_aff;
4445  template <typename...>
4446  friend struct multi_union_pw_aff;
4447  template <typename...>
4448  friend struct multi_val;
4449  template <typename...>
4450  friend struct point;
4451  template <typename...>
4452  friend struct pw_aff;
4453  template <typename...>
4454  friend struct pw_aff_list;
4455  template <typename...>
4456  friend struct pw_multi_aff;
4457  template <typename...>
4458  friend struct pw_multi_aff_list;
4459  template <typename...>
4460  friend struct set;
4461  template <typename...>
4462  friend struct set_list;
4463  template <typename...>
4464  friend struct space;
4465  template <typename...>
4466  friend struct union_map;
4467  template <typename...>
4468  friend struct union_pw_aff;
4469  template <typename...>
4470  friend struct union_pw_aff_list;
4471  template <typename...>
4472  friend struct union_pw_multi_aff;
4473  template <typename...>
4474  friend struct union_set;
4475  template <typename...>
4476  friend struct union_set_list;
4477  template <typename...>
4478  friend struct val;
4479  template <typename...>
4480  friend struct val_list;
4481
4482  map() = default;
4483  template <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
4484            typename std::enable_if<
4485              std::is_base_of<T1, Arg1>{} &&
4486              std::is_base_of<T2, Arg2>{} &&
4487              std::is_base_of<Range, Arg3>{} &&
4488              std::is_base_of<Range2, Arg4>{},
4489            bool>::type = true>
4490  map(const map<pair<Arg1, Arg2>, pair<Arg3, Arg4>> &obj) : isl::map(obj) {}
4491 private:
4492  template <typename base,
4493            typename std::enable_if<
4494              std::is_same<base, isl::map>{}, bool>::type = true>
4495  map(const base &obj) : isl::map(obj) {}
4496 public:
4497  static map from(const isl::map &obj) {
4498    return map(obj);
4499  }
4500  inline /* implicit */ map(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &bmap);
4501  inline explicit map(const isl::ctx &ctx, const std::string &str);
4502  template <typename Domain2>
4503  inline typed::map<Domain2, pair<Range, Range2>> apply_domain(const typed::map<pair<T1, T2>, Domain2> &map2) const;
4504  template <typename Domain2>
4505  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const;
4506  template <typename Domain2>
4507  inline typed::map<Domain2, pair<Range, Range2>> apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &map2) const;
4508  template <typename Arg2>
4509  inline typed::map<pair<T1, T2>, Arg2> apply_range(const typed::map<pair<Range, Range2>, Arg2> &map2) const;
4510  template <typename Arg2>
4511  inline typed::union_map<pair<T1, T2>, Arg2> apply_range(const typed::union_map<pair<Range, Range2>, Arg2> &umap2) const;
4512  template <typename Arg2>
4513  inline typed::map<pair<T1, T2>, Arg2> apply_range(const typed::basic_map<pair<Range, Range2>, Arg2> &map2) const;
4514  inline typed::map<pair<T1, T2>, pair<Range, Range2>> as_map() const;
4515  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> as_multi_union_pw_aff() const;
4516  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> as_pw_multi_aff() const;
4517  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> as_union_pw_multi_aff() const;
4518  inline typed::set<pair<Range, Range2>> bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const;
4519  inline typed::set<pair<T1, T2>> bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const;
4520  inline typed::map<pair<T1, T2>, pair<Range, Range2>> coalesce() const;
4521  inline typed::map<T1, pair<T2, pair<Range, Range2>>> curry() const;
4522  inline typed::set<pair<T1, T2>, pair<Range, Range2>> deltas() const = delete;
4523  inline typed::map<pair<T1, T2>, pair<Range, Range2>> detect_equalities() const;
4524  inline typed::set<pair<T1, T2>> domain() const;
4525  inline typed::map<T1, pair<Range, Range2>> domain_factor_domain() const;
4526  inline typed::map<T2, pair<Range, Range2>> domain_factor_range() const;
4527  inline typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> domain_map() const;
4528  inline typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> domain_map_union_pw_multi_aff() const;
4529  template <typename Domain2>
4530  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> domain_product(const typed::map<Domain2, pair<Range, Range2>> &map2) const;
4531  template <typename Domain2>
4532  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const;
4533  template <typename Domain2>
4534  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> domain_product(const typed::basic_map<Domain2, pair<Range, Range2>> &map2) const;
4535  inline typed::map<pair<T2, T1>, pair<Range, Range2>> domain_reverse() const;
4536  inline typed::id<pair<T1, T2>, pair<Range, Range2>> get_domain_tuple_id() const = delete;
4537  inline typed::map<pair<T1, T2>, pair<Range, Range2>> drop_unused_params() const;
4538  inline typed::map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::multi_pw_aff<> &mpa) const = delete;
4539  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
4540  inline typed::map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::aff<> &mpa) const = delete;
4541  inline typed::map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::multi_aff<> &mpa) const = delete;
4542  inline typed::map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::pw_aff<> &mpa) const = delete;
4543  inline typed::map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::pw_multi_aff<> &mpa) const = delete;
4544  inline bool every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &test) const;
4545  inline typed::map<pair<T1, T2>, pair<Range, Range2>> extract_map(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const;
4546  inline typed::map<Anonymous, pair<Range, Range2>> flatten_domain() const;
4547  inline typed::map<pair<T1, T2>, Anonymous> flatten_range() const;
4548  inline void foreach_basic_map(const std::function<void(typed::basic_map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const;
4549  inline void foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const;
4550  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist(const typed::map<pair<T1, T2>, pair<Range, Range2>> &context) const;
4551  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &context) const;
4552  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &context) const;
4553  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::set<pair<T1, T2>> &context) const;
4554  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::union_set<pair<T1, T2>> &uset) const;
4555  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::basic_set<pair<T1, T2>> &context) const;
4556  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::point<pair<T1, T2>> &context) const;
4557  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::set<> &context) const;
4558  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::basic_set<> &context) const;
4559  inline typed::map<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::point<> &context) const;
4560  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const;
4561  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
4562  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &map2) const;
4563  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::set<pair<T1, T2>> &set) const;
4564  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::space<pair<T1, T2>> &space) const;
4565  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const;
4566  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::basic_set<pair<T1, T2>> &set) const;
4567  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::point<pair<T1, T2>> &set) const;
4568  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::set<T1> &domain) const;
4569  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const;
4570  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::basic_set<T1> &domain) const;
4571  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::point<T1> &domain) const;
4572  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::set<> &params) const;
4573  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::basic_set<> &params) const;
4574  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::point<> &params) const;
4575  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::set<pair<Range, Range2>> &set) const;
4576  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::space<pair<Range, Range2>> &space) const;
4577  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const;
4578  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::basic_set<pair<Range, Range2>> &set) const;
4579  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::point<pair<Range, Range2>> &set) const;
4580  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::set<Range> &domain) const;
4581  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const;
4582  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::basic_set<Range> &domain) const;
4583  inline typed::map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::point<Range> &domain) const;
4584  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_ge_at(const typed::multi_pw_aff<> &mpa) const = delete;
4585  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_ge_at(const typed::aff<> &mpa) const = delete;
4586  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_ge_at(const typed::multi_aff<> &mpa) const = delete;
4587  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_ge_at(const typed::pw_aff<> &mpa) const = delete;
4588  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_ge_at(const typed::pw_multi_aff<> &mpa) const = delete;
4589  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_gt_at(const typed::multi_pw_aff<> &mpa) const = delete;
4590  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_gt_at(const typed::aff<> &mpa) const = delete;
4591  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_gt_at(const typed::multi_aff<> &mpa) const = delete;
4592  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_gt_at(const typed::pw_aff<> &mpa) const = delete;
4593  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_gt_at(const typed::pw_multi_aff<> &mpa) const = delete;
4594  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_le_at(const typed::multi_pw_aff<> &mpa) const = delete;
4595  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_le_at(const typed::aff<> &mpa) const = delete;
4596  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_le_at(const typed::multi_aff<> &mpa) const = delete;
4597  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_le_at(const typed::pw_aff<> &mpa) const = delete;
4598  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_le_at(const typed::pw_multi_aff<> &mpa) const = delete;
4599  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_lt_at(const typed::multi_pw_aff<> &mpa) const = delete;
4600  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_lt_at(const typed::aff<> &mpa) const = delete;
4601  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_lt_at(const typed::multi_aff<> &mpa) const = delete;
4602  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_lt_at(const typed::pw_aff<> &mpa) const = delete;
4603  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lex_lt_at(const typed::pw_multi_aff<> &mpa) const = delete;
4604  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lexmax() const;
4605  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> lexmax_pw_multi_aff() const;
4606  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lexmin() const;
4607  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> lexmin_pw_multi_aff() const;
4608  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lower_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const;
4609  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lower_bound(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &lower) const;
4610  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lower_bound(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const;
4611  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lower_bound(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const;
4612  inline typed::map<pair<T1, T2>, pair<Range, Range2>> lower_bound(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const;
4613  inline typed::map_list<pair<T1, T2>, pair<Range, Range2>> map_list() const;
4614  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> max_multi_pw_aff() const;
4615  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> min_multi_pw_aff() const;
4616  inline typed::set<> params() const;
4617  template <typename Domain2>
4618  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const;
4619  template <typename Domain2>
4620  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const;
4621  template <typename Domain2>
4622  inline typed::map<Domain2, pair<Range, Range2>> preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const;
4623  template <typename Domain2>
4624  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const;
4625  template <typename Arg2>
4626  inline typed::map<pair<T1, T2>, Arg2> preimage_range(const typed::multi_aff<Arg2, pair<Range, Range2>> &ma) const;
4627  template <typename Arg2>
4628  inline typed::map<pair<T1, T2>, Arg2> preimage_range(const typed::pw_multi_aff<Arg2, pair<Range, Range2>> &pma) const;
4629  template <typename Arg2>
4630  inline typed::union_map<pair<T1, T2>, Arg2> preimage_range(const typed::union_pw_multi_aff<Arg2, pair<Range, Range2>> &upma) const;
4631  template <typename Domain2, typename Arg2>
4632  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::map<Domain2, Arg2> &map2) const;
4633  template <typename Domain2, typename Arg2>
4634  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::union_map<Domain2, Arg2> &umap2) const;
4635  template <typename Domain2, typename Arg2>
4636  inline typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::basic_map<Domain2, Arg2> &map2) const;
4637  inline typed::map<pair<T1, T2>, pair<Range, Range2>> project_out_all_params() const;
4638  inline typed::map<pair<T1, T2>, pair<Range, Range2>> project_out_param(const typed::id<Anonymous> &id) const;
4639  inline typed::map<pair<T1, T2>, pair<Range, Range2>> project_out_param(const std::string &id) const;
4640  inline typed::map<pair<T1, T2>, pair<Range, Range2>> project_out_param(const typed::id_list<Anonymous> &list) const;
4641  inline typed::set<pair<Range, Range2>> range() const;
4642  inline typed::map<pair<T1, T2>, Range> range_factor_domain() const;
4643  inline typed::map<pair<T1, T2>, Range2> range_factor_range() const;
4644  inline typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> range_lattice_tile() const;
4645  inline typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> get_range_lattice_tile() const = delete;
4646  inline typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> range_map() const;
4647  template <typename Arg2>
4648  inline typed::map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::map<pair<T1, T2>, Arg2> &map2) const;
4649  template <typename Arg2>
4650  inline typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::union_map<pair<T1, T2>, Arg2> &umap2) const;
4651  template <typename Arg2>
4652  inline typed::map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::basic_map<pair<T1, T2>, Arg2> &map2) const;
4653  inline typed::map<pair<T1, T2>, pair<Range2, Range>> range_reverse() const;
4654  inline typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> range_simple_fixed_box_hull() const;
4655  inline typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> get_range_simple_fixed_box_hull() const = delete;
4656  inline typed::id<pair<T1, T2>, pair<Range, Range2>> get_range_tuple_id() const = delete;
4657  inline typed::map<pair<Range, Range2>, pair<T1, T2>> reverse() const;
4658  inline typed::map<pair<T1, T2>, pair<Range, Range2>> set_domain_tuple(const typed::id<> &id) const = delete;
4659  inline typed::map<pair<T1, T2>, pair<Range, Range2>> set_domain_tuple(const std::string &id) const = delete;
4660  inline typed::map<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
4661  inline typed::map<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
4662  inline typed::space<pair<T1, T2>, pair<Range, Range2>> space() const;
4663  inline typed::space<pair<T1, T2>, pair<Range, Range2>> get_space() const = delete;
4664  inline typed::map<pair<T1, T2>, pair<Range, Range2>> subtract(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const;
4665  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
4666  inline typed::map<pair<T1, T2>, pair<Range, Range2>> subtract(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &map2) const;
4667  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const;
4668  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const;
4669  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> to_union_map() const;
4670  inline typed::map<pair<pair<T1, T2>, Range>, Range2> uncurry() const;
4671  inline typed::map<pair<T1, T2>, pair<Range, Range2>> unite(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const;
4672  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> unite(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
4673  inline typed::map<pair<T1, T2>, pair<Range, Range2>> unite(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &map2) const;
4674  static inline typed::map<pair<T1, T2>, pair<Range, Range2>> universe(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space);
4675  inline typed::map<pair<T1, T2>, pair<Range, Range2>> upper_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const;
4676  inline typed::map<pair<T1, T2>, pair<Range, Range2>> upper_bound(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &upper) const;
4677  inline typed::map<pair<T1, T2>, pair<Range, Range2>> upper_bound(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const;
4678  inline typed::map<pair<T1, T2>, pair<Range, Range2>> upper_bound(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const;
4679  inline typed::map<pair<T1, T2>, pair<Range, Range2>> upper_bound(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const;
4680  inline typed::set<pair<pair<T1, T2>, pair<Range, Range2>>> wrap() const;
4681};
4682
4683template <typename Domain, typename Range>
4684struct map_list<Domain, Range> : public isl::map_list {
4685  template <typename...>
4686  friend struct aff;
4687  template <typename...>
4688  friend struct aff_list;
4689  template <typename...>
4690  friend struct basic_map;
4691  template <typename...>
4692  friend struct basic_set;
4693  template <typename...>
4694  friend struct fixed_box;
4695  template <typename...>
4696  friend struct id;
4697  template <typename...>
4698  friend struct id_list;
4699  template <typename...>
4700  friend struct map;
4701  template <typename...>
4702  friend struct map_list;
4703  template <typename...>
4704  friend struct multi_aff;
4705  template <typename...>
4706  friend struct multi_id;
4707  template <typename...>
4708  friend struct multi_pw_aff;
4709  template <typename...>
4710  friend struct multi_union_pw_aff;
4711  template <typename...>
4712  friend struct multi_val;
4713  template <typename...>
4714  friend struct point;
4715  template <typename...>
4716  friend struct pw_aff;
4717  template <typename...>
4718  friend struct pw_aff_list;
4719  template <typename...>
4720  friend struct pw_multi_aff;
4721  template <typename...>
4722  friend struct pw_multi_aff_list;
4723  template <typename...>
4724  friend struct set;
4725  template <typename...>
4726  friend struct set_list;
4727  template <typename...>
4728  friend struct space;
4729  template <typename...>
4730  friend struct union_map;
4731  template <typename...>
4732  friend struct union_pw_aff;
4733  template <typename...>
4734  friend struct union_pw_aff_list;
4735  template <typename...>
4736  friend struct union_pw_multi_aff;
4737  template <typename...>
4738  friend struct union_set;
4739  template <typename...>
4740  friend struct union_set_list;
4741  template <typename...>
4742  friend struct val;
4743  template <typename...>
4744  friend struct val_list;
4745
4746  map_list() = default;
4747  template <typename Arg1, typename Arg2,
4748            typename std::enable_if<
4749              std::is_base_of<Domain, Arg1>{} &&
4750              std::is_base_of<Range, Arg2>{},
4751            bool>::type = true>
4752  map_list(const map_list<Arg1, Arg2> &obj) : isl::map_list(obj) {}
4753 private:
4754  template <typename base,
4755            typename std::enable_if<
4756              std::is_same<base, isl::map_list>{}, bool>::type = true>
4757  map_list(const base &obj) : isl::map_list(obj) {}
4758 public:
4759  static map_list from(const isl::map_list &obj) {
4760    return map_list(obj);
4761  }
4762  inline explicit map_list(const isl::ctx &ctx, int n);
4763  inline explicit map_list(const typed::map<Domain, Range> &el);
4764  inline explicit map_list(const isl::ctx &ctx, const std::string &str);
4765  inline typed::map_list<Domain, Range> add(const typed::map<Domain, Range> &el) const;
4766  inline typed::map_list<Domain, Range> add(const typed::basic_map<Domain, Range> &el) const;
4767  inline typed::map<Domain, Range> at(int index) const;
4768  inline typed::map<Domain, Range> get_at(int index) const = delete;
4769  inline typed::map_list<Domain, Range> drop(unsigned int first, unsigned int n) const;
4770  inline void foreach(const std::function<void(typed::map<Domain, Range>)> &fn) const;
4771  inline void foreach_scc(const std::function<bool(typed::map<Domain, Range>, typed::map<Domain, Range>)> &follows, const std::function<void(typed::map_list<Domain, Range>)> &fn) const;
4772  inline typed::map_list<Domain, Range> set_at(int index, const typed::map<Domain, Anonymous> &el) const;
4773};
4774
4775template <typename Domain>
4776struct multi_aff<Domain> : public isl::multi_aff {
4777  template <typename...>
4778  friend struct aff;
4779  template <typename...>
4780  friend struct aff_list;
4781  template <typename...>
4782  friend struct basic_map;
4783  template <typename...>
4784  friend struct basic_set;
4785  template <typename...>
4786  friend struct fixed_box;
4787  template <typename...>
4788  friend struct id;
4789  template <typename...>
4790  friend struct id_list;
4791  template <typename...>
4792  friend struct map;
4793  template <typename...>
4794  friend struct map_list;
4795  template <typename...>
4796  friend struct multi_aff;
4797  template <typename...>
4798  friend struct multi_id;
4799  template <typename...>
4800  friend struct multi_pw_aff;
4801  template <typename...>
4802  friend struct multi_union_pw_aff;
4803  template <typename...>
4804  friend struct multi_val;
4805  template <typename...>
4806  friend struct point;
4807  template <typename...>
4808  friend struct pw_aff;
4809  template <typename...>
4810  friend struct pw_aff_list;
4811  template <typename...>
4812  friend struct pw_multi_aff;
4813  template <typename...>
4814  friend struct pw_multi_aff_list;
4815  template <typename...>
4816  friend struct set;
4817  template <typename...>
4818  friend struct set_list;
4819  template <typename...>
4820  friend struct space;
4821  template <typename...>
4822  friend struct union_map;
4823  template <typename...>
4824  friend struct union_pw_aff;
4825  template <typename...>
4826  friend struct union_pw_aff_list;
4827  template <typename...>
4828  friend struct union_pw_multi_aff;
4829  template <typename...>
4830  friend struct union_set;
4831  template <typename...>
4832  friend struct union_set_list;
4833  template <typename...>
4834  friend struct val;
4835  template <typename...>
4836  friend struct val_list;
4837
4838  multi_aff() = default;
4839  template <typename Arg1,
4840            typename std::enable_if<
4841              std::is_base_of<Domain, Arg1>{},
4842            bool>::type = true>
4843  multi_aff(const multi_aff<Arg1> &obj) : isl::multi_aff(obj) {}
4844 private:
4845  template <typename base,
4846            typename std::enable_if<
4847              std::is_same<base, isl::multi_aff>{}, bool>::type = true>
4848  multi_aff(const base &obj) : isl::multi_aff(obj) {}
4849 public:
4850  static multi_aff from(const isl::multi_aff &obj) {
4851    return multi_aff(obj);
4852  }
4853  inline /* implicit */ multi_aff(const typed::aff<Domain> &aff);
4854  inline explicit multi_aff(const typed::space<Domain> &space, const typed::aff_list<Anonymous> &list);
4855  inline explicit multi_aff(const isl::ctx &ctx, const std::string &str);
4856  inline typed::multi_aff<Domain> add(const typed::multi_aff<Domain> &multi2) const;
4857  inline typed::multi_pw_aff<Domain> add(const typed::multi_pw_aff<Domain> &multi2) const;
4858  inline typed::multi_union_pw_aff<Domain> add(const typed::multi_union_pw_aff<Domain> &multi2) const;
4859  inline typed::pw_multi_aff<Domain> add(const typed::pw_multi_aff<Domain> &pma2) const;
4860  inline typed::union_pw_multi_aff<Domain> add(const typed::union_pw_multi_aff<Domain> &upma2) const;
4861  inline typed::multi_aff<Domain> add(const typed::aff<Domain> &multi2) const;
4862  inline typed::multi_aff<Domain> add_constant(const typed::multi_val<Domain> &mv) const;
4863  inline typed::multi_aff<Domain> add_constant(const typed::val<Domain> &v) const;
4864  inline typed::multi_aff<Domain> add_constant(long v) const;
4865  template <typename Range>
4866  inline typed::union_pw_multi_aff<Range> apply(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
4867  inline typed::map<Domain> as_map() const = delete;
4868  inline typed::multi_aff<Domain> as_multi_aff() const;
4869  inline typed::multi_union_pw_aff<Domain> as_multi_union_pw_aff() const;
4870  inline typed::pw_multi_aff<Domain> as_pw_multi_aff() const;
4871  inline typed::set<Domain> as_set() const;
4872  inline typed::union_map<Domain> as_union_map() const = delete;
4873  inline typed::aff<Anonymous> at(int pos) const;
4874  inline typed::aff<Domain> get_at(int pos) const = delete;
4875  inline typed::basic_set<> bind(const typed::multi_id<Domain> &tuple) const;
4876  inline typed::multi_aff<Domain> bind_domain(const typed::multi_id<> &tuple) const = delete;
4877  inline typed::multi_aff<Domain> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
4878  inline typed::pw_multi_aff<Domain> coalesce() const;
4879  inline typed::multi_val<Domain> constant_multi_val() const;
4880  inline typed::multi_val<Domain> get_constant_multi_val() const = delete;
4881  inline typed::set<> domain() const;
4882  inline typed::multi_aff<Domain> domain_reverse() const = delete;
4883  inline typed::pw_multi_aff<Domain> drop_unused_params() const;
4884  inline typed::pw_multi_aff<Domain> extract_pw_multi_aff(const typed::space<Domain> &space) const;
4885  inline typed::multi_aff<Domain> floor() const;
4886  inline typed::multi_aff<Domain> gist(const typed::set<> &context) const;
4887  inline typed::union_pw_multi_aff<Domain> gist(const typed::union_set<> &context) const;
4888  inline typed::multi_aff<Domain> gist(const typed::basic_set<> &context) const;
4889  inline typed::multi_aff<Domain> gist(const typed::point<> &context) const;
4890  inline typed::multi_aff<Domain> gist_params(const typed::set<> &context) const;
4891  inline typed::multi_aff<Domain> gist_params(const typed::basic_set<> &context) const;
4892  inline typed::multi_aff<Domain> gist_params(const typed::point<> &context) const;
4893  inline typed::multi_aff<Domain, Domain> identity() const;
4894  template <typename Arg1>
4895  inline typed::multi_aff<Arg1, Domain> insert_domain(const typed::space<Arg1> &domain) const;
4896  inline typed::pw_multi_aff<Domain> intersect_domain(const typed::set<> &set) const = delete;
4897  inline typed::union_pw_multi_aff<Domain> intersect_domain(const typed::space<> &space) const = delete;
4898  inline typed::union_pw_multi_aff<Domain> intersect_domain(const typed::union_set<> &uset) const = delete;
4899  inline typed::union_pw_multi_aff<Domain> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
4900  inline typed::pw_multi_aff<Domain> intersect_params(const typed::set<> &set) const;
4901  inline typed::aff_list<Anonymous> list() const;
4902  inline typed::aff_list<Domain> get_list() const = delete;
4903  inline typed::multi_pw_aff<Domain> max(const typed::multi_pw_aff<Domain> &multi2) const;
4904  inline typed::multi_val<Domain> max_multi_val() const;
4905  inline typed::multi_pw_aff<Domain> min(const typed::multi_pw_aff<Domain> &multi2) const;
4906  inline typed::multi_val<Domain> min_multi_val() const;
4907  inline typed::multi_aff<Domain> neg() const;
4908  inline typed::pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
4909  inline typed::union_pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
4910  template <typename Range>
4911  inline typed::multi_aff<pair<Domain, Range>> product(const typed::multi_aff<Range> &multi2) const;
4912  template <typename Range>
4913  inline typed::multi_pw_aff<pair<Domain, Range>> product(const typed::multi_pw_aff<Range> &multi2) const;
4914  template <typename Range>
4915  inline typed::pw_multi_aff<pair<Domain, Range>> product(const typed::pw_multi_aff<Range> &pma2) const;
4916  inline typed::multi_aff<pair<Domain, Anonymous>> product(const typed::aff<Anonymous> &multi2) const;
4917  inline typed::multi_aff<Domain> pullback(const typed::multi_aff<> &ma2) const = delete;
4918  inline typed::multi_pw_aff<Domain> pullback(const typed::multi_pw_aff<> &mpa2) const = delete;
4919  inline typed::pw_multi_aff<Domain> pullback(const typed::pw_multi_aff<> &pma2) const = delete;
4920  inline typed::union_pw_multi_aff<Domain> pullback(const typed::union_pw_multi_aff<> &upma2) const = delete;
4921  inline typed::multi_aff<Domain> pullback(const typed::aff<> &ma2) const = delete;
4922  inline typed::pw_multi_aff_list<Domain> pw_multi_aff_list() const;
4923  inline typed::pw_multi_aff<Domain> range_factor_domain() const = delete;
4924  inline typed::pw_multi_aff<Domain> range_factor_range() const = delete;
4925  inline typed::multi_aff<Domain> range_product(const typed::multi_aff<> &multi2) const = delete;
4926  inline typed::multi_pw_aff<Domain> range_product(const typed::multi_pw_aff<> &multi2) const = delete;
4927  inline typed::multi_union_pw_aff<Domain> range_product(const typed::multi_union_pw_aff<> &multi2) const = delete;
4928  inline typed::pw_multi_aff<Domain> range_product(const typed::pw_multi_aff<> &pma2) const = delete;
4929  inline typed::union_pw_multi_aff<Domain> range_product(const typed::union_pw_multi_aff<> &upma2) const = delete;
4930  inline typed::multi_aff<Domain> range_product(const typed::aff<> &multi2) const = delete;
4931  inline typed::id<Domain> get_range_tuple_id() const = delete;
4932  inline typed::multi_aff<Domain> scale(const typed::multi_val<Domain> &mv) const;
4933  inline typed::multi_aff<Domain> scale(const typed::val<Domain> &v) const;
4934  inline typed::multi_aff<Domain> scale(long v) const;
4935  inline typed::multi_aff<Domain> scale_down(const typed::multi_val<Domain> &mv) const;
4936  inline typed::multi_aff<Domain> scale_down(const typed::val<Domain> &v) const;
4937  inline typed::multi_aff<Domain> scale_down(long v) const;
4938  inline typed::multi_aff<Domain> set_at(int pos, const typed::aff<Anonymous> &el) const;
4939  inline typed::multi_pw_aff<Domain> set_at(int pos, const typed::pw_aff<Anonymous> &el) const;
4940  inline typed::multi_union_pw_aff<Domain> set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const;
4941  template <typename Domain2>
4942  inline typed::multi_aff<Domain2> set_range_tuple(const typed::id<Anonymous> &id) const;
4943  template <typename Domain2>
4944  inline typed::multi_aff<Domain2> set_range_tuple(const std::string &id) const;
4945  inline typed::space<Domain> space() const;
4946  inline typed::space<Domain> get_space() const = delete;
4947  inline typed::multi_aff<Domain> sub(const typed::multi_aff<Domain> &multi2) const;
4948  inline typed::multi_pw_aff<Domain> sub(const typed::multi_pw_aff<Domain> &multi2) const;
4949  inline typed::multi_union_pw_aff<Domain> sub(const typed::multi_union_pw_aff<Domain> &multi2) const;
4950  inline typed::pw_multi_aff<Domain> sub(const typed::pw_multi_aff<Domain> &pma2) const;
4951  inline typed::union_pw_multi_aff<Domain> sub(const typed::union_pw_multi_aff<Domain> &upma2) const;
4952  inline typed::multi_aff<Domain> sub(const typed::aff<Domain> &multi2) const;
4953  inline typed::pw_multi_aff<Domain> subtract_domain(const typed::set<> &set) const = delete;
4954  inline typed::union_pw_multi_aff<Domain> subtract_domain(const typed::space<> &space) const = delete;
4955  inline typed::union_pw_multi_aff<Domain> subtract_domain(const typed::union_set<> &uset) const = delete;
4956  inline typed::multi_pw_aff<Domain> to_multi_pw_aff() const;
4957  inline typed::multi_union_pw_aff<Domain> to_multi_union_pw_aff() const;
4958  inline typed::pw_multi_aff<Domain> to_pw_multi_aff() const;
4959  inline typed::union_pw_multi_aff<Domain> to_union_pw_multi_aff() const;
4960  template <typename Arg1>
4961  inline typed::multi_aff<Arg1, Domain> unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const;
4962  inline typed::multi_pw_aff<Domain> union_add(const typed::multi_pw_aff<Domain> &mpa2) const;
4963  inline typed::multi_union_pw_aff<Domain> union_add(const typed::multi_union_pw_aff<Domain> &mupa2) const;
4964  inline typed::pw_multi_aff<Domain> union_add(const typed::pw_multi_aff<Domain> &pma2) const;
4965  inline typed::union_pw_multi_aff<Domain> union_add(const typed::union_pw_multi_aff<Domain> &upma2) const;
4966};
4967
4968template <typename Domain, typename Range>
4969struct multi_aff<Domain, Range> : public isl::multi_aff {
4970  template <typename...>
4971  friend struct aff;
4972  template <typename...>
4973  friend struct aff_list;
4974  template <typename...>
4975  friend struct basic_map;
4976  template <typename...>
4977  friend struct basic_set;
4978  template <typename...>
4979  friend struct fixed_box;
4980  template <typename...>
4981  friend struct id;
4982  template <typename...>
4983  friend struct id_list;
4984  template <typename...>
4985  friend struct map;
4986  template <typename...>
4987  friend struct map_list;
4988  template <typename...>
4989  friend struct multi_aff;
4990  template <typename...>
4991  friend struct multi_id;
4992  template <typename...>
4993  friend struct multi_pw_aff;
4994  template <typename...>
4995  friend struct multi_union_pw_aff;
4996  template <typename...>
4997  friend struct multi_val;
4998  template <typename...>
4999  friend struct point;
5000  template <typename...>
5001  friend struct pw_aff;
5002  template <typename...>
5003  friend struct pw_aff_list;
5004  template <typename...>
5005  friend struct pw_multi_aff;
5006  template <typename...>
5007  friend struct pw_multi_aff_list;
5008  template <typename...>
5009  friend struct set;
5010  template <typename...>
5011  friend struct set_list;
5012  template <typename...>
5013  friend struct space;
5014  template <typename...>
5015  friend struct union_map;
5016  template <typename...>
5017  friend struct union_pw_aff;
5018  template <typename...>
5019  friend struct union_pw_aff_list;
5020  template <typename...>
5021  friend struct union_pw_multi_aff;
5022  template <typename...>
5023  friend struct union_set;
5024  template <typename...>
5025  friend struct union_set_list;
5026  template <typename...>
5027  friend struct val;
5028  template <typename...>
5029  friend struct val_list;
5030
5031  multi_aff() = default;
5032  template <typename Arg1, typename Arg2,
5033            typename std::enable_if<
5034              std::is_base_of<Domain, Arg1>{} &&
5035              std::is_base_of<Range, Arg2>{},
5036            bool>::type = true>
5037  multi_aff(const multi_aff<Arg1, Arg2> &obj) : isl::multi_aff(obj) {}
5038 private:
5039  template <typename base,
5040            typename std::enable_if<
5041              std::is_same<base, isl::multi_aff>{}, bool>::type = true>
5042  multi_aff(const base &obj) : isl::multi_aff(obj) {}
5043 public:
5044  static multi_aff from(const isl::multi_aff &obj) {
5045    return multi_aff(obj);
5046  }
5047  inline /* implicit */ multi_aff(const typed::aff<Domain, Range> &aff);
5048  inline explicit multi_aff(const typed::space<Domain, Range> &space, const typed::aff_list<Domain, Anonymous> &list);
5049  inline explicit multi_aff(const isl::ctx &ctx, const std::string &str);
5050  inline typed::multi_aff<Domain, Range> add(const typed::multi_aff<Domain, Range> &multi2) const;
5051  inline typed::multi_pw_aff<Domain, Range> add(const typed::multi_pw_aff<Domain, Range> &multi2) const;
5052  inline typed::multi_union_pw_aff<Domain, Range> add(const typed::multi_union_pw_aff<Domain, Range> &multi2) const;
5053  inline typed::pw_multi_aff<Domain, Range> add(const typed::pw_multi_aff<Domain, Range> &pma2) const;
5054  inline typed::union_pw_multi_aff<Domain, Range> add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
5055  inline typed::multi_aff<Domain, Range> add(const typed::aff<Domain, Range> &multi2) const;
5056  inline typed::multi_aff<Domain, Range> add_constant(const typed::multi_val<Range> &mv) const;
5057  inline typed::multi_aff<Domain, Range> add_constant(const typed::val<Range> &v) const;
5058  inline typed::multi_aff<Domain, Range> add_constant(long v) const;
5059  template <typename Range2>
5060  inline typed::union_pw_multi_aff<Domain, Range2> apply(const typed::union_pw_multi_aff<Range, Range2> &upma2) const;
5061  inline typed::map<Domain, Range> as_map() const;
5062  inline typed::multi_aff<Domain, Range> as_multi_aff() const;
5063  inline typed::multi_union_pw_aff<Domain, Range> as_multi_union_pw_aff() const;
5064  inline typed::pw_multi_aff<Domain, Range> as_pw_multi_aff() const;
5065  inline typed::set<Domain, Range> as_set() const = delete;
5066  inline typed::union_map<Domain, Range> as_union_map() const;
5067  inline typed::aff<Domain, Anonymous> at(int pos) const;
5068  inline typed::aff<Domain, Range> get_at(int pos) const = delete;
5069  inline typed::basic_set<Domain> bind(const typed::multi_id<Range> &tuple) const;
5070  inline typed::multi_aff<Range> bind_domain(const typed::multi_id<Domain> &tuple) const;
5071  inline typed::multi_aff<Domain, Range> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
5072  inline typed::pw_multi_aff<Domain, Range> coalesce() const;
5073  inline typed::multi_val<Range> constant_multi_val() const;
5074  inline typed::multi_val<Domain, Range> get_constant_multi_val() const = delete;
5075  inline typed::set<Domain> domain() const;
5076  inline typed::multi_aff<Domain, Range> domain_reverse() const = delete;
5077  inline typed::pw_multi_aff<Domain, Range> drop_unused_params() const;
5078  inline typed::pw_multi_aff<Domain, Range> extract_pw_multi_aff(const typed::space<Domain, Range> &space) const;
5079  inline typed::multi_aff<Domain, Range> floor() const;
5080  inline typed::multi_aff<Domain, Range> gist(const typed::set<Domain> &context) const;
5081  inline typed::union_pw_multi_aff<Domain, Range> gist(const typed::union_set<Domain> &context) const;
5082  inline typed::multi_aff<Domain, Range> gist(const typed::basic_set<Domain> &context) const;
5083  inline typed::multi_aff<Domain, Range> gist(const typed::point<Domain> &context) const;
5084  inline typed::multi_aff<Domain, Range> gist_params(const typed::set<> &context) const;
5085  inline typed::multi_aff<Domain, Range> gist_params(const typed::basic_set<> &context) const;
5086  inline typed::multi_aff<Domain, Range> gist_params(const typed::point<> &context) const;
5087  inline typed::multi_aff<Domain, Range> identity() const;
5088  inline typed::multi_aff<Domain, Range> insert_domain(const typed::space<> &domain) const = delete;
5089  inline typed::pw_multi_aff<Domain, Range> intersect_domain(const typed::set<Domain> &set) const;
5090  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain(const typed::space<Domain> &space) const;
5091  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain(const typed::union_set<Domain> &uset) const;
5092  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
5093  inline typed::pw_multi_aff<Domain, Range> intersect_params(const typed::set<> &set) const;
5094  inline typed::aff_list<Domain, Anonymous> list() const;
5095  inline typed::aff_list<Domain, Range> get_list() const = delete;
5096  inline typed::multi_pw_aff<Domain, Range> max(const typed::multi_pw_aff<Domain, Range> &multi2) const;
5097  inline typed::multi_val<Range> max_multi_val() const;
5098  inline typed::multi_pw_aff<Domain, Range> min(const typed::multi_pw_aff<Domain, Range> &multi2) const;
5099  inline typed::multi_val<Range> min_multi_val() const;
5100  inline typed::multi_aff<Domain, Range> neg() const;
5101  inline typed::pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
5102  inline typed::union_pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
5103  template <typename Domain2, typename Range2>
5104  inline typed::multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::multi_aff<Domain2, Range2> &multi2) const;
5105  template <typename Domain2, typename Range2>
5106  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const;
5107  template <typename Domain2, typename Range2>
5108  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::pw_multi_aff<Domain2, Range2> &pma2) const;
5109  template <typename Domain2>
5110  inline typed::multi_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> product(const typed::aff<Domain2, Anonymous> &multi2) const;
5111  template <typename Domain2>
5112  inline typed::multi_aff<Domain2, Range> pullback(const typed::multi_aff<Domain2, Domain> &ma2) const;
5113  inline typed::multi_aff<Range> pullback(const typed::multi_aff<Domain> &ma2) const;
5114  template <typename Domain2>
5115  inline typed::multi_pw_aff<Domain2, Range> pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const;
5116  inline typed::multi_pw_aff<Range> pullback(const typed::multi_pw_aff<Domain> &mpa2) const;
5117  template <typename Domain2>
5118  inline typed::pw_multi_aff<Domain2, Range> pullback(const typed::pw_multi_aff<Domain2, Domain> &pma2) const;
5119  inline typed::pw_multi_aff<Range> pullback(const typed::pw_multi_aff<Domain> &pma2) const;
5120  template <typename Domain2>
5121  inline typed::union_pw_multi_aff<Domain2, Range> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const;
5122  inline typed::union_pw_multi_aff<Range> pullback(const typed::union_pw_multi_aff<Domain> &upma2) const;
5123  template <typename Domain2>
5124  inline typed::multi_aff<Domain2, Range> pullback(const typed::aff<Domain2, Domain> &ma2) const;
5125  inline typed::multi_aff<Range> pullback(const typed::aff<Domain> &ma2) const;
5126  inline typed::pw_multi_aff_list<Domain, Range> pw_multi_aff_list() const;
5127  inline typed::pw_multi_aff<Domain, Range> range_factor_domain() const = delete;
5128  inline typed::pw_multi_aff<Domain, Range> range_factor_range() const = delete;
5129  template <typename Range2>
5130  inline typed::multi_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_aff<Domain, Range2> &multi2) const;
5131  template <typename Range2>
5132  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const;
5133  template <typename Range2>
5134  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const;
5135  template <typename Range2>
5136  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> range_product(const typed::pw_multi_aff<Domain, Range2> &pma2) const;
5137  template <typename Range2>
5138  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const;
5139  inline typed::multi_aff<Domain, pair<Range, Anonymous>> range_product(const typed::aff<Domain, Anonymous> &multi2) const;
5140  inline typed::id<Domain, Range> get_range_tuple_id() const = delete;
5141  inline typed::multi_aff<Domain, Range> scale(const typed::multi_val<Range> &mv) const;
5142  inline typed::multi_aff<Domain, Range> scale(const typed::val<Range> &v) const;
5143  inline typed::multi_aff<Domain, Range> scale(long v) const;
5144  inline typed::multi_aff<Domain, Range> scale_down(const typed::multi_val<Range> &mv) const;
5145  inline typed::multi_aff<Domain, Range> scale_down(const typed::val<Range> &v) const;
5146  inline typed::multi_aff<Domain, Range> scale_down(long v) const;
5147  inline typed::multi_aff<Domain, Range> set_at(int pos, const typed::aff<Domain, Anonymous> &el) const;
5148  inline typed::multi_pw_aff<Domain, Range> set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const;
5149  inline typed::multi_union_pw_aff<Domain, Range> set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const;
5150  template <typename Range2>
5151  inline typed::multi_aff<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
5152  template <typename Range2>
5153  inline typed::multi_aff<Domain, Range2> set_range_tuple(const std::string &id) const;
5154  inline typed::space<Domain, Range> space() const;
5155  inline typed::space<Domain, Range> get_space() const = delete;
5156  inline typed::multi_aff<Domain, Range> sub(const typed::multi_aff<Domain, Range> &multi2) const;
5157  inline typed::multi_pw_aff<Domain, Range> sub(const typed::multi_pw_aff<Domain, Range> &multi2) const;
5158  inline typed::multi_union_pw_aff<Domain, Range> sub(const typed::multi_union_pw_aff<Domain, Range> &multi2) const;
5159  inline typed::pw_multi_aff<Domain, Range> sub(const typed::pw_multi_aff<Domain, Range> &pma2) const;
5160  inline typed::union_pw_multi_aff<Domain, Range> sub(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
5161  inline typed::multi_aff<Domain, Range> sub(const typed::aff<Domain, Range> &multi2) const;
5162  inline typed::pw_multi_aff<Domain, Range> subtract_domain(const typed::set<Domain> &set) const;
5163  inline typed::union_pw_multi_aff<Domain, Range> subtract_domain(const typed::space<Domain> &space) const;
5164  inline typed::union_pw_multi_aff<Domain, Range> subtract_domain(const typed::union_set<Domain> &uset) const;
5165  inline typed::multi_pw_aff<Domain, Range> to_multi_pw_aff() const;
5166  inline typed::multi_union_pw_aff<Domain, Range> to_multi_union_pw_aff() const;
5167  inline typed::pw_multi_aff<Domain, Range> to_pw_multi_aff() const;
5168  inline typed::union_pw_multi_aff<Domain, Range> to_union_pw_multi_aff() const;
5169  inline typed::multi_aff<Domain, Range> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
5170  inline typed::multi_pw_aff<Domain, Range> union_add(const typed::multi_pw_aff<Domain, Range> &mpa2) const;
5171  inline typed::multi_union_pw_aff<Domain, Range> union_add(const typed::multi_union_pw_aff<Domain, Range> &mupa2) const;
5172  inline typed::pw_multi_aff<Domain, Range> union_add(const typed::pw_multi_aff<Domain, Range> &pma2) const;
5173  inline typed::union_pw_multi_aff<Domain, Range> union_add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
5174};
5175
5176template <typename Domain2, typename Range2, typename Range>
5177struct multi_aff<pair<Domain2, Range2>, Range> : public isl::multi_aff {
5178  template <typename...>
5179  friend struct aff;
5180  template <typename...>
5181  friend struct aff_list;
5182  template <typename...>
5183  friend struct basic_map;
5184  template <typename...>
5185  friend struct basic_set;
5186  template <typename...>
5187  friend struct fixed_box;
5188  template <typename...>
5189  friend struct id;
5190  template <typename...>
5191  friend struct id_list;
5192  template <typename...>
5193  friend struct map;
5194  template <typename...>
5195  friend struct map_list;
5196  template <typename...>
5197  friend struct multi_aff;
5198  template <typename...>
5199  friend struct multi_id;
5200  template <typename...>
5201  friend struct multi_pw_aff;
5202  template <typename...>
5203  friend struct multi_union_pw_aff;
5204  template <typename...>
5205  friend struct multi_val;
5206  template <typename...>
5207  friend struct point;
5208  template <typename...>
5209  friend struct pw_aff;
5210  template <typename...>
5211  friend struct pw_aff_list;
5212  template <typename...>
5213  friend struct pw_multi_aff;
5214  template <typename...>
5215  friend struct pw_multi_aff_list;
5216  template <typename...>
5217  friend struct set;
5218  template <typename...>
5219  friend struct set_list;
5220  template <typename...>
5221  friend struct space;
5222  template <typename...>
5223  friend struct union_map;
5224  template <typename...>
5225  friend struct union_pw_aff;
5226  template <typename...>
5227  friend struct union_pw_aff_list;
5228  template <typename...>
5229  friend struct union_pw_multi_aff;
5230  template <typename...>
5231  friend struct union_set;
5232  template <typename...>
5233  friend struct union_set_list;
5234  template <typename...>
5235  friend struct val;
5236  template <typename...>
5237  friend struct val_list;
5238
5239  multi_aff() = default;
5240  template <typename Arg1, typename Arg2, typename Arg3,
5241            typename std::enable_if<
5242              std::is_base_of<Domain2, Arg1>{} &&
5243              std::is_base_of<Range2, Arg2>{} &&
5244              std::is_base_of<Range, Arg3>{},
5245            bool>::type = true>
5246  multi_aff(const multi_aff<pair<Arg1, Arg2>, Arg3> &obj) : isl::multi_aff(obj) {}
5247 private:
5248  template <typename base,
5249            typename std::enable_if<
5250              std::is_same<base, isl::multi_aff>{}, bool>::type = true>
5251  multi_aff(const base &obj) : isl::multi_aff(obj) {}
5252 public:
5253  static multi_aff from(const isl::multi_aff &obj) {
5254    return multi_aff(obj);
5255  }
5256  inline /* implicit */ multi_aff(const typed::aff<pair<Domain2, Range2>, Range> &aff);
5257  inline explicit multi_aff(const typed::space<pair<Domain2, Range2>, Range> &space, const typed::aff_list<pair<Domain2, Range2>, Anonymous> &list);
5258  inline explicit multi_aff(const isl::ctx &ctx, const std::string &str);
5259  inline typed::multi_aff<pair<Domain2, Range2>, Range> add(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
5260  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
5261  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
5262  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const;
5263  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const;
5264  inline typed::multi_aff<pair<Domain2, Range2>, Range> add(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const;
5265  inline typed::multi_aff<pair<Domain2, Range2>, Range> add_constant(const typed::multi_val<Range> &mv) const;
5266  inline typed::multi_aff<pair<Domain2, Range2>, Range> add_constant(const typed::val<Range> &v) const;
5267  inline typed::multi_aff<pair<Domain2, Range2>, Range> add_constant(long v) const;
5268  template <typename Arg2>
5269  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2> apply(const typed::union_pw_multi_aff<Range, Arg2> &upma2) const;
5270  inline typed::map<pair<Domain2, Range2>, Range> as_map() const;
5271  inline typed::multi_aff<pair<Domain2, Range2>, Range> as_multi_aff() const;
5272  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> as_multi_union_pw_aff() const;
5273  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> as_pw_multi_aff() const;
5274  inline typed::set<pair<Domain2, Range2>, Range> as_set() const = delete;
5275  inline typed::union_map<pair<Domain2, Range2>, Range> as_union_map() const;
5276  inline typed::aff<pair<Domain2, Range2>, Anonymous> at(int pos) const;
5277  inline typed::aff<pair<Domain2, Range2>, Range> get_at(int pos) const = delete;
5278  inline typed::basic_set<pair<Domain2, Range2>> bind(const typed::multi_id<Range> &tuple) const;
5279  inline typed::multi_aff<Range> bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const;
5280  inline typed::multi_aff<Range2, Range> bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const;
5281  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> coalesce() const;
5282  inline typed::multi_val<Range> constant_multi_val() const;
5283  inline typed::multi_val<pair<Domain2, Range2>, Range> get_constant_multi_val() const = delete;
5284  inline typed::set<pair<Domain2, Range2>> domain() const;
5285  inline typed::multi_aff<pair<Range2, Domain2>, Range> domain_reverse() const;
5286  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> drop_unused_params() const;
5287  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> extract_pw_multi_aff(const typed::space<pair<Domain2, Range2>, Range> &space) const;
5288  inline typed::multi_aff<pair<Domain2, Range2>, Range> floor() const;
5289  inline typed::multi_aff<pair<Domain2, Range2>, Range> gist(const typed::set<pair<Domain2, Range2>> &context) const;
5290  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> gist(const typed::union_set<pair<Domain2, Range2>> &context) const;
5291  inline typed::multi_aff<pair<Domain2, Range2>, Range> gist(const typed::basic_set<pair<Domain2, Range2>> &context) const;
5292  inline typed::multi_aff<pair<Domain2, Range2>, Range> gist(const typed::point<pair<Domain2, Range2>> &context) const;
5293  inline typed::multi_aff<pair<Domain2, Range2>, Range> gist_params(const typed::set<> &context) const;
5294  inline typed::multi_aff<pair<Domain2, Range2>, Range> gist_params(const typed::basic_set<> &context) const;
5295  inline typed::multi_aff<pair<Domain2, Range2>, Range> gist_params(const typed::point<> &context) const;
5296  inline typed::multi_aff<pair<Domain2, Range2>, Range> identity() const;
5297  inline typed::multi_aff<pair<Domain2, Range2>, Range> insert_domain(const typed::space<> &domain) const = delete;
5298  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::set<pair<Domain2, Range2>> &set) const;
5299  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::space<pair<Domain2, Range2>> &space) const;
5300  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const;
5301  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain_wrapped_domain(const typed::union_set<Domain2> &uset) const;
5302  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> intersect_params(const typed::set<> &set) const;
5303  inline typed::aff_list<pair<Domain2, Range2>, Anonymous> list() const;
5304  inline typed::aff_list<pair<Domain2, Range2>, Range> get_list() const = delete;
5305  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> max(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
5306  inline typed::multi_val<Range> max_multi_val() const;
5307  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> min(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
5308  inline typed::multi_val<Range> min_multi_val() const;
5309  inline typed::multi_aff<pair<Domain2, Range2>, Range> neg() const;
5310  template <typename Domain3>
5311  inline typed::pw_multi_aff<pair<Domain3, Range2>, Range> preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain2> &pma2) const;
5312  template <typename Domain3>
5313  inline typed::union_pw_multi_aff<pair<Domain3, Range2>, Range> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain2> &upma2) const;
5314  template <typename Arg2, typename Arg3>
5315  inline typed::multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> product(const typed::multi_aff<Arg2, Arg3> &multi2) const;
5316  template <typename Arg2, typename Arg3>
5317  inline typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> product(const typed::multi_pw_aff<Arg2, Arg3> &multi2) const;
5318  template <typename Arg2, typename Arg3>
5319  inline typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> product(const typed::pw_multi_aff<Arg2, Arg3> &pma2) const;
5320  template <typename Arg2>
5321  inline typed::multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>> product(const typed::aff<Arg2, Anonymous> &multi2) const;
5322  template <typename Arg2>
5323  inline typed::multi_aff<Arg2, Range> pullback(const typed::multi_aff<Arg2, pair<Domain2, Range2>> &ma2) const;
5324  inline typed::multi_aff<Range> pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma2) const;
5325  template <typename Arg2>
5326  inline typed::multi_pw_aff<Arg2, Range> pullback(const typed::multi_pw_aff<Arg2, pair<Domain2, Range2>> &mpa2) const;
5327  inline typed::multi_pw_aff<Range> pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa2) const;
5328  template <typename Arg2>
5329  inline typed::pw_multi_aff<Arg2, Range> pullback(const typed::pw_multi_aff<Arg2, pair<Domain2, Range2>> &pma2) const;
5330  inline typed::pw_multi_aff<Range> pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma2) const;
5331  template <typename Arg2>
5332  inline typed::union_pw_multi_aff<Arg2, Range> pullback(const typed::union_pw_multi_aff<Arg2, pair<Domain2, Range2>> &upma2) const;
5333  inline typed::union_pw_multi_aff<Range> pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma2) const;
5334  template <typename Arg2>
5335  inline typed::multi_aff<Arg2, Range> pullback(const typed::aff<Arg2, pair<Domain2, Range2>> &ma2) const;
5336  inline typed::multi_aff<Range> pullback(const typed::aff<pair<Domain2, Range2>> &ma2) const;
5337  inline typed::pw_multi_aff_list<pair<Domain2, Range2>, Range> pw_multi_aff_list() const;
5338  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> range_factor_domain() const = delete;
5339  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> range_factor_range() const = delete;
5340  template <typename Arg2>
5341  inline typed::multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::multi_aff<pair<Domain2, Range2>, Arg2> &multi2) const;
5342  template <typename Arg2>
5343  inline typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const;
5344  template <typename Arg2>
5345  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const;
5346  template <typename Arg2>
5347  inline typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg2> &pma2) const;
5348  template <typename Arg2>
5349  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2> &upma2) const;
5350  inline typed::multi_aff<pair<Domain2, Range2>, pair<Range, Anonymous>> range_product(const typed::aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
5351  inline typed::id<pair<Domain2, Range2>, Range> get_range_tuple_id() const = delete;
5352  inline typed::multi_aff<pair<Domain2, Range2>, Range> scale(const typed::multi_val<Range> &mv) const;
5353  inline typed::multi_aff<pair<Domain2, Range2>, Range> scale(const typed::val<Range> &v) const;
5354  inline typed::multi_aff<pair<Domain2, Range2>, Range> scale(long v) const;
5355  inline typed::multi_aff<pair<Domain2, Range2>, Range> scale_down(const typed::multi_val<Range> &mv) const;
5356  inline typed::multi_aff<pair<Domain2, Range2>, Range> scale_down(const typed::val<Range> &v) const;
5357  inline typed::multi_aff<pair<Domain2, Range2>, Range> scale_down(long v) const;
5358  inline typed::multi_aff<pair<Domain2, Range2>, Range> set_at(int pos, const typed::aff<pair<Domain2, Range2>, Anonymous> &el) const;
5359  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
5360  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
5361  template <typename Arg1>
5362  inline typed::multi_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const typed::id<Anonymous> &id) const;
5363  template <typename Arg1>
5364  inline typed::multi_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const std::string &id) const;
5365  inline typed::space<pair<Domain2, Range2>, Range> space() const;
5366  inline typed::space<pair<Domain2, Range2>, Range> get_space() const = delete;
5367  inline typed::multi_aff<pair<Domain2, Range2>, Range> sub(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
5368  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
5369  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
5370  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const;
5371  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> sub(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const;
5372  inline typed::multi_aff<pair<Domain2, Range2>, Range> sub(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const;
5373  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> subtract_domain(const typed::set<pair<Domain2, Range2>> &set) const;
5374  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> subtract_domain(const typed::space<pair<Domain2, Range2>> &space) const;
5375  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> subtract_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const;
5376  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> to_multi_pw_aff() const;
5377  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> to_multi_union_pw_aff() const;
5378  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> to_pw_multi_aff() const;
5379  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> to_union_pw_multi_aff() const;
5380  inline typed::multi_aff<pair<Domain2, Range2>, Range> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
5381  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &mpa2) const;
5382  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &mupa2) const;
5383  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const;
5384  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> union_add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const;
5385};
5386
5387template <typename Domain, typename Range, typename Range2>
5388struct multi_aff<Domain, pair<Range, Range2>> : public isl::multi_aff {
5389  template <typename...>
5390  friend struct aff;
5391  template <typename...>
5392  friend struct aff_list;
5393  template <typename...>
5394  friend struct basic_map;
5395  template <typename...>
5396  friend struct basic_set;
5397  template <typename...>
5398  friend struct fixed_box;
5399  template <typename...>
5400  friend struct id;
5401  template <typename...>
5402  friend struct id_list;
5403  template <typename...>
5404  friend struct map;
5405  template <typename...>
5406  friend struct map_list;
5407  template <typename...>
5408  friend struct multi_aff;
5409  template <typename...>
5410  friend struct multi_id;
5411  template <typename...>
5412  friend struct multi_pw_aff;
5413  template <typename...>
5414  friend struct multi_union_pw_aff;
5415  template <typename...>
5416  friend struct multi_val;
5417  template <typename...>
5418  friend struct point;
5419  template <typename...>
5420  friend struct pw_aff;
5421  template <typename...>
5422  friend struct pw_aff_list;
5423  template <typename...>
5424  friend struct pw_multi_aff;
5425  template <typename...>
5426  friend struct pw_multi_aff_list;
5427  template <typename...>
5428  friend struct set;
5429  template <typename...>
5430  friend struct set_list;
5431  template <typename...>
5432  friend struct space;
5433  template <typename...>
5434  friend struct union_map;
5435  template <typename...>
5436  friend struct union_pw_aff;
5437  template <typename...>
5438  friend struct union_pw_aff_list;
5439  template <typename...>
5440  friend struct union_pw_multi_aff;
5441  template <typename...>
5442  friend struct union_set;
5443  template <typename...>
5444  friend struct union_set_list;
5445  template <typename...>
5446  friend struct val;
5447  template <typename...>
5448  friend struct val_list;
5449
5450  multi_aff() = default;
5451  template <typename Arg1, typename Arg2, typename Arg3,
5452            typename std::enable_if<
5453              std::is_base_of<Domain, Arg1>{} &&
5454              std::is_base_of<Range, Arg2>{} &&
5455              std::is_base_of<Range2, Arg3>{},
5456            bool>::type = true>
5457  multi_aff(const multi_aff<Arg1, pair<Arg2, Arg3>> &obj) : isl::multi_aff(obj) {}
5458 private:
5459  template <typename base,
5460            typename std::enable_if<
5461              std::is_same<base, isl::multi_aff>{}, bool>::type = true>
5462  multi_aff(const base &obj) : isl::multi_aff(obj) {}
5463 public:
5464  static multi_aff from(const isl::multi_aff &obj) {
5465    return multi_aff(obj);
5466  }
5467  inline /* implicit */ multi_aff(const typed::aff<Domain, pair<Range, Range2>> &aff);
5468  inline explicit multi_aff(const typed::space<Domain, pair<Range, Range2>> &space, const typed::aff_list<Domain, Anonymous> &list);
5469  inline explicit multi_aff(const isl::ctx &ctx, const std::string &str);
5470  inline typed::multi_aff<Domain, pair<Range, Range2>> add(const typed::multi_aff<Domain, pair<Range, Range2>> &multi2) const;
5471  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> add(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
5472  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> add(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
5473  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const;
5474  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
5475  inline typed::multi_aff<Domain, pair<Range, Range2>> add(const typed::aff<Domain, pair<Range, Range2>> &multi2) const;
5476  inline typed::multi_aff<Domain, pair<Range, Range2>> add_constant(const typed::multi_val<pair<Range, Range2>> &mv) const;
5477  inline typed::multi_aff<Domain, pair<Range, Range2>> add_constant(const typed::val<pair<Range, Range2>> &v) const;
5478  inline typed::multi_aff<Domain, pair<Range, Range2>> add_constant(long v) const;
5479  template <typename Arg3>
5480  inline typed::union_pw_multi_aff<Domain, Arg3> apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg3> &upma2) const;
5481  inline typed::map<Domain, pair<Range, Range2>> as_map() const;
5482  inline typed::multi_aff<Domain, pair<Range, Range2>> as_multi_aff() const;
5483  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> as_multi_union_pw_aff() const;
5484  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> as_pw_multi_aff() const;
5485  inline typed::set<Domain, pair<Range, Range2>> as_set() const = delete;
5486  inline typed::union_map<Domain, pair<Range, Range2>> as_union_map() const;
5487  inline typed::aff<Domain, Anonymous> at(int pos) const;
5488  inline typed::aff<Domain, pair<Range, Range2>> get_at(int pos) const = delete;
5489  inline typed::basic_set<Domain> bind(const typed::multi_id<pair<Range, Range2>> &tuple) const;
5490  inline typed::multi_aff<pair<Range, Range2>> bind_domain(const typed::multi_id<Domain> &tuple) const;
5491  inline typed::multi_aff<Domain, pair<Range, Range2>> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
5492  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> coalesce() const;
5493  inline typed::multi_val<pair<Range, Range2>> constant_multi_val() const;
5494  inline typed::multi_val<Domain, pair<Range, Range2>> get_constant_multi_val() const = delete;
5495  inline typed::set<Domain> domain() const;
5496  inline typed::multi_aff<Domain, pair<Range, Range2>> domain_reverse() const = delete;
5497  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> drop_unused_params() const;
5498  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> extract_pw_multi_aff(const typed::space<Domain, pair<Range, Range2>> &space) const;
5499  inline typed::multi_aff<Domain, pair<Range, Range2>> floor() const;
5500  inline typed::multi_aff<Domain, pair<Range, Range2>> gist(const typed::set<Domain> &context) const;
5501  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> gist(const typed::union_set<Domain> &context) const;
5502  inline typed::multi_aff<Domain, pair<Range, Range2>> gist(const typed::basic_set<Domain> &context) const;
5503  inline typed::multi_aff<Domain, pair<Range, Range2>> gist(const typed::point<Domain> &context) const;
5504  inline typed::multi_aff<Domain, pair<Range, Range2>> gist_params(const typed::set<> &context) const;
5505  inline typed::multi_aff<Domain, pair<Range, Range2>> gist_params(const typed::basic_set<> &context) const;
5506  inline typed::multi_aff<Domain, pair<Range, Range2>> gist_params(const typed::point<> &context) const;
5507  inline typed::multi_aff<Domain, pair<Range, Range2>> identity() const;
5508  inline typed::multi_aff<Domain, pair<Range, Range2>> insert_domain(const typed::space<> &domain) const = delete;
5509  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::set<Domain> &set) const;
5510  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::space<Domain> &space) const;
5511  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::union_set<Domain> &uset) const;
5512  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
5513  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> intersect_params(const typed::set<> &set) const;
5514  inline typed::aff_list<Domain, Anonymous> list() const;
5515  inline typed::aff_list<Domain, pair<Range, Range2>> get_list() const = delete;
5516  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> max(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
5517  inline typed::multi_val<pair<Range, Range2>> max_multi_val() const;
5518  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> min(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
5519  inline typed::multi_val<pair<Range, Range2>> min_multi_val() const;
5520  inline typed::multi_aff<Domain, pair<Range, Range2>> neg() const;
5521  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
5522  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
5523  template <typename Domain2, typename Arg3>
5524  inline typed::multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::multi_aff<Domain2, Arg3> &multi2) const;
5525  template <typename Domain2, typename Arg3>
5526  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::multi_pw_aff<Domain2, Arg3> &multi2) const;
5527  template <typename Domain2, typename Arg3>
5528  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::pw_multi_aff<Domain2, Arg3> &pma2) const;
5529  template <typename Domain2>
5530  inline typed::multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Anonymous>> product(const typed::aff<Domain2, Anonymous> &multi2) const;
5531  template <typename Domain2>
5532  inline typed::multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_aff<Domain2, Domain> &ma2) const;
5533  inline typed::multi_aff<pair<Range, Range2>> pullback(const typed::multi_aff<Domain> &ma2) const;
5534  template <typename Domain2>
5535  inline typed::multi_pw_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const;
5536  inline typed::multi_pw_aff<pair<Range, Range2>> pullback(const typed::multi_pw_aff<Domain> &mpa2) const;
5537  template <typename Domain2>
5538  inline typed::pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::pw_multi_aff<Domain2, Domain> &pma2) const;
5539  inline typed::pw_multi_aff<pair<Range, Range2>> pullback(const typed::pw_multi_aff<Domain> &pma2) const;
5540  template <typename Domain2>
5541  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const;
5542  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<Domain> &upma2) const;
5543  template <typename Domain2>
5544  inline typed::multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::aff<Domain2, Domain> &ma2) const;
5545  inline typed::multi_aff<pair<Range, Range2>> pullback(const typed::aff<Domain> &ma2) const;
5546  inline typed::pw_multi_aff_list<Domain, pair<Range, Range2>> pw_multi_aff_list() const;
5547  inline typed::pw_multi_aff<Domain, Range> range_factor_domain() const;
5548  inline typed::pw_multi_aff<Domain, Range2> range_factor_range() const;
5549  template <typename Arg3>
5550  inline typed::multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::multi_aff<Domain, Arg3> &multi2) const;
5551  template <typename Arg3>
5552  inline typed::multi_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::multi_pw_aff<Domain, Arg3> &multi2) const;
5553  template <typename Arg3>
5554  inline typed::multi_union_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::multi_union_pw_aff<Domain, Arg3> &multi2) const;
5555  template <typename Arg3>
5556  inline typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::pw_multi_aff<Domain, Arg3> &pma2) const;
5557  template <typename Arg3>
5558  inline typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::union_pw_multi_aff<Domain, Arg3> &upma2) const;
5559  inline typed::multi_aff<Domain, pair<pair<Range, Range2>, Anonymous>> range_product(const typed::aff<Domain, Anonymous> &multi2) const;
5560  inline typed::id<Domain, pair<Range, Range2>> get_range_tuple_id() const = delete;
5561  inline typed::multi_aff<Domain, pair<Range, Range2>> scale(const typed::multi_val<pair<Range, Range2>> &mv) const;
5562  inline typed::multi_aff<Domain, pair<Range, Range2>> scale(const typed::val<pair<Range, Range2>> &v) const;
5563  inline typed::multi_aff<Domain, pair<Range, Range2>> scale(long v) const;
5564  inline typed::multi_aff<Domain, pair<Range, Range2>> scale_down(const typed::multi_val<pair<Range, Range2>> &mv) const;
5565  inline typed::multi_aff<Domain, pair<Range, Range2>> scale_down(const typed::val<pair<Range, Range2>> &v) const;
5566  inline typed::multi_aff<Domain, pair<Range, Range2>> scale_down(long v) const;
5567  inline typed::multi_aff<Domain, pair<Range, Range2>> set_at(int pos, const typed::aff<Domain, Anonymous> &el) const;
5568  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const;
5569  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const;
5570  inline typed::multi_aff<Domain, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
5571  inline typed::multi_aff<Domain, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
5572  inline typed::space<Domain, pair<Range, Range2>> space() const;
5573  inline typed::space<Domain, pair<Range, Range2>> get_space() const = delete;
5574  inline typed::multi_aff<Domain, pair<Range, Range2>> sub(const typed::multi_aff<Domain, pair<Range, Range2>> &multi2) const;
5575  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> sub(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
5576  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> sub(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
5577  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const;
5578  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
5579  inline typed::multi_aff<Domain, pair<Range, Range2>> sub(const typed::aff<Domain, pair<Range, Range2>> &multi2) const;
5580  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::set<Domain> &set) const;
5581  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::space<Domain> &space) const;
5582  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::union_set<Domain> &uset) const;
5583  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> to_multi_pw_aff() const;
5584  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> to_multi_union_pw_aff() const;
5585  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> to_pw_multi_aff() const;
5586  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> to_union_pw_multi_aff() const;
5587  inline typed::multi_aff<Domain, pair<Range, Range2>> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
5588  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> union_add(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &mpa2) const;
5589  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> union_add(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &mupa2) const;
5590  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const;
5591  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
5592};
5593
5594template <typename T1, typename T2, typename Range, typename Range2>
5595struct multi_aff<pair<T1, T2>, pair<Range, Range2>> : public isl::multi_aff {
5596  template <typename...>
5597  friend struct aff;
5598  template <typename...>
5599  friend struct aff_list;
5600  template <typename...>
5601  friend struct basic_map;
5602  template <typename...>
5603  friend struct basic_set;
5604  template <typename...>
5605  friend struct fixed_box;
5606  template <typename...>
5607  friend struct id;
5608  template <typename...>
5609  friend struct id_list;
5610  template <typename...>
5611  friend struct map;
5612  template <typename...>
5613  friend struct map_list;
5614  template <typename...>
5615  friend struct multi_aff;
5616  template <typename...>
5617  friend struct multi_id;
5618  template <typename...>
5619  friend struct multi_pw_aff;
5620  template <typename...>
5621  friend struct multi_union_pw_aff;
5622  template <typename...>
5623  friend struct multi_val;
5624  template <typename...>
5625  friend struct point;
5626  template <typename...>
5627  friend struct pw_aff;
5628  template <typename...>
5629  friend struct pw_aff_list;
5630  template <typename...>
5631  friend struct pw_multi_aff;
5632  template <typename...>
5633  friend struct pw_multi_aff_list;
5634  template <typename...>
5635  friend struct set;
5636  template <typename...>
5637  friend struct set_list;
5638  template <typename...>
5639  friend struct space;
5640  template <typename...>
5641  friend struct union_map;
5642  template <typename...>
5643  friend struct union_pw_aff;
5644  template <typename...>
5645  friend struct union_pw_aff_list;
5646  template <typename...>
5647  friend struct union_pw_multi_aff;
5648  template <typename...>
5649  friend struct union_set;
5650  template <typename...>
5651  friend struct union_set_list;
5652  template <typename...>
5653  friend struct val;
5654  template <typename...>
5655  friend struct val_list;
5656
5657  multi_aff() = default;
5658  template <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
5659            typename std::enable_if<
5660              std::is_base_of<T1, Arg1>{} &&
5661              std::is_base_of<T2, Arg2>{} &&
5662              std::is_base_of<Range, Arg3>{} &&
5663              std::is_base_of<Range2, Arg4>{},
5664            bool>::type = true>
5665  multi_aff(const multi_aff<pair<Arg1, Arg2>, pair<Arg3, Arg4>> &obj) : isl::multi_aff(obj) {}
5666 private:
5667  template <typename base,
5668            typename std::enable_if<
5669              std::is_same<base, isl::multi_aff>{}, bool>::type = true>
5670  multi_aff(const base &obj) : isl::multi_aff(obj) {}
5671 public:
5672  static multi_aff from(const isl::multi_aff &obj) {
5673    return multi_aff(obj);
5674  }
5675  inline /* implicit */ multi_aff(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &aff);
5676  inline explicit multi_aff(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space, const typed::aff_list<pair<T1, T2>, Anonymous> &list);
5677  inline explicit multi_aff(const isl::ctx &ctx, const std::string &str);
5678  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5679  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5680  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5681  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
5682  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
5683  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5684  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> add_constant(const typed::multi_val<pair<Range, Range2>> &mv) const;
5685  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> add_constant(const typed::val<pair<Range, Range2>> &v) const;
5686  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> add_constant(long v) const;
5687  template <typename Arg2>
5688  inline typed::union_pw_multi_aff<pair<T1, T2>, Arg2> apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg2> &upma2) const;
5689  inline typed::map<pair<T1, T2>, pair<Range, Range2>> as_map() const;
5690  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> as_multi_aff() const;
5691  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> as_multi_union_pw_aff() const;
5692  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> as_pw_multi_aff() const;
5693  inline typed::set<pair<T1, T2>, pair<Range, Range2>> as_set() const = delete;
5694  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> as_union_map() const;
5695  inline typed::aff<pair<T1, T2>, Anonymous> at(int pos) const;
5696  inline typed::aff<pair<T1, T2>, pair<Range, Range2>> get_at(int pos) const = delete;
5697  inline typed::basic_set<pair<T1, T2>> bind(const typed::multi_id<pair<Range, Range2>> &tuple) const;
5698  inline typed::multi_aff<pair<Range, Range2>> bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const;
5699  inline typed::multi_aff<T2, pair<Range, Range2>> bind_domain_wrapped_domain(const typed::multi_id<T1> &tuple) const;
5700  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> coalesce() const;
5701  inline typed::multi_val<pair<Range, Range2>> constant_multi_val() const;
5702  inline typed::multi_val<pair<T1, T2>, pair<Range, Range2>> get_constant_multi_val() const = delete;
5703  inline typed::set<pair<T1, T2>> domain() const;
5704  inline typed::multi_aff<pair<T2, T1>, pair<Range, Range2>> domain_reverse() const;
5705  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> drop_unused_params() const;
5706  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> extract_pw_multi_aff(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const;
5707  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> floor() const;
5708  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::set<pair<T1, T2>> &context) const;
5709  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::union_set<pair<T1, T2>> &context) const;
5710  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::basic_set<pair<T1, T2>> &context) const;
5711  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::point<pair<T1, T2>> &context) const;
5712  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::set<> &context) const;
5713  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::basic_set<> &context) const;
5714  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::point<> &context) const;
5715  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> identity() const;
5716  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> insert_domain(const typed::space<> &domain) const = delete;
5717  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::set<pair<T1, T2>> &set) const;
5718  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::space<pair<T1, T2>> &space) const;
5719  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const;
5720  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<T1> &uset) const;
5721  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::set<> &set) const;
5722  inline typed::aff_list<pair<T1, T2>, Anonymous> list() const;
5723  inline typed::aff_list<pair<T1, T2>, pair<Range, Range2>> get_list() const = delete;
5724  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> max(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5725  inline typed::multi_val<pair<Range, Range2>> max_multi_val() const;
5726  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> min(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5727  inline typed::multi_val<pair<Range, Range2>> min_multi_val() const;
5728  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> neg() const;
5729  template <typename Domain3>
5730  inline typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, T1> &pma2) const;
5731  template <typename Domain3>
5732  inline typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, T1> &upma2) const;
5733  template <typename Domain2, typename Arg2>
5734  inline typed::multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::multi_aff<Domain2, Arg2> &multi2) const;
5735  template <typename Domain2, typename Arg2>
5736  inline typed::multi_pw_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::multi_pw_aff<Domain2, Arg2> &multi2) const;
5737  template <typename Domain2, typename Arg2>
5738  inline typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::pw_multi_aff<Domain2, Arg2> &pma2) const;
5739  template <typename Domain2>
5740  inline typed::multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Anonymous>> product(const typed::aff<Domain2, Anonymous> &multi2) const;
5741  template <typename Domain2>
5742  inline typed::multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_aff<Domain2, pair<T1, T2>> &ma2) const;
5743  inline typed::multi_aff<pair<Range, Range2>> pullback(const typed::multi_aff<pair<T1, T2>> &ma2) const;
5744  template <typename Domain2>
5745  inline typed::multi_pw_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa2) const;
5746  inline typed::multi_pw_aff<pair<Range, Range2>> pullback(const typed::multi_pw_aff<pair<T1, T2>> &mpa2) const;
5747  template <typename Domain2>
5748  inline typed::pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma2) const;
5749  inline typed::pw_multi_aff<pair<Range, Range2>> pullback(const typed::pw_multi_aff<pair<T1, T2>> &pma2) const;
5750  template <typename Domain2>
5751  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma2) const;
5752  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<pair<T1, T2>> &upma2) const;
5753  template <typename Domain2>
5754  inline typed::multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::aff<Domain2, pair<T1, T2>> &ma2) const;
5755  inline typed::multi_aff<pair<Range, Range2>> pullback(const typed::aff<pair<T1, T2>> &ma2) const;
5756  inline typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>> pw_multi_aff_list() const;
5757  inline typed::pw_multi_aff<pair<T1, T2>, Range> range_factor_domain() const;
5758  inline typed::pw_multi_aff<pair<T1, T2>, Range2> range_factor_range() const;
5759  template <typename Arg2>
5760  inline typed::multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::multi_aff<pair<T1, T2>, Arg2> &multi2) const;
5761  template <typename Arg2>
5762  inline typed::multi_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::multi_pw_aff<pair<T1, T2>, Arg2> &multi2) const;
5763  template <typename Arg2>
5764  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::multi_union_pw_aff<pair<T1, T2>, Arg2> &multi2) const;
5765  template <typename Arg2>
5766  inline typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::pw_multi_aff<pair<T1, T2>, Arg2> &pma2) const;
5767  template <typename Arg2>
5768  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::union_pw_multi_aff<pair<T1, T2>, Arg2> &upma2) const;
5769  inline typed::multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Anonymous>> range_product(const typed::aff<pair<T1, T2>, Anonymous> &multi2) const;
5770  inline typed::id<pair<T1, T2>, pair<Range, Range2>> get_range_tuple_id() const = delete;
5771  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> scale(const typed::multi_val<pair<Range, Range2>> &mv) const;
5772  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> scale(const typed::val<pair<Range, Range2>> &v) const;
5773  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> scale(long v) const;
5774  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> scale_down(const typed::multi_val<pair<Range, Range2>> &mv) const;
5775  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> scale_down(const typed::val<pair<Range, Range2>> &v) const;
5776  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> scale_down(long v) const;
5777  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> set_at(int pos, const typed::aff<pair<T1, T2>, Anonymous> &el) const;
5778  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> set_at(int pos, const typed::pw_aff<pair<T1, T2>, Anonymous> &el) const;
5779  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> set_at(int pos, const typed::union_pw_aff<pair<T1, T2>, Anonymous> &el) const;
5780  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
5781  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
5782  inline typed::space<pair<T1, T2>, pair<Range, Range2>> space() const;
5783  inline typed::space<pair<T1, T2>, pair<Range, Range2>> get_space() const = delete;
5784  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5785  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5786  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5787  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
5788  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
5789  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
5790  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::set<pair<T1, T2>> &set) const;
5791  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::space<pair<T1, T2>> &space) const;
5792  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::union_set<pair<T1, T2>> &uset) const;
5793  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> to_multi_pw_aff() const;
5794  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> to_multi_union_pw_aff() const;
5795  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> to_pw_multi_aff() const;
5796  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> to_union_pw_multi_aff() const;
5797  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
5798  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &mpa2) const;
5799  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &mupa2) const;
5800  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
5801  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
5802};
5803
5804template <typename Domain>
5805struct multi_id<Domain> : public isl::multi_id {
5806  template <typename...>
5807  friend struct aff;
5808  template <typename...>
5809  friend struct aff_list;
5810  template <typename...>
5811  friend struct basic_map;
5812  template <typename...>
5813  friend struct basic_set;
5814  template <typename...>
5815  friend struct fixed_box;
5816  template <typename...>
5817  friend struct id;
5818  template <typename...>
5819  friend struct id_list;
5820  template <typename...>
5821  friend struct map;
5822  template <typename...>
5823  friend struct map_list;
5824  template <typename...>
5825  friend struct multi_aff;
5826  template <typename...>
5827  friend struct multi_id;
5828  template <typename...>
5829  friend struct multi_pw_aff;
5830  template <typename...>
5831  friend struct multi_union_pw_aff;
5832  template <typename...>
5833  friend struct multi_val;
5834  template <typename...>
5835  friend struct point;
5836  template <typename...>
5837  friend struct pw_aff;
5838  template <typename...>
5839  friend struct pw_aff_list;
5840  template <typename...>
5841  friend struct pw_multi_aff;
5842  template <typename...>
5843  friend struct pw_multi_aff_list;
5844  template <typename...>
5845  friend struct set;
5846  template <typename...>
5847  friend struct set_list;
5848  template <typename...>
5849  friend struct space;
5850  template <typename...>
5851  friend struct union_map;
5852  template <typename...>
5853  friend struct union_pw_aff;
5854  template <typename...>
5855  friend struct union_pw_aff_list;
5856  template <typename...>
5857  friend struct union_pw_multi_aff;
5858  template <typename...>
5859  friend struct union_set;
5860  template <typename...>
5861  friend struct union_set_list;
5862  template <typename...>
5863  friend struct val;
5864  template <typename...>
5865  friend struct val_list;
5866
5867  multi_id() = default;
5868  template <typename Arg1,
5869            typename std::enable_if<
5870              std::is_base_of<Domain, Arg1>{},
5871            bool>::type = true>
5872  multi_id(const multi_id<Arg1> &obj) : isl::multi_id(obj) {}
5873 private:
5874  template <typename base,
5875            typename std::enable_if<
5876              std::is_same<base, isl::multi_id>{}, bool>::type = true>
5877  multi_id(const base &obj) : isl::multi_id(obj) {}
5878 public:
5879  static multi_id from(const isl::multi_id &obj) {
5880    return multi_id(obj);
5881  }
5882  inline explicit multi_id(const typed::space<Domain> &space, const typed::id_list<Anonymous> &list);
5883  inline explicit multi_id(const isl::ctx &ctx, const std::string &str);
5884  inline typed::id<Anonymous> at(int pos) const;
5885  inline typed::id<Domain> get_at(int pos) const = delete;
5886  inline typed::id_list<Anonymous> list() const;
5887  inline typed::id_list<Domain> get_list() const = delete;
5888  inline typed::multi_id<Domain> range_product(const typed::multi_id<> &multi2) const = delete;
5889  inline typed::multi_id<Domain> set_at(int pos, const typed::id<Anonymous> &el) const;
5890  inline typed::multi_id<Domain> set_at(int pos, const std::string &el) const;
5891  inline typed::space<Domain> space() const;
5892  inline typed::space<Domain> get_space() const = delete;
5893};
5894
5895template <typename Domain>
5896struct multi_pw_aff<Domain> : public isl::multi_pw_aff {
5897  template <typename...>
5898  friend struct aff;
5899  template <typename...>
5900  friend struct aff_list;
5901  template <typename...>
5902  friend struct basic_map;
5903  template <typename...>
5904  friend struct basic_set;
5905  template <typename...>
5906  friend struct fixed_box;
5907  template <typename...>
5908  friend struct id;
5909  template <typename...>
5910  friend struct id_list;
5911  template <typename...>
5912  friend struct map;
5913  template <typename...>
5914  friend struct map_list;
5915  template <typename...>
5916  friend struct multi_aff;
5917  template <typename...>
5918  friend struct multi_id;
5919  template <typename...>
5920  friend struct multi_pw_aff;
5921  template <typename...>
5922  friend struct multi_union_pw_aff;
5923  template <typename...>
5924  friend struct multi_val;
5925  template <typename...>
5926  friend struct point;
5927  template <typename...>
5928  friend struct pw_aff;
5929  template <typename...>
5930  friend struct pw_aff_list;
5931  template <typename...>
5932  friend struct pw_multi_aff;
5933  template <typename...>
5934  friend struct pw_multi_aff_list;
5935  template <typename...>
5936  friend struct set;
5937  template <typename...>
5938  friend struct set_list;
5939  template <typename...>
5940  friend struct space;
5941  template <typename...>
5942  friend struct union_map;
5943  template <typename...>
5944  friend struct union_pw_aff;
5945  template <typename...>
5946  friend struct union_pw_aff_list;
5947  template <typename...>
5948  friend struct union_pw_multi_aff;
5949  template <typename...>
5950  friend struct union_set;
5951  template <typename...>
5952  friend struct union_set_list;
5953  template <typename...>
5954  friend struct val;
5955  template <typename...>
5956  friend struct val_list;
5957
5958  multi_pw_aff() = default;
5959  template <typename Arg1,
5960            typename std::enable_if<
5961              std::is_base_of<Domain, Arg1>{},
5962            bool>::type = true>
5963  multi_pw_aff(const multi_pw_aff<Arg1> &obj) : isl::multi_pw_aff(obj) {}
5964 private:
5965  template <typename base,
5966            typename std::enable_if<
5967              std::is_same<base, isl::multi_pw_aff>{}, bool>::type = true>
5968  multi_pw_aff(const base &obj) : isl::multi_pw_aff(obj) {}
5969 public:
5970  static multi_pw_aff from(const isl::multi_pw_aff &obj) {
5971    return multi_pw_aff(obj);
5972  }
5973  inline /* implicit */ multi_pw_aff(const typed::aff<Domain> &aff);
5974  inline /* implicit */ multi_pw_aff(const typed::multi_aff<Domain> &ma);
5975  inline /* implicit */ multi_pw_aff(const typed::pw_aff<Domain> &pa);
5976  inline explicit multi_pw_aff(const typed::space<Domain> &space, const typed::pw_aff_list<Anonymous> &list);
5977  inline /* implicit */ multi_pw_aff(const typed::pw_multi_aff<Domain> &pma);
5978  inline explicit multi_pw_aff(const isl::ctx &ctx, const std::string &str);
5979  inline typed::multi_pw_aff<Domain> add(const typed::multi_pw_aff<Domain> &multi2) const;
5980  inline typed::multi_union_pw_aff<Domain> add(const typed::multi_union_pw_aff<Domain> &multi2) const;
5981  inline typed::multi_pw_aff<Domain> add(const typed::aff<Domain> &multi2) const;
5982  inline typed::multi_pw_aff<Domain> add(const typed::multi_aff<Domain> &multi2) const;
5983  inline typed::multi_pw_aff<Domain> add(const typed::pw_aff<Domain> &multi2) const;
5984  inline typed::multi_pw_aff<Domain> add(const typed::pw_multi_aff<Domain> &multi2) const;
5985  inline typed::multi_pw_aff<Domain> add_constant(const typed::multi_val<Domain> &mv) const;
5986  inline typed::multi_pw_aff<Domain> add_constant(const typed::val<Domain> &v) const;
5987  inline typed::multi_pw_aff<Domain> add_constant(long v) const;
5988  inline typed::map<Domain> as_map() const = delete;
5989  inline typed::multi_aff<Domain> as_multi_aff() const;
5990  inline typed::set<Domain> as_set() const;
5991  inline typed::pw_aff<Anonymous> at(int pos) const;
5992  inline typed::pw_aff<Domain> get_at(int pos) const = delete;
5993  inline typed::set<> bind(const typed::multi_id<Domain> &tuple) const;
5994  inline typed::multi_pw_aff<Domain> bind_domain(const typed::multi_id<> &tuple) const = delete;
5995  inline typed::multi_pw_aff<Domain> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
5996  inline typed::multi_pw_aff<Domain> coalesce() const;
5997  inline typed::set<> domain() const;
5998  inline typed::multi_pw_aff<Domain> domain_reverse() const = delete;
5999  inline typed::multi_pw_aff<Domain> gist(const typed::set<> &set) const;
6000  inline typed::multi_union_pw_aff<Domain> gist(const typed::union_set<> &context) const;
6001  inline typed::multi_pw_aff<Domain> gist(const typed::basic_set<> &set) const;
6002  inline typed::multi_pw_aff<Domain> gist(const typed::point<> &set) const;
6003  inline typed::multi_pw_aff<Domain> gist_params(const typed::set<> &set) const;
6004  inline typed::multi_pw_aff<Domain> gist_params(const typed::basic_set<> &set) const;
6005  inline typed::multi_pw_aff<Domain> gist_params(const typed::point<> &set) const;
6006  inline typed::multi_pw_aff<Domain, Domain> identity() const;
6007  template <typename Arg1>
6008  inline typed::multi_pw_aff<Arg1, Domain> insert_domain(const typed::space<Arg1> &domain) const;
6009  inline typed::multi_pw_aff<Domain> intersect_domain(const typed::set<> &domain) const = delete;
6010  inline typed::multi_union_pw_aff<Domain> intersect_domain(const typed::union_set<> &uset) const = delete;
6011  inline typed::multi_pw_aff<Domain> intersect_domain(const typed::basic_set<> &domain) const = delete;
6012  inline typed::multi_pw_aff<Domain> intersect_domain(const typed::point<> &domain) const = delete;
6013  inline typed::multi_pw_aff<Domain> intersect_params(const typed::set<> &set) const;
6014  inline typed::multi_pw_aff<Domain> intersect_params(const typed::basic_set<> &set) const;
6015  inline typed::multi_pw_aff<Domain> intersect_params(const typed::point<> &set) const;
6016  inline typed::pw_aff_list<Anonymous> list() const;
6017  inline typed::pw_aff_list<Domain> get_list() const = delete;
6018  inline typed::multi_pw_aff<Domain> max(const typed::multi_pw_aff<Domain> &multi2) const;
6019  inline typed::multi_pw_aff<Domain> max(const typed::aff<Domain> &multi2) const;
6020  inline typed::multi_pw_aff<Domain> max(const typed::multi_aff<Domain> &multi2) const;
6021  inline typed::multi_pw_aff<Domain> max(const typed::pw_aff<Domain> &multi2) const;
6022  inline typed::multi_pw_aff<Domain> max(const typed::pw_multi_aff<Domain> &multi2) const;
6023  inline typed::multi_val<Domain> max_multi_val() const;
6024  inline typed::multi_pw_aff<Domain> min(const typed::multi_pw_aff<Domain> &multi2) const;
6025  inline typed::multi_pw_aff<Domain> min(const typed::aff<Domain> &multi2) const;
6026  inline typed::multi_pw_aff<Domain> min(const typed::multi_aff<Domain> &multi2) const;
6027  inline typed::multi_pw_aff<Domain> min(const typed::pw_aff<Domain> &multi2) const;
6028  inline typed::multi_pw_aff<Domain> min(const typed::pw_multi_aff<Domain> &multi2) const;
6029  inline typed::multi_val<Domain> min_multi_val() const;
6030  inline typed::multi_pw_aff<Domain> neg() const;
6031  template <typename Range>
6032  inline typed::multi_pw_aff<pair<Domain, Range>> product(const typed::multi_pw_aff<Range> &multi2) const;
6033  inline typed::multi_pw_aff<pair<Domain, Anonymous>> product(const typed::aff<Anonymous> &multi2) const;
6034  template <typename Range>
6035  inline typed::multi_pw_aff<pair<Domain, Range>> product(const typed::multi_aff<Range> &multi2) const;
6036  inline typed::multi_pw_aff<pair<Domain, Anonymous>> product(const typed::pw_aff<Anonymous> &multi2) const;
6037  template <typename Range>
6038  inline typed::multi_pw_aff<pair<Domain, Range>> product(const typed::pw_multi_aff<Range> &multi2) const;
6039  inline typed::multi_pw_aff<Domain> pullback(const typed::multi_aff<> &ma) const = delete;
6040  inline typed::multi_pw_aff<Domain> pullback(const typed::multi_pw_aff<> &mpa2) const = delete;
6041  inline typed::multi_pw_aff<Domain> pullback(const typed::pw_multi_aff<> &pma) const = delete;
6042  inline typed::multi_union_pw_aff<Domain> pullback(const typed::union_pw_multi_aff<> &upma) const = delete;
6043  inline typed::multi_pw_aff<Domain> range_product(const typed::multi_pw_aff<> &multi2) const = delete;
6044  inline typed::multi_union_pw_aff<Domain> range_product(const typed::multi_union_pw_aff<> &multi2) const = delete;
6045  inline typed::multi_pw_aff<Domain> range_product(const typed::aff<> &multi2) const = delete;
6046  inline typed::multi_pw_aff<Domain> range_product(const typed::multi_aff<> &multi2) const = delete;
6047  inline typed::multi_pw_aff<Domain> range_product(const typed::pw_aff<> &multi2) const = delete;
6048  inline typed::multi_pw_aff<Domain> range_product(const typed::pw_multi_aff<> &multi2) const = delete;
6049  inline typed::id<Domain> get_range_tuple_id() const = delete;
6050  inline typed::multi_pw_aff<Domain> scale(const typed::multi_val<Domain> &mv) const;
6051  inline typed::multi_pw_aff<Domain> scale(const typed::val<Domain> &v) const;
6052  inline typed::multi_pw_aff<Domain> scale(long v) const;
6053  inline typed::multi_pw_aff<Domain> scale_down(const typed::multi_val<Domain> &mv) const;
6054  inline typed::multi_pw_aff<Domain> scale_down(const typed::val<Domain> &v) const;
6055  inline typed::multi_pw_aff<Domain> scale_down(long v) const;
6056  inline typed::multi_pw_aff<Domain> set_at(int pos, const typed::pw_aff<Anonymous> &el) const;
6057  inline typed::multi_union_pw_aff<Domain> set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const;
6058  template <typename Domain2>
6059  inline typed::multi_pw_aff<Domain2> set_range_tuple(const typed::id<Anonymous> &id) const;
6060  template <typename Domain2>
6061  inline typed::multi_pw_aff<Domain2> set_range_tuple(const std::string &id) const;
6062  inline typed::space<Domain> space() const;
6063  inline typed::space<Domain> get_space() const = delete;
6064  inline typed::multi_pw_aff<Domain> sub(const typed::multi_pw_aff<Domain> &multi2) const;
6065  inline typed::multi_union_pw_aff<Domain> sub(const typed::multi_union_pw_aff<Domain> &multi2) const;
6066  inline typed::multi_pw_aff<Domain> sub(const typed::aff<Domain> &multi2) const;
6067  inline typed::multi_pw_aff<Domain> sub(const typed::multi_aff<Domain> &multi2) const;
6068  inline typed::multi_pw_aff<Domain> sub(const typed::pw_aff<Domain> &multi2) const;
6069  inline typed::multi_pw_aff<Domain> sub(const typed::pw_multi_aff<Domain> &multi2) const;
6070  template <typename Arg1>
6071  inline typed::multi_pw_aff<Arg1, Domain> unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const;
6072  inline typed::multi_pw_aff<Domain> union_add(const typed::multi_pw_aff<Domain> &mpa2) const;
6073  inline typed::multi_union_pw_aff<Domain> union_add(const typed::multi_union_pw_aff<Domain> &mupa2) const;
6074  inline typed::multi_pw_aff<Domain> union_add(const typed::aff<Domain> &mpa2) const;
6075  inline typed::multi_pw_aff<Domain> union_add(const typed::multi_aff<Domain> &mpa2) const;
6076  inline typed::multi_pw_aff<Domain> union_add(const typed::pw_aff<Domain> &mpa2) const;
6077  inline typed::multi_pw_aff<Domain> union_add(const typed::pw_multi_aff<Domain> &mpa2) const;
6078};
6079
6080template <typename Domain, typename Range>
6081struct multi_pw_aff<Domain, Range> : public isl::multi_pw_aff {
6082  template <typename...>
6083  friend struct aff;
6084  template <typename...>
6085  friend struct aff_list;
6086  template <typename...>
6087  friend struct basic_map;
6088  template <typename...>
6089  friend struct basic_set;
6090  template <typename...>
6091  friend struct fixed_box;
6092  template <typename...>
6093  friend struct id;
6094  template <typename...>
6095  friend struct id_list;
6096  template <typename...>
6097  friend struct map;
6098  template <typename...>
6099  friend struct map_list;
6100  template <typename...>
6101  friend struct multi_aff;
6102  template <typename...>
6103  friend struct multi_id;
6104  template <typename...>
6105  friend struct multi_pw_aff;
6106  template <typename...>
6107  friend struct multi_union_pw_aff;
6108  template <typename...>
6109  friend struct multi_val;
6110  template <typename...>
6111  friend struct point;
6112  template <typename...>
6113  friend struct pw_aff;
6114  template <typename...>
6115  friend struct pw_aff_list;
6116  template <typename...>
6117  friend struct pw_multi_aff;
6118  template <typename...>
6119  friend struct pw_multi_aff_list;
6120  template <typename...>
6121  friend struct set;
6122  template <typename...>
6123  friend struct set_list;
6124  template <typename...>
6125  friend struct space;
6126  template <typename...>
6127  friend struct union_map;
6128  template <typename...>
6129  friend struct union_pw_aff;
6130  template <typename...>
6131  friend struct union_pw_aff_list;
6132  template <typename...>
6133  friend struct union_pw_multi_aff;
6134  template <typename...>
6135  friend struct union_set;
6136  template <typename...>
6137  friend struct union_set_list;
6138  template <typename...>
6139  friend struct val;
6140  template <typename...>
6141  friend struct val_list;
6142
6143  multi_pw_aff() = default;
6144  template <typename Arg1, typename Arg2,
6145            typename std::enable_if<
6146              std::is_base_of<Domain, Arg1>{} &&
6147              std::is_base_of<Range, Arg2>{},
6148            bool>::type = true>
6149  multi_pw_aff(const multi_pw_aff<Arg1, Arg2> &obj) : isl::multi_pw_aff(obj) {}
6150 private:
6151  template <typename base,
6152            typename std::enable_if<
6153              std::is_same<base, isl::multi_pw_aff>{}, bool>::type = true>
6154  multi_pw_aff(const base &obj) : isl::multi_pw_aff(obj) {}
6155 public:
6156  static multi_pw_aff from(const isl::multi_pw_aff &obj) {
6157    return multi_pw_aff(obj);
6158  }
6159  inline /* implicit */ multi_pw_aff(const typed::aff<Domain, Range> &aff);
6160  inline /* implicit */ multi_pw_aff(const typed::multi_aff<Domain, Range> &ma);
6161  inline /* implicit */ multi_pw_aff(const typed::pw_aff<Domain, Range> &pa);
6162  inline explicit multi_pw_aff(const typed::space<Domain, Range> &space, const typed::pw_aff_list<Domain, Anonymous> &list);
6163  inline /* implicit */ multi_pw_aff(const typed::pw_multi_aff<Domain, Range> &pma);
6164  inline explicit multi_pw_aff(const isl::ctx &ctx, const std::string &str);
6165  inline typed::multi_pw_aff<Domain, Range> add(const typed::multi_pw_aff<Domain, Range> &multi2) const;
6166  inline typed::multi_union_pw_aff<Domain, Range> add(const typed::multi_union_pw_aff<Domain, Range> &multi2) const;
6167  inline typed::multi_pw_aff<Domain, Range> add(const typed::aff<Domain, Range> &multi2) const;
6168  inline typed::multi_pw_aff<Domain, Range> add(const typed::multi_aff<Domain, Range> &multi2) const;
6169  inline typed::multi_pw_aff<Domain, Range> add(const typed::pw_aff<Domain, Range> &multi2) const;
6170  inline typed::multi_pw_aff<Domain, Range> add(const typed::pw_multi_aff<Domain, Range> &multi2) const;
6171  inline typed::multi_pw_aff<Domain, Range> add_constant(const typed::multi_val<Range> &mv) const;
6172  inline typed::multi_pw_aff<Domain, Range> add_constant(const typed::val<Range> &v) const;
6173  inline typed::multi_pw_aff<Domain, Range> add_constant(long v) const;
6174  inline typed::map<Domain, Range> as_map() const;
6175  inline typed::multi_aff<Domain, Range> as_multi_aff() const;
6176  inline typed::set<Domain, Range> as_set() const = delete;
6177  inline typed::pw_aff<Domain, Anonymous> at(int pos) const;
6178  inline typed::pw_aff<Domain, Range> get_at(int pos) const = delete;
6179  inline typed::set<Domain> bind(const typed::multi_id<Range> &tuple) const;
6180  inline typed::multi_pw_aff<Range> bind_domain(const typed::multi_id<Domain> &tuple) const;
6181  inline typed::multi_pw_aff<Domain, Range> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
6182  inline typed::multi_pw_aff<Domain, Range> coalesce() const;
6183  inline typed::set<Domain> domain() const;
6184  inline typed::multi_pw_aff<Domain, Range> domain_reverse() const = delete;
6185  inline typed::multi_pw_aff<Domain, Range> gist(const typed::set<Domain> &set) const;
6186  inline typed::multi_union_pw_aff<Domain, Range> gist(const typed::union_set<Domain> &context) const;
6187  inline typed::multi_pw_aff<Domain, Range> gist(const typed::basic_set<Domain> &set) const;
6188  inline typed::multi_pw_aff<Domain, Range> gist(const typed::point<Domain> &set) const;
6189  inline typed::multi_pw_aff<Domain, Range> gist_params(const typed::set<> &set) const;
6190  inline typed::multi_pw_aff<Domain, Range> gist_params(const typed::basic_set<> &set) const;
6191  inline typed::multi_pw_aff<Domain, Range> gist_params(const typed::point<> &set) const;
6192  inline typed::multi_pw_aff<Domain, Range> identity() const;
6193  inline typed::multi_pw_aff<Domain, Range> insert_domain(const typed::space<> &domain) const = delete;
6194  inline typed::multi_pw_aff<Domain, Range> intersect_domain(const typed::set<Domain> &domain) const;
6195  inline typed::multi_union_pw_aff<Domain, Range> intersect_domain(const typed::union_set<Domain> &uset) const;
6196  inline typed::multi_pw_aff<Domain, Range> intersect_domain(const typed::basic_set<Domain> &domain) const;
6197  inline typed::multi_pw_aff<Domain, Range> intersect_domain(const typed::point<Domain> &domain) const;
6198  inline typed::multi_pw_aff<Domain, Range> intersect_params(const typed::set<> &set) const;
6199  inline typed::multi_pw_aff<Domain, Range> intersect_params(const typed::basic_set<> &set) const;
6200  inline typed::multi_pw_aff<Domain, Range> intersect_params(const typed::point<> &set) const;
6201  inline typed::pw_aff_list<Domain, Anonymous> list() const;
6202  inline typed::pw_aff_list<Domain, Range> get_list() const = delete;
6203  inline typed::multi_pw_aff<Domain, Range> max(const typed::multi_pw_aff<Domain, Range> &multi2) const;
6204  inline typed::multi_pw_aff<Domain, Range> max(const typed::aff<Domain, Range> &multi2) const;
6205  inline typed::multi_pw_aff<Domain, Range> max(const typed::multi_aff<Domain, Range> &multi2) const;
6206  inline typed::multi_pw_aff<Domain, Range> max(const typed::pw_aff<Domain, Range> &multi2) const;
6207  inline typed::multi_pw_aff<Domain, Range> max(const typed::pw_multi_aff<Domain, Range> &multi2) const;
6208  inline typed::multi_val<Range> max_multi_val() const;
6209  inline typed::multi_pw_aff<Domain, Range> min(const typed::multi_pw_aff<Domain, Range> &multi2) const;
6210  inline typed::multi_pw_aff<Domain, Range> min(const typed::aff<Domain, Range> &multi2) const;
6211  inline typed::multi_pw_aff<Domain, Range> min(const typed::multi_aff<Domain, Range> &multi2) const;
6212  inline typed::multi_pw_aff<Domain, Range> min(const typed::pw_aff<Domain, Range> &multi2) const;
6213  inline typed::multi_pw_aff<Domain, Range> min(const typed::pw_multi_aff<Domain, Range> &multi2) const;
6214  inline typed::multi_val<Range> min_multi_val() const;
6215  inline typed::multi_pw_aff<Domain, Range> neg() const;
6216  template <typename Domain2, typename Range2>
6217  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const;
6218  template <typename Domain2>
6219  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> product(const typed::aff<Domain2, Anonymous> &multi2) const;
6220  template <typename Domain2, typename Range2>
6221  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::multi_aff<Domain2, Range2> &multi2) const;
6222  template <typename Domain2>
6223  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> product(const typed::pw_aff<Domain2, Anonymous> &multi2) const;
6224  template <typename Domain2, typename Range2>
6225  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::pw_multi_aff<Domain2, Range2> &multi2) const;
6226  template <typename Domain2>
6227  inline typed::multi_pw_aff<Domain2, Range> pullback(const typed::multi_aff<Domain2, Domain> &ma) const;
6228  inline typed::multi_pw_aff<Range> pullback(const typed::multi_aff<Domain> &ma) const;
6229  template <typename Domain2>
6230  inline typed::multi_pw_aff<Domain2, Range> pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const;
6231  inline typed::multi_pw_aff<Range> pullback(const typed::multi_pw_aff<Domain> &mpa2) const;
6232  template <typename Domain2>
6233  inline typed::multi_pw_aff<Domain2, Range> pullback(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
6234  inline typed::multi_pw_aff<Range> pullback(const typed::pw_multi_aff<Domain> &pma) const;
6235  template <typename Domain2>
6236  inline typed::multi_union_pw_aff<Domain2, Range> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
6237  inline typed::multi_union_pw_aff<Range> pullback(const typed::union_pw_multi_aff<Domain> &upma) const;
6238  template <typename Range2>
6239  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const;
6240  template <typename Range2>
6241  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const;
6242  inline typed::multi_pw_aff<Domain, pair<Range, Anonymous>> range_product(const typed::aff<Domain, Anonymous> &multi2) const;
6243  template <typename Range2>
6244  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_aff<Domain, Range2> &multi2) const;
6245  inline typed::multi_pw_aff<Domain, pair<Range, Anonymous>> range_product(const typed::pw_aff<Domain, Anonymous> &multi2) const;
6246  template <typename Range2>
6247  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::pw_multi_aff<Domain, Range2> &multi2) const;
6248  inline typed::id<Domain, Range> get_range_tuple_id() const = delete;
6249  inline typed::multi_pw_aff<Domain, Range> scale(const typed::multi_val<Range> &mv) const;
6250  inline typed::multi_pw_aff<Domain, Range> scale(const typed::val<Range> &v) const;
6251  inline typed::multi_pw_aff<Domain, Range> scale(long v) const;
6252  inline typed::multi_pw_aff<Domain, Range> scale_down(const typed::multi_val<Range> &mv) const;
6253  inline typed::multi_pw_aff<Domain, Range> scale_down(const typed::val<Range> &v) const;
6254  inline typed::multi_pw_aff<Domain, Range> scale_down(long v) const;
6255  inline typed::multi_pw_aff<Domain, Range> set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const;
6256  inline typed::multi_union_pw_aff<Domain, Range> set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const;
6257  template <typename Range2>
6258  inline typed::multi_pw_aff<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
6259  template <typename Range2>
6260  inline typed::multi_pw_aff<Domain, Range2> set_range_tuple(const std::string &id) const;
6261  inline typed::space<Domain, Range> space() const;
6262  inline typed::space<Domain, Range> get_space() const = delete;
6263  inline typed::multi_pw_aff<Domain, Range> sub(const typed::multi_pw_aff<Domain, Range> &multi2) const;
6264  inline typed::multi_union_pw_aff<Domain, Range> sub(const typed::multi_union_pw_aff<Domain, Range> &multi2) const;
6265  inline typed::multi_pw_aff<Domain, Range> sub(const typed::aff<Domain, Range> &multi2) const;
6266  inline typed::multi_pw_aff<Domain, Range> sub(const typed::multi_aff<Domain, Range> &multi2) const;
6267  inline typed::multi_pw_aff<Domain, Range> sub(const typed::pw_aff<Domain, Range> &multi2) const;
6268  inline typed::multi_pw_aff<Domain, Range> sub(const typed::pw_multi_aff<Domain, Range> &multi2) const;
6269  inline typed::multi_pw_aff<Domain, Range> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
6270  inline typed::multi_pw_aff<Domain, Range> union_add(const typed::multi_pw_aff<Domain, Range> &mpa2) const;
6271  inline typed::multi_union_pw_aff<Domain, Range> union_add(const typed::multi_union_pw_aff<Domain, Range> &mupa2) const;
6272  inline typed::multi_pw_aff<Domain, Range> union_add(const typed::aff<Domain, Range> &mpa2) const;
6273  inline typed::multi_pw_aff<Domain, Range> union_add(const typed::multi_aff<Domain, Range> &mpa2) const;
6274  inline typed::multi_pw_aff<Domain, Range> union_add(const typed::pw_aff<Domain, Range> &mpa2) const;
6275  inline typed::multi_pw_aff<Domain, Range> union_add(const typed::pw_multi_aff<Domain, Range> &mpa2) const;
6276};
6277
6278template <typename Domain2, typename Range2, typename Range>
6279struct multi_pw_aff<pair<Domain2, Range2>, Range> : public isl::multi_pw_aff {
6280  template <typename...>
6281  friend struct aff;
6282  template <typename...>
6283  friend struct aff_list;
6284  template <typename...>
6285  friend struct basic_map;
6286  template <typename...>
6287  friend struct basic_set;
6288  template <typename...>
6289  friend struct fixed_box;
6290  template <typename...>
6291  friend struct id;
6292  template <typename...>
6293  friend struct id_list;
6294  template <typename...>
6295  friend struct map;
6296  template <typename...>
6297  friend struct map_list;
6298  template <typename...>
6299  friend struct multi_aff;
6300  template <typename...>
6301  friend struct multi_id;
6302  template <typename...>
6303  friend struct multi_pw_aff;
6304  template <typename...>
6305  friend struct multi_union_pw_aff;
6306  template <typename...>
6307  friend struct multi_val;
6308  template <typename...>
6309  friend struct point;
6310  template <typename...>
6311  friend struct pw_aff;
6312  template <typename...>
6313  friend struct pw_aff_list;
6314  template <typename...>
6315  friend struct pw_multi_aff;
6316  template <typename...>
6317  friend struct pw_multi_aff_list;
6318  template <typename...>
6319  friend struct set;
6320  template <typename...>
6321  friend struct set_list;
6322  template <typename...>
6323  friend struct space;
6324  template <typename...>
6325  friend struct union_map;
6326  template <typename...>
6327  friend struct union_pw_aff;
6328  template <typename...>
6329  friend struct union_pw_aff_list;
6330  template <typename...>
6331  friend struct union_pw_multi_aff;
6332  template <typename...>
6333  friend struct union_set;
6334  template <typename...>
6335  friend struct union_set_list;
6336  template <typename...>
6337  friend struct val;
6338  template <typename...>
6339  friend struct val_list;
6340
6341  multi_pw_aff() = default;
6342  template <typename Arg1, typename Arg2, typename Arg3,
6343            typename std::enable_if<
6344              std::is_base_of<Domain2, Arg1>{} &&
6345              std::is_base_of<Range2, Arg2>{} &&
6346              std::is_base_of<Range, Arg3>{},
6347            bool>::type = true>
6348  multi_pw_aff(const multi_pw_aff<pair<Arg1, Arg2>, Arg3> &obj) : isl::multi_pw_aff(obj) {}
6349 private:
6350  template <typename base,
6351            typename std::enable_if<
6352              std::is_same<base, isl::multi_pw_aff>{}, bool>::type = true>
6353  multi_pw_aff(const base &obj) : isl::multi_pw_aff(obj) {}
6354 public:
6355  static multi_pw_aff from(const isl::multi_pw_aff &obj) {
6356    return multi_pw_aff(obj);
6357  }
6358  inline /* implicit */ multi_pw_aff(const typed::aff<pair<Domain2, Range2>, Range> &aff);
6359  inline /* implicit */ multi_pw_aff(const typed::multi_aff<pair<Domain2, Range2>, Range> &ma);
6360  inline /* implicit */ multi_pw_aff(const typed::pw_aff<pair<Domain2, Range2>, Range> &pa);
6361  inline explicit multi_pw_aff(const typed::space<pair<Domain2, Range2>, Range> &space, const typed::pw_aff_list<pair<Domain2, Range2>, Anonymous> &list);
6362  inline /* implicit */ multi_pw_aff(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma);
6363  inline explicit multi_pw_aff(const isl::ctx &ctx, const std::string &str);
6364  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6365  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6366  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const;
6367  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
6368  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add(const typed::pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6369  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
6370  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add_constant(const typed::multi_val<Range> &mv) const;
6371  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add_constant(const typed::val<Range> &v) const;
6372  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add_constant(long v) const;
6373  inline typed::map<pair<Domain2, Range2>, Range> as_map() const;
6374  inline typed::multi_aff<pair<Domain2, Range2>, Range> as_multi_aff() const;
6375  inline typed::set<pair<Domain2, Range2>, Range> as_set() const = delete;
6376  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> at(int pos) const;
6377  inline typed::pw_aff<pair<Domain2, Range2>, Range> get_at(int pos) const = delete;
6378  inline typed::set<pair<Domain2, Range2>> bind(const typed::multi_id<Range> &tuple) const;
6379  inline typed::multi_pw_aff<Range> bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const;
6380  inline typed::multi_pw_aff<Range2, Range> bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const;
6381  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> coalesce() const;
6382  inline typed::set<pair<Domain2, Range2>> domain() const;
6383  inline typed::multi_pw_aff<pair<Range2, Domain2>, Range> domain_reverse() const;
6384  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> gist(const typed::set<pair<Domain2, Range2>> &set) const;
6385  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> gist(const typed::union_set<pair<Domain2, Range2>> &context) const;
6386  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> gist(const typed::basic_set<pair<Domain2, Range2>> &set) const;
6387  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> gist(const typed::point<pair<Domain2, Range2>> &set) const;
6388  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> gist_params(const typed::set<> &set) const;
6389  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> gist_params(const typed::basic_set<> &set) const;
6390  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> gist_params(const typed::point<> &set) const;
6391  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> identity() const;
6392  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> insert_domain(const typed::space<> &domain) const = delete;
6393  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::set<pair<Domain2, Range2>> &domain) const;
6394  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const;
6395  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::basic_set<pair<Domain2, Range2>> &domain) const;
6396  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::point<pair<Domain2, Range2>> &domain) const;
6397  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> intersect_params(const typed::set<> &set) const;
6398  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> intersect_params(const typed::basic_set<> &set) const;
6399  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> intersect_params(const typed::point<> &set) const;
6400  inline typed::pw_aff_list<pair<Domain2, Range2>, Anonymous> list() const;
6401  inline typed::pw_aff_list<pair<Domain2, Range2>, Range> get_list() const = delete;
6402  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> max(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6403  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> max(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const;
6404  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> max(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
6405  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> max(const typed::pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6406  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> max(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
6407  inline typed::multi_val<Range> max_multi_val() const;
6408  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> min(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6409  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> min(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const;
6410  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> min(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
6411  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> min(const typed::pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6412  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> min(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
6413  inline typed::multi_val<Range> min_multi_val() const;
6414  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> neg() const;
6415  template <typename Arg2, typename Arg3>
6416  inline typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> product(const typed::multi_pw_aff<Arg2, Arg3> &multi2) const;
6417  template <typename Arg2>
6418  inline typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>> product(const typed::aff<Arg2, Anonymous> &multi2) const;
6419  template <typename Arg2, typename Arg3>
6420  inline typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> product(const typed::multi_aff<Arg2, Arg3> &multi2) const;
6421  template <typename Arg2>
6422  inline typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>> product(const typed::pw_aff<Arg2, Anonymous> &multi2) const;
6423  template <typename Arg2, typename Arg3>
6424  inline typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> product(const typed::pw_multi_aff<Arg2, Arg3> &multi2) const;
6425  template <typename Arg2>
6426  inline typed::multi_pw_aff<Arg2, Range> pullback(const typed::multi_aff<Arg2, pair<Domain2, Range2>> &ma) const;
6427  inline typed::multi_pw_aff<Range> pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma) const;
6428  template <typename Arg2>
6429  inline typed::multi_pw_aff<Arg2, Range> pullback(const typed::multi_pw_aff<Arg2, pair<Domain2, Range2>> &mpa2) const;
6430  inline typed::multi_pw_aff<Range> pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa2) const;
6431  template <typename Arg2>
6432  inline typed::multi_pw_aff<Arg2, Range> pullback(const typed::pw_multi_aff<Arg2, pair<Domain2, Range2>> &pma) const;
6433  inline typed::multi_pw_aff<Range> pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma) const;
6434  template <typename Arg2>
6435  inline typed::multi_union_pw_aff<Arg2, Range> pullback(const typed::union_pw_multi_aff<Arg2, pair<Domain2, Range2>> &upma) const;
6436  inline typed::multi_union_pw_aff<Range> pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma) const;
6437  template <typename Arg2>
6438  inline typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const;
6439  template <typename Arg2>
6440  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const;
6441  inline typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Anonymous>> range_product(const typed::aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
6442  template <typename Arg2>
6443  inline typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::multi_aff<pair<Domain2, Range2>, Arg2> &multi2) const;
6444  inline typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Anonymous>> range_product(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
6445  template <typename Arg2>
6446  inline typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg2> &multi2) const;
6447  inline typed::id<pair<Domain2, Range2>, Range> get_range_tuple_id() const = delete;
6448  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> scale(const typed::multi_val<Range> &mv) const;
6449  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> scale(const typed::val<Range> &v) const;
6450  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> scale(long v) const;
6451  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> scale_down(const typed::multi_val<Range> &mv) const;
6452  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> scale_down(const typed::val<Range> &v) const;
6453  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> scale_down(long v) const;
6454  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
6455  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
6456  template <typename Arg1>
6457  inline typed::multi_pw_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const typed::id<Anonymous> &id) const;
6458  template <typename Arg1>
6459  inline typed::multi_pw_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const std::string &id) const;
6460  inline typed::space<pair<Domain2, Range2>, Range> space() const;
6461  inline typed::space<pair<Domain2, Range2>, Range> get_space() const = delete;
6462  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6463  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6464  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const;
6465  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
6466  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
6467  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &multi2) const;
6468  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
6469  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &mpa2) const;
6470  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &mupa2) const;
6471  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::aff<pair<Domain2, Range2>, Range> &mpa2) const;
6472  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::multi_aff<pair<Domain2, Range2>, Range> &mpa2) const;
6473  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::pw_aff<pair<Domain2, Range2>, Range> &mpa2) const;
6474  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &mpa2) const;
6475};
6476
6477template <typename Domain>
6478struct multi_union_pw_aff<Domain> : public isl::multi_union_pw_aff {
6479  template <typename...>
6480  friend struct aff;
6481  template <typename...>
6482  friend struct aff_list;
6483  template <typename...>
6484  friend struct basic_map;
6485  template <typename...>
6486  friend struct basic_set;
6487  template <typename...>
6488  friend struct fixed_box;
6489  template <typename...>
6490  friend struct id;
6491  template <typename...>
6492  friend struct id_list;
6493  template <typename...>
6494  friend struct map;
6495  template <typename...>
6496  friend struct map_list;
6497  template <typename...>
6498  friend struct multi_aff;
6499  template <typename...>
6500  friend struct multi_id;
6501  template <typename...>
6502  friend struct multi_pw_aff;
6503  template <typename...>
6504  friend struct multi_union_pw_aff;
6505  template <typename...>
6506  friend struct multi_val;
6507  template <typename...>
6508  friend struct point;
6509  template <typename...>
6510  friend struct pw_aff;
6511  template <typename...>
6512  friend struct pw_aff_list;
6513  template <typename...>
6514  friend struct pw_multi_aff;
6515  template <typename...>
6516  friend struct pw_multi_aff_list;
6517  template <typename...>
6518  friend struct set;
6519  template <typename...>
6520  friend struct set_list;
6521  template <typename...>
6522  friend struct space;
6523  template <typename...>
6524  friend struct union_map;
6525  template <typename...>
6526  friend struct union_pw_aff;
6527  template <typename...>
6528  friend struct union_pw_aff_list;
6529  template <typename...>
6530  friend struct union_pw_multi_aff;
6531  template <typename...>
6532  friend struct union_set;
6533  template <typename...>
6534  friend struct union_set_list;
6535  template <typename...>
6536  friend struct val;
6537  template <typename...>
6538  friend struct val_list;
6539
6540  multi_union_pw_aff() = default;
6541  template <typename Arg1,
6542            typename std::enable_if<
6543              std::is_base_of<Domain, Arg1>{},
6544            bool>::type = true>
6545  multi_union_pw_aff(const multi_union_pw_aff<Arg1> &obj) : isl::multi_union_pw_aff(obj) {}
6546 private:
6547  template <typename base,
6548            typename std::enable_if<
6549              std::is_same<base, isl::multi_union_pw_aff>{}, bool>::type = true>
6550  multi_union_pw_aff(const base &obj) : isl::multi_union_pw_aff(obj) {}
6551 public:
6552  static multi_union_pw_aff from(const isl::multi_union_pw_aff &obj) {
6553    return multi_union_pw_aff(obj);
6554  }
6555  inline /* implicit */ multi_union_pw_aff(const typed::multi_pw_aff<Domain> &mpa);
6556  inline /* implicit */ multi_union_pw_aff(const typed::union_pw_aff<Domain> &upa);
6557  inline explicit multi_union_pw_aff(const typed::space<Domain> &space, const typed::union_pw_aff_list<Anonymous> &list);
6558  inline explicit multi_union_pw_aff(const isl::ctx &ctx, const std::string &str);
6559  inline typed::multi_union_pw_aff<Domain> add(const typed::multi_union_pw_aff<Domain> &multi2) const;
6560  inline typed::multi_union_pw_aff<Domain> add(const typed::multi_pw_aff<Domain> &multi2) const;
6561  inline typed::multi_union_pw_aff<Domain> add(const typed::union_pw_aff<Domain> &multi2) const;
6562  inline typed::union_pw_aff<Anonymous> at(int pos) const;
6563  inline typed::union_pw_aff<Domain> get_at(int pos) const = delete;
6564  inline typed::union_set<> bind(const typed::multi_id<Domain> &tuple) const;
6565  inline typed::multi_union_pw_aff<Domain> coalesce() const;
6566  inline typed::union_set<> domain() const;
6567  inline typed::multi_union_pw_aff<Domain> gist(const typed::union_set<> &context) const;
6568  inline typed::multi_union_pw_aff<Domain> gist(const typed::basic_set<> &context) const;
6569  inline typed::multi_union_pw_aff<Domain> gist(const typed::point<> &context) const;
6570  inline typed::multi_union_pw_aff<Domain> gist(const typed::set<> &context) const;
6571  inline typed::multi_union_pw_aff<Domain> gist_params(const typed::set<> &context) const;
6572  inline typed::multi_union_pw_aff<Domain> gist_params(const typed::basic_set<> &context) const;
6573  inline typed::multi_union_pw_aff<Domain> gist_params(const typed::point<> &context) const;
6574  inline typed::multi_union_pw_aff<Domain> intersect_domain(const typed::union_set<> &uset) const = delete;
6575  inline typed::multi_union_pw_aff<Domain> intersect_domain(const typed::basic_set<> &uset) const = delete;
6576  inline typed::multi_union_pw_aff<Domain> intersect_domain(const typed::point<> &uset) const = delete;
6577  inline typed::multi_union_pw_aff<Domain> intersect_domain(const typed::set<> &uset) const = delete;
6578  inline typed::multi_union_pw_aff<Domain> intersect_params(const typed::set<> &params) const;
6579  inline typed::multi_union_pw_aff<Domain> intersect_params(const typed::basic_set<> &params) const;
6580  inline typed::multi_union_pw_aff<Domain> intersect_params(const typed::point<> &params) const;
6581  inline typed::union_pw_aff_list<Anonymous> list() const;
6582  inline typed::union_pw_aff_list<Domain> get_list() const = delete;
6583  inline typed::multi_union_pw_aff<Domain> neg() const;
6584  inline typed::multi_union_pw_aff<Domain> pullback(const typed::union_pw_multi_aff<> &upma) const = delete;
6585  inline typed::multi_union_pw_aff<Domain> pullback(const typed::multi_aff<> &upma) const = delete;
6586  inline typed::multi_union_pw_aff<Domain> pullback(const typed::pw_multi_aff<> &upma) const = delete;
6587  inline typed::multi_union_pw_aff<Domain> pullback(const typed::union_pw_aff<> &upma) const = delete;
6588  inline typed::multi_union_pw_aff<Domain> range_product(const typed::multi_union_pw_aff<> &multi2) const = delete;
6589  inline typed::multi_union_pw_aff<Domain> range_product(const typed::multi_pw_aff<> &multi2) const = delete;
6590  inline typed::multi_union_pw_aff<Domain> range_product(const typed::union_pw_aff<> &multi2) const = delete;
6591  inline typed::id<Domain> get_range_tuple_id() const = delete;
6592  inline typed::multi_union_pw_aff<Domain> scale(const typed::multi_val<Domain> &mv) const;
6593  inline typed::multi_union_pw_aff<Domain> scale(const typed::val<Domain> &v) const;
6594  inline typed::multi_union_pw_aff<Domain> scale(long v) const;
6595  inline typed::multi_union_pw_aff<Domain> scale_down(const typed::multi_val<Domain> &mv) const;
6596  inline typed::multi_union_pw_aff<Domain> scale_down(const typed::val<Domain> &v) const;
6597  inline typed::multi_union_pw_aff<Domain> scale_down(long v) const;
6598  inline typed::multi_union_pw_aff<Domain> set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const;
6599  template <typename Domain2>
6600  inline typed::multi_union_pw_aff<Domain2> set_range_tuple(const typed::id<Anonymous> &id) const;
6601  template <typename Domain2>
6602  inline typed::multi_union_pw_aff<Domain2> set_range_tuple(const std::string &id) const;
6603  inline typed::space<Domain> space() const;
6604  inline typed::space<Domain> get_space() const = delete;
6605  inline typed::multi_union_pw_aff<Domain> sub(const typed::multi_union_pw_aff<Domain> &multi2) const;
6606  inline typed::multi_union_pw_aff<Domain> sub(const typed::multi_pw_aff<Domain> &multi2) const;
6607  inline typed::multi_union_pw_aff<Domain> sub(const typed::union_pw_aff<Domain> &multi2) const;
6608  inline typed::multi_union_pw_aff<Domain> union_add(const typed::multi_union_pw_aff<Domain> &mupa2) const;
6609  inline typed::multi_union_pw_aff<Domain> union_add(const typed::multi_pw_aff<Domain> &mupa2) const;
6610  inline typed::multi_union_pw_aff<Domain> union_add(const typed::union_pw_aff<Domain> &mupa2) const;
6611};
6612
6613template <typename Domain, typename Range>
6614struct multi_union_pw_aff<Domain, Range> : public isl::multi_union_pw_aff {
6615  template <typename...>
6616  friend struct aff;
6617  template <typename...>
6618  friend struct aff_list;
6619  template <typename...>
6620  friend struct basic_map;
6621  template <typename...>
6622  friend struct basic_set;
6623  template <typename...>
6624  friend struct fixed_box;
6625  template <typename...>
6626  friend struct id;
6627  template <typename...>
6628  friend struct id_list;
6629  template <typename...>
6630  friend struct map;
6631  template <typename...>
6632  friend struct map_list;
6633  template <typename...>
6634  friend struct multi_aff;
6635  template <typename...>
6636  friend struct multi_id;
6637  template <typename...>
6638  friend struct multi_pw_aff;
6639  template <typename...>
6640  friend struct multi_union_pw_aff;
6641  template <typename...>
6642  friend struct multi_val;
6643  template <typename...>
6644  friend struct point;
6645  template <typename...>
6646  friend struct pw_aff;
6647  template <typename...>
6648  friend struct pw_aff_list;
6649  template <typename...>
6650  friend struct pw_multi_aff;
6651  template <typename...>
6652  friend struct pw_multi_aff_list;
6653  template <typename...>
6654  friend struct set;
6655  template <typename...>
6656  friend struct set_list;
6657  template <typename...>
6658  friend struct space;
6659  template <typename...>
6660  friend struct union_map;
6661  template <typename...>
6662  friend struct union_pw_aff;
6663  template <typename...>
6664  friend struct union_pw_aff_list;
6665  template <typename...>
6666  friend struct union_pw_multi_aff;
6667  template <typename...>
6668  friend struct union_set;
6669  template <typename...>
6670  friend struct union_set_list;
6671  template <typename...>
6672  friend struct val;
6673  template <typename...>
6674  friend struct val_list;
6675
6676  multi_union_pw_aff() = default;
6677  template <typename Arg1, typename Arg2,
6678            typename std::enable_if<
6679              std::is_base_of<Domain, Arg1>{} &&
6680              std::is_base_of<Range, Arg2>{},
6681            bool>::type = true>
6682  multi_union_pw_aff(const multi_union_pw_aff<Arg1, Arg2> &obj) : isl::multi_union_pw_aff(obj) {}
6683 private:
6684  template <typename base,
6685            typename std::enable_if<
6686              std::is_same<base, isl::multi_union_pw_aff>{}, bool>::type = true>
6687  multi_union_pw_aff(const base &obj) : isl::multi_union_pw_aff(obj) {}
6688 public:
6689  static multi_union_pw_aff from(const isl::multi_union_pw_aff &obj) {
6690    return multi_union_pw_aff(obj);
6691  }
6692  inline /* implicit */ multi_union_pw_aff(const typed::multi_pw_aff<Domain, Range> &mpa);
6693  inline /* implicit */ multi_union_pw_aff(const typed::union_pw_aff<Domain, Range> &upa);
6694  inline explicit multi_union_pw_aff(const typed::space<Domain, Range> &space, const typed::union_pw_aff_list<Domain, Anonymous> &list);
6695  inline explicit multi_union_pw_aff(const isl::ctx &ctx, const std::string &str);
6696  inline typed::multi_union_pw_aff<Domain, Range> add(const typed::multi_union_pw_aff<Domain, Range> &multi2) const;
6697  inline typed::multi_union_pw_aff<Domain, Range> add(const typed::multi_pw_aff<Domain, Range> &multi2) const;
6698  inline typed::multi_union_pw_aff<Domain, Range> add(const typed::union_pw_aff<Domain, Range> &multi2) const;
6699  inline typed::union_pw_aff<Domain, Anonymous> at(int pos) const;
6700  inline typed::union_pw_aff<Domain, Range> get_at(int pos) const = delete;
6701  inline typed::union_set<Domain> bind(const typed::multi_id<Range> &tuple) const;
6702  inline typed::multi_union_pw_aff<Domain, Range> coalesce() const;
6703  inline typed::union_set<Domain> domain() const;
6704  inline typed::multi_union_pw_aff<Domain, Range> gist(const typed::union_set<Domain> &context) const;
6705  inline typed::multi_union_pw_aff<Domain, Range> gist(const typed::basic_set<Domain> &context) const;
6706  inline typed::multi_union_pw_aff<Domain, Range> gist(const typed::point<Domain> &context) const;
6707  inline typed::multi_union_pw_aff<Domain, Range> gist(const typed::set<Domain> &context) const;
6708  inline typed::multi_union_pw_aff<Domain, Range> gist_params(const typed::set<> &context) const;
6709  inline typed::multi_union_pw_aff<Domain, Range> gist_params(const typed::basic_set<> &context) const;
6710  inline typed::multi_union_pw_aff<Domain, Range> gist_params(const typed::point<> &context) const;
6711  inline typed::multi_union_pw_aff<Domain, Range> intersect_domain(const typed::union_set<Domain> &uset) const;
6712  inline typed::multi_union_pw_aff<Domain, Range> intersect_domain(const typed::basic_set<Domain> &uset) const;
6713  inline typed::multi_union_pw_aff<Domain, Range> intersect_domain(const typed::point<Domain> &uset) const;
6714  inline typed::multi_union_pw_aff<Domain, Range> intersect_domain(const typed::set<Domain> &uset) const;
6715  inline typed::multi_union_pw_aff<Domain, Range> intersect_params(const typed::set<> &params) const;
6716  inline typed::multi_union_pw_aff<Domain, Range> intersect_params(const typed::basic_set<> &params) const;
6717  inline typed::multi_union_pw_aff<Domain, Range> intersect_params(const typed::point<> &params) const;
6718  inline typed::union_pw_aff_list<Domain, Anonymous> list() const;
6719  inline typed::union_pw_aff_list<Domain, Range> get_list() const = delete;
6720  inline typed::multi_union_pw_aff<Domain, Range> neg() const;
6721  template <typename Domain2>
6722  inline typed::multi_union_pw_aff<Domain2, Range> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
6723  inline typed::multi_union_pw_aff<Range> pullback(const typed::union_pw_multi_aff<Domain> &upma) const;
6724  template <typename Domain2>
6725  inline typed::multi_union_pw_aff<Domain2, Range> pullback(const typed::multi_aff<Domain2, Domain> &upma) const;
6726  inline typed::multi_union_pw_aff<Range> pullback(const typed::multi_aff<Domain> &upma) const;
6727  template <typename Domain2>
6728  inline typed::multi_union_pw_aff<Domain2, Range> pullback(const typed::pw_multi_aff<Domain2, Domain> &upma) const;
6729  inline typed::multi_union_pw_aff<Range> pullback(const typed::pw_multi_aff<Domain> &upma) const;
6730  template <typename Domain2>
6731  inline typed::multi_union_pw_aff<Domain2, Range> pullback(const typed::union_pw_aff<Domain2, Domain> &upma) const;
6732  inline typed::multi_union_pw_aff<Range> pullback(const typed::union_pw_aff<Domain> &upma) const;
6733  template <typename Range2>
6734  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const;
6735  template <typename Range2>
6736  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const;
6737  inline typed::multi_union_pw_aff<Domain, pair<Range, Anonymous>> range_product(const typed::union_pw_aff<Domain, Anonymous> &multi2) const;
6738  inline typed::id<Domain, Range> get_range_tuple_id() const = delete;
6739  inline typed::multi_union_pw_aff<Domain, Range> scale(const typed::multi_val<Range> &mv) const;
6740  inline typed::multi_union_pw_aff<Domain, Range> scale(const typed::val<Range> &v) const;
6741  inline typed::multi_union_pw_aff<Domain, Range> scale(long v) const;
6742  inline typed::multi_union_pw_aff<Domain, Range> scale_down(const typed::multi_val<Range> &mv) const;
6743  inline typed::multi_union_pw_aff<Domain, Range> scale_down(const typed::val<Range> &v) const;
6744  inline typed::multi_union_pw_aff<Domain, Range> scale_down(long v) const;
6745  inline typed::multi_union_pw_aff<Domain, Range> set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const;
6746  template <typename Range2>
6747  inline typed::multi_union_pw_aff<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
6748  template <typename Range2>
6749  inline typed::multi_union_pw_aff<Domain, Range2> set_range_tuple(const std::string &id) const;
6750  inline typed::space<Range> space() const;
6751  inline typed::space<Domain, Range> get_space() const = delete;
6752  inline typed::multi_union_pw_aff<Domain, Range> sub(const typed::multi_union_pw_aff<Domain, Range> &multi2) const;
6753  inline typed::multi_union_pw_aff<Domain, Range> sub(const typed::multi_pw_aff<Domain, Range> &multi2) const;
6754  inline typed::multi_union_pw_aff<Domain, Range> sub(const typed::union_pw_aff<Domain, Range> &multi2) const;
6755  inline typed::multi_union_pw_aff<Domain, Range> union_add(const typed::multi_union_pw_aff<Domain, Range> &mupa2) const;
6756  inline typed::multi_union_pw_aff<Domain, Range> union_add(const typed::multi_pw_aff<Domain, Range> &mupa2) const;
6757  inline typed::multi_union_pw_aff<Domain, Range> union_add(const typed::union_pw_aff<Domain, Range> &mupa2) const;
6758};
6759
6760template <typename Domain>
6761struct multi_val<Domain> : public isl::multi_val {
6762  template <typename...>
6763  friend struct aff;
6764  template <typename...>
6765  friend struct aff_list;
6766  template <typename...>
6767  friend struct basic_map;
6768  template <typename...>
6769  friend struct basic_set;
6770  template <typename...>
6771  friend struct fixed_box;
6772  template <typename...>
6773  friend struct id;
6774  template <typename...>
6775  friend struct id_list;
6776  template <typename...>
6777  friend struct map;
6778  template <typename...>
6779  friend struct map_list;
6780  template <typename...>
6781  friend struct multi_aff;
6782  template <typename...>
6783  friend struct multi_id;
6784  template <typename...>
6785  friend struct multi_pw_aff;
6786  template <typename...>
6787  friend struct multi_union_pw_aff;
6788  template <typename...>
6789  friend struct multi_val;
6790  template <typename...>
6791  friend struct point;
6792  template <typename...>
6793  friend struct pw_aff;
6794  template <typename...>
6795  friend struct pw_aff_list;
6796  template <typename...>
6797  friend struct pw_multi_aff;
6798  template <typename...>
6799  friend struct pw_multi_aff_list;
6800  template <typename...>
6801  friend struct set;
6802  template <typename...>
6803  friend struct set_list;
6804  template <typename...>
6805  friend struct space;
6806  template <typename...>
6807  friend struct union_map;
6808  template <typename...>
6809  friend struct union_pw_aff;
6810  template <typename...>
6811  friend struct union_pw_aff_list;
6812  template <typename...>
6813  friend struct union_pw_multi_aff;
6814  template <typename...>
6815  friend struct union_set;
6816  template <typename...>
6817  friend struct union_set_list;
6818  template <typename...>
6819  friend struct val;
6820  template <typename...>
6821  friend struct val_list;
6822
6823  multi_val() = default;
6824  template <typename Arg1,
6825            typename std::enable_if<
6826              std::is_base_of<Domain, Arg1>{},
6827            bool>::type = true>
6828  multi_val(const multi_val<Arg1> &obj) : isl::multi_val(obj) {}
6829 private:
6830  template <typename base,
6831            typename std::enable_if<
6832              std::is_same<base, isl::multi_val>{}, bool>::type = true>
6833  multi_val(const base &obj) : isl::multi_val(obj) {}
6834 public:
6835  static multi_val from(const isl::multi_val &obj) {
6836    return multi_val(obj);
6837  }
6838  inline explicit multi_val(const typed::space<Domain> &space, const typed::val_list<Anonymous> &list);
6839  inline explicit multi_val(const isl::ctx &ctx, const std::string &str);
6840  inline typed::multi_val<Domain> add(const typed::multi_val<Domain> &multi2) const;
6841  inline typed::multi_val<Domain> add(const typed::val<Domain> &v) const;
6842  inline typed::multi_val<Domain> add(long v) const;
6843  inline typed::val<Anonymous> at(int pos) const;
6844  inline typed::val<Domain> get_at(int pos) const = delete;
6845  inline typed::val_list<Anonymous> list() const;
6846  inline typed::val_list<Domain> get_list() const = delete;
6847  inline typed::multi_val<Domain> max(const typed::multi_val<Domain> &multi2) const;
6848  inline typed::multi_val<Domain> min(const typed::multi_val<Domain> &multi2) const;
6849  inline typed::multi_val<Domain> neg() const;
6850  template <typename Range>
6851  inline typed::multi_val<pair<Domain, Range>> product(const typed::multi_val<Range> &multi2) const;
6852  inline typed::multi_val<Domain> range_product(const typed::multi_val<> &multi2) const = delete;
6853  inline typed::id<Domain> get_range_tuple_id() const = delete;
6854  inline typed::multi_val<Domain> scale(const typed::multi_val<Domain> &mv) const;
6855  inline typed::multi_val<Domain> scale(const typed::val<Domain> &v) const;
6856  inline typed::multi_val<Domain> scale(long v) const;
6857  inline typed::multi_val<Domain> scale_down(const typed::multi_val<Domain> &mv) const;
6858  inline typed::multi_val<Domain> scale_down(const typed::val<Domain> &v) const;
6859  inline typed::multi_val<Domain> scale_down(long v) const;
6860  inline typed::multi_val<Domain> set_at(int pos, const typed::val<Anonymous> &el) const;
6861  inline typed::multi_val<Domain> set_at(int pos, long el) const;
6862  template <typename Domain2>
6863  inline typed::multi_val<Domain2> set_range_tuple(const typed::id<Anonymous> &id) const;
6864  template <typename Domain2>
6865  inline typed::multi_val<Domain2> set_range_tuple(const std::string &id) const;
6866  inline typed::space<Domain> space() const;
6867  inline typed::space<Domain> get_space() const = delete;
6868  inline typed::multi_val<Domain> sub(const typed::multi_val<Domain> &multi2) const;
6869};
6870
6871template <>
6872struct point<> : public isl::point {
6873  template <typename...>
6874  friend struct aff;
6875  template <typename...>
6876  friend struct aff_list;
6877  template <typename...>
6878  friend struct basic_map;
6879  template <typename...>
6880  friend struct basic_set;
6881  template <typename...>
6882  friend struct fixed_box;
6883  template <typename...>
6884  friend struct id;
6885  template <typename...>
6886  friend struct id_list;
6887  template <typename...>
6888  friend struct map;
6889  template <typename...>
6890  friend struct map_list;
6891  template <typename...>
6892  friend struct multi_aff;
6893  template <typename...>
6894  friend struct multi_id;
6895  template <typename...>
6896  friend struct multi_pw_aff;
6897  template <typename...>
6898  friend struct multi_union_pw_aff;
6899  template <typename...>
6900  friend struct multi_val;
6901  template <typename...>
6902  friend struct point;
6903  template <typename...>
6904  friend struct pw_aff;
6905  template <typename...>
6906  friend struct pw_aff_list;
6907  template <typename...>
6908  friend struct pw_multi_aff;
6909  template <typename...>
6910  friend struct pw_multi_aff_list;
6911  template <typename...>
6912  friend struct set;
6913  template <typename...>
6914  friend struct set_list;
6915  template <typename...>
6916  friend struct space;
6917  template <typename...>
6918  friend struct union_map;
6919  template <typename...>
6920  friend struct union_pw_aff;
6921  template <typename...>
6922  friend struct union_pw_aff_list;
6923  template <typename...>
6924  friend struct union_pw_multi_aff;
6925  template <typename...>
6926  friend struct union_set;
6927  template <typename...>
6928  friend struct union_set_list;
6929  template <typename...>
6930  friend struct val;
6931  template <typename...>
6932  friend struct val_list;
6933
6934  point() = default;
6935 private:
6936  template <typename base,
6937            typename std::enable_if<
6938              std::is_same<base, isl::point>{}, bool>::type = true>
6939  point(const base &obj) : isl::point(obj) {}
6940 public:
6941  static point from(const isl::point &obj) {
6942    return point(obj);
6943  }
6944  inline typed::basic_set<> apply(const typed::basic_map<> &bmap) const = delete;
6945  inline typed::set<> apply(const typed::map<> &map) const = delete;
6946  inline typed::union_set<> apply(const typed::union_map<> &umap) const = delete;
6947  inline typed::pw_multi_aff<> as_pw_multi_aff() const = delete;
6948  inline typed::set<> as_set() const = delete;
6949  inline typed::set<> bind(const typed::multi_id<> &tuple) const = delete;
6950  inline typed::set<> coalesce() const;
6951  inline typed::basic_set<> detect_equalities() const;
6952  inline typed::set<> drop_unused_params() const;
6953  inline bool every_set(const std::function<bool(typed::set<>)> &test) const;
6954  inline typed::set<> extract_set(const typed::space<> &space) const;
6955  inline void foreach_basic_set(const std::function<void(typed::basic_set<>)> &fn) const;
6956  inline void foreach_point(const std::function<void(typed::point<>)> &fn) const;
6957  inline void foreach_set(const std::function<void(typed::set<>)> &fn) const;
6958  inline typed::basic_set<> gist(const typed::basic_set<> &context) const;
6959  inline typed::set<> gist(const typed::set<> &context) const;
6960  inline typed::union_set<> gist(const typed::union_set<> &context) const;
6961  inline typed::set<> gist_params(const typed::set<> &context) const = delete;
6962  inline typed::map<> identity() const = delete;
6963  inline typed::pw_aff<Anonymous> indicator_function() const;
6964  inline typed::map<> insert_domain(const typed::space<> &domain) const = delete;
6965  inline typed::basic_set<> intersect(const typed::basic_set<> &bset2) const;
6966  inline typed::set<> intersect(const typed::set<> &set2) const;
6967  inline typed::union_set<> intersect(const typed::union_set<> &uset2) const;
6968  inline typed::basic_set<> intersect_params(const typed::basic_set<> &bset2) const = delete;
6969  inline typed::set<> intersect_params(const typed::set<> &params) const = delete;
6970  inline typed::fixed_box<> lattice_tile() const = delete;
6971  inline typed::set<> lexmax() const = delete;
6972  inline typed::pw_multi_aff<> lexmax_pw_multi_aff() const = delete;
6973  inline typed::set<> lexmin() const = delete;
6974  inline typed::pw_multi_aff<> lexmin_pw_multi_aff() const = delete;
6975  inline typed::set<> lower_bound(const typed::multi_pw_aff<> &lower) const = delete;
6976  inline typed::set<> lower_bound(const typed::multi_val<> &lower) const = delete;
6977  inline typed::multi_pw_aff<> max_multi_pw_aff() const = delete;
6978  inline typed::val<> max_val(const typed::aff<> &obj) const = delete;
6979  inline typed::multi_pw_aff<> min_multi_pw_aff() const = delete;
6980  inline typed::val<> min_val(const typed::aff<> &obj) const = delete;
6981  inline typed::multi_val<> multi_val() const = delete;
6982  inline typed::multi_val<> get_multi_val() const = delete;
6983  inline typed::pw_aff<Anonymous> param_pw_aff_on_domain(const typed::id<Anonymous> &id) const;
6984  inline typed::pw_aff<Anonymous> param_pw_aff_on_domain(const std::string &id) const;
6985  inline typed::basic_set<> params() const = delete;
6986  inline typed::multi_val<> plain_multi_val_if_fixed() const = delete;
6987  inline typed::set<> preimage(const typed::multi_aff<> &ma) const = delete;
6988  inline typed::set<> preimage(const typed::multi_pw_aff<> &mpa) const = delete;
6989  inline typed::set<> preimage(const typed::pw_multi_aff<> &pma) const = delete;
6990  inline typed::union_set<> preimage(const typed::union_pw_multi_aff<> &upma) const = delete;
6991  inline typed::set<> product(const typed::set<> &set2) const = delete;
6992  inline typed::set<> project_out_all_params() const;
6993  inline typed::set<> project_out_param(const typed::id<Anonymous> &id) const;
6994  inline typed::set<> project_out_param(const std::string &id) const;
6995  inline typed::set<> project_out_param(const typed::id_list<Anonymous> &list) const;
6996  inline typed::pw_aff<Anonymous> pw_aff_on_domain(const typed::val<Anonymous> &v) const;
6997  inline typed::pw_aff<Anonymous> pw_aff_on_domain(long v) const;
6998  template <typename Domain>
6999  inline typed::pw_multi_aff<Domain> pw_multi_aff_on_domain(const typed::multi_val<Domain> &mv) const;
7000  inline typed::set_list<> set_list() const;
7001  inline typed::fixed_box<> simple_fixed_box_hull() const = delete;
7002  inline typed::space<> space() const;
7003  inline typed::set<> subtract(const typed::set<> &set2) const;
7004  inline typed::union_set<> subtract(const typed::union_set<> &uset2) const;
7005  inline typed::set<> to_set() const;
7006  inline typed::union_set<> to_union_set() const;
7007  inline typed::map<> translation() const = delete;
7008  template <typename Domain>
7009  inline typed::set<Domain> unbind_params(const typed::multi_id<Domain> &tuple) const;
7010  inline typed::map<> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
7011  inline typed::set<> unite(const typed::basic_set<> &bset2) const;
7012  inline typed::set<> unite(const typed::set<> &set2) const;
7013  inline typed::union_set<> unite(const typed::union_set<> &uset2) const;
7014  inline typed::map<> unwrap() const = delete;
7015  inline typed::set<> upper_bound(const typed::multi_pw_aff<> &upper) const = delete;
7016  inline typed::set<> upper_bound(const typed::multi_val<> &upper) const = delete;
7017  inline typed::set<> wrapped_reverse() const = delete;
7018};
7019
7020template <typename Domain>
7021struct point<Domain> : public isl::point {
7022  template <typename...>
7023  friend struct aff;
7024  template <typename...>
7025  friend struct aff_list;
7026  template <typename...>
7027  friend struct basic_map;
7028  template <typename...>
7029  friend struct basic_set;
7030  template <typename...>
7031  friend struct fixed_box;
7032  template <typename...>
7033  friend struct id;
7034  template <typename...>
7035  friend struct id_list;
7036  template <typename...>
7037  friend struct map;
7038  template <typename...>
7039  friend struct map_list;
7040  template <typename...>
7041  friend struct multi_aff;
7042  template <typename...>
7043  friend struct multi_id;
7044  template <typename...>
7045  friend struct multi_pw_aff;
7046  template <typename...>
7047  friend struct multi_union_pw_aff;
7048  template <typename...>
7049  friend struct multi_val;
7050  template <typename...>
7051  friend struct point;
7052  template <typename...>
7053  friend struct pw_aff;
7054  template <typename...>
7055  friend struct pw_aff_list;
7056  template <typename...>
7057  friend struct pw_multi_aff;
7058  template <typename...>
7059  friend struct pw_multi_aff_list;
7060  template <typename...>
7061  friend struct set;
7062  template <typename...>
7063  friend struct set_list;
7064  template <typename...>
7065  friend struct space;
7066  template <typename...>
7067  friend struct union_map;
7068  template <typename...>
7069  friend struct union_pw_aff;
7070  template <typename...>
7071  friend struct union_pw_aff_list;
7072  template <typename...>
7073  friend struct union_pw_multi_aff;
7074  template <typename...>
7075  friend struct union_set;
7076  template <typename...>
7077  friend struct union_set_list;
7078  template <typename...>
7079  friend struct val;
7080  template <typename...>
7081  friend struct val_list;
7082
7083  point() = default;
7084  template <typename Arg1,
7085            typename std::enable_if<
7086              std::is_base_of<Domain, Arg1>{},
7087            bool>::type = true>
7088  point(const point<Arg1> &obj) : isl::point(obj) {}
7089 private:
7090  template <typename base,
7091            typename std::enable_if<
7092              std::is_same<base, isl::point>{}, bool>::type = true>
7093  point(const base &obj) : isl::point(obj) {}
7094 public:
7095  static point from(const isl::point &obj) {
7096    return point(obj);
7097  }
7098  template <typename Range>
7099  inline typed::basic_set<Range> apply(const typed::basic_map<Domain, Range> &bmap) const;
7100  template <typename Range>
7101  inline typed::set<Range> apply(const typed::map<Domain, Range> &map) const;
7102  template <typename Range>
7103  inline typed::union_set<Range> apply(const typed::union_map<Domain, Range> &umap) const;
7104  inline typed::pw_multi_aff<Domain> as_pw_multi_aff() const;
7105  inline typed::set<Domain> as_set() const;
7106  inline typed::set<> bind(const typed::multi_id<Domain> &tuple) const;
7107  inline typed::set<Domain> coalesce() const;
7108  inline typed::basic_set<Domain> detect_equalities() const;
7109  inline typed::set<Domain> drop_unused_params() const;
7110  inline bool every_set(const std::function<bool(typed::set<Domain>)> &test) const;
7111  inline typed::set<Domain> extract_set(const typed::space<Domain> &space) const;
7112  inline void foreach_basic_set(const std::function<void(typed::basic_set<Domain>)> &fn) const;
7113  inline void foreach_point(const std::function<void(typed::point<Domain>)> &fn) const;
7114  inline void foreach_set(const std::function<void(typed::set<Domain>)> &fn) const;
7115  inline typed::basic_set<Domain> gist(const typed::basic_set<Domain> &context) const;
7116  inline typed::set<Domain> gist(const typed::set<Domain> &context) const;
7117  inline typed::union_set<Domain> gist(const typed::union_set<Domain> &context) const;
7118  inline typed::set<Domain> gist_params(const typed::set<> &context) const;
7119  inline typed::map<Domain, Domain> identity() const;
7120  inline typed::pw_aff<Domain, Anonymous> indicator_function() const;
7121  template <typename Arg1>
7122  inline typed::map<Arg1, Domain> insert_domain(const typed::space<Arg1> &domain) const;
7123  inline typed::basic_set<Domain> intersect(const typed::basic_set<Domain> &bset2) const;
7124  inline typed::set<Domain> intersect(const typed::set<Domain> &set2) const;
7125  inline typed::union_set<Domain> intersect(const typed::union_set<Domain> &uset2) const;
7126  inline typed::basic_set<Domain> intersect_params(const typed::basic_set<> &bset2) const;
7127  inline typed::set<Domain> intersect_params(const typed::set<> &params) const;
7128  inline typed::fixed_box<Domain> lattice_tile() const;
7129  inline typed::set<Domain> lexmax() const;
7130  inline typed::pw_multi_aff<Domain> lexmax_pw_multi_aff() const;
7131  inline typed::set<Domain> lexmin() const;
7132  inline typed::pw_multi_aff<Domain> lexmin_pw_multi_aff() const;
7133  inline typed::set<Domain> lower_bound(const typed::multi_pw_aff<Domain> &lower) const;
7134  inline typed::set<Domain> lower_bound(const typed::multi_val<Domain> &lower) const;
7135  inline typed::multi_pw_aff<Domain> max_multi_pw_aff() const;
7136  inline typed::val<Domain> max_val(const typed::aff<> &obj) const = delete;
7137  inline typed::multi_pw_aff<Domain> min_multi_pw_aff() const;
7138  inline typed::val<Domain> min_val(const typed::aff<> &obj) const = delete;
7139  inline typed::multi_val<Domain> multi_val() const;
7140  inline typed::multi_val<Domain> get_multi_val() const = delete;
7141  inline typed::pw_aff<Domain, Anonymous> param_pw_aff_on_domain(const typed::id<Anonymous> &id) const;
7142  inline typed::pw_aff<Domain, Anonymous> param_pw_aff_on_domain(const std::string &id) const;
7143  inline typed::basic_set<> params() const;
7144  inline typed::multi_val<Domain> plain_multi_val_if_fixed() const;
7145  template <typename Domain2>
7146  inline typed::set<Domain2> preimage(const typed::multi_aff<Domain2, Domain> &ma) const;
7147  template <typename Domain2>
7148  inline typed::set<Domain2> preimage(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
7149  template <typename Domain2>
7150  inline typed::set<Domain2> preimage(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
7151  template <typename Domain2>
7152  inline typed::union_set<Domain2> preimage(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
7153  template <typename Range>
7154  inline typed::set<pair<Domain, Range>> product(const typed::set<Range> &set2) const;
7155  inline typed::set<Domain> project_out_all_params() const;
7156  inline typed::set<Domain> project_out_param(const typed::id<Anonymous> &id) const;
7157  inline typed::set<Domain> project_out_param(const std::string &id) const;
7158  inline typed::set<Domain> project_out_param(const typed::id_list<Anonymous> &list) const;
7159  inline typed::pw_aff<Domain, Anonymous> pw_aff_on_domain(const typed::val<Anonymous> &v) const;
7160  inline typed::pw_aff<Domain, Anonymous> pw_aff_on_domain(long v) const;
7161  template <typename Range>
7162  inline typed::pw_multi_aff<Domain, Range> pw_multi_aff_on_domain(const typed::multi_val<Range> &mv) const;
7163  inline typed::set_list<Domain> set_list() const;
7164  inline typed::fixed_box<Domain> simple_fixed_box_hull() const;
7165  inline typed::space<Domain> space() const;
7166  inline typed::set<Domain> subtract(const typed::set<Domain> &set2) const;
7167  inline typed::union_set<Domain> subtract(const typed::union_set<Domain> &uset2) const;
7168  inline typed::set<Domain> to_set() const;
7169  inline typed::union_set<Domain> to_union_set() const;
7170  inline typed::map<Domain, Domain> translation() const;
7171  inline typed::set<Domain> unbind_params(const typed::multi_id<> &tuple) const = delete;
7172  template <typename Arg1>
7173  inline typed::map<Arg1, Domain> unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const;
7174  inline typed::set<Domain> unite(const typed::basic_set<Domain> &bset2) const;
7175  inline typed::set<Domain> unite(const typed::set<Domain> &set2) const;
7176  inline typed::union_set<Domain> unite(const typed::union_set<Domain> &uset2) const;
7177  inline typed::map<Domain> unwrap() const = delete;
7178  inline typed::set<Domain> upper_bound(const typed::multi_pw_aff<Domain> &upper) const;
7179  inline typed::set<Domain> upper_bound(const typed::multi_val<Domain> &upper) const;
7180  inline typed::set<Domain> wrapped_reverse() const = delete;
7181};
7182
7183template <typename Domain, typename Range>
7184struct point<pair<Domain, Range>> : public isl::point {
7185  template <typename...>
7186  friend struct aff;
7187  template <typename...>
7188  friend struct aff_list;
7189  template <typename...>
7190  friend struct basic_map;
7191  template <typename...>
7192  friend struct basic_set;
7193  template <typename...>
7194  friend struct fixed_box;
7195  template <typename...>
7196  friend struct id;
7197  template <typename...>
7198  friend struct id_list;
7199  template <typename...>
7200  friend struct map;
7201  template <typename...>
7202  friend struct map_list;
7203  template <typename...>
7204  friend struct multi_aff;
7205  template <typename...>
7206  friend struct multi_id;
7207  template <typename...>
7208  friend struct multi_pw_aff;
7209  template <typename...>
7210  friend struct multi_union_pw_aff;
7211  template <typename...>
7212  friend struct multi_val;
7213  template <typename...>
7214  friend struct point;
7215  template <typename...>
7216  friend struct pw_aff;
7217  template <typename...>
7218  friend struct pw_aff_list;
7219  template <typename...>
7220  friend struct pw_multi_aff;
7221  template <typename...>
7222  friend struct pw_multi_aff_list;
7223  template <typename...>
7224  friend struct set;
7225  template <typename...>
7226  friend struct set_list;
7227  template <typename...>
7228  friend struct space;
7229  template <typename...>
7230  friend struct union_map;
7231  template <typename...>
7232  friend struct union_pw_aff;
7233  template <typename...>
7234  friend struct union_pw_aff_list;
7235  template <typename...>
7236  friend struct union_pw_multi_aff;
7237  template <typename...>
7238  friend struct union_set;
7239  template <typename...>
7240  friend struct union_set_list;
7241  template <typename...>
7242  friend struct val;
7243  template <typename...>
7244  friend struct val_list;
7245
7246  point() = default;
7247  template <typename Arg1, typename Arg2,
7248            typename std::enable_if<
7249              std::is_base_of<Domain, Arg1>{} &&
7250              std::is_base_of<Range, Arg2>{},
7251            bool>::type = true>
7252  point(const point<pair<Arg1, Arg2>> &obj) : isl::point(obj) {}
7253 private:
7254  template <typename base,
7255            typename std::enable_if<
7256              std::is_same<base, isl::point>{}, bool>::type = true>
7257  point(const base &obj) : isl::point(obj) {}
7258 public:
7259  static point from(const isl::point &obj) {
7260    return point(obj);
7261  }
7262  template <typename Arg2>
7263  inline typed::basic_set<Arg2> apply(const typed::basic_map<pair<Domain, Range>, Arg2> &bmap) const;
7264  template <typename Arg2>
7265  inline typed::set<Arg2> apply(const typed::map<pair<Domain, Range>, Arg2> &map) const;
7266  template <typename Arg2>
7267  inline typed::union_set<Arg2> apply(const typed::union_map<pair<Domain, Range>, Arg2> &umap) const;
7268  inline typed::pw_multi_aff<pair<Domain, Range>> as_pw_multi_aff() const;
7269  inline typed::set<pair<Domain, Range>> as_set() const;
7270  inline typed::set<> bind(const typed::multi_id<pair<Domain, Range>> &tuple) const;
7271  inline typed::set<pair<Domain, Range>> coalesce() const;
7272  inline typed::basic_set<pair<Domain, Range>> detect_equalities() const;
7273  inline typed::set<pair<Domain, Range>> drop_unused_params() const;
7274  inline bool every_set(const std::function<bool(typed::set<pair<Domain, Range>>)> &test) const;
7275  inline typed::set<pair<Domain, Range>> extract_set(const typed::space<pair<Domain, Range>> &space) const;
7276  inline void foreach_basic_set(const std::function<void(typed::basic_set<pair<Domain, Range>>)> &fn) const;
7277  inline void foreach_point(const std::function<void(typed::point<pair<Domain, Range>>)> &fn) const;
7278  inline void foreach_set(const std::function<void(typed::set<pair<Domain, Range>>)> &fn) const;
7279  inline typed::basic_set<pair<Domain, Range>> gist(const typed::basic_set<pair<Domain, Range>> &context) const;
7280  inline typed::set<pair<Domain, Range>> gist(const typed::set<pair<Domain, Range>> &context) const;
7281  inline typed::union_set<pair<Domain, Range>> gist(const typed::union_set<pair<Domain, Range>> &context) const;
7282  inline typed::set<pair<Domain, Range>> gist_params(const typed::set<> &context) const;
7283  inline typed::map<pair<Domain, Range>, pair<Domain, Range>> identity() const;
7284  inline typed::pw_aff<pair<Domain, Range>, Anonymous> indicator_function() const;
7285  template <typename Arg2>
7286  inline typed::map<Arg2, pair<Domain, Range>> insert_domain(const typed::space<Arg2> &domain) const;
7287  inline typed::basic_set<pair<Domain, Range>> intersect(const typed::basic_set<pair<Domain, Range>> &bset2) const;
7288  inline typed::set<pair<Domain, Range>> intersect(const typed::set<pair<Domain, Range>> &set2) const;
7289  inline typed::union_set<pair<Domain, Range>> intersect(const typed::union_set<pair<Domain, Range>> &uset2) const;
7290  inline typed::basic_set<pair<Domain, Range>> intersect_params(const typed::basic_set<> &bset2) const;
7291  inline typed::set<pair<Domain, Range>> intersect_params(const typed::set<> &params) const;
7292  inline typed::fixed_box<pair<Domain, Range>> lattice_tile() const;
7293  inline typed::set<pair<Domain, Range>> lexmax() const;
7294  inline typed::pw_multi_aff<pair<Domain, Range>> lexmax_pw_multi_aff() const;
7295  inline typed::set<pair<Domain, Range>> lexmin() const;
7296  inline typed::pw_multi_aff<pair<Domain, Range>> lexmin_pw_multi_aff() const;
7297  inline typed::set<pair<Domain, Range>> lower_bound(const typed::multi_pw_aff<pair<Domain, Range>> &lower) const;
7298  inline typed::set<pair<Domain, Range>> lower_bound(const typed::multi_val<pair<Domain, Range>> &lower) const;
7299  inline typed::multi_pw_aff<pair<Domain, Range>> max_multi_pw_aff() const;
7300  inline typed::val<pair<Domain, Range>> max_val(const typed::aff<> &obj) const = delete;
7301  inline typed::multi_pw_aff<pair<Domain, Range>> min_multi_pw_aff() const;
7302  inline typed::val<pair<Domain, Range>> min_val(const typed::aff<> &obj) const = delete;
7303  inline typed::multi_val<pair<Domain, Range>> multi_val() const;
7304  inline typed::multi_val<pair<Domain, Range>> get_multi_val() const = delete;
7305  inline typed::pw_aff<pair<Domain, Range>, Anonymous> param_pw_aff_on_domain(const typed::id<Anonymous> &id) const;
7306  inline typed::pw_aff<pair<Domain, Range>, Anonymous> param_pw_aff_on_domain(const std::string &id) const;
7307  inline typed::basic_set<> params() const;
7308  inline typed::multi_val<pair<Domain, Range>> plain_multi_val_if_fixed() const;
7309  template <typename Domain2>
7310  inline typed::set<Domain2> preimage(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const;
7311  template <typename Domain2>
7312  inline typed::set<Domain2> preimage(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const;
7313  template <typename Domain2>
7314  inline typed::set<Domain2> preimage(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const;
7315  template <typename Domain2>
7316  inline typed::union_set<Domain2> preimage(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const;
7317  template <typename Arg2>
7318  inline typed::set<pair<pair<Domain, Range>, Arg2>> product(const typed::set<Arg2> &set2) const;
7319  inline typed::set<pair<Domain, Range>> project_out_all_params() const;
7320  inline typed::set<pair<Domain, Range>> project_out_param(const typed::id<Anonymous> &id) const;
7321  inline typed::set<pair<Domain, Range>> project_out_param(const std::string &id) const;
7322  inline typed::set<pair<Domain, Range>> project_out_param(const typed::id_list<Anonymous> &list) const;
7323  inline typed::pw_aff<pair<Domain, Range>, Anonymous> pw_aff_on_domain(const typed::val<Anonymous> &v) const;
7324  inline typed::pw_aff<pair<Domain, Range>, Anonymous> pw_aff_on_domain(long v) const;
7325  template <typename Arg2>
7326  inline typed::pw_multi_aff<pair<Domain, Range>, Arg2> pw_multi_aff_on_domain(const typed::multi_val<Arg2> &mv) const;
7327  inline typed::set_list<pair<Domain, Range>> set_list() const;
7328  inline typed::fixed_box<pair<Domain, Range>> simple_fixed_box_hull() const;
7329  inline typed::space<pair<Domain, Range>> space() const;
7330  inline typed::set<pair<Domain, Range>> subtract(const typed::set<pair<Domain, Range>> &set2) const;
7331  inline typed::union_set<pair<Domain, Range>> subtract(const typed::union_set<pair<Domain, Range>> &uset2) const;
7332  inline typed::set<pair<Domain, Range>> to_set() const;
7333  inline typed::union_set<pair<Domain, Range>> to_union_set() const;
7334  inline typed::map<pair<Domain, Range>, pair<Domain, Range>> translation() const;
7335  inline typed::set<pair<Domain, Range>> unbind_params(const typed::multi_id<> &tuple) const = delete;
7336  template <typename Arg2>
7337  inline typed::map<Arg2, pair<Domain, Range>> unbind_params_insert_domain(const typed::multi_id<Arg2> &domain) const;
7338  inline typed::set<pair<Domain, Range>> unite(const typed::basic_set<pair<Domain, Range>> &bset2) const;
7339  inline typed::set<pair<Domain, Range>> unite(const typed::set<pair<Domain, Range>> &set2) const;
7340  inline typed::union_set<pair<Domain, Range>> unite(const typed::union_set<pair<Domain, Range>> &uset2) const;
7341  inline typed::map<Domain, Range> unwrap() const;
7342  inline typed::set<pair<Domain, Range>> upper_bound(const typed::multi_pw_aff<pair<Domain, Range>> &upper) const;
7343  inline typed::set<pair<Domain, Range>> upper_bound(const typed::multi_val<pair<Domain, Range>> &upper) const;
7344  inline typed::set<pair<Range, Domain>> wrapped_reverse() const;
7345};
7346
7347template <>
7348struct pw_aff<Anonymous> : public isl::pw_aff {
7349  template <typename...>
7350  friend struct aff;
7351  template <typename...>
7352  friend struct aff_list;
7353  template <typename...>
7354  friend struct basic_map;
7355  template <typename...>
7356  friend struct basic_set;
7357  template <typename...>
7358  friend struct fixed_box;
7359  template <typename...>
7360  friend struct id;
7361  template <typename...>
7362  friend struct id_list;
7363  template <typename...>
7364  friend struct map;
7365  template <typename...>
7366  friend struct map_list;
7367  template <typename...>
7368  friend struct multi_aff;
7369  template <typename...>
7370  friend struct multi_id;
7371  template <typename...>
7372  friend struct multi_pw_aff;
7373  template <typename...>
7374  friend struct multi_union_pw_aff;
7375  template <typename...>
7376  friend struct multi_val;
7377  template <typename...>
7378  friend struct point;
7379  template <typename...>
7380  friend struct pw_aff;
7381  template <typename...>
7382  friend struct pw_aff_list;
7383  template <typename...>
7384  friend struct pw_multi_aff;
7385  template <typename...>
7386  friend struct pw_multi_aff_list;
7387  template <typename...>
7388  friend struct set;
7389  template <typename...>
7390  friend struct set_list;
7391  template <typename...>
7392  friend struct space;
7393  template <typename...>
7394  friend struct union_map;
7395  template <typename...>
7396  friend struct union_pw_aff;
7397  template <typename...>
7398  friend struct union_pw_aff_list;
7399  template <typename...>
7400  friend struct union_pw_multi_aff;
7401  template <typename...>
7402  friend struct union_set;
7403  template <typename...>
7404  friend struct union_set_list;
7405  template <typename...>
7406  friend struct val;
7407  template <typename...>
7408  friend struct val_list;
7409
7410  pw_aff() = default;
7411  pw_aff(const isl::pw_aff &obj) : isl::pw_aff(obj) {}
7412  static pw_aff from(const isl::pw_aff &obj) {
7413    return pw_aff(obj);
7414  }
7415  inline /* implicit */ pw_aff(const typed::aff<Anonymous> &aff);
7416  inline explicit pw_aff(const isl::ctx &ctx, const std::string &str);
7417  inline typed::multi_pw_aff<Anonymous> add(const typed::multi_pw_aff<Anonymous> &multi2) const;
7418  inline typed::multi_union_pw_aff<Anonymous> add(const typed::multi_union_pw_aff<Anonymous> &multi2) const;
7419  inline typed::pw_aff<Anonymous> add(const typed::pw_aff<Anonymous> &pwaff2) const;
7420  inline typed::pw_multi_aff<Anonymous> add(const typed::pw_multi_aff<Anonymous> &pma2) const;
7421  inline typed::union_pw_aff<Anonymous> add(const typed::union_pw_aff<Anonymous> &upa2) const;
7422  inline typed::union_pw_multi_aff<Anonymous> add(const typed::union_pw_multi_aff<Anonymous> &upma2) const;
7423  inline typed::pw_aff<Anonymous> add(const typed::aff<Anonymous> &pwaff2) const;
7424  inline typed::pw_aff<Anonymous> add_constant(const typed::val<Anonymous> &v) const;
7425  inline typed::pw_aff<Anonymous> add_constant(long v) const;
7426  inline typed::pw_multi_aff<Anonymous> add_constant(const typed::multi_val<Anonymous> &mv) const;
7427  template <typename Range>
7428  inline typed::union_pw_multi_aff<Range> apply(const typed::union_pw_multi_aff<Anonymous, Range> &upma2) const;
7429  inline typed::aff<Anonymous> as_aff() const;
7430  inline typed::map<Anonymous> as_map() const = delete;
7431  inline typed::multi_aff<Anonymous> as_multi_aff() const;
7432  inline typed::multi_union_pw_aff<Anonymous> as_multi_union_pw_aff() const;
7433  inline typed::pw_multi_aff<Anonymous> as_pw_multi_aff() const;
7434  inline typed::set<Anonymous> as_set() const;
7435  inline typed::union_map<Anonymous> as_union_map() const = delete;
7436  inline typed::pw_aff<Anonymous> at(int pos) const;
7437  inline typed::set<> bind(const typed::multi_id<Anonymous> &tuple) const;
7438  inline typed::set<> bind(const typed::id<Anonymous> &id) const;
7439  inline typed::set<> bind(const std::string &id) const;
7440  inline typed::pw_aff<Anonymous> bind_domain(const typed::multi_id<> &tuple) const = delete;
7441  inline typed::pw_aff<Anonymous> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
7442  inline typed::pw_aff<Anonymous> ceil() const;
7443  inline typed::pw_aff<Anonymous> coalesce() const;
7444  inline typed::pw_aff<Anonymous> cond(const typed::pw_aff<Anonymous> &pwaff_true, const typed::pw_aff<Anonymous> &pwaff_false) const;
7445  inline typed::set<> domain() const;
7446  inline typed::pw_aff<Anonymous> domain_reverse() const = delete;
7447  inline typed::pw_aff<Anonymous> drop_unused_params() const;
7448  inline typed::pw_multi_aff<Anonymous> extract_pw_multi_aff(const typed::space<Anonymous> &space) const;
7449  inline typed::pw_aff<Anonymous> floor() const;
7450  inline typed::set<Anonymous> ge_set(const typed::pw_aff<> &pwaff2) const = delete;
7451  inline typed::set<Anonymous> ge_set(const typed::aff<> &pwaff2) const = delete;
7452  inline typed::pw_aff<Anonymous> gist(const typed::set<> &context) const;
7453  inline typed::union_pw_aff<Anonymous> gist(const typed::union_set<> &context) const;
7454  inline typed::pw_aff<Anonymous> gist(const typed::basic_set<> &context) const;
7455  inline typed::pw_aff<Anonymous> gist(const typed::point<> &context) const;
7456  inline typed::pw_aff<Anonymous> gist_params(const typed::set<> &context) const;
7457  inline typed::pw_aff<Anonymous> gist_params(const typed::basic_set<> &context) const;
7458  inline typed::pw_aff<Anonymous> gist_params(const typed::point<> &context) const;
7459  inline typed::set<Anonymous> gt_set(const typed::pw_aff<> &pwaff2) const = delete;
7460  inline typed::set<Anonymous> gt_set(const typed::aff<> &pwaff2) const = delete;
7461  inline typed::multi_pw_aff<Anonymous, Anonymous> identity() const;
7462  template <typename Domain>
7463  inline typed::pw_aff<Domain, Anonymous> insert_domain(const typed::space<Domain> &domain) const;
7464  inline typed::pw_aff<Anonymous> intersect_domain(const typed::set<> &set) const = delete;
7465  inline typed::union_pw_aff<Anonymous> intersect_domain(const typed::space<> &space) const = delete;
7466  inline typed::union_pw_aff<Anonymous> intersect_domain(const typed::union_set<> &uset) const = delete;
7467  inline typed::pw_aff<Anonymous> intersect_domain(const typed::basic_set<> &set) const = delete;
7468  inline typed::pw_aff<Anonymous> intersect_domain(const typed::point<> &set) const = delete;
7469  inline typed::union_pw_aff<Anonymous> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
7470  inline typed::pw_aff<Anonymous> intersect_params(const typed::set<> &set) const;
7471  inline typed::pw_aff<Anonymous> intersect_params(const typed::basic_set<> &set) const;
7472  inline typed::pw_aff<Anonymous> intersect_params(const typed::point<> &set) const;
7473  inline typed::set<Anonymous> le_set(const typed::pw_aff<> &pwaff2) const = delete;
7474  inline typed::set<Anonymous> le_set(const typed::aff<> &pwaff2) const = delete;
7475  inline typed::pw_aff_list<Anonymous> list() const;
7476  inline typed::set<Anonymous> lt_set(const typed::pw_aff<> &pwaff2) const = delete;
7477  inline typed::set<Anonymous> lt_set(const typed::aff<> &pwaff2) const = delete;
7478  inline typed::multi_pw_aff<Anonymous> max(const typed::multi_pw_aff<Anonymous> &multi2) const;
7479  inline typed::pw_aff<Anonymous> max(const typed::pw_aff<Anonymous> &pwaff2) const;
7480  inline typed::pw_aff<Anonymous> max(const typed::aff<Anonymous> &pwaff2) const;
7481  inline typed::multi_val<Anonymous> max_multi_val() const;
7482  inline typed::val<Anonymous> max_val() const;
7483  inline typed::multi_pw_aff<Anonymous> min(const typed::multi_pw_aff<Anonymous> &multi2) const;
7484  inline typed::pw_aff<Anonymous> min(const typed::pw_aff<Anonymous> &pwaff2) const;
7485  inline typed::pw_aff<Anonymous> min(const typed::aff<Anonymous> &pwaff2) const;
7486  inline typed::multi_val<Anonymous> min_multi_val() const;
7487  inline typed::val<Anonymous> min_val() const;
7488  inline typed::pw_aff<Anonymous> mod(const typed::val<Anonymous> &mod) const;
7489  inline typed::pw_aff<Anonymous> mod(long mod) const;
7490  inline typed::pw_aff<Anonymous> neg() const;
7491  inline typed::set<> params() const;
7492  inline typed::pw_multi_aff<Anonymous> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
7493  inline typed::union_pw_multi_aff<Anonymous> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
7494  template <typename Range>
7495  inline typed::multi_pw_aff<pair<Anonymous, Range>> product(const typed::multi_pw_aff<Range> &multi2) const;
7496  template <typename Range>
7497  inline typed::pw_multi_aff<pair<Anonymous, Range>> product(const typed::pw_multi_aff<Range> &pma2) const;
7498  inline typed::pw_aff<Anonymous> pullback(const typed::multi_aff<> &ma) const = delete;
7499  inline typed::pw_aff<Anonymous> pullback(const typed::multi_pw_aff<> &mpa) const = delete;
7500  inline typed::pw_aff<Anonymous> pullback(const typed::pw_multi_aff<> &pma) const = delete;
7501  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_multi_aff<> &upma) const = delete;
7502  inline typed::pw_multi_aff_list<Anonymous> pw_multi_aff_list() const;
7503  inline typed::pw_multi_aff<Anonymous> range_factor_domain() const = delete;
7504  inline typed::pw_multi_aff<Anonymous> range_factor_range() const = delete;
7505  inline typed::multi_pw_aff<Anonymous> range_product(const typed::multi_pw_aff<> &multi2) const = delete;
7506  inline typed::multi_union_pw_aff<Anonymous> range_product(const typed::multi_union_pw_aff<> &multi2) const = delete;
7507  inline typed::pw_multi_aff<Anonymous> range_product(const typed::pw_multi_aff<> &pma2) const = delete;
7508  inline typed::union_pw_multi_aff<Anonymous> range_product(const typed::union_pw_multi_aff<> &upma2) const = delete;
7509  inline typed::pw_aff<Anonymous> scale(const typed::val<Anonymous> &v) const;
7510  inline typed::pw_aff<Anonymous> scale(long v) const;
7511  inline typed::pw_multi_aff<Anonymous> scale(const typed::multi_val<Anonymous> &mv) const;
7512  inline typed::pw_aff<Anonymous> scale_down(const typed::val<Anonymous> &f) const;
7513  inline typed::pw_aff<Anonymous> scale_down(long f) const;
7514  inline typed::pw_multi_aff<Anonymous> scale_down(const typed::multi_val<Anonymous> &mv) const;
7515  inline typed::multi_pw_aff<Anonymous> set_at(int pos, const typed::pw_aff<Anonymous> &el) const;
7516  inline typed::multi_union_pw_aff<Anonymous> set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const;
7517  template <typename Domain2>
7518  inline typed::pw_multi_aff<Domain2> set_range_tuple(const typed::id<Anonymous> &id) const;
7519  template <typename Domain2>
7520  inline typed::pw_multi_aff<Domain2> set_range_tuple(const std::string &id) const;
7521  inline typed::space<Anonymous> space() const;
7522  inline typed::space<Anonymous> get_space() const = delete;
7523  inline typed::multi_pw_aff<Anonymous> sub(const typed::multi_pw_aff<Anonymous> &multi2) const;
7524  inline typed::multi_union_pw_aff<Anonymous> sub(const typed::multi_union_pw_aff<Anonymous> &multi2) const;
7525  inline typed::pw_aff<Anonymous> sub(const typed::pw_aff<Anonymous> &pwaff2) const;
7526  inline typed::pw_multi_aff<Anonymous> sub(const typed::pw_multi_aff<Anonymous> &pma2) const;
7527  inline typed::union_pw_aff<Anonymous> sub(const typed::union_pw_aff<Anonymous> &upa2) const;
7528  inline typed::union_pw_multi_aff<Anonymous> sub(const typed::union_pw_multi_aff<Anonymous> &upma2) const;
7529  inline typed::pw_aff<Anonymous> sub(const typed::aff<Anonymous> &pwaff2) const;
7530  inline typed::pw_aff<Anonymous> subtract_domain(const typed::set<> &set) const = delete;
7531  inline typed::union_pw_aff<Anonymous> subtract_domain(const typed::space<> &space) const = delete;
7532  inline typed::union_pw_aff<Anonymous> subtract_domain(const typed::union_set<> &uset) const = delete;
7533  inline typed::pw_aff<Anonymous> subtract_domain(const typed::basic_set<> &set) const = delete;
7534  inline typed::pw_aff<Anonymous> subtract_domain(const typed::point<> &set) const = delete;
7535  inline typed::multi_pw_aff<Anonymous> to_multi_pw_aff() const;
7536  inline typed::union_pw_aff<Anonymous> to_union_pw_aff() const;
7537  inline typed::union_pw_multi_aff<Anonymous> to_union_pw_multi_aff() const;
7538  template <typename Domain>
7539  inline typed::multi_pw_aff<Domain, Anonymous> unbind_params_insert_domain(const typed::multi_id<Domain> &domain) const;
7540  inline typed::multi_pw_aff<Anonymous> union_add(const typed::multi_pw_aff<Anonymous> &mpa2) const;
7541  inline typed::multi_union_pw_aff<Anonymous> union_add(const typed::multi_union_pw_aff<Anonymous> &mupa2) const;
7542  inline typed::pw_aff<Anonymous> union_add(const typed::pw_aff<Anonymous> &pwaff2) const;
7543  inline typed::pw_multi_aff<Anonymous> union_add(const typed::pw_multi_aff<Anonymous> &pma2) const;
7544  inline typed::union_pw_aff<Anonymous> union_add(const typed::union_pw_aff<Anonymous> &upa2) const;
7545  inline typed::union_pw_multi_aff<Anonymous> union_add(const typed::union_pw_multi_aff<Anonymous> &upma2) const;
7546  inline typed::pw_aff<Anonymous> union_add(const typed::aff<Anonymous> &pwaff2) const;
7547};
7548
7549template <typename Domain>
7550struct pw_aff<Domain, Anonymous> : public isl::pw_aff {
7551  template <typename...>
7552  friend struct aff;
7553  template <typename...>
7554  friend struct aff_list;
7555  template <typename...>
7556  friend struct basic_map;
7557  template <typename...>
7558  friend struct basic_set;
7559  template <typename...>
7560  friend struct fixed_box;
7561  template <typename...>
7562  friend struct id;
7563  template <typename...>
7564  friend struct id_list;
7565  template <typename...>
7566  friend struct map;
7567  template <typename...>
7568  friend struct map_list;
7569  template <typename...>
7570  friend struct multi_aff;
7571  template <typename...>
7572  friend struct multi_id;
7573  template <typename...>
7574  friend struct multi_pw_aff;
7575  template <typename...>
7576  friend struct multi_union_pw_aff;
7577  template <typename...>
7578  friend struct multi_val;
7579  template <typename...>
7580  friend struct point;
7581  template <typename...>
7582  friend struct pw_aff;
7583  template <typename...>
7584  friend struct pw_aff_list;
7585  template <typename...>
7586  friend struct pw_multi_aff;
7587  template <typename...>
7588  friend struct pw_multi_aff_list;
7589  template <typename...>
7590  friend struct set;
7591  template <typename...>
7592  friend struct set_list;
7593  template <typename...>
7594  friend struct space;
7595  template <typename...>
7596  friend struct union_map;
7597  template <typename...>
7598  friend struct union_pw_aff;
7599  template <typename...>
7600  friend struct union_pw_aff_list;
7601  template <typename...>
7602  friend struct union_pw_multi_aff;
7603  template <typename...>
7604  friend struct union_set;
7605  template <typename...>
7606  friend struct union_set_list;
7607  template <typename...>
7608  friend struct val;
7609  template <typename...>
7610  friend struct val_list;
7611
7612  pw_aff() = default;
7613  template <typename Arg1,
7614            typename std::enable_if<
7615              std::is_base_of<Domain, Arg1>{},
7616            bool>::type = true>
7617  pw_aff(const pw_aff<Arg1, Anonymous> &obj) : isl::pw_aff(obj) {}
7618 private:
7619  template <typename base,
7620            typename std::enable_if<
7621              std::is_same<base, isl::pw_aff>{}, bool>::type = true>
7622  pw_aff(const base &obj) : isl::pw_aff(obj) {}
7623 public:
7624  static pw_aff from(const isl::pw_aff &obj) {
7625    return pw_aff(obj);
7626  }
7627  inline /* implicit */ pw_aff(const typed::aff<Domain, Anonymous> &aff);
7628  inline explicit pw_aff(const isl::ctx &ctx, const std::string &str);
7629  inline typed::multi_pw_aff<Domain, Anonymous> add(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const;
7630  inline typed::multi_union_pw_aff<Domain, Anonymous> add(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const;
7631  inline typed::pw_aff<Domain, Anonymous> add(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
7632  inline typed::pw_multi_aff<Domain, Anonymous> add(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const;
7633  inline typed::union_pw_aff<Domain, Anonymous> add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const;
7634  inline typed::union_pw_multi_aff<Domain, Anonymous> add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const;
7635  inline typed::pw_aff<Domain, Anonymous> add(const typed::aff<Domain, Anonymous> &pwaff2) const;
7636  inline typed::pw_aff<Domain, Anonymous> add_constant(const typed::val<Anonymous> &v) const;
7637  inline typed::pw_aff<Domain, Anonymous> add_constant(long v) const;
7638  inline typed::pw_multi_aff<Domain, Anonymous> add_constant(const typed::multi_val<Anonymous> &mv) const;
7639  template <typename Range2>
7640  inline typed::union_pw_multi_aff<Domain, Range2> apply(const typed::union_pw_multi_aff<Anonymous, Range2> &upma2) const;
7641  inline typed::aff<Domain, Anonymous> as_aff() const;
7642  inline typed::map<Domain, Anonymous> as_map() const;
7643  inline typed::multi_aff<Domain, Anonymous> as_multi_aff() const;
7644  inline typed::multi_union_pw_aff<Domain, Anonymous> as_multi_union_pw_aff() const;
7645  inline typed::pw_multi_aff<Domain, Anonymous> as_pw_multi_aff() const;
7646  inline typed::set<Domain, Anonymous> as_set() const = delete;
7647  inline typed::union_map<Domain, Anonymous> as_union_map() const;
7648  inline typed::pw_aff<Domain, Anonymous> at(int pos) const;
7649  inline typed::set<Domain> bind(const typed::multi_id<Anonymous> &tuple) const;
7650  inline typed::set<Domain> bind(const typed::id<Anonymous> &id) const;
7651  inline typed::set<Domain> bind(const std::string &id) const;
7652  inline typed::pw_aff<Anonymous> bind_domain(const typed::multi_id<Domain> &tuple) const;
7653  inline typed::pw_aff<Domain, Anonymous> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
7654  inline typed::pw_aff<Domain, Anonymous> ceil() const;
7655  inline typed::pw_aff<Domain, Anonymous> coalesce() const;
7656  inline typed::pw_aff<Domain, Anonymous> cond(const typed::pw_aff<Domain, Anonymous> &pwaff_true, const typed::pw_aff<Domain, Anonymous> &pwaff_false) const;
7657  inline typed::set<Domain> domain() const;
7658  inline typed::pw_aff<Domain, Anonymous> domain_reverse() const = delete;
7659  inline typed::pw_aff<Domain, Anonymous> drop_unused_params() const;
7660  inline typed::pw_multi_aff<Domain, Anonymous> extract_pw_multi_aff(const typed::space<Domain, Anonymous> &space) const;
7661  inline typed::pw_aff<Domain, Anonymous> floor() const;
7662  inline typed::set<Domain> ge_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
7663  inline typed::set<Domain> ge_set(const typed::aff<Domain, Anonymous> &pwaff2) const;
7664  inline typed::pw_aff<Domain, Anonymous> gist(const typed::set<Domain> &context) const;
7665  inline typed::union_pw_aff<Domain, Anonymous> gist(const typed::union_set<Domain> &context) const;
7666  inline typed::pw_aff<Domain, Anonymous> gist(const typed::basic_set<Domain> &context) const;
7667  inline typed::pw_aff<Domain, Anonymous> gist(const typed::point<Domain> &context) const;
7668  inline typed::pw_aff<Domain, Anonymous> gist_params(const typed::set<> &context) const;
7669  inline typed::pw_aff<Domain, Anonymous> gist_params(const typed::basic_set<> &context) const;
7670  inline typed::pw_aff<Domain, Anonymous> gist_params(const typed::point<> &context) const;
7671  inline typed::set<Domain> gt_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
7672  inline typed::set<Domain> gt_set(const typed::aff<Domain, Anonymous> &pwaff2) const;
7673  inline typed::multi_pw_aff<Domain, Anonymous> identity() const;
7674  inline typed::pw_aff<Domain, Anonymous> insert_domain(const typed::space<> &domain) const = delete;
7675  inline typed::pw_aff<Domain, Anonymous> intersect_domain(const typed::set<Domain> &set) const;
7676  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain(const typed::space<Domain> &space) const;
7677  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain(const typed::union_set<Domain> &uset) const;
7678  inline typed::pw_aff<Domain, Anonymous> intersect_domain(const typed::basic_set<Domain> &set) const;
7679  inline typed::pw_aff<Domain, Anonymous> intersect_domain(const typed::point<Domain> &set) const;
7680  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
7681  inline typed::pw_aff<Domain, Anonymous> intersect_params(const typed::set<> &set) const;
7682  inline typed::pw_aff<Domain, Anonymous> intersect_params(const typed::basic_set<> &set) const;
7683  inline typed::pw_aff<Domain, Anonymous> intersect_params(const typed::point<> &set) const;
7684  inline typed::set<Domain> le_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
7685  inline typed::set<Domain> le_set(const typed::aff<Domain, Anonymous> &pwaff2) const;
7686  inline typed::pw_aff_list<Domain, Anonymous> list() const;
7687  inline typed::set<Domain> lt_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
7688  inline typed::set<Domain> lt_set(const typed::aff<Domain, Anonymous> &pwaff2) const;
7689  inline typed::multi_pw_aff<Domain, Anonymous> max(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const;
7690  inline typed::pw_aff<Domain, Anonymous> max(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
7691  inline typed::pw_aff<Domain, Anonymous> max(const typed::aff<Domain, Anonymous> &pwaff2) const;
7692  inline typed::multi_val<Anonymous> max_multi_val() const;
7693  inline typed::val<Anonymous> max_val() const;
7694  inline typed::multi_pw_aff<Domain, Anonymous> min(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const;
7695  inline typed::pw_aff<Domain, Anonymous> min(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
7696  inline typed::pw_aff<Domain, Anonymous> min(const typed::aff<Domain, Anonymous> &pwaff2) const;
7697  inline typed::multi_val<Anonymous> min_multi_val() const;
7698  inline typed::val<Anonymous> min_val() const;
7699  inline typed::pw_aff<Domain, Anonymous> mod(const typed::val<Anonymous> &mod) const;
7700  inline typed::pw_aff<Domain, Anonymous> mod(long mod) const;
7701  inline typed::pw_aff<Domain, Anonymous> neg() const;
7702  inline typed::set<> params() const;
7703  inline typed::pw_multi_aff<Domain, Anonymous> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
7704  inline typed::union_pw_multi_aff<Domain, Anonymous> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
7705  template <typename Domain2, typename Range2>
7706  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const;
7707  template <typename Domain2, typename Range2>
7708  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> product(const typed::pw_multi_aff<Domain2, Range2> &pma2) const;
7709  template <typename Domain2>
7710  inline typed::pw_aff<Domain2, Anonymous> pullback(const typed::multi_aff<Domain2, Domain> &ma) const;
7711  inline typed::pw_aff<Anonymous> pullback(const typed::multi_aff<Domain> &ma) const;
7712  template <typename Domain2>
7713  inline typed::pw_aff<Domain2, Anonymous> pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
7714  inline typed::pw_aff<Anonymous> pullback(const typed::multi_pw_aff<Domain> &mpa) const;
7715  template <typename Domain2>
7716  inline typed::pw_aff<Domain2, Anonymous> pullback(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
7717  inline typed::pw_aff<Anonymous> pullback(const typed::pw_multi_aff<Domain> &pma) const;
7718  template <typename Domain2>
7719  inline typed::union_pw_aff<Domain2, Anonymous> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
7720  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_multi_aff<Domain> &upma) const;
7721  inline typed::pw_multi_aff_list<Domain, Anonymous> pw_multi_aff_list() const;
7722  inline typed::pw_multi_aff<Domain, Anonymous> range_factor_domain() const = delete;
7723  inline typed::pw_multi_aff<Domain, Anonymous> range_factor_range() const = delete;
7724  template <typename Range2>
7725  inline typed::multi_pw_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const;
7726  template <typename Range2>
7727  inline typed::multi_union_pw_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const;
7728  template <typename Range2>
7729  inline typed::pw_multi_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::pw_multi_aff<Domain, Range2> &pma2) const;
7730  template <typename Range2>
7731  inline typed::union_pw_multi_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const;
7732  inline typed::pw_aff<Domain, Anonymous> scale(const typed::val<Anonymous> &v) const;
7733  inline typed::pw_aff<Domain, Anonymous> scale(long v) const;
7734  inline typed::pw_multi_aff<Domain, Anonymous> scale(const typed::multi_val<Anonymous> &mv) const;
7735  inline typed::pw_aff<Domain, Anonymous> scale_down(const typed::val<Anonymous> &f) const;
7736  inline typed::pw_aff<Domain, Anonymous> scale_down(long f) const;
7737  inline typed::pw_multi_aff<Domain, Anonymous> scale_down(const typed::multi_val<Anonymous> &mv) const;
7738  inline typed::multi_pw_aff<Domain, Anonymous> set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const;
7739  inline typed::multi_union_pw_aff<Domain, Anonymous> set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const;
7740  template <typename Range2>
7741  inline typed::pw_multi_aff<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
7742  template <typename Range2>
7743  inline typed::pw_multi_aff<Domain, Range2> set_range_tuple(const std::string &id) const;
7744  inline typed::space<Domain, Anonymous> space() const;
7745  inline typed::space<Domain, Anonymous> get_space() const = delete;
7746  inline typed::multi_pw_aff<Domain, Anonymous> sub(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const;
7747  inline typed::multi_union_pw_aff<Domain, Anonymous> sub(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const;
7748  inline typed::pw_aff<Domain, Anonymous> sub(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
7749  inline typed::pw_multi_aff<Domain, Anonymous> sub(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const;
7750  inline typed::union_pw_aff<Domain, Anonymous> sub(const typed::union_pw_aff<Domain, Anonymous> &upa2) const;
7751  inline typed::union_pw_multi_aff<Domain, Anonymous> sub(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const;
7752  inline typed::pw_aff<Domain, Anonymous> sub(const typed::aff<Domain, Anonymous> &pwaff2) const;
7753  inline typed::pw_aff<Domain, Anonymous> subtract_domain(const typed::set<Domain> &set) const;
7754  inline typed::union_pw_aff<Domain, Anonymous> subtract_domain(const typed::space<Domain> &space) const;
7755  inline typed::union_pw_aff<Domain, Anonymous> subtract_domain(const typed::union_set<Domain> &uset) const;
7756  inline typed::pw_aff<Domain, Anonymous> subtract_domain(const typed::basic_set<Domain> &set) const;
7757  inline typed::pw_aff<Domain, Anonymous> subtract_domain(const typed::point<Domain> &set) const;
7758  inline typed::multi_pw_aff<Domain, Anonymous> to_multi_pw_aff() const;
7759  inline typed::union_pw_aff<Domain, Anonymous> to_union_pw_aff() const;
7760  inline typed::union_pw_multi_aff<Domain, Anonymous> to_union_pw_multi_aff() const;
7761  inline typed::multi_pw_aff<Domain, Anonymous> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
7762  inline typed::multi_pw_aff<Domain, Anonymous> union_add(const typed::multi_pw_aff<Domain, Anonymous> &mpa2) const;
7763  inline typed::multi_union_pw_aff<Domain, Anonymous> union_add(const typed::multi_union_pw_aff<Domain, Anonymous> &mupa2) const;
7764  inline typed::pw_aff<Domain, Anonymous> union_add(const typed::pw_aff<Domain, Anonymous> &pwaff2) const;
7765  inline typed::pw_multi_aff<Domain, Anonymous> union_add(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const;
7766  inline typed::union_pw_aff<Domain, Anonymous> union_add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const;
7767  inline typed::union_pw_multi_aff<Domain, Anonymous> union_add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const;
7768  inline typed::pw_aff<Domain, Anonymous> union_add(const typed::aff<Domain, Anonymous> &pwaff2) const;
7769};
7770
7771template <typename Domain2, typename Range2>
7772struct pw_aff<pair<Domain2, Range2>, Anonymous> : public isl::pw_aff {
7773  template <typename...>
7774  friend struct aff;
7775  template <typename...>
7776  friend struct aff_list;
7777  template <typename...>
7778  friend struct basic_map;
7779  template <typename...>
7780  friend struct basic_set;
7781  template <typename...>
7782  friend struct fixed_box;
7783  template <typename...>
7784  friend struct id;
7785  template <typename...>
7786  friend struct id_list;
7787  template <typename...>
7788  friend struct map;
7789  template <typename...>
7790  friend struct map_list;
7791  template <typename...>
7792  friend struct multi_aff;
7793  template <typename...>
7794  friend struct multi_id;
7795  template <typename...>
7796  friend struct multi_pw_aff;
7797  template <typename...>
7798  friend struct multi_union_pw_aff;
7799  template <typename...>
7800  friend struct multi_val;
7801  template <typename...>
7802  friend struct point;
7803  template <typename...>
7804  friend struct pw_aff;
7805  template <typename...>
7806  friend struct pw_aff_list;
7807  template <typename...>
7808  friend struct pw_multi_aff;
7809  template <typename...>
7810  friend struct pw_multi_aff_list;
7811  template <typename...>
7812  friend struct set;
7813  template <typename...>
7814  friend struct set_list;
7815  template <typename...>
7816  friend struct space;
7817  template <typename...>
7818  friend struct union_map;
7819  template <typename...>
7820  friend struct union_pw_aff;
7821  template <typename...>
7822  friend struct union_pw_aff_list;
7823  template <typename...>
7824  friend struct union_pw_multi_aff;
7825  template <typename...>
7826  friend struct union_set;
7827  template <typename...>
7828  friend struct union_set_list;
7829  template <typename...>
7830  friend struct val;
7831  template <typename...>
7832  friend struct val_list;
7833
7834  pw_aff() = default;
7835  template <typename Arg1, typename Arg2,
7836            typename std::enable_if<
7837              std::is_base_of<Domain2, Arg1>{} &&
7838              std::is_base_of<Range2, Arg2>{},
7839            bool>::type = true>
7840  pw_aff(const pw_aff<pair<Arg1, Arg2>, Anonymous> &obj) : isl::pw_aff(obj) {}
7841 private:
7842  template <typename base,
7843            typename std::enable_if<
7844              std::is_same<base, isl::pw_aff>{}, bool>::type = true>
7845  pw_aff(const base &obj) : isl::pw_aff(obj) {}
7846 public:
7847  static pw_aff from(const isl::pw_aff &obj) {
7848    return pw_aff(obj);
7849  }
7850  inline /* implicit */ pw_aff(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff);
7851  inline explicit pw_aff(const isl::ctx &ctx, const std::string &str);
7852  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> add(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
7853  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
7854  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> add(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7855  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> add(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const;
7856  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> add(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const;
7857  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const;
7858  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> add(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7859  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> add_constant(const typed::val<Anonymous> &v) const;
7860  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> add_constant(long v) const;
7861  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> add_constant(const typed::multi_val<Anonymous> &mv) const;
7862  template <typename Arg1>
7863  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1> apply(const typed::union_pw_multi_aff<Anonymous, Arg1> &upma2) const;
7864  inline typed::aff<pair<Domain2, Range2>, Anonymous> as_aff() const;
7865  inline typed::map<pair<Domain2, Range2>, Anonymous> as_map() const;
7866  inline typed::multi_aff<pair<Domain2, Range2>, Anonymous> as_multi_aff() const;
7867  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> as_multi_union_pw_aff() const;
7868  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> as_pw_multi_aff() const;
7869  inline typed::set<pair<Domain2, Range2>, Anonymous> as_set() const = delete;
7870  inline typed::union_map<pair<Domain2, Range2>, Anonymous> as_union_map() const;
7871  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> at(int pos) const;
7872  inline typed::set<pair<Domain2, Range2>> bind(const typed::multi_id<Anonymous> &tuple) const;
7873  inline typed::set<pair<Domain2, Range2>> bind(const typed::id<Anonymous> &id) const;
7874  inline typed::set<pair<Domain2, Range2>> bind(const std::string &id) const;
7875  inline typed::pw_aff<Anonymous> bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const;
7876  inline typed::pw_aff<Range2, Anonymous> bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const;
7877  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> ceil() const;
7878  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> coalesce() const;
7879  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> cond(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff_true, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff_false) const;
7880  inline typed::set<pair<Domain2, Range2>> domain() const;
7881  inline typed::pw_aff<pair<Range2, Domain2>, Anonymous> domain_reverse() const;
7882  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> drop_unused_params() const;
7883  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> extract_pw_multi_aff(const typed::space<pair<Domain2, Range2>, Anonymous> &space) const;
7884  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> floor() const;
7885  inline typed::set<pair<Domain2, Range2>> ge_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7886  inline typed::set<pair<Domain2, Range2>> ge_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7887  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> gist(const typed::set<pair<Domain2, Range2>> &context) const;
7888  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> gist(const typed::union_set<pair<Domain2, Range2>> &context) const;
7889  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> gist(const typed::basic_set<pair<Domain2, Range2>> &context) const;
7890  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> gist(const typed::point<pair<Domain2, Range2>> &context) const;
7891  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> gist_params(const typed::set<> &context) const;
7892  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> gist_params(const typed::basic_set<> &context) const;
7893  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> gist_params(const typed::point<> &context) const;
7894  inline typed::set<pair<Domain2, Range2>> gt_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7895  inline typed::set<pair<Domain2, Range2>> gt_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7896  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> identity() const;
7897  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> insert_domain(const typed::space<> &domain) const = delete;
7898  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain(const typed::set<pair<Domain2, Range2>> &set) const;
7899  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain(const typed::space<pair<Domain2, Range2>> &space) const;
7900  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const;
7901  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain(const typed::basic_set<pair<Domain2, Range2>> &set) const;
7902  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain(const typed::point<pair<Domain2, Range2>> &set) const;
7903  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> intersect_domain_wrapped_domain(const typed::union_set<Domain2> &uset) const;
7904  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> intersect_params(const typed::set<> &set) const;
7905  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> intersect_params(const typed::basic_set<> &set) const;
7906  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> intersect_params(const typed::point<> &set) const;
7907  inline typed::set<pair<Domain2, Range2>> le_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7908  inline typed::set<pair<Domain2, Range2>> le_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7909  inline typed::pw_aff_list<pair<Domain2, Range2>, Anonymous> list() const;
7910  inline typed::set<pair<Domain2, Range2>> lt_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7911  inline typed::set<pair<Domain2, Range2>> lt_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7912  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> max(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
7913  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> max(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7914  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> max(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7915  inline typed::multi_val<Anonymous> max_multi_val() const;
7916  inline typed::val<Anonymous> max_val() const;
7917  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> min(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
7918  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> min(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7919  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> min(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7920  inline typed::multi_val<Anonymous> min_multi_val() const;
7921  inline typed::val<Anonymous> min_val() const;
7922  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> mod(const typed::val<Anonymous> &mod) const;
7923  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> mod(long mod) const;
7924  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> neg() const;
7925  inline typed::set<> params() const;
7926  template <typename Domain3>
7927  inline typed::pw_multi_aff<pair<Domain3, Range2>, Anonymous> preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain2> &pma2) const;
7928  template <typename Domain3>
7929  inline typed::union_pw_multi_aff<pair<Domain3, Range2>, Anonymous> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain2> &upma2) const;
7930  template <typename Arg1, typename Arg2>
7931  inline typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> product(const typed::multi_pw_aff<Arg1, Arg2> &multi2) const;
7932  template <typename Arg1, typename Arg2>
7933  inline typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> product(const typed::pw_multi_aff<Arg1, Arg2> &pma2) const;
7934  template <typename Arg1>
7935  inline typed::pw_aff<Arg1, Anonymous> pullback(const typed::multi_aff<Arg1, pair<Domain2, Range2>> &ma) const;
7936  inline typed::pw_aff<Anonymous> pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma) const;
7937  template <typename Arg1>
7938  inline typed::pw_aff<Arg1, Anonymous> pullback(const typed::multi_pw_aff<Arg1, pair<Domain2, Range2>> &mpa) const;
7939  inline typed::pw_aff<Anonymous> pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa) const;
7940  template <typename Arg1>
7941  inline typed::pw_aff<Arg1, Anonymous> pullback(const typed::pw_multi_aff<Arg1, pair<Domain2, Range2>> &pma) const;
7942  inline typed::pw_aff<Anonymous> pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma) const;
7943  template <typename Arg1>
7944  inline typed::union_pw_aff<Arg1, Anonymous> pullback(const typed::union_pw_multi_aff<Arg1, pair<Domain2, Range2>> &upma) const;
7945  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma) const;
7946  inline typed::pw_multi_aff_list<pair<Domain2, Range2>, Anonymous> pw_multi_aff_list() const;
7947  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> range_factor_domain() const = delete;
7948  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> range_factor_range() const = delete;
7949  template <typename Arg1>
7950  inline typed::multi_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg1> &multi2) const;
7951  template <typename Arg1>
7952  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg1> &multi2) const;
7953  template <typename Arg1>
7954  inline typed::pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> &pma2) const;
7955  template <typename Arg1>
7956  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> range_product(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1> &upma2) const;
7957  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> scale(const typed::val<Anonymous> &v) const;
7958  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> scale(long v) const;
7959  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> scale(const typed::multi_val<Anonymous> &mv) const;
7960  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> scale_down(const typed::val<Anonymous> &f) const;
7961  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> scale_down(long f) const;
7962  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> scale_down(const typed::multi_val<Anonymous> &mv) const;
7963  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
7964  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
7965  template <typename Arg1>
7966  inline typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const typed::id<Anonymous> &id) const;
7967  template <typename Arg1>
7968  inline typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const std::string &id) const;
7969  inline typed::space<pair<Domain2, Range2>, Anonymous> space() const;
7970  inline typed::space<pair<Domain2, Range2>, Anonymous> get_space() const = delete;
7971  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
7972  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const;
7973  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7974  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const;
7975  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const;
7976  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const;
7977  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> sub(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7978  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> subtract_domain(const typed::set<pair<Domain2, Range2>> &set) const;
7979  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> subtract_domain(const typed::space<pair<Domain2, Range2>> &space) const;
7980  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> subtract_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const;
7981  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> subtract_domain(const typed::basic_set<pair<Domain2, Range2>> &set) const;
7982  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> subtract_domain(const typed::point<pair<Domain2, Range2>> &set) const;
7983  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> to_multi_pw_aff() const;
7984  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> to_union_pw_aff() const;
7985  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> to_union_pw_multi_aff() const;
7986  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
7987  inline typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &mpa2) const;
7988  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &mupa2) const;
7989  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7990  inline typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const;
7991  inline typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const;
7992  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const;
7993  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> union_add(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const;
7994};
7995
7996template <>
7997struct pw_aff_list<Anonymous> : public isl::pw_aff_list {
7998  template <typename...>
7999  friend struct aff;
8000  template <typename...>
8001  friend struct aff_list;
8002  template <typename...>
8003  friend struct basic_map;
8004  template <typename...>
8005  friend struct basic_set;
8006  template <typename...>
8007  friend struct fixed_box;
8008  template <typename...>
8009  friend struct id;
8010  template <typename...>
8011  friend struct id_list;
8012  template <typename...>
8013  friend struct map;
8014  template <typename...>
8015  friend struct map_list;
8016  template <typename...>
8017  friend struct multi_aff;
8018  template <typename...>
8019  friend struct multi_id;
8020  template <typename...>
8021  friend struct multi_pw_aff;
8022  template <typename...>
8023  friend struct multi_union_pw_aff;
8024  template <typename...>
8025  friend struct multi_val;
8026  template <typename...>
8027  friend struct point;
8028  template <typename...>
8029  friend struct pw_aff;
8030  template <typename...>
8031  friend struct pw_aff_list;
8032  template <typename...>
8033  friend struct pw_multi_aff;
8034  template <typename...>
8035  friend struct pw_multi_aff_list;
8036  template <typename...>
8037  friend struct set;
8038  template <typename...>
8039  friend struct set_list;
8040  template <typename...>
8041  friend struct space;
8042  template <typename...>
8043  friend struct union_map;
8044  template <typename...>
8045  friend struct union_pw_aff;
8046  template <typename...>
8047  friend struct union_pw_aff_list;
8048  template <typename...>
8049  friend struct union_pw_multi_aff;
8050  template <typename...>
8051  friend struct union_set;
8052  template <typename...>
8053  friend struct union_set_list;
8054  template <typename...>
8055  friend struct val;
8056  template <typename...>
8057  friend struct val_list;
8058
8059  pw_aff_list() = default;
8060  pw_aff_list(const isl::pw_aff_list &obj) : isl::pw_aff_list(obj) {}
8061  static pw_aff_list from(const isl::pw_aff_list &obj) {
8062    return pw_aff_list(obj);
8063  }
8064  inline explicit pw_aff_list(const isl::ctx &ctx, int n);
8065  inline explicit pw_aff_list(const typed::pw_aff<Anonymous> &el);
8066  inline explicit pw_aff_list(const isl::ctx &ctx, const std::string &str);
8067  inline typed::pw_aff_list<Anonymous> add(const typed::pw_aff<Anonymous> &el) const;
8068  inline typed::pw_aff_list<Anonymous> add(const typed::aff<Anonymous> &el) const;
8069  inline typed::pw_aff<Anonymous> at(int index) const;
8070  inline typed::pw_aff<Anonymous> get_at(int index) const = delete;
8071  inline typed::pw_aff_list<Anonymous> drop(unsigned int first, unsigned int n) const;
8072  inline void foreach(const std::function<void(typed::pw_aff<Anonymous>)> &fn) const;
8073  inline void foreach_scc(const std::function<bool(typed::pw_aff<Anonymous>, typed::pw_aff<Anonymous>)> &follows, const std::function<void(typed::pw_aff_list<Anonymous>)> &fn) const;
8074  inline typed::pw_aff_list<Anonymous> set_at(int index, const typed::pw_aff<Anonymous> &el) const;
8075};
8076
8077template <typename Domain>
8078struct pw_aff_list<Domain, Anonymous> : public isl::pw_aff_list {
8079  template <typename...>
8080  friend struct aff;
8081  template <typename...>
8082  friend struct aff_list;
8083  template <typename...>
8084  friend struct basic_map;
8085  template <typename...>
8086  friend struct basic_set;
8087  template <typename...>
8088  friend struct fixed_box;
8089  template <typename...>
8090  friend struct id;
8091  template <typename...>
8092  friend struct id_list;
8093  template <typename...>
8094  friend struct map;
8095  template <typename...>
8096  friend struct map_list;
8097  template <typename...>
8098  friend struct multi_aff;
8099  template <typename...>
8100  friend struct multi_id;
8101  template <typename...>
8102  friend struct multi_pw_aff;
8103  template <typename...>
8104  friend struct multi_union_pw_aff;
8105  template <typename...>
8106  friend struct multi_val;
8107  template <typename...>
8108  friend struct point;
8109  template <typename...>
8110  friend struct pw_aff;
8111  template <typename...>
8112  friend struct pw_aff_list;
8113  template <typename...>
8114  friend struct pw_multi_aff;
8115  template <typename...>
8116  friend struct pw_multi_aff_list;
8117  template <typename...>
8118  friend struct set;
8119  template <typename...>
8120  friend struct set_list;
8121  template <typename...>
8122  friend struct space;
8123  template <typename...>
8124  friend struct union_map;
8125  template <typename...>
8126  friend struct union_pw_aff;
8127  template <typename...>
8128  friend struct union_pw_aff_list;
8129  template <typename...>
8130  friend struct union_pw_multi_aff;
8131  template <typename...>
8132  friend struct union_set;
8133  template <typename...>
8134  friend struct union_set_list;
8135  template <typename...>
8136  friend struct val;
8137  template <typename...>
8138  friend struct val_list;
8139
8140  pw_aff_list() = default;
8141  template <typename Arg1,
8142            typename std::enable_if<
8143              std::is_base_of<Domain, Arg1>{},
8144            bool>::type = true>
8145  pw_aff_list(const pw_aff_list<Arg1, Anonymous> &obj) : isl::pw_aff_list(obj) {}
8146 private:
8147  template <typename base,
8148            typename std::enable_if<
8149              std::is_same<base, isl::pw_aff_list>{}, bool>::type = true>
8150  pw_aff_list(const base &obj) : isl::pw_aff_list(obj) {}
8151 public:
8152  static pw_aff_list from(const isl::pw_aff_list &obj) {
8153    return pw_aff_list(obj);
8154  }
8155  inline explicit pw_aff_list(const isl::ctx &ctx, int n);
8156  inline explicit pw_aff_list(const typed::pw_aff<Domain, Anonymous> &el);
8157  inline explicit pw_aff_list(const isl::ctx &ctx, const std::string &str);
8158  inline typed::pw_aff_list<Domain, Anonymous> add(const typed::pw_aff<Domain, Anonymous> &el) const;
8159  inline typed::pw_aff_list<Domain, Anonymous> add(const typed::aff<Domain, Anonymous> &el) const;
8160  inline typed::pw_aff<Domain, Anonymous> at(int index) const;
8161  inline typed::pw_aff<Domain, Anonymous> get_at(int index) const = delete;
8162  inline typed::pw_aff_list<Domain, Anonymous> drop(unsigned int first, unsigned int n) const;
8163  inline void foreach(const std::function<void(typed::pw_aff<Domain, Anonymous>)> &fn) const;
8164  inline void foreach_scc(const std::function<bool(typed::pw_aff<Domain, Anonymous>, typed::pw_aff<Domain, Anonymous>)> &follows, const std::function<void(typed::pw_aff_list<Domain, Anonymous>)> &fn) const;
8165  inline typed::pw_aff_list<Domain, Anonymous> set_at(int index, const typed::pw_aff<Domain, Anonymous> &el) const;
8166};
8167
8168template <typename Domain>
8169struct pw_multi_aff<Domain> : public isl::pw_multi_aff {
8170  template <typename...>
8171  friend struct aff;
8172  template <typename...>
8173  friend struct aff_list;
8174  template <typename...>
8175  friend struct basic_map;
8176  template <typename...>
8177  friend struct basic_set;
8178  template <typename...>
8179  friend struct fixed_box;
8180  template <typename...>
8181  friend struct id;
8182  template <typename...>
8183  friend struct id_list;
8184  template <typename...>
8185  friend struct map;
8186  template <typename...>
8187  friend struct map_list;
8188  template <typename...>
8189  friend struct multi_aff;
8190  template <typename...>
8191  friend struct multi_id;
8192  template <typename...>
8193  friend struct multi_pw_aff;
8194  template <typename...>
8195  friend struct multi_union_pw_aff;
8196  template <typename...>
8197  friend struct multi_val;
8198  template <typename...>
8199  friend struct point;
8200  template <typename...>
8201  friend struct pw_aff;
8202  template <typename...>
8203  friend struct pw_aff_list;
8204  template <typename...>
8205  friend struct pw_multi_aff;
8206  template <typename...>
8207  friend struct pw_multi_aff_list;
8208  template <typename...>
8209  friend struct set;
8210  template <typename...>
8211  friend struct set_list;
8212  template <typename...>
8213  friend struct space;
8214  template <typename...>
8215  friend struct union_map;
8216  template <typename...>
8217  friend struct union_pw_aff;
8218  template <typename...>
8219  friend struct union_pw_aff_list;
8220  template <typename...>
8221  friend struct union_pw_multi_aff;
8222  template <typename...>
8223  friend struct union_set;
8224  template <typename...>
8225  friend struct union_set_list;
8226  template <typename...>
8227  friend struct val;
8228  template <typename...>
8229  friend struct val_list;
8230
8231  pw_multi_aff() = default;
8232  template <typename Arg1,
8233            typename std::enable_if<
8234              std::is_base_of<Domain, Arg1>{},
8235            bool>::type = true>
8236  pw_multi_aff(const pw_multi_aff<Arg1> &obj) : isl::pw_multi_aff(obj) {}
8237 private:
8238  template <typename base,
8239            typename std::enable_if<
8240              std::is_same<base, isl::pw_multi_aff>{}, bool>::type = true>
8241  pw_multi_aff(const base &obj) : isl::pw_multi_aff(obj) {}
8242 public:
8243  static pw_multi_aff from(const isl::pw_multi_aff &obj) {
8244    return pw_multi_aff(obj);
8245  }
8246  inline /* implicit */ pw_multi_aff(const typed::multi_aff<Domain> &ma);
8247  inline /* implicit */ pw_multi_aff(const typed::pw_aff<Domain> &pa);
8248  inline explicit pw_multi_aff(const isl::ctx &ctx, const std::string &str);
8249  inline typed::multi_pw_aff<Domain> add(const typed::multi_pw_aff<Domain> &multi2) const;
8250  inline typed::multi_union_pw_aff<Domain> add(const typed::multi_union_pw_aff<Domain> &multi2) const;
8251  inline typed::pw_multi_aff<Domain> add(const typed::pw_multi_aff<Domain> &pma2) const;
8252  inline typed::union_pw_multi_aff<Domain> add(const typed::union_pw_multi_aff<Domain> &upma2) const;
8253  inline typed::pw_multi_aff<Domain> add(const typed::multi_aff<Domain> &pma2) const;
8254  inline typed::pw_multi_aff<Domain> add(const typed::pw_aff<Domain> &pma2) const;
8255  inline typed::pw_multi_aff<Domain> add_constant(const typed::multi_val<Domain> &mv) const;
8256  inline typed::pw_multi_aff<Domain> add_constant(const typed::val<Domain> &v) const;
8257  inline typed::pw_multi_aff<Domain> add_constant(long v) const;
8258  template <typename Range>
8259  inline typed::union_pw_multi_aff<Range> apply(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
8260  inline typed::map<Domain> as_map() const = delete;
8261  inline typed::multi_aff<Domain> as_multi_aff() const;
8262  inline typed::multi_union_pw_aff<Domain> as_multi_union_pw_aff() const;
8263  inline typed::pw_multi_aff<Domain> as_pw_multi_aff() const;
8264  inline typed::set<Domain> as_set() const;
8265  inline typed::union_map<Domain> as_union_map() const = delete;
8266  inline typed::pw_aff<Anonymous> at(int pos) const;
8267  inline typed::pw_aff<Domain> get_at(int pos) const = delete;
8268  inline typed::set<> bind(const typed::multi_id<Domain> &tuple) const;
8269  inline typed::pw_multi_aff<Domain> bind_domain(const typed::multi_id<> &tuple) const = delete;
8270  inline typed::pw_multi_aff<Domain> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
8271  inline typed::pw_multi_aff<Domain> coalesce() const;
8272  inline typed::set<> domain() const;
8273  inline typed::pw_multi_aff<Domain> domain_reverse() const = delete;
8274  inline typed::pw_multi_aff<Domain> drop_unused_params() const;
8275  inline typed::pw_multi_aff<Domain> extract_pw_multi_aff(const typed::space<Domain> &space) const;
8276  inline typed::pw_multi_aff<Domain> gist(const typed::set<> &set) const;
8277  inline typed::union_pw_multi_aff<Domain> gist(const typed::union_set<> &context) const;
8278  inline typed::pw_multi_aff<Domain> gist(const typed::basic_set<> &set) const;
8279  inline typed::pw_multi_aff<Domain> gist(const typed::point<> &set) const;
8280  inline typed::pw_multi_aff<Domain> gist_params(const typed::set<> &set) const;
8281  inline typed::pw_multi_aff<Domain> gist_params(const typed::basic_set<> &set) const;
8282  inline typed::pw_multi_aff<Domain> gist_params(const typed::point<> &set) const;
8283  inline typed::multi_pw_aff<Domain, Domain> identity() const;
8284  template <typename Arg1>
8285  inline typed::pw_multi_aff<Arg1, Domain> insert_domain(const typed::space<Arg1> &domain) const;
8286  inline typed::pw_multi_aff<Domain> intersect_domain(const typed::set<> &set) const = delete;
8287  inline typed::union_pw_multi_aff<Domain> intersect_domain(const typed::space<> &space) const = delete;
8288  inline typed::union_pw_multi_aff<Domain> intersect_domain(const typed::union_set<> &uset) const = delete;
8289  inline typed::pw_multi_aff<Domain> intersect_domain(const typed::basic_set<> &set) const = delete;
8290  inline typed::pw_multi_aff<Domain> intersect_domain(const typed::point<> &set) const = delete;
8291  inline typed::union_pw_multi_aff<Domain> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
8292  inline typed::pw_multi_aff<Domain> intersect_params(const typed::set<> &set) const;
8293  inline typed::pw_multi_aff<Domain> intersect_params(const typed::basic_set<> &set) const;
8294  inline typed::pw_multi_aff<Domain> intersect_params(const typed::point<> &set) const;
8295  inline typed::pw_aff_list<Anonymous> list() const;
8296  inline typed::multi_pw_aff<Domain> max(const typed::multi_pw_aff<Domain> &multi2) const;
8297  inline typed::multi_val<Domain> max_multi_val() const;
8298  inline typed::multi_pw_aff<Domain> min(const typed::multi_pw_aff<Domain> &multi2) const;
8299  inline typed::multi_val<Domain> min_multi_val() const;
8300  inline typed::multi_pw_aff<Domain> neg() const;
8301  inline typed::pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
8302  inline typed::union_pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
8303  inline typed::pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::multi_aff<> &pma2) const = delete;
8304  inline typed::pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::pw_aff<> &pma2) const = delete;
8305  template <typename Range>
8306  inline typed::multi_pw_aff<pair<Domain, Range>> product(const typed::multi_pw_aff<Range> &multi2) const;
8307  template <typename Range>
8308  inline typed::pw_multi_aff<pair<Domain, Range>> product(const typed::pw_multi_aff<Range> &pma2) const;
8309  template <typename Range>
8310  inline typed::pw_multi_aff<pair<Domain, Range>> product(const typed::multi_aff<Range> &pma2) const;
8311  inline typed::pw_multi_aff<pair<Domain, Anonymous>> product(const typed::pw_aff<Anonymous> &pma2) const;
8312  inline typed::multi_pw_aff<Domain> pullback(const typed::multi_pw_aff<> &mpa2) const = delete;
8313  inline typed::pw_multi_aff<Domain> pullback(const typed::multi_aff<> &ma) const = delete;
8314  inline typed::pw_multi_aff<Domain> pullback(const typed::pw_multi_aff<> &pma2) const = delete;
8315  inline typed::union_pw_multi_aff<Domain> pullback(const typed::union_pw_multi_aff<> &upma2) const = delete;
8316  inline typed::pw_multi_aff_list<Domain> pw_multi_aff_list() const;
8317  inline typed::pw_multi_aff<Domain> range_factor_domain() const = delete;
8318  inline typed::pw_multi_aff<Domain> range_factor_range() const = delete;
8319  inline typed::multi_pw_aff<Domain> range_product(const typed::multi_pw_aff<> &multi2) const = delete;
8320  inline typed::multi_union_pw_aff<Domain> range_product(const typed::multi_union_pw_aff<> &multi2) const = delete;
8321  inline typed::pw_multi_aff<Domain> range_product(const typed::pw_multi_aff<> &pma2) const = delete;
8322  inline typed::union_pw_multi_aff<Domain> range_product(const typed::union_pw_multi_aff<> &upma2) const = delete;
8323  inline typed::pw_multi_aff<Domain> range_product(const typed::multi_aff<> &pma2) const = delete;
8324  inline typed::pw_multi_aff<Domain> range_product(const typed::pw_aff<> &pma2) const = delete;
8325  inline typed::id<Domain> get_range_tuple_id() const = delete;
8326  inline typed::pw_multi_aff<Domain> scale(const typed::multi_val<Domain> &mv) const;
8327  inline typed::pw_multi_aff<Domain> scale(const typed::val<Domain> &v) const;
8328  inline typed::pw_multi_aff<Domain> scale(long v) const;
8329  inline typed::pw_multi_aff<Domain> scale_down(const typed::multi_val<Domain> &mv) const;
8330  inline typed::pw_multi_aff<Domain> scale_down(const typed::val<Domain> &v) const;
8331  inline typed::pw_multi_aff<Domain> scale_down(long v) const;
8332  inline typed::multi_pw_aff<Domain> set_at(int pos, const typed::pw_aff<Anonymous> &el) const;
8333  inline typed::multi_union_pw_aff<Domain> set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const;
8334  template <typename Domain2>
8335  inline typed::pw_multi_aff<Domain2> set_range_tuple(const typed::id<Anonymous> &id) const;
8336  template <typename Domain2>
8337  inline typed::pw_multi_aff<Domain2> set_range_tuple(const std::string &id) const;
8338  inline typed::space<Domain> space() const;
8339  inline typed::space<Domain> get_space() const = delete;
8340  inline typed::multi_pw_aff<Domain> sub(const typed::multi_pw_aff<Domain> &multi2) const;
8341  inline typed::multi_union_pw_aff<Domain> sub(const typed::multi_union_pw_aff<Domain> &multi2) const;
8342  inline typed::pw_multi_aff<Domain> sub(const typed::pw_multi_aff<Domain> &pma2) const;
8343  inline typed::union_pw_multi_aff<Domain> sub(const typed::union_pw_multi_aff<Domain> &upma2) const;
8344  inline typed::pw_multi_aff<Domain> sub(const typed::multi_aff<Domain> &pma2) const;
8345  inline typed::pw_multi_aff<Domain> sub(const typed::pw_aff<Domain> &pma2) const;
8346  inline typed::pw_multi_aff<Domain> subtract_domain(const typed::set<> &set) const = delete;
8347  inline typed::union_pw_multi_aff<Domain> subtract_domain(const typed::space<> &space) const = delete;
8348  inline typed::union_pw_multi_aff<Domain> subtract_domain(const typed::union_set<> &uset) const = delete;
8349  inline typed::pw_multi_aff<Domain> subtract_domain(const typed::basic_set<> &set) const = delete;
8350  inline typed::pw_multi_aff<Domain> subtract_domain(const typed::point<> &set) const = delete;
8351  inline typed::multi_pw_aff<Domain> to_multi_pw_aff() const;
8352  inline typed::union_pw_multi_aff<Domain> to_union_pw_multi_aff() const;
8353  template <typename Arg1>
8354  inline typed::multi_pw_aff<Arg1, Domain> unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const;
8355  inline typed::multi_pw_aff<Domain> union_add(const typed::multi_pw_aff<Domain> &mpa2) const;
8356  inline typed::multi_union_pw_aff<Domain> union_add(const typed::multi_union_pw_aff<Domain> &mupa2) const;
8357  inline typed::pw_multi_aff<Domain> union_add(const typed::pw_multi_aff<Domain> &pma2) const;
8358  inline typed::union_pw_multi_aff<Domain> union_add(const typed::union_pw_multi_aff<Domain> &upma2) const;
8359  inline typed::pw_multi_aff<Domain> union_add(const typed::multi_aff<Domain> &pma2) const;
8360  inline typed::pw_multi_aff<Domain> union_add(const typed::pw_aff<Domain> &pma2) const;
8361};
8362
8363template <typename Domain, typename Range>
8364struct pw_multi_aff<Domain, Range> : public isl::pw_multi_aff {
8365  template <typename...>
8366  friend struct aff;
8367  template <typename...>
8368  friend struct aff_list;
8369  template <typename...>
8370  friend struct basic_map;
8371  template <typename...>
8372  friend struct basic_set;
8373  template <typename...>
8374  friend struct fixed_box;
8375  template <typename...>
8376  friend struct id;
8377  template <typename...>
8378  friend struct id_list;
8379  template <typename...>
8380  friend struct map;
8381  template <typename...>
8382  friend struct map_list;
8383  template <typename...>
8384  friend struct multi_aff;
8385  template <typename...>
8386  friend struct multi_id;
8387  template <typename...>
8388  friend struct multi_pw_aff;
8389  template <typename...>
8390  friend struct multi_union_pw_aff;
8391  template <typename...>
8392  friend struct multi_val;
8393  template <typename...>
8394  friend struct point;
8395  template <typename...>
8396  friend struct pw_aff;
8397  template <typename...>
8398  friend struct pw_aff_list;
8399  template <typename...>
8400  friend struct pw_multi_aff;
8401  template <typename...>
8402  friend struct pw_multi_aff_list;
8403  template <typename...>
8404  friend struct set;
8405  template <typename...>
8406  friend struct set_list;
8407  template <typename...>
8408  friend struct space;
8409  template <typename...>
8410  friend struct union_map;
8411  template <typename...>
8412  friend struct union_pw_aff;
8413  template <typename...>
8414  friend struct union_pw_aff_list;
8415  template <typename...>
8416  friend struct union_pw_multi_aff;
8417  template <typename...>
8418  friend struct union_set;
8419  template <typename...>
8420  friend struct union_set_list;
8421  template <typename...>
8422  friend struct val;
8423  template <typename...>
8424  friend struct val_list;
8425
8426  pw_multi_aff() = default;
8427  template <typename Arg1, typename Arg2,
8428            typename std::enable_if<
8429              std::is_base_of<Domain, Arg1>{} &&
8430              std::is_base_of<Range, Arg2>{},
8431            bool>::type = true>
8432  pw_multi_aff(const pw_multi_aff<Arg1, Arg2> &obj) : isl::pw_multi_aff(obj) {}
8433 private:
8434  template <typename base,
8435            typename std::enable_if<
8436              std::is_same<base, isl::pw_multi_aff>{}, bool>::type = true>
8437  pw_multi_aff(const base &obj) : isl::pw_multi_aff(obj) {}
8438 public:
8439  static pw_multi_aff from(const isl::pw_multi_aff &obj) {
8440    return pw_multi_aff(obj);
8441  }
8442  inline /* implicit */ pw_multi_aff(const typed::multi_aff<Domain, Range> &ma);
8443  inline /* implicit */ pw_multi_aff(const typed::pw_aff<Domain, Range> &pa);
8444  inline explicit pw_multi_aff(const isl::ctx &ctx, const std::string &str);
8445  inline typed::multi_pw_aff<Domain, Range> add(const typed::multi_pw_aff<Domain, Range> &multi2) const;
8446  inline typed::multi_union_pw_aff<Domain, Range> add(const typed::multi_union_pw_aff<Domain, Range> &multi2) const;
8447  inline typed::pw_multi_aff<Domain, Range> add(const typed::pw_multi_aff<Domain, Range> &pma2) const;
8448  inline typed::union_pw_multi_aff<Domain, Range> add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
8449  inline typed::pw_multi_aff<Domain, Range> add(const typed::multi_aff<Domain, Range> &pma2) const;
8450  inline typed::pw_multi_aff<Domain, Range> add(const typed::pw_aff<Domain, Range> &pma2) const;
8451  inline typed::pw_multi_aff<Domain, Range> add_constant(const typed::multi_val<Range> &mv) const;
8452  inline typed::pw_multi_aff<Domain, Range> add_constant(const typed::val<Range> &v) const;
8453  inline typed::pw_multi_aff<Domain, Range> add_constant(long v) const;
8454  template <typename Range2>
8455  inline typed::union_pw_multi_aff<Domain, Range2> apply(const typed::union_pw_multi_aff<Range, Range2> &upma2) const;
8456  inline typed::map<Domain, Range> as_map() const;
8457  inline typed::multi_aff<Domain, Range> as_multi_aff() const;
8458  inline typed::multi_union_pw_aff<Domain, Range> as_multi_union_pw_aff() const;
8459  inline typed::pw_multi_aff<Domain, Range> as_pw_multi_aff() const;
8460  inline typed::set<Domain, Range> as_set() const = delete;
8461  inline typed::union_map<Domain, Range> as_union_map() const;
8462  inline typed::pw_aff<Domain, Anonymous> at(int pos) const;
8463  inline typed::pw_aff<Domain, Range> get_at(int pos) const = delete;
8464  inline typed::set<Domain> bind(const typed::multi_id<Range> &tuple) const;
8465  inline typed::pw_multi_aff<Range> bind_domain(const typed::multi_id<Domain> &tuple) const;
8466  inline typed::pw_multi_aff<Domain, Range> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
8467  inline typed::pw_multi_aff<Domain, Range> coalesce() const;
8468  inline typed::set<Domain> domain() const;
8469  inline typed::pw_multi_aff<Domain, Range> domain_reverse() const = delete;
8470  inline typed::pw_multi_aff<Domain, Range> drop_unused_params() const;
8471  inline typed::pw_multi_aff<Domain, Range> extract_pw_multi_aff(const typed::space<Domain, Range> &space) const;
8472  inline typed::pw_multi_aff<Domain, Range> gist(const typed::set<Domain> &set) const;
8473  inline typed::union_pw_multi_aff<Domain, Range> gist(const typed::union_set<Domain> &context) const;
8474  inline typed::pw_multi_aff<Domain, Range> gist(const typed::basic_set<Domain> &set) const;
8475  inline typed::pw_multi_aff<Domain, Range> gist(const typed::point<Domain> &set) const;
8476  inline typed::pw_multi_aff<Domain, Range> gist_params(const typed::set<> &set) const;
8477  inline typed::pw_multi_aff<Domain, Range> gist_params(const typed::basic_set<> &set) const;
8478  inline typed::pw_multi_aff<Domain, Range> gist_params(const typed::point<> &set) const;
8479  inline typed::multi_pw_aff<Domain, Range> identity() const;
8480  inline typed::pw_multi_aff<Domain, Range> insert_domain(const typed::space<> &domain) const = delete;
8481  inline typed::pw_multi_aff<Domain, Range> intersect_domain(const typed::set<Domain> &set) const;
8482  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain(const typed::space<Domain> &space) const;
8483  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain(const typed::union_set<Domain> &uset) const;
8484  inline typed::pw_multi_aff<Domain, Range> intersect_domain(const typed::basic_set<Domain> &set) const;
8485  inline typed::pw_multi_aff<Domain, Range> intersect_domain(const typed::point<Domain> &set) const;
8486  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
8487  inline typed::pw_multi_aff<Domain, Range> intersect_params(const typed::set<> &set) const;
8488  inline typed::pw_multi_aff<Domain, Range> intersect_params(const typed::basic_set<> &set) const;
8489  inline typed::pw_multi_aff<Domain, Range> intersect_params(const typed::point<> &set) const;
8490  inline typed::pw_aff_list<Domain, Anonymous> list() const;
8491  inline typed::multi_pw_aff<Domain, Range> max(const typed::multi_pw_aff<Domain, Range> &multi2) const;
8492  inline typed::multi_val<Range> max_multi_val() const;
8493  inline typed::multi_pw_aff<Domain, Range> min(const typed::multi_pw_aff<Domain, Range> &multi2) const;
8494  inline typed::multi_val<Range> min_multi_val() const;
8495  inline typed::multi_pw_aff<Domain, Range> neg() const;
8496  inline typed::pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
8497  inline typed::union_pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
8498  inline typed::pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::multi_aff<> &pma2) const = delete;
8499  inline typed::pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::pw_aff<> &pma2) const = delete;
8500  template <typename Domain2, typename Range2>
8501  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const;
8502  template <typename Domain2, typename Range2>
8503  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::pw_multi_aff<Domain2, Range2> &pma2) const;
8504  template <typename Domain2, typename Range2>
8505  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::multi_aff<Domain2, Range2> &pma2) const;
8506  template <typename Domain2>
8507  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> product(const typed::pw_aff<Domain2, Anonymous> &pma2) const;
8508  template <typename Domain2>
8509  inline typed::multi_pw_aff<Domain2, Range> pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const;
8510  inline typed::multi_pw_aff<Range> pullback(const typed::multi_pw_aff<Domain> &mpa2) const;
8511  template <typename Domain2>
8512  inline typed::pw_multi_aff<Domain2, Range> pullback(const typed::multi_aff<Domain2, Domain> &ma) const;
8513  inline typed::pw_multi_aff<Range> pullback(const typed::multi_aff<Domain> &ma) const;
8514  template <typename Domain2>
8515  inline typed::pw_multi_aff<Domain2, Range> pullback(const typed::pw_multi_aff<Domain2, Domain> &pma2) const;
8516  inline typed::pw_multi_aff<Range> pullback(const typed::pw_multi_aff<Domain> &pma2) const;
8517  template <typename Domain2>
8518  inline typed::union_pw_multi_aff<Domain2, Range> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const;
8519  inline typed::union_pw_multi_aff<Range> pullback(const typed::union_pw_multi_aff<Domain> &upma2) const;
8520  inline typed::pw_multi_aff_list<Domain, Range> pw_multi_aff_list() const;
8521  inline typed::pw_multi_aff<Domain, Range> range_factor_domain() const = delete;
8522  inline typed::pw_multi_aff<Domain, Range> range_factor_range() const = delete;
8523  template <typename Range2>
8524  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const;
8525  template <typename Range2>
8526  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const;
8527  template <typename Range2>
8528  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> range_product(const typed::pw_multi_aff<Domain, Range2> &pma2) const;
8529  template <typename Range2>
8530  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const;
8531  template <typename Range2>
8532  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_aff<Domain, Range2> &pma2) const;
8533  inline typed::pw_multi_aff<Domain, pair<Range, Anonymous>> range_product(const typed::pw_aff<Domain, Anonymous> &pma2) const;
8534  inline typed::id<Domain, Range> get_range_tuple_id() const = delete;
8535  inline typed::pw_multi_aff<Domain, Range> scale(const typed::multi_val<Range> &mv) const;
8536  inline typed::pw_multi_aff<Domain, Range> scale(const typed::val<Range> &v) const;
8537  inline typed::pw_multi_aff<Domain, Range> scale(long v) const;
8538  inline typed::pw_multi_aff<Domain, Range> scale_down(const typed::multi_val<Range> &mv) const;
8539  inline typed::pw_multi_aff<Domain, Range> scale_down(const typed::val<Range> &v) const;
8540  inline typed::pw_multi_aff<Domain, Range> scale_down(long v) const;
8541  inline typed::multi_pw_aff<Domain, Range> set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const;
8542  inline typed::multi_union_pw_aff<Domain, Range> set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const;
8543  template <typename Range2>
8544  inline typed::pw_multi_aff<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
8545  template <typename Range2>
8546  inline typed::pw_multi_aff<Domain, Range2> set_range_tuple(const std::string &id) const;
8547  inline typed::space<Domain, Range> space() const;
8548  inline typed::space<Domain, Range> get_space() const = delete;
8549  inline typed::multi_pw_aff<Domain, Range> sub(const typed::multi_pw_aff<Domain, Range> &multi2) const;
8550  inline typed::multi_union_pw_aff<Domain, Range> sub(const typed::multi_union_pw_aff<Domain, Range> &multi2) const;
8551  inline typed::pw_multi_aff<Domain, Range> sub(const typed::pw_multi_aff<Domain, Range> &pma2) const;
8552  inline typed::union_pw_multi_aff<Domain, Range> sub(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
8553  inline typed::pw_multi_aff<Domain, Range> sub(const typed::multi_aff<Domain, Range> &pma2) const;
8554  inline typed::pw_multi_aff<Domain, Range> sub(const typed::pw_aff<Domain, Range> &pma2) const;
8555  inline typed::pw_multi_aff<Domain, Range> subtract_domain(const typed::set<Domain> &set) const;
8556  inline typed::union_pw_multi_aff<Domain, Range> subtract_domain(const typed::space<Domain> &space) const;
8557  inline typed::union_pw_multi_aff<Domain, Range> subtract_domain(const typed::union_set<Domain> &uset) const;
8558  inline typed::pw_multi_aff<Domain, Range> subtract_domain(const typed::basic_set<Domain> &set) const;
8559  inline typed::pw_multi_aff<Domain, Range> subtract_domain(const typed::point<Domain> &set) const;
8560  inline typed::multi_pw_aff<Domain, Range> to_multi_pw_aff() const;
8561  inline typed::union_pw_multi_aff<Domain, Range> to_union_pw_multi_aff() const;
8562  inline typed::multi_pw_aff<Domain, Range> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
8563  inline typed::multi_pw_aff<Domain, Range> union_add(const typed::multi_pw_aff<Domain, Range> &mpa2) const;
8564  inline typed::multi_union_pw_aff<Domain, Range> union_add(const typed::multi_union_pw_aff<Domain, Range> &mupa2) const;
8565  inline typed::pw_multi_aff<Domain, Range> union_add(const typed::pw_multi_aff<Domain, Range> &pma2) const;
8566  inline typed::union_pw_multi_aff<Domain, Range> union_add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
8567  inline typed::pw_multi_aff<Domain, Range> union_add(const typed::multi_aff<Domain, Range> &pma2) const;
8568  inline typed::pw_multi_aff<Domain, Range> union_add(const typed::pw_aff<Domain, Range> &pma2) const;
8569};
8570
8571template <typename Domain2, typename Range2, typename Range>
8572struct pw_multi_aff<pair<Domain2, Range2>, Range> : public isl::pw_multi_aff {
8573  template <typename...>
8574  friend struct aff;
8575  template <typename...>
8576  friend struct aff_list;
8577  template <typename...>
8578  friend struct basic_map;
8579  template <typename...>
8580  friend struct basic_set;
8581  template <typename...>
8582  friend struct fixed_box;
8583  template <typename...>
8584  friend struct id;
8585  template <typename...>
8586  friend struct id_list;
8587  template <typename...>
8588  friend struct map;
8589  template <typename...>
8590  friend struct map_list;
8591  template <typename...>
8592  friend struct multi_aff;
8593  template <typename...>
8594  friend struct multi_id;
8595  template <typename...>
8596  friend struct multi_pw_aff;
8597  template <typename...>
8598  friend struct multi_union_pw_aff;
8599  template <typename...>
8600  friend struct multi_val;
8601  template <typename...>
8602  friend struct point;
8603  template <typename...>
8604  friend struct pw_aff;
8605  template <typename...>
8606  friend struct pw_aff_list;
8607  template <typename...>
8608  friend struct pw_multi_aff;
8609  template <typename...>
8610  friend struct pw_multi_aff_list;
8611  template <typename...>
8612  friend struct set;
8613  template <typename...>
8614  friend struct set_list;
8615  template <typename...>
8616  friend struct space;
8617  template <typename...>
8618  friend struct union_map;
8619  template <typename...>
8620  friend struct union_pw_aff;
8621  template <typename...>
8622  friend struct union_pw_aff_list;
8623  template <typename...>
8624  friend struct union_pw_multi_aff;
8625  template <typename...>
8626  friend struct union_set;
8627  template <typename...>
8628  friend struct union_set_list;
8629  template <typename...>
8630  friend struct val;
8631  template <typename...>
8632  friend struct val_list;
8633
8634  pw_multi_aff() = default;
8635  template <typename Arg1, typename Arg2, typename Arg3,
8636            typename std::enable_if<
8637              std::is_base_of<Domain2, Arg1>{} &&
8638              std::is_base_of<Range2, Arg2>{} &&
8639              std::is_base_of<Range, Arg3>{},
8640            bool>::type = true>
8641  pw_multi_aff(const pw_multi_aff<pair<Arg1, Arg2>, Arg3> &obj) : isl::pw_multi_aff(obj) {}
8642 private:
8643  template <typename base,
8644            typename std::enable_if<
8645              std::is_same<base, isl::pw_multi_aff>{}, bool>::type = true>
8646  pw_multi_aff(const base &obj) : isl::pw_multi_aff(obj) {}
8647 public:
8648  static pw_multi_aff from(const isl::pw_multi_aff &obj) {
8649    return pw_multi_aff(obj);
8650  }
8651  inline /* implicit */ pw_multi_aff(const typed::multi_aff<pair<Domain2, Range2>, Range> &ma);
8652  inline /* implicit */ pw_multi_aff(const typed::pw_aff<pair<Domain2, Range2>, Range> &pa);
8653  inline explicit pw_multi_aff(const isl::ctx &ctx, const std::string &str);
8654  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
8655  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
8656  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const;
8657  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const;
8658  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> add(const typed::multi_aff<pair<Domain2, Range2>, Range> &pma2) const;
8659  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> add(const typed::pw_aff<pair<Domain2, Range2>, Range> &pma2) const;
8660  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> add_constant(const typed::multi_val<Range> &mv) const;
8661  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> add_constant(const typed::val<Range> &v) const;
8662  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> add_constant(long v) const;
8663  template <typename Arg2>
8664  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2> apply(const typed::union_pw_multi_aff<Range, Arg2> &upma2) const;
8665  inline typed::map<pair<Domain2, Range2>, Range> as_map() const;
8666  inline typed::multi_aff<pair<Domain2, Range2>, Range> as_multi_aff() const;
8667  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> as_multi_union_pw_aff() const;
8668  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> as_pw_multi_aff() const;
8669  inline typed::set<pair<Domain2, Range2>, Range> as_set() const = delete;
8670  inline typed::union_map<pair<Domain2, Range2>, Range> as_union_map() const;
8671  inline typed::pw_aff<pair<Domain2, Range2>, Anonymous> at(int pos) const;
8672  inline typed::pw_aff<pair<Domain2, Range2>, Range> get_at(int pos) const = delete;
8673  inline typed::set<pair<Domain2, Range2>> bind(const typed::multi_id<Range> &tuple) const;
8674  inline typed::pw_multi_aff<Range> bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const;
8675  inline typed::pw_multi_aff<Range2, Range> bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const;
8676  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> coalesce() const;
8677  inline typed::set<pair<Domain2, Range2>> domain() const;
8678  inline typed::pw_multi_aff<pair<Range2, Domain2>, Range> domain_reverse() const;
8679  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> drop_unused_params() const;
8680  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> extract_pw_multi_aff(const typed::space<pair<Domain2, Range2>, Range> &space) const;
8681  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> gist(const typed::set<pair<Domain2, Range2>> &set) const;
8682  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> gist(const typed::union_set<pair<Domain2, Range2>> &context) const;
8683  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> gist(const typed::basic_set<pair<Domain2, Range2>> &set) const;
8684  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> gist(const typed::point<pair<Domain2, Range2>> &set) const;
8685  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> gist_params(const typed::set<> &set) const;
8686  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> gist_params(const typed::basic_set<> &set) const;
8687  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> gist_params(const typed::point<> &set) const;
8688  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> identity() const;
8689  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> insert_domain(const typed::space<> &domain) const = delete;
8690  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::set<pair<Domain2, Range2>> &set) const;
8691  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::space<pair<Domain2, Range2>> &space) const;
8692  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const;
8693  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::basic_set<pair<Domain2, Range2>> &set) const;
8694  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain(const typed::point<pair<Domain2, Range2>> &set) const;
8695  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> intersect_domain_wrapped_domain(const typed::union_set<Domain2> &uset) const;
8696  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> intersect_params(const typed::set<> &set) const;
8697  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> intersect_params(const typed::basic_set<> &set) const;
8698  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> intersect_params(const typed::point<> &set) const;
8699  inline typed::pw_aff_list<pair<Domain2, Range2>, Anonymous> list() const;
8700  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> max(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
8701  inline typed::multi_val<Range> max_multi_val() const;
8702  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> min(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
8703  inline typed::multi_val<Range> min_multi_val() const;
8704  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> neg() const;
8705  template <typename Domain3>
8706  inline typed::pw_multi_aff<pair<Domain3, Range2>, Range> preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain2> &pma2) const;
8707  template <typename Domain3>
8708  inline typed::union_pw_multi_aff<pair<Domain3, Range2>, Range> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain2> &upma2) const;
8709  template <typename Domain3>
8710  inline typed::pw_multi_aff<pair<Domain3, Range2>, Range> preimage_domain_wrapped_domain(const typed::multi_aff<Domain3, Domain2> &pma2) const;
8711  template <typename Domain3>
8712  inline typed::pw_multi_aff<pair<Domain3, Range2>, Range> preimage_domain_wrapped_domain(const typed::pw_aff<Domain3, Domain2> &pma2) const;
8713  template <typename Arg2, typename Arg3>
8714  inline typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> product(const typed::multi_pw_aff<Arg2, Arg3> &multi2) const;
8715  template <typename Arg2, typename Arg3>
8716  inline typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> product(const typed::pw_multi_aff<Arg2, Arg3> &pma2) const;
8717  template <typename Arg2, typename Arg3>
8718  inline typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> product(const typed::multi_aff<Arg2, Arg3> &pma2) const;
8719  template <typename Arg2>
8720  inline typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>> product(const typed::pw_aff<Arg2, Anonymous> &pma2) const;
8721  template <typename Arg2>
8722  inline typed::multi_pw_aff<Arg2, Range> pullback(const typed::multi_pw_aff<Arg2, pair<Domain2, Range2>> &mpa2) const;
8723  inline typed::multi_pw_aff<Range> pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa2) const;
8724  template <typename Arg2>
8725  inline typed::pw_multi_aff<Arg2, Range> pullback(const typed::multi_aff<Arg2, pair<Domain2, Range2>> &ma) const;
8726  inline typed::pw_multi_aff<Range> pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma) const;
8727  template <typename Arg2>
8728  inline typed::pw_multi_aff<Arg2, Range> pullback(const typed::pw_multi_aff<Arg2, pair<Domain2, Range2>> &pma2) const;
8729  inline typed::pw_multi_aff<Range> pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma2) const;
8730  template <typename Arg2>
8731  inline typed::union_pw_multi_aff<Arg2, Range> pullback(const typed::union_pw_multi_aff<Arg2, pair<Domain2, Range2>> &upma2) const;
8732  inline typed::union_pw_multi_aff<Range> pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma2) const;
8733  inline typed::pw_multi_aff_list<pair<Domain2, Range2>, Range> pw_multi_aff_list() const;
8734  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> range_factor_domain() const = delete;
8735  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> range_factor_range() const = delete;
8736  template <typename Arg2>
8737  inline typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const;
8738  template <typename Arg2>
8739  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const;
8740  template <typename Arg2>
8741  inline typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg2> &pma2) const;
8742  template <typename Arg2>
8743  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2> &upma2) const;
8744  template <typename Arg2>
8745  inline typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> range_product(const typed::multi_aff<pair<Domain2, Range2>, Arg2> &pma2) const;
8746  inline typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Anonymous>> range_product(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pma2) const;
8747  inline typed::id<pair<Domain2, Range2>, Range> get_range_tuple_id() const = delete;
8748  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> scale(const typed::multi_val<Range> &mv) const;
8749  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> scale(const typed::val<Range> &v) const;
8750  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> scale(long v) const;
8751  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> scale_down(const typed::multi_val<Range> &mv) const;
8752  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> scale_down(const typed::val<Range> &v) const;
8753  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> scale_down(long v) const;
8754  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
8755  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const;
8756  template <typename Arg1>
8757  inline typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const typed::id<Anonymous> &id) const;
8758  template <typename Arg1>
8759  inline typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> set_range_tuple(const std::string &id) const;
8760  inline typed::space<pair<Domain2, Range2>, Range> space() const;
8761  inline typed::space<pair<Domain2, Range2>, Range> get_space() const = delete;
8762  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
8763  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const;
8764  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const;
8765  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> sub(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const;
8766  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> sub(const typed::multi_aff<pair<Domain2, Range2>, Range> &pma2) const;
8767  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> sub(const typed::pw_aff<pair<Domain2, Range2>, Range> &pma2) const;
8768  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> subtract_domain(const typed::set<pair<Domain2, Range2>> &set) const;
8769  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> subtract_domain(const typed::space<pair<Domain2, Range2>> &space) const;
8770  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> subtract_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const;
8771  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> subtract_domain(const typed::basic_set<pair<Domain2, Range2>> &set) const;
8772  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> subtract_domain(const typed::point<pair<Domain2, Range2>> &set) const;
8773  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> to_multi_pw_aff() const;
8774  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> to_union_pw_multi_aff() const;
8775  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
8776  inline typed::multi_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &mpa2) const;
8777  inline typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &mupa2) const;
8778  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const;
8779  inline typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> union_add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const;
8780  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> union_add(const typed::multi_aff<pair<Domain2, Range2>, Range> &pma2) const;
8781  inline typed::pw_multi_aff<pair<Domain2, Range2>, Range> union_add(const typed::pw_aff<pair<Domain2, Range2>, Range> &pma2) const;
8782};
8783
8784template <typename Domain, typename Range, typename Range2>
8785struct pw_multi_aff<Domain, pair<Range, Range2>> : public isl::pw_multi_aff {
8786  template <typename...>
8787  friend struct aff;
8788  template <typename...>
8789  friend struct aff_list;
8790  template <typename...>
8791  friend struct basic_map;
8792  template <typename...>
8793  friend struct basic_set;
8794  template <typename...>
8795  friend struct fixed_box;
8796  template <typename...>
8797  friend struct id;
8798  template <typename...>
8799  friend struct id_list;
8800  template <typename...>
8801  friend struct map;
8802  template <typename...>
8803  friend struct map_list;
8804  template <typename...>
8805  friend struct multi_aff;
8806  template <typename...>
8807  friend struct multi_id;
8808  template <typename...>
8809  friend struct multi_pw_aff;
8810  template <typename...>
8811  friend struct multi_union_pw_aff;
8812  template <typename...>
8813  friend struct multi_val;
8814  template <typename...>
8815  friend struct point;
8816  template <typename...>
8817  friend struct pw_aff;
8818  template <typename...>
8819  friend struct pw_aff_list;
8820  template <typename...>
8821  friend struct pw_multi_aff;
8822  template <typename...>
8823  friend struct pw_multi_aff_list;
8824  template <typename...>
8825  friend struct set;
8826  template <typename...>
8827  friend struct set_list;
8828  template <typename...>
8829  friend struct space;
8830  template <typename...>
8831  friend struct union_map;
8832  template <typename...>
8833  friend struct union_pw_aff;
8834  template <typename...>
8835  friend struct union_pw_aff_list;
8836  template <typename...>
8837  friend struct union_pw_multi_aff;
8838  template <typename...>
8839  friend struct union_set;
8840  template <typename...>
8841  friend struct union_set_list;
8842  template <typename...>
8843  friend struct val;
8844  template <typename...>
8845  friend struct val_list;
8846
8847  pw_multi_aff() = default;
8848  template <typename Arg1, typename Arg2, typename Arg3,
8849            typename std::enable_if<
8850              std::is_base_of<Domain, Arg1>{} &&
8851              std::is_base_of<Range, Arg2>{} &&
8852              std::is_base_of<Range2, Arg3>{},
8853            bool>::type = true>
8854  pw_multi_aff(const pw_multi_aff<Arg1, pair<Arg2, Arg3>> &obj) : isl::pw_multi_aff(obj) {}
8855 private:
8856  template <typename base,
8857            typename std::enable_if<
8858              std::is_same<base, isl::pw_multi_aff>{}, bool>::type = true>
8859  pw_multi_aff(const base &obj) : isl::pw_multi_aff(obj) {}
8860 public:
8861  static pw_multi_aff from(const isl::pw_multi_aff &obj) {
8862    return pw_multi_aff(obj);
8863  }
8864  inline /* implicit */ pw_multi_aff(const typed::multi_aff<Domain, pair<Range, Range2>> &ma);
8865  inline /* implicit */ pw_multi_aff(const typed::pw_aff<Domain, pair<Range, Range2>> &pa);
8866  inline explicit pw_multi_aff(const isl::ctx &ctx, const std::string &str);
8867  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> add(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
8868  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> add(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
8869  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const;
8870  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
8871  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::multi_aff<Domain, pair<Range, Range2>> &pma2) const;
8872  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::pw_aff<Domain, pair<Range, Range2>> &pma2) const;
8873  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> add_constant(const typed::multi_val<pair<Range, Range2>> &mv) const;
8874  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> add_constant(const typed::val<pair<Range, Range2>> &v) const;
8875  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> add_constant(long v) const;
8876  template <typename Arg3>
8877  inline typed::union_pw_multi_aff<Domain, Arg3> apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg3> &upma2) const;
8878  inline typed::map<Domain, pair<Range, Range2>> as_map() const;
8879  inline typed::multi_aff<Domain, pair<Range, Range2>> as_multi_aff() const;
8880  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> as_multi_union_pw_aff() const;
8881  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> as_pw_multi_aff() const;
8882  inline typed::set<Domain, pair<Range, Range2>> as_set() const = delete;
8883  inline typed::union_map<Domain, pair<Range, Range2>> as_union_map() const;
8884  inline typed::pw_aff<Domain, Anonymous> at(int pos) const;
8885  inline typed::pw_aff<Domain, pair<Range, Range2>> get_at(int pos) const = delete;
8886  inline typed::set<Domain> bind(const typed::multi_id<pair<Range, Range2>> &tuple) const;
8887  inline typed::pw_multi_aff<pair<Range, Range2>> bind_domain(const typed::multi_id<Domain> &tuple) const;
8888  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> bind_domain_wrapped_domain(const typed::multi_id<> &tuple) const = delete;
8889  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> coalesce() const;
8890  inline typed::set<Domain> domain() const;
8891  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> domain_reverse() const = delete;
8892  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> drop_unused_params() const;
8893  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> extract_pw_multi_aff(const typed::space<Domain, pair<Range, Range2>> &space) const;
8894  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> gist(const typed::set<Domain> &set) const;
8895  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> gist(const typed::union_set<Domain> &context) const;
8896  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> gist(const typed::basic_set<Domain> &set) const;
8897  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> gist(const typed::point<Domain> &set) const;
8898  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> gist_params(const typed::set<> &set) const;
8899  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> gist_params(const typed::basic_set<> &set) const;
8900  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> gist_params(const typed::point<> &set) const;
8901  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> identity() const;
8902  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> insert_domain(const typed::space<> &domain) const = delete;
8903  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::set<Domain> &set) const;
8904  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::space<Domain> &space) const;
8905  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::union_set<Domain> &uset) const;
8906  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::basic_set<Domain> &set) const;
8907  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::point<Domain> &set) const;
8908  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
8909  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> intersect_params(const typed::set<> &set) const;
8910  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> intersect_params(const typed::basic_set<> &set) const;
8911  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> intersect_params(const typed::point<> &set) const;
8912  inline typed::pw_aff_list<Domain, Anonymous> list() const;
8913  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> max(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
8914  inline typed::multi_val<pair<Range, Range2>> max_multi_val() const;
8915  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> min(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
8916  inline typed::multi_val<pair<Range, Range2>> min_multi_val() const;
8917  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> neg() const;
8918  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &pma2) const = delete;
8919  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
8920  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::multi_aff<> &pma2) const = delete;
8921  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::pw_aff<> &pma2) const = delete;
8922  template <typename Domain2, typename Arg3>
8923  inline typed::multi_pw_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::multi_pw_aff<Domain2, Arg3> &multi2) const;
8924  template <typename Domain2, typename Arg3>
8925  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::pw_multi_aff<Domain2, Arg3> &pma2) const;
8926  template <typename Domain2, typename Arg3>
8927  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::multi_aff<Domain2, Arg3> &pma2) const;
8928  template <typename Domain2>
8929  inline typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Anonymous>> product(const typed::pw_aff<Domain2, Anonymous> &pma2) const;
8930  template <typename Domain2>
8931  inline typed::multi_pw_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const;
8932  inline typed::multi_pw_aff<pair<Range, Range2>> pullback(const typed::multi_pw_aff<Domain> &mpa2) const;
8933  template <typename Domain2>
8934  inline typed::pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_aff<Domain2, Domain> &ma) const;
8935  inline typed::pw_multi_aff<pair<Range, Range2>> pullback(const typed::multi_aff<Domain> &ma) const;
8936  template <typename Domain2>
8937  inline typed::pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::pw_multi_aff<Domain2, Domain> &pma2) const;
8938  inline typed::pw_multi_aff<pair<Range, Range2>> pullback(const typed::pw_multi_aff<Domain> &pma2) const;
8939  template <typename Domain2>
8940  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const;
8941  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<Domain> &upma2) const;
8942  inline typed::pw_multi_aff_list<Domain, pair<Range, Range2>> pw_multi_aff_list() const;
8943  inline typed::pw_multi_aff<Domain, Range> range_factor_domain() const;
8944  inline typed::pw_multi_aff<Domain, Range2> range_factor_range() const;
8945  template <typename Arg3>
8946  inline typed::multi_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::multi_pw_aff<Domain, Arg3> &multi2) const;
8947  template <typename Arg3>
8948  inline typed::multi_union_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::multi_union_pw_aff<Domain, Arg3> &multi2) const;
8949  template <typename Arg3>
8950  inline typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::pw_multi_aff<Domain, Arg3> &pma2) const;
8951  template <typename Arg3>
8952  inline typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::union_pw_multi_aff<Domain, Arg3> &upma2) const;
8953  template <typename Arg3>
8954  inline typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::multi_aff<Domain, Arg3> &pma2) const;
8955  inline typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Anonymous>> range_product(const typed::pw_aff<Domain, Anonymous> &pma2) const;
8956  inline typed::id<Domain, pair<Range, Range2>> get_range_tuple_id() const = delete;
8957  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> scale(const typed::multi_val<pair<Range, Range2>> &mv) const;
8958  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> scale(const typed::val<pair<Range, Range2>> &v) const;
8959  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> scale(long v) const;
8960  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> scale_down(const typed::multi_val<pair<Range, Range2>> &mv) const;
8961  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> scale_down(const typed::val<pair<Range, Range2>> &v) const;
8962  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> scale_down(long v) const;
8963  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const;
8964  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const;
8965  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
8966  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
8967  inline typed::space<Domain, pair<Range, Range2>> space() const;
8968  inline typed::space<Domain, pair<Range, Range2>> get_space() const = delete;
8969  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> sub(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
8970  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> sub(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &multi2) const;
8971  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const;
8972  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
8973  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::multi_aff<Domain, pair<Range, Range2>> &pma2) const;
8974  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::pw_aff<Domain, pair<Range, Range2>> &pma2) const;
8975  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::set<Domain> &set) const;
8976  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::space<Domain> &space) const;
8977  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::union_set<Domain> &uset) const;
8978  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::basic_set<Domain> &set) const;
8979  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::point<Domain> &set) const;
8980  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> to_multi_pw_aff() const;
8981  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> to_union_pw_multi_aff() const;
8982  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
8983  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> union_add(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &mpa2) const;
8984  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> union_add(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &mupa2) const;
8985  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const;
8986  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
8987  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::multi_aff<Domain, pair<Range, Range2>> &pma2) const;
8988  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::pw_aff<Domain, pair<Range, Range2>> &pma2) const;
8989};
8990
8991template <typename T1, typename T2, typename Range, typename Range2>
8992struct pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> : public isl::pw_multi_aff {
8993  template <typename...>
8994  friend struct aff;
8995  template <typename...>
8996  friend struct aff_list;
8997  template <typename...>
8998  friend struct basic_map;
8999  template <typename...>
9000  friend struct basic_set;
9001  template <typename...>
9002  friend struct fixed_box;
9003  template <typename...>
9004  friend struct id;
9005  template <typename...>
9006  friend struct id_list;
9007  template <typename...>
9008  friend struct map;
9009  template <typename...>
9010  friend struct map_list;
9011  template <typename...>
9012  friend struct multi_aff;
9013  template <typename...>
9014  friend struct multi_id;
9015  template <typename...>
9016  friend struct multi_pw_aff;
9017  template <typename...>
9018  friend struct multi_union_pw_aff;
9019  template <typename...>
9020  friend struct multi_val;
9021  template <typename...>
9022  friend struct point;
9023  template <typename...>
9024  friend struct pw_aff;
9025  template <typename...>
9026  friend struct pw_aff_list;
9027  template <typename...>
9028  friend struct pw_multi_aff;
9029  template <typename...>
9030  friend struct pw_multi_aff_list;
9031  template <typename...>
9032  friend struct set;
9033  template <typename...>
9034  friend struct set_list;
9035  template <typename...>
9036  friend struct space;
9037  template <typename...>
9038  friend struct union_map;
9039  template <typename...>
9040  friend struct union_pw_aff;
9041  template <typename...>
9042  friend struct union_pw_aff_list;
9043  template <typename...>
9044  friend struct union_pw_multi_aff;
9045  template <typename...>
9046  friend struct union_set;
9047  template <typename...>
9048  friend struct union_set_list;
9049  template <typename...>
9050  friend struct val;
9051  template <typename...>
9052  friend struct val_list;
9053
9054  pw_multi_aff() = default;
9055  template <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
9056            typename std::enable_if<
9057              std::is_base_of<T1, Arg1>{} &&
9058              std::is_base_of<T2, Arg2>{} &&
9059              std::is_base_of<Range, Arg3>{} &&
9060              std::is_base_of<Range2, Arg4>{},
9061            bool>::type = true>
9062  pw_multi_aff(const pw_multi_aff<pair<Arg1, Arg2>, pair<Arg3, Arg4>> &obj) : isl::pw_multi_aff(obj) {}
9063 private:
9064  template <typename base,
9065            typename std::enable_if<
9066              std::is_same<base, isl::pw_multi_aff>{}, bool>::type = true>
9067  pw_multi_aff(const base &obj) : isl::pw_multi_aff(obj) {}
9068 public:
9069  static pw_multi_aff from(const isl::pw_multi_aff &obj) {
9070    return pw_multi_aff(obj);
9071  }
9072  inline /* implicit */ pw_multi_aff(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &ma);
9073  inline /* implicit */ pw_multi_aff(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &pa);
9074  inline explicit pw_multi_aff(const isl::ctx &ctx, const std::string &str);
9075  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
9076  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
9077  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
9078  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
9079  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
9080  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
9081  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add_constant(const typed::multi_val<pair<Range, Range2>> &mv) const;
9082  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add_constant(const typed::val<pair<Range, Range2>> &v) const;
9083  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add_constant(long v) const;
9084  template <typename Arg2>
9085  inline typed::union_pw_multi_aff<pair<T1, T2>, Arg2> apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg2> &upma2) const;
9086  inline typed::map<pair<T1, T2>, pair<Range, Range2>> as_map() const;
9087  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> as_multi_aff() const;
9088  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> as_multi_union_pw_aff() const;
9089  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> as_pw_multi_aff() const;
9090  inline typed::set<pair<T1, T2>, pair<Range, Range2>> as_set() const = delete;
9091  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> as_union_map() const;
9092  inline typed::pw_aff<pair<T1, T2>, Anonymous> at(int pos) const;
9093  inline typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> get_at(int pos) const = delete;
9094  inline typed::set<pair<T1, T2>> bind(const typed::multi_id<pair<Range, Range2>> &tuple) const;
9095  inline typed::pw_multi_aff<pair<Range, Range2>> bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const;
9096  inline typed::pw_multi_aff<T2, pair<Range, Range2>> bind_domain_wrapped_domain(const typed::multi_id<T1> &tuple) const;
9097  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> coalesce() const;
9098  inline typed::set<pair<T1, T2>> domain() const;
9099  inline typed::pw_multi_aff<pair<T2, T1>, pair<Range, Range2>> domain_reverse() const;
9100  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> drop_unused_params() const;
9101  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> extract_pw_multi_aff(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const;
9102  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::set<pair<T1, T2>> &set) const;
9103  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::union_set<pair<T1, T2>> &context) const;
9104  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::basic_set<pair<T1, T2>> &set) const;
9105  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::point<pair<T1, T2>> &set) const;
9106  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::set<> &set) const;
9107  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::basic_set<> &set) const;
9108  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::point<> &set) const;
9109  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> identity() const;
9110  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> insert_domain(const typed::space<> &domain) const = delete;
9111  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::set<pair<T1, T2>> &set) const;
9112  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::space<pair<T1, T2>> &space) const;
9113  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const;
9114  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::basic_set<pair<T1, T2>> &set) const;
9115  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::point<pair<T1, T2>> &set) const;
9116  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<T1> &uset) const;
9117  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::set<> &set) const;
9118  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::basic_set<> &set) const;
9119  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::point<> &set) const;
9120  inline typed::pw_aff_list<pair<T1, T2>, Anonymous> list() const;
9121  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> max(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
9122  inline typed::multi_val<pair<Range, Range2>> max_multi_val() const;
9123  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> min(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
9124  inline typed::multi_val<pair<Range, Range2>> min_multi_val() const;
9125  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> neg() const;
9126  template <typename Domain3>
9127  inline typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, T1> &pma2) const;
9128  template <typename Domain3>
9129  inline typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, T1> &upma2) const;
9130  template <typename Domain3>
9131  inline typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::multi_aff<Domain3, T1> &pma2) const;
9132  template <typename Domain3>
9133  inline typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::pw_aff<Domain3, T1> &pma2) const;
9134  template <typename Domain2, typename Arg2>
9135  inline typed::multi_pw_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::multi_pw_aff<Domain2, Arg2> &multi2) const;
9136  template <typename Domain2, typename Arg2>
9137  inline typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::pw_multi_aff<Domain2, Arg2> &pma2) const;
9138  template <typename Domain2, typename Arg2>
9139  inline typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::multi_aff<Domain2, Arg2> &pma2) const;
9140  template <typename Domain2>
9141  inline typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Anonymous>> product(const typed::pw_aff<Domain2, Anonymous> &pma2) const;
9142  template <typename Domain2>
9143  inline typed::multi_pw_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa2) const;
9144  inline typed::multi_pw_aff<pair<Range, Range2>> pullback(const typed::multi_pw_aff<pair<T1, T2>> &mpa2) const;
9145  template <typename Domain2>
9146  inline typed::pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const;
9147  inline typed::pw_multi_aff<pair<Range, Range2>> pullback(const typed::multi_aff<pair<T1, T2>> &ma) const;
9148  template <typename Domain2>
9149  inline typed::pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma2) const;
9150  inline typed::pw_multi_aff<pair<Range, Range2>> pullback(const typed::pw_multi_aff<pair<T1, T2>> &pma2) const;
9151  template <typename Domain2>
9152  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma2) const;
9153  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<pair<T1, T2>> &upma2) const;
9154  inline typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>> pw_multi_aff_list() const;
9155  inline typed::pw_multi_aff<pair<T1, T2>, Range> range_factor_domain() const;
9156  inline typed::pw_multi_aff<pair<T1, T2>, Range2> range_factor_range() const;
9157  template <typename Arg2>
9158  inline typed::multi_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::multi_pw_aff<pair<T1, T2>, Arg2> &multi2) const;
9159  template <typename Arg2>
9160  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::multi_union_pw_aff<pair<T1, T2>, Arg2> &multi2) const;
9161  template <typename Arg2>
9162  inline typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::pw_multi_aff<pair<T1, T2>, Arg2> &pma2) const;
9163  template <typename Arg2>
9164  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::union_pw_multi_aff<pair<T1, T2>, Arg2> &upma2) const;
9165  template <typename Arg2>
9166  inline typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::multi_aff<pair<T1, T2>, Arg2> &pma2) const;
9167  inline typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Anonymous>> range_product(const typed::pw_aff<pair<T1, T2>, Anonymous> &pma2) const;
9168  inline typed::id<pair<T1, T2>, pair<Range, Range2>> get_range_tuple_id() const = delete;
9169  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> scale(const typed::multi_val<pair<Range, Range2>> &mv) const;
9170  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> scale(const typed::val<pair<Range, Range2>> &v) const;
9171  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> scale(long v) const;
9172  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> scale_down(const typed::multi_val<pair<Range, Range2>> &mv) const;
9173  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> scale_down(const typed::val<pair<Range, Range2>> &v) const;
9174  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> scale_down(long v) const;
9175  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> set_at(int pos, const typed::pw_aff<pair<T1, T2>, Anonymous> &el) const;
9176  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> set_at(int pos, const typed::union_pw_aff<pair<T1, T2>, Anonymous> &el) const;
9177  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
9178  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
9179  inline typed::space<pair<T1, T2>, pair<Range, Range2>> space() const;
9180  inline typed::space<pair<T1, T2>, pair<Range, Range2>> get_space() const = delete;
9181  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
9182  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const;
9183  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
9184  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
9185  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
9186  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
9187  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::set<pair<T1, T2>> &set) const;
9188  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::space<pair<T1, T2>> &space) const;
9189  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::union_set<pair<T1, T2>> &uset) const;
9190  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::basic_set<pair<T1, T2>> &set) const;
9191  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::point<pair<T1, T2>> &set) const;
9192  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> to_multi_pw_aff() const;
9193  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> to_union_pw_multi_aff() const;
9194  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
9195  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &mpa2) const;
9196  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &mupa2) const;
9197  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
9198  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
9199  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
9200  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const;
9201};
9202
9203template <typename Domain>
9204struct pw_multi_aff_list<Domain> : public isl::pw_multi_aff_list {
9205  template <typename...>
9206  friend struct aff;
9207  template <typename...>
9208  friend struct aff_list;
9209  template <typename...>
9210  friend struct basic_map;
9211  template <typename...>
9212  friend struct basic_set;
9213  template <typename...>
9214  friend struct fixed_box;
9215  template <typename...>
9216  friend struct id;
9217  template <typename...>
9218  friend struct id_list;
9219  template <typename...>
9220  friend struct map;
9221  template <typename...>
9222  friend struct map_list;
9223  template <typename...>
9224  friend struct multi_aff;
9225  template <typename...>
9226  friend struct multi_id;
9227  template <typename...>
9228  friend struct multi_pw_aff;
9229  template <typename...>
9230  friend struct multi_union_pw_aff;
9231  template <typename...>
9232  friend struct multi_val;
9233  template <typename...>
9234  friend struct point;
9235  template <typename...>
9236  friend struct pw_aff;
9237  template <typename...>
9238  friend struct pw_aff_list;
9239  template <typename...>
9240  friend struct pw_multi_aff;
9241  template <typename...>
9242  friend struct pw_multi_aff_list;
9243  template <typename...>
9244  friend struct set;
9245  template <typename...>
9246  friend struct set_list;
9247  template <typename...>
9248  friend struct space;
9249  template <typename...>
9250  friend struct union_map;
9251  template <typename...>
9252  friend struct union_pw_aff;
9253  template <typename...>
9254  friend struct union_pw_aff_list;
9255  template <typename...>
9256  friend struct union_pw_multi_aff;
9257  template <typename...>
9258  friend struct union_set;
9259  template <typename...>
9260  friend struct union_set_list;
9261  template <typename...>
9262  friend struct val;
9263  template <typename...>
9264  friend struct val_list;
9265
9266  pw_multi_aff_list() = default;
9267  template <typename Arg1,
9268            typename std::enable_if<
9269              std::is_base_of<Domain, Arg1>{},
9270            bool>::type = true>
9271  pw_multi_aff_list(const pw_multi_aff_list<Arg1> &obj) : isl::pw_multi_aff_list(obj) {}
9272 private:
9273  template <typename base,
9274            typename std::enable_if<
9275              std::is_same<base, isl::pw_multi_aff_list>{}, bool>::type = true>
9276  pw_multi_aff_list(const base &obj) : isl::pw_multi_aff_list(obj) {}
9277 public:
9278  static pw_multi_aff_list from(const isl::pw_multi_aff_list &obj) {
9279    return pw_multi_aff_list(obj);
9280  }
9281  inline explicit pw_multi_aff_list(const isl::ctx &ctx, int n);
9282  inline explicit pw_multi_aff_list(const typed::pw_multi_aff<Domain> &el);
9283  inline explicit pw_multi_aff_list(const isl::ctx &ctx, const std::string &str);
9284  inline typed::pw_multi_aff_list<Domain> add(const typed::pw_multi_aff<Domain> &el) const;
9285  inline typed::pw_multi_aff_list<Domain> add(const typed::multi_aff<Domain> &el) const;
9286  inline typed::pw_multi_aff_list<Domain> add(const typed::pw_aff<Domain> &el) const;
9287  inline typed::pw_multi_aff<Domain> at(int index) const;
9288  inline typed::pw_multi_aff<Domain> get_at(int index) const = delete;
9289  inline typed::pw_multi_aff_list<Domain> drop(unsigned int first, unsigned int n) const;
9290  inline void foreach(const std::function<void(typed::pw_multi_aff<Domain>)> &fn) const;
9291  inline void foreach_scc(const std::function<bool(typed::pw_multi_aff<Domain>, typed::pw_multi_aff<Domain>)> &follows, const std::function<void(typed::pw_multi_aff_list<Domain>)> &fn) const;
9292  inline typed::pw_multi_aff_list<Domain> set_at(int index, const typed::pw_multi_aff<Anonymous> &el) const;
9293};
9294
9295template <typename Domain, typename Range>
9296struct pw_multi_aff_list<Domain, Range> : public isl::pw_multi_aff_list {
9297  template <typename...>
9298  friend struct aff;
9299  template <typename...>
9300  friend struct aff_list;
9301  template <typename...>
9302  friend struct basic_map;
9303  template <typename...>
9304  friend struct basic_set;
9305  template <typename...>
9306  friend struct fixed_box;
9307  template <typename...>
9308  friend struct id;
9309  template <typename...>
9310  friend struct id_list;
9311  template <typename...>
9312  friend struct map;
9313  template <typename...>
9314  friend struct map_list;
9315  template <typename...>
9316  friend struct multi_aff;
9317  template <typename...>
9318  friend struct multi_id;
9319  template <typename...>
9320  friend struct multi_pw_aff;
9321  template <typename...>
9322  friend struct multi_union_pw_aff;
9323  template <typename...>
9324  friend struct multi_val;
9325  template <typename...>
9326  friend struct point;
9327  template <typename...>
9328  friend struct pw_aff;
9329  template <typename...>
9330  friend struct pw_aff_list;
9331  template <typename...>
9332  friend struct pw_multi_aff;
9333  template <typename...>
9334  friend struct pw_multi_aff_list;
9335  template <typename...>
9336  friend struct set;
9337  template <typename...>
9338  friend struct set_list;
9339  template <typename...>
9340  friend struct space;
9341  template <typename...>
9342  friend struct union_map;
9343  template <typename...>
9344  friend struct union_pw_aff;
9345  template <typename...>
9346  friend struct union_pw_aff_list;
9347  template <typename...>
9348  friend struct union_pw_multi_aff;
9349  template <typename...>
9350  friend struct union_set;
9351  template <typename...>
9352  friend struct union_set_list;
9353  template <typename...>
9354  friend struct val;
9355  template <typename...>
9356  friend struct val_list;
9357
9358  pw_multi_aff_list() = default;
9359  template <typename Arg1, typename Arg2,
9360            typename std::enable_if<
9361              std::is_base_of<Domain, Arg1>{} &&
9362              std::is_base_of<Range, Arg2>{},
9363            bool>::type = true>
9364  pw_multi_aff_list(const pw_multi_aff_list<Arg1, Arg2> &obj) : isl::pw_multi_aff_list(obj) {}
9365 private:
9366  template <typename base,
9367            typename std::enable_if<
9368              std::is_same<base, isl::pw_multi_aff_list>{}, bool>::type = true>
9369  pw_multi_aff_list(const base &obj) : isl::pw_multi_aff_list(obj) {}
9370 public:
9371  static pw_multi_aff_list from(const isl::pw_multi_aff_list &obj) {
9372    return pw_multi_aff_list(obj);
9373  }
9374  inline explicit pw_multi_aff_list(const isl::ctx &ctx, int n);
9375  inline explicit pw_multi_aff_list(const typed::pw_multi_aff<Domain, Range> &el);
9376  inline explicit pw_multi_aff_list(const isl::ctx &ctx, const std::string &str);
9377  inline typed::pw_multi_aff_list<Domain, Range> add(const typed::pw_multi_aff<Domain, Range> &el) const;
9378  inline typed::pw_multi_aff_list<Domain, Range> add(const typed::multi_aff<Domain, Range> &el) const;
9379  inline typed::pw_multi_aff_list<Domain, Range> add(const typed::pw_aff<Domain, Range> &el) const;
9380  inline typed::pw_multi_aff<Domain, Range> at(int index) const;
9381  inline typed::pw_multi_aff<Domain, Range> get_at(int index) const = delete;
9382  inline typed::pw_multi_aff_list<Domain, Range> drop(unsigned int first, unsigned int n) const;
9383  inline void foreach(const std::function<void(typed::pw_multi_aff<Domain, Range>)> &fn) const;
9384  inline void foreach_scc(const std::function<bool(typed::pw_multi_aff<Domain, Range>, typed::pw_multi_aff<Domain, Range>)> &follows, const std::function<void(typed::pw_multi_aff_list<Domain, Range>)> &fn) const;
9385  inline typed::pw_multi_aff_list<Domain, Range> set_at(int index, const typed::pw_multi_aff<Domain, Anonymous> &el) const;
9386};
9387
9388template <>
9389struct set<> : public isl::set {
9390  template <typename...>
9391  friend struct aff;
9392  template <typename...>
9393  friend struct aff_list;
9394  template <typename...>
9395  friend struct basic_map;
9396  template <typename...>
9397  friend struct basic_set;
9398  template <typename...>
9399  friend struct fixed_box;
9400  template <typename...>
9401  friend struct id;
9402  template <typename...>
9403  friend struct id_list;
9404  template <typename...>
9405  friend struct map;
9406  template <typename...>
9407  friend struct map_list;
9408  template <typename...>
9409  friend struct multi_aff;
9410  template <typename...>
9411  friend struct multi_id;
9412  template <typename...>
9413  friend struct multi_pw_aff;
9414  template <typename...>
9415  friend struct multi_union_pw_aff;
9416  template <typename...>
9417  friend struct multi_val;
9418  template <typename...>
9419  friend struct point;
9420  template <typename...>
9421  friend struct pw_aff;
9422  template <typename...>
9423  friend struct pw_aff_list;
9424  template <typename...>
9425  friend struct pw_multi_aff;
9426  template <typename...>
9427  friend struct pw_multi_aff_list;
9428  template <typename...>
9429  friend struct set;
9430  template <typename...>
9431  friend struct set_list;
9432  template <typename...>
9433  friend struct space;
9434  template <typename...>
9435  friend struct union_map;
9436  template <typename...>
9437  friend struct union_pw_aff;
9438  template <typename...>
9439  friend struct union_pw_aff_list;
9440  template <typename...>
9441  friend struct union_pw_multi_aff;
9442  template <typename...>
9443  friend struct union_set;
9444  template <typename...>
9445  friend struct union_set_list;
9446  template <typename...>
9447  friend struct val;
9448  template <typename...>
9449  friend struct val_list;
9450
9451  set() = default;
9452 private:
9453  template <typename base,
9454            typename std::enable_if<
9455              std::is_same<base, isl::set>{}, bool>::type = true>
9456  set(const base &obj) : isl::set(obj) {}
9457 public:
9458  static set from(const isl::set &obj) {
9459    return set(obj);
9460  }
9461  inline /* implicit */ set(const typed::basic_set<> &bset);
9462  inline /* implicit */ set(const typed::point<> &pnt);
9463  inline explicit set(const isl::ctx &ctx, const std::string &str);
9464  inline typed::set<> apply(const typed::map<> &map) const = delete;
9465  inline typed::union_set<> apply(const typed::union_map<> &umap) const = delete;
9466  inline typed::set<> apply(const typed::basic_map<> &map) const = delete;
9467  inline typed::pw_multi_aff<> as_pw_multi_aff() const = delete;
9468  inline typed::set<> as_set() const = delete;
9469  inline typed::set<> bind(const typed::multi_id<> &tuple) const = delete;
9470  inline typed::set<> coalesce() const;
9471  inline typed::set<> detect_equalities() const;
9472  inline typed::set<> drop_unused_params() const;
9473  inline bool every_set(const std::function<bool(typed::set<>)> &test) const;
9474  inline typed::set<> extract_set(const typed::space<> &space) const;
9475  inline void foreach_basic_set(const std::function<void(typed::basic_set<>)> &fn) const;
9476  inline void foreach_point(const std::function<void(typed::point<>)> &fn) const;
9477  inline void foreach_set(const std::function<void(typed::set<>)> &fn) const;
9478  inline typed::set<> gist(const typed::set<> &context) const;
9479  inline typed::union_set<> gist(const typed::union_set<> &context) const;
9480  inline typed::set<> gist(const typed::basic_set<> &context) const;
9481  inline typed::set<> gist(const typed::point<> &context) const;
9482  inline typed::set<> gist_params(const typed::set<> &context) const = delete;
9483  inline typed::set<> gist_params(const typed::basic_set<> &context) const = delete;
9484  inline typed::set<> gist_params(const typed::point<> &context) const = delete;
9485  inline typed::map<> identity() const = delete;
9486  inline typed::pw_aff<Anonymous> indicator_function() const;
9487  inline typed::map<> insert_domain(const typed::space<> &domain) const = delete;
9488  inline typed::set<> intersect(const typed::set<> &set2) const;
9489  inline typed::union_set<> intersect(const typed::union_set<> &uset2) const;
9490  inline typed::set<> intersect(const typed::basic_set<> &set2) const;
9491  inline typed::set<> intersect(const typed::point<> &set2) const;
9492  inline typed::set<> intersect_params(const typed::set<> &params) const = delete;
9493  inline typed::set<> intersect_params(const typed::basic_set<> &params) const = delete;
9494  inline typed::set<> intersect_params(const typed::point<> &params) const = delete;
9495  inline typed::fixed_box<> lattice_tile() const = delete;
9496  inline typed::fixed_box<> get_lattice_tile() const = delete;
9497  inline typed::set<> lexmax() const = delete;
9498  inline typed::pw_multi_aff<> lexmax_pw_multi_aff() const = delete;
9499  inline typed::set<> lexmin() const = delete;
9500  inline typed::pw_multi_aff<> lexmin_pw_multi_aff() const = delete;
9501  inline typed::set<> lower_bound(const typed::multi_pw_aff<> &lower) const = delete;
9502  inline typed::set<> lower_bound(const typed::multi_val<> &lower) const = delete;
9503  inline typed::multi_pw_aff<> max_multi_pw_aff() const = delete;
9504  inline typed::val<> max_val(const typed::aff<> &obj) const = delete;
9505  inline typed::multi_pw_aff<> min_multi_pw_aff() const = delete;
9506  inline typed::val<> min_val(const typed::aff<> &obj) const = delete;
9507  inline typed::pw_aff<Anonymous> param_pw_aff_on_domain(const typed::id<Anonymous> &id) const;
9508  inline typed::pw_aff<Anonymous> param_pw_aff_on_domain(const std::string &id) const;
9509  inline typed::set<> params() const = delete;
9510  inline typed::multi_val<> plain_multi_val_if_fixed() const = delete;
9511  inline typed::multi_val<> get_plain_multi_val_if_fixed() const = delete;
9512  inline typed::set<> preimage(const typed::multi_aff<> &ma) const = delete;
9513  inline typed::set<> preimage(const typed::multi_pw_aff<> &mpa) const = delete;
9514  inline typed::set<> preimage(const typed::pw_multi_aff<> &pma) const = delete;
9515  inline typed::union_set<> preimage(const typed::union_pw_multi_aff<> &upma) const = delete;
9516  inline typed::set<> product(const typed::set<> &set2) const = delete;
9517  inline typed::set<> product(const typed::basic_set<> &set2) const = delete;
9518  inline typed::set<> product(const typed::point<> &set2) const = delete;
9519  inline typed::set<> project_out_all_params() const;
9520  inline typed::set<> project_out_param(const typed::id<Anonymous> &id) const;
9521  inline typed::set<> project_out_param(const std::string &id) const;
9522  inline typed::set<> project_out_param(const typed::id_list<Anonymous> &list) const;
9523  inline typed::pw_aff<Anonymous> pw_aff_on_domain(const typed::val<Anonymous> &v) const;
9524  inline typed::pw_aff<Anonymous> pw_aff_on_domain(long v) const;
9525  template <typename Domain>
9526  inline typed::pw_multi_aff<Domain> pw_multi_aff_on_domain(const typed::multi_val<Domain> &mv) const;
9527  inline typed::set_list<> set_list() const;
9528  inline typed::fixed_box<> simple_fixed_box_hull() const = delete;
9529  inline typed::fixed_box<> get_simple_fixed_box_hull() const = delete;
9530  inline typed::space<> space() const;
9531  inline typed::space<> get_space() const = delete;
9532  inline typed::val<> get_stride(int pos) const = delete;
9533  inline typed::set<> subtract(const typed::set<> &set2) const;
9534  inline typed::union_set<> subtract(const typed::union_set<> &uset2) const;
9535  inline typed::set<> subtract(const typed::basic_set<> &set2) const;
9536  inline typed::set<> subtract(const typed::point<> &set2) const;
9537  inline typed::union_set<> to_union_set() const;
9538  inline typed::map<> translation() const = delete;
9539  template <typename Domain>
9540  inline typed::set<Domain> unbind_params(const typed::multi_id<Domain> &tuple) const;
9541  inline typed::map<> unbind_params_insert_domain(const typed::multi_id<> &domain) const = delete;
9542  inline typed::set<> unite(const typed::set<> &set2) const;
9543  inline typed::union_set<> unite(const typed::union_set<> &uset2) const;
9544  inline typed::set<> unite(const typed::basic_set<> &set2) const;
9545  inline typed::set<> unite(const typed::point<> &set2) const;
9546  static inline typed::set<> universe(const typed::space<> &space);
9547  inline typed::map<> unwrap() const = delete;
9548  inline typed::set<> upper_bound(const typed::multi_pw_aff<> &upper) const = delete;
9549  inline typed::set<> upper_bound(const typed::multi_val<> &upper) const = delete;
9550  inline typed::set<> wrapped_reverse() const = delete;
9551};
9552
9553template <typename Domain>
9554struct set<Domain> : public isl::set {
9555  template <typename...>
9556  friend struct aff;
9557  template <typename...>
9558  friend struct aff_list;
9559  template <typename...>
9560  friend struct basic_map;
9561  template <typename...>
9562  friend struct basic_set;
9563  template <typename...>
9564  friend struct fixed_box;
9565  template <typename...>
9566  friend struct id;
9567  template <typename...>
9568  friend struct id_list;
9569  template <typename...>
9570  friend struct map;
9571  template <typename...>
9572  friend struct map_list;
9573  template <typename...>
9574  friend struct multi_aff;
9575  template <typename...>
9576  friend struct multi_id;
9577  template <typename...>
9578  friend struct multi_pw_aff;
9579  template <typename...>
9580  friend struct multi_union_pw_aff;
9581  template <typename...>
9582  friend struct multi_val;
9583  template <typename...>
9584  friend struct point;
9585  template <typename...>
9586  friend struct pw_aff;
9587  template <typename...>
9588  friend struct pw_aff_list;
9589  template <typename...>
9590  friend struct pw_multi_aff;
9591  template <typename...>
9592  friend struct pw_multi_aff_list;
9593  template <typename...>
9594  friend struct set;
9595  template <typename...>
9596  friend struct set_list;
9597  template <typename...>
9598  friend struct space;
9599  template <typename...>
9600  friend struct union_map;
9601  template <typename...>
9602  friend struct union_pw_aff;
9603  template <typename...>
9604  friend struct union_pw_aff_list;
9605  template <typename...>
9606  friend struct union_pw_multi_aff;
9607  template <typename...>
9608  friend struct union_set;
9609  template <typename...>
9610  friend struct union_set_list;
9611  template <typename...>
9612  friend struct val;
9613  template <typename...>
9614  friend struct val_list;
9615
9616  set() = default;
9617  template <typename Arg1,
9618            typename std::enable_if<
9619              std::is_base_of<Domain, Arg1>{},
9620            bool>::type = true>
9621  set(const set<Arg1> &obj) : isl::set(obj) {}
9622 private:
9623  template <typename base,
9624            typename std::enable_if<
9625              std::is_same<base, isl::set>{}, bool>::type = true>
9626  set(const base &obj) : isl::set(obj) {}
9627 public:
9628  static set from(const isl::set &obj) {
9629    return set(obj);
9630  }
9631  inline /* implicit */ set(const typed::basic_set<Domain> &bset);
9632  inline /* implicit */ set(const typed::point<Domain> &pnt);
9633  inline explicit set(const isl::ctx &ctx, const std::string &str);
9634  template <typename Range>
9635  inline typed::set<Range> apply(const typed::map<Domain, Range> &map) const;
9636  template <typename Range>
9637  inline typed::union_set<Range> apply(const typed::union_map<Domain, Range> &umap) const;
9638  template <typename Range>
9639  inline typed::set<Range> apply(const typed::basic_map<Domain, Range> &map) const;
9640  inline typed::pw_multi_aff<Domain> as_pw_multi_aff() const;
9641  inline typed::set<Domain> as_set() const;
9642  inline typed::set<> bind(const typed::multi_id<Domain> &tuple) const;
9643  inline typed::set<Domain> coalesce() const;
9644  inline typed::set<Domain> detect_equalities() const;
9645  inline typed::set<Domain> drop_unused_params() const;
9646  inline bool every_set(const std::function<bool(typed::set<Domain>)> &test) const;
9647  inline typed::set<Domain> extract_set(const typed::space<Domain> &space) const;
9648  inline void foreach_basic_set(const std::function<void(typed::basic_set<Domain>)> &fn) const;
9649  inline void foreach_point(const std::function<void(typed::point<Domain>)> &fn) const;
9650  inline void foreach_set(const std::function<void(typed::set<Domain>)> &fn) const;
9651  inline typed::set<Domain> gist(const typed::set<Domain> &context) const;
9652  inline typed::union_set<Domain> gist(const typed::union_set<Domain> &context) const;
9653  inline typed::set<Domain> gist(const typed::basic_set<Domain> &context) const;
9654  inline typed::set<Domain> gist(const typed::point<Domain> &context) const;
9655  inline typed::set<Domain> gist_params(const typed::set<> &context) const;
9656  inline typed::set<Domain> gist_params(const typed::basic_set<> &context) const;
9657  inline typed::set<Domain> gist_params(const typed::point<> &context) const;
9658  inline typed::map<Domain, Domain> identity() const;
9659  inline typed::pw_aff<Domain, Anonymous> indicator_function() const;
9660  template <typename Arg1>
9661  inline typed::map<Arg1, Domain> insert_domain(const typed::space<Arg1> &domain) const;
9662  inline typed::set<Domain> intersect(const typed::set<Domain> &set2) const;
9663  inline typed::union_set<Domain> intersect(const typed::union_set<Domain> &uset2) const;
9664  inline typed::set<Domain> intersect(const typed::basic_set<Domain> &set2) const;
9665  inline typed::set<Domain> intersect(const typed::point<Domain> &set2) const;
9666  inline typed::set<Domain> intersect_params(const typed::set<> &params) const;
9667  inline typed::set<Domain> intersect_params(const typed::basic_set<> &params) const;
9668  inline typed::set<Domain> intersect_params(const typed::point<> &params) const;
9669  inline typed::fixed_box<Domain> lattice_tile() const;
9670  inline typed::fixed_box<Domain> get_lattice_tile() const = delete;
9671  inline typed::set<Domain> lexmax() const;
9672  inline typed::pw_multi_aff<Domain> lexmax_pw_multi_aff() const;
9673  inline typed::set<Domain> lexmin() const;
9674  inline typed::pw_multi_aff<Domain> lexmin_pw_multi_aff() const;
9675  inline typed::set<Domain> lower_bound(const typed::multi_pw_aff<Domain> &lower) const;
9676  inline typed::set<Domain> lower_bound(const typed::multi_val<Domain> &lower) const;
9677  inline typed::multi_pw_aff<Domain> max_multi_pw_aff() const;
9678  inline typed::val<Domain> max_val(const typed::aff<> &obj) const = delete;
9679  inline typed::multi_pw_aff<Domain> min_multi_pw_aff() const;
9680  inline typed::val<Domain> min_val(const typed::aff<> &obj) const = delete;
9681  inline typed::pw_aff<Domain, Anonymous> param_pw_aff_on_domain(const typed::id<Anonymous> &id) const;
9682  inline typed::pw_aff<Domain, Anonymous> param_pw_aff_on_domain(const std::string &id) const;
9683  inline typed::set<> params() const;
9684  inline typed::multi_val<Domain> plain_multi_val_if_fixed() const;
9685  inline typed::multi_val<Domain> get_plain_multi_val_if_fixed() const = delete;
9686  template <typename Domain2>
9687  inline typed::set<Domain2> preimage(const typed::multi_aff<Domain2, Domain> &ma) const;
9688  template <typename Domain2>
9689  inline typed::set<Domain2> preimage(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
9690  template <typename Domain2>
9691  inline typed::set<Domain2> preimage(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
9692  template <typename Domain2>
9693  inline typed::union_set<Domain2> preimage(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
9694  template <typename Range>
9695  inline typed::set<pair<Domain, Range>> product(const typed::set<Range> &set2) const;
9696  template <typename Range>
9697  inline typed::set<pair<Domain, Range>> product(const typed::basic_set<Range> &set2) const;
9698  template <typename Range>
9699  inline typed::set<pair<Domain, Range>> product(const typed::point<Range> &set2) const;
9700  inline typed::set<Domain> project_out_all_params() const;
9701  inline typed::set<Domain> project_out_param(const typed::id<Anonymous> &id) const;
9702  inline typed::set<Domain> project_out_param(const std::string &id) const;
9703  inline typed::set<Domain> project_out_param(const typed::id_list<Anonymous> &list) const;
9704  inline typed::pw_aff<Domain, Anonymous> pw_aff_on_domain(const typed::val<Anonymous> &v) const;
9705  inline typed::pw_aff<Domain, Anonymous> pw_aff_on_domain(long v) const;
9706  template <typename Range>
9707  inline typed::pw_multi_aff<Domain, Range> pw_multi_aff_on_domain(const typed::multi_val<Range> &mv) const;
9708  inline typed::set_list<Domain> set_list() const;
9709  inline typed::fixed_box<Domain> simple_fixed_box_hull() const;
9710  inline typed::fixed_box<Domain> get_simple_fixed_box_hull() const = delete;
9711  inline typed::space<Domain> space() const;
9712  inline typed::space<Domain> get_space() const = delete;
9713  inline typed::val<Domain> get_stride(int pos) const = delete;
9714  inline typed::set<Domain> subtract(const typed::set<Domain> &set2) const;
9715  inline typed::union_set<Domain> subtract(const typed::union_set<Domain> &uset2) const;
9716  inline typed::set<Domain> subtract(const typed::basic_set<Domain> &set2) const;
9717  inline typed::set<Domain> subtract(const typed::point<Domain> &set2) const;
9718  inline typed::union_set<Domain> to_union_set() const;
9719  inline typed::map<Domain, Domain> translation() const;
9720  inline typed::set<Domain> unbind_params(const typed::multi_id<> &tuple) const = delete;
9721  template <typename Arg1>
9722  inline typed::map<Arg1, Domain> unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const;
9723  inline typed::set<Domain> unite(const typed::set<Domain> &set2) const;
9724  inline typed::union_set<Domain> unite(const typed::union_set<Domain> &uset2) const;
9725  inline typed::set<Domain> unite(const typed::basic_set<Domain> &set2) const;
9726  inline typed::set<Domain> unite(const typed::point<Domain> &set2) const;
9727  static inline typed::set<Domain> universe(const typed::space<Domain> &space);
9728  inline typed::map<Domain> unwrap() const = delete;
9729  inline typed::set<Domain> upper_bound(const typed::multi_pw_aff<Domain> &upper) const;
9730  inline typed::set<Domain> upper_bound(const typed::multi_val<Domain> &upper) const;
9731  inline typed::set<Domain> wrapped_reverse() const = delete;
9732};
9733
9734template <typename Domain, typename Range>
9735struct set<pair<Domain, Range>> : public isl::set {
9736  template <typename...>
9737  friend struct aff;
9738  template <typename...>
9739  friend struct aff_list;
9740  template <typename...>
9741  friend struct basic_map;
9742  template <typename...>
9743  friend struct basic_set;
9744  template <typename...>
9745  friend struct fixed_box;
9746  template <typename...>
9747  friend struct id;
9748  template <typename...>
9749  friend struct id_list;
9750  template <typename...>
9751  friend struct map;
9752  template <typename...>
9753  friend struct map_list;
9754  template <typename...>
9755  friend struct multi_aff;
9756  template <typename...>
9757  friend struct multi_id;
9758  template <typename...>
9759  friend struct multi_pw_aff;
9760  template <typename...>
9761  friend struct multi_union_pw_aff;
9762  template <typename...>
9763  friend struct multi_val;
9764  template <typename...>
9765  friend struct point;
9766  template <typename...>
9767  friend struct pw_aff;
9768  template <typename...>
9769  friend struct pw_aff_list;
9770  template <typename...>
9771  friend struct pw_multi_aff;
9772  template <typename...>
9773  friend struct pw_multi_aff_list;
9774  template <typename...>
9775  friend struct set;
9776  template <typename...>
9777  friend struct set_list;
9778  template <typename...>
9779  friend struct space;
9780  template <typename...>
9781  friend struct union_map;
9782  template <typename...>
9783  friend struct union_pw_aff;
9784  template <typename...>
9785  friend struct union_pw_aff_list;
9786  template <typename...>
9787  friend struct union_pw_multi_aff;
9788  template <typename...>
9789  friend struct union_set;
9790  template <typename...>
9791  friend struct union_set_list;
9792  template <typename...>
9793  friend struct val;
9794  template <typename...>
9795  friend struct val_list;
9796
9797  set() = default;
9798  template <typename Arg1, typename Arg2,
9799            typename std::enable_if<
9800              std::is_base_of<Domain, Arg1>{} &&
9801              std::is_base_of<Range, Arg2>{},
9802            bool>::type = true>
9803  set(const set<pair<Arg1, Arg2>> &obj) : isl::set(obj) {}
9804 private:
9805  template <typename base,
9806            typename std::enable_if<
9807              std::is_same<base, isl::set>{}, bool>::type = true>
9808  set(const base &obj) : isl::set(obj) {}
9809 public:
9810  static set from(const isl::set &obj) {
9811    return set(obj);
9812  }
9813  inline /* implicit */ set(const typed::basic_set<pair<Domain, Range>> &bset);
9814  inline /* implicit */ set(const typed::point<pair<Domain, Range>> &pnt);
9815  inline explicit set(const isl::ctx &ctx, const std::string &str);
9816  template <typename Arg2>
9817  inline typed::set<Arg2> apply(const typed::map<pair<Domain, Range>, Arg2> &map) const;
9818  template <typename Arg2>
9819  inline typed::union_set<Arg2> apply(const typed::union_map<pair<Domain, Range>, Arg2> &umap) const;
9820  template <typename Arg2>
9821  inline typed::set<Arg2> apply(const typed::basic_map<pair<Domain, Range>, Arg2> &map) const;
9822  inline typed::pw_multi_aff<pair<Domain, Range>> as_pw_multi_aff() const;
9823  inline typed::set<pair<Domain, Range>> as_set() const;
9824  inline typed::set<> bind(const typed::multi_id<pair<Domain, Range>> &tuple) const;
9825  inline typed::set<pair<Domain, Range>> coalesce() const;
9826  inline typed::set<pair<Domain, Range>> detect_equalities() const;
9827  inline typed::set<pair<Domain, Range>> drop_unused_params() const;
9828  inline bool every_set(const std::function<bool(typed::set<pair<Domain, Range>>)> &test) const;
9829  inline typed::set<pair<Domain, Range>> extract_set(const typed::space<pair<Domain, Range>> &space) const;
9830  inline void foreach_basic_set(const std::function<void(typed::basic_set<pair<Domain, Range>>)> &fn) const;
9831  inline void foreach_point(const std::function<void(typed::point<pair<Domain, Range>>)> &fn) const;
9832  inline void foreach_set(const std::function<void(typed::set<pair<Domain, Range>>)> &fn) const;
9833  inline typed::set<pair<Domain, Range>> gist(const typed::set<pair<Domain, Range>> &context) const;
9834  inline typed::union_set<pair<Domain, Range>> gist(const typed::union_set<pair<Domain, Range>> &context) const;
9835  inline typed::set<pair<Domain, Range>> gist(const typed::basic_set<pair<Domain, Range>> &context) const;
9836  inline typed::set<pair<Domain, Range>> gist(const typed::point<pair<Domain, Range>> &context) const;
9837  inline typed::set<pair<Domain, Range>> gist_params(const typed::set<> &context) const;
9838  inline typed::set<pair<Domain, Range>> gist_params(const typed::basic_set<> &context) const;
9839  inline typed::set<pair<Domain, Range>> gist_params(const typed::point<> &context) const;
9840  inline typed::map<pair<Domain, Range>, pair<Domain, Range>> identity() const;
9841  inline typed::pw_aff<pair<Domain, Range>, Anonymous> indicator_function() const;
9842  template <typename Arg2>
9843  inline typed::map<Arg2, pair<Domain, Range>> insert_domain(const typed::space<Arg2> &domain) const;
9844  inline typed::set<pair<Domain, Range>> intersect(const typed::set<pair<Domain, Range>> &set2) const;
9845  inline typed::union_set<pair<Domain, Range>> intersect(const typed::union_set<pair<Domain, Range>> &uset2) const;
9846  inline typed::set<pair<Domain, Range>> intersect(const typed::basic_set<pair<Domain, Range>> &set2) const;
9847  inline typed::set<pair<Domain, Range>> intersect(const typed::point<pair<Domain, Range>> &set2) const;
9848  inline typed::set<pair<Domain, Range>> intersect_params(const typed::set<> &params) const;
9849  inline typed::set<pair<Domain, Range>> intersect_params(const typed::basic_set<> &params) const;
9850  inline typed::set<pair<Domain, Range>> intersect_params(const typed::point<> &params) const;
9851  inline typed::fixed_box<pair<Domain, Range>> lattice_tile() const;
9852  inline typed::fixed_box<pair<Domain, Range>> get_lattice_tile() const = delete;
9853  inline typed::set<pair<Domain, Range>> lexmax() const;
9854  inline typed::pw_multi_aff<pair<Domain, Range>> lexmax_pw_multi_aff() const;
9855  inline typed::set<pair<Domain, Range>> lexmin() const;
9856  inline typed::pw_multi_aff<pair<Domain, Range>> lexmin_pw_multi_aff() const;
9857  inline typed::set<pair<Domain, Range>> lower_bound(const typed::multi_pw_aff<pair<Domain, Range>> &lower) const;
9858  inline typed::set<pair<Domain, Range>> lower_bound(const typed::multi_val<pair<Domain, Range>> &lower) const;
9859  inline typed::multi_pw_aff<pair<Domain, Range>> max_multi_pw_aff() const;
9860  inline typed::val<pair<Domain, Range>> max_val(const typed::aff<> &obj) const = delete;
9861  inline typed::multi_pw_aff<pair<Domain, Range>> min_multi_pw_aff() const;
9862  inline typed::val<pair<Domain, Range>> min_val(const typed::aff<> &obj) const = delete;
9863  inline typed::pw_aff<pair<Domain, Range>, Anonymous> param_pw_aff_on_domain(const typed::id<Anonymous> &id) const;
9864  inline typed::pw_aff<pair<Domain, Range>, Anonymous> param_pw_aff_on_domain(const std::string &id) const;
9865  inline typed::set<> params() const;
9866  inline typed::multi_val<pair<Domain, Range>> plain_multi_val_if_fixed() const;
9867  inline typed::multi_val<pair<Domain, Range>> get_plain_multi_val_if_fixed() const = delete;
9868  template <typename Domain2>
9869  inline typed::set<Domain2> preimage(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const;
9870  template <typename Domain2>
9871  inline typed::set<Domain2> preimage(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const;
9872  template <typename Domain2>
9873  inline typed::set<Domain2> preimage(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const;
9874  template <typename Domain2>
9875  inline typed::union_set<Domain2> preimage(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const;
9876  template <typename Arg2>
9877  inline typed::set<pair<pair<Domain, Range>, Arg2>> product(const typed::set<Arg2> &set2) const;
9878  template <typename Arg2>
9879  inline typed::set<pair<pair<Domain, Range>, Arg2>> product(const typed::basic_set<Arg2> &set2) const;
9880  template <typename Arg2>
9881  inline typed::set<pair<pair<Domain, Range>, Arg2>> product(const typed::point<Arg2> &set2) const;
9882  inline typed::set<pair<Domain, Range>> project_out_all_params() const;
9883  inline typed::set<pair<Domain, Range>> project_out_param(const typed::id<Anonymous> &id) const;
9884  inline typed::set<pair<Domain, Range>> project_out_param(const std::string &id) const;
9885  inline typed::set<pair<Domain, Range>> project_out_param(const typed::id_list<Anonymous> &list) const;
9886  inline typed::pw_aff<pair<Domain, Range>, Anonymous> pw_aff_on_domain(const typed::val<Anonymous> &v) const;
9887  inline typed::pw_aff<pair<Domain, Range>, Anonymous> pw_aff_on_domain(long v) const;
9888  template <typename Arg2>
9889  inline typed::pw_multi_aff<pair<Domain, Range>, Arg2> pw_multi_aff_on_domain(const typed::multi_val<Arg2> &mv) const;
9890  inline typed::set_list<pair<Domain, Range>> set_list() const;
9891  inline typed::fixed_box<pair<Domain, Range>> simple_fixed_box_hull() const;
9892  inline typed::fixed_box<pair<Domain, Range>> get_simple_fixed_box_hull() const = delete;
9893  inline typed::space<pair<Domain, Range>> space() const;
9894  inline typed::space<pair<Domain, Range>> get_space() const = delete;
9895  inline typed::val<pair<Domain, Range>> get_stride(int pos) const = delete;
9896  inline typed::set<pair<Domain, Range>> subtract(const typed::set<pair<Domain, Range>> &set2) const;
9897  inline typed::union_set<pair<Domain, Range>> subtract(const typed::union_set<pair<Domain, Range>> &uset2) const;
9898  inline typed::set<pair<Domain, Range>> subtract(const typed::basic_set<pair<Domain, Range>> &set2) const;
9899  inline typed::set<pair<Domain, Range>> subtract(const typed::point<pair<Domain, Range>> &set2) const;
9900  inline typed::union_set<pair<Domain, Range>> to_union_set() const;
9901  inline typed::map<pair<Domain, Range>, pair<Domain, Range>> translation() const;
9902  inline typed::set<pair<Domain, Range>> unbind_params(const typed::multi_id<> &tuple) const = delete;
9903  template <typename Arg2>
9904  inline typed::map<Arg2, pair<Domain, Range>> unbind_params_insert_domain(const typed::multi_id<Arg2> &domain) const;
9905  inline typed::set<pair<Domain, Range>> unite(const typed::set<pair<Domain, Range>> &set2) const;
9906  inline typed::union_set<pair<Domain, Range>> unite(const typed::union_set<pair<Domain, Range>> &uset2) const;
9907  inline typed::set<pair<Domain, Range>> unite(const typed::basic_set<pair<Domain, Range>> &set2) const;
9908  inline typed::set<pair<Domain, Range>> unite(const typed::point<pair<Domain, Range>> &set2) const;
9909  static inline typed::set<pair<Domain, Range>> universe(const typed::space<pair<Domain, Range>> &space);
9910  inline typed::map<Domain, Range> unwrap() const;
9911  inline typed::set<pair<Domain, Range>> upper_bound(const typed::multi_pw_aff<pair<Domain, Range>> &upper) const;
9912  inline typed::set<pair<Domain, Range>> upper_bound(const typed::multi_val<pair<Domain, Range>> &upper) const;
9913  inline typed::set<pair<Range, Domain>> wrapped_reverse() const;
9914};
9915
9916template <>
9917struct set_list<> : public isl::set_list {
9918  template <typename...>
9919  friend struct aff;
9920  template <typename...>
9921  friend struct aff_list;
9922  template <typename...>
9923  friend struct basic_map;
9924  template <typename...>
9925  friend struct basic_set;
9926  template <typename...>
9927  friend struct fixed_box;
9928  template <typename...>
9929  friend struct id;
9930  template <typename...>
9931  friend struct id_list;
9932  template <typename...>
9933  friend struct map;
9934  template <typename...>
9935  friend struct map_list;
9936  template <typename...>
9937  friend struct multi_aff;
9938  template <typename...>
9939  friend struct multi_id;
9940  template <typename...>
9941  friend struct multi_pw_aff;
9942  template <typename...>
9943  friend struct multi_union_pw_aff;
9944  template <typename...>
9945  friend struct multi_val;
9946  template <typename...>
9947  friend struct point;
9948  template <typename...>
9949  friend struct pw_aff;
9950  template <typename...>
9951  friend struct pw_aff_list;
9952  template <typename...>
9953  friend struct pw_multi_aff;
9954  template <typename...>
9955  friend struct pw_multi_aff_list;
9956  template <typename...>
9957  friend struct set;
9958  template <typename...>
9959  friend struct set_list;
9960  template <typename...>
9961  friend struct space;
9962  template <typename...>
9963  friend struct union_map;
9964  template <typename...>
9965  friend struct union_pw_aff;
9966  template <typename...>
9967  friend struct union_pw_aff_list;
9968  template <typename...>
9969  friend struct union_pw_multi_aff;
9970  template <typename...>
9971  friend struct union_set;
9972  template <typename...>
9973  friend struct union_set_list;
9974  template <typename...>
9975  friend struct val;
9976  template <typename...>
9977  friend struct val_list;
9978
9979  set_list() = default;
9980 private:
9981  template <typename base,
9982            typename std::enable_if<
9983              std::is_same<base, isl::set_list>{}, bool>::type = true>
9984  set_list(const base &obj) : isl::set_list(obj) {}
9985 public:
9986  static set_list from(const isl::set_list &obj) {
9987    return set_list(obj);
9988  }
9989  inline explicit set_list(const isl::ctx &ctx, int n);
9990  inline explicit set_list(const typed::set<> &el);
9991  inline explicit set_list(const isl::ctx &ctx, const std::string &str);
9992  inline typed::set_list<> add(const typed::set<> &el) const;
9993  inline typed::set_list<> add(const typed::basic_set<> &el) const;
9994  inline typed::set_list<> add(const typed::point<> &el) const;
9995  inline typed::set<> at(int index) const = delete;
9996  inline typed::set<> get_at(int index) const = delete;
9997  inline typed::set_list<> drop(unsigned int first, unsigned int n) const;
9998  inline void foreach(const std::function<void(typed::set<>)> &fn) const;
9999  inline void foreach_scc(const std::function<bool(typed::set<>, typed::set<>)> &follows, const std::function<void(typed::set_list<>)> &fn) const;
10000  inline typed::set_list<> set_at(int index, const typed::set<> &el) const = delete;
10001};
10002
10003template <typename Domain>
10004struct set_list<Domain> : public isl::set_list {
10005  template <typename...>
10006  friend struct aff;
10007  template <typename...>
10008  friend struct aff_list;
10009  template <typename...>
10010  friend struct basic_map;
10011  template <typename...>
10012  friend struct basic_set;
10013  template <typename...>
10014  friend struct fixed_box;
10015  template <typename...>
10016  friend struct id;
10017  template <typename...>
10018  friend struct id_list;
10019  template <typename...>
10020  friend struct map;
10021  template <typename...>
10022  friend struct map_list;
10023  template <typename...>
10024  friend struct multi_aff;
10025  template <typename...>
10026  friend struct multi_id;
10027  template <typename...>
10028  friend struct multi_pw_aff;
10029  template <typename...>
10030  friend struct multi_union_pw_aff;
10031  template <typename...>
10032  friend struct multi_val;
10033  template <typename...>
10034  friend struct point;
10035  template <typename...>
10036  friend struct pw_aff;
10037  template <typename...>
10038  friend struct pw_aff_list;
10039  template <typename...>
10040  friend struct pw_multi_aff;
10041  template <typename...>
10042  friend struct pw_multi_aff_list;
10043  template <typename...>
10044  friend struct set;
10045  template <typename...>
10046  friend struct set_list;
10047  template <typename...>
10048  friend struct space;
10049  template <typename...>
10050  friend struct union_map;
10051  template <typename...>
10052  friend struct union_pw_aff;
10053  template <typename...>
10054  friend struct union_pw_aff_list;
10055  template <typename...>
10056  friend struct union_pw_multi_aff;
10057  template <typename...>
10058  friend struct union_set;
10059  template <typename...>
10060  friend struct union_set_list;
10061  template <typename...>
10062  friend struct val;
10063  template <typename...>
10064  friend struct val_list;
10065
10066  set_list() = default;
10067  template <typename Arg1,
10068            typename std::enable_if<
10069              std::is_base_of<Domain, Arg1>{},
10070            bool>::type = true>
10071  set_list(const set_list<Arg1> &obj) : isl::set_list(obj) {}
10072 private:
10073  template <typename base,
10074            typename std::enable_if<
10075              std::is_same<base, isl::set_list>{}, bool>::type = true>
10076  set_list(const base &obj) : isl::set_list(obj) {}
10077 public:
10078  static set_list from(const isl::set_list &obj) {
10079    return set_list(obj);
10080  }
10081  inline explicit set_list(const isl::ctx &ctx, int n);
10082  inline explicit set_list(const typed::set<Domain> &el);
10083  inline explicit set_list(const isl::ctx &ctx, const std::string &str);
10084  inline typed::set_list<Domain> add(const typed::set<Domain> &el) const;
10085  inline typed::set_list<Domain> add(const typed::basic_set<Domain> &el) const;
10086  inline typed::set_list<Domain> add(const typed::point<Domain> &el) const;
10087  inline typed::set<Domain> at(int index) const;
10088  inline typed::set<Domain> get_at(int index) const = delete;
10089  inline typed::set_list<Domain> drop(unsigned int first, unsigned int n) const;
10090  inline void foreach(const std::function<void(typed::set<Domain>)> &fn) const;
10091  inline void foreach_scc(const std::function<bool(typed::set<Domain>, typed::set<Domain>)> &follows, const std::function<void(typed::set_list<Domain>)> &fn) const;
10092  inline typed::set_list<Domain> set_at(int index, const typed::set<Anonymous> &el) const;
10093};
10094
10095template <>
10096struct space<> : public isl::space {
10097  template <typename...>
10098  friend struct aff;
10099  template <typename...>
10100  friend struct aff_list;
10101  template <typename...>
10102  friend struct basic_map;
10103  template <typename...>
10104  friend struct basic_set;
10105  template <typename...>
10106  friend struct fixed_box;
10107  template <typename...>
10108  friend struct id;
10109  template <typename...>
10110  friend struct id_list;
10111  template <typename...>
10112  friend struct map;
10113  template <typename...>
10114  friend struct map_list;
10115  template <typename...>
10116  friend struct multi_aff;
10117  template <typename...>
10118  friend struct multi_id;
10119  template <typename...>
10120  friend struct multi_pw_aff;
10121  template <typename...>
10122  friend struct multi_union_pw_aff;
10123  template <typename...>
10124  friend struct multi_val;
10125  template <typename...>
10126  friend struct point;
10127  template <typename...>
10128  friend struct pw_aff;
10129  template <typename...>
10130  friend struct pw_aff_list;
10131  template <typename...>
10132  friend struct pw_multi_aff;
10133  template <typename...>
10134  friend struct pw_multi_aff_list;
10135  template <typename...>
10136  friend struct set;
10137  template <typename...>
10138  friend struct set_list;
10139  template <typename...>
10140  friend struct space;
10141  template <typename...>
10142  friend struct union_map;
10143  template <typename...>
10144  friend struct union_pw_aff;
10145  template <typename...>
10146  friend struct union_pw_aff_list;
10147  template <typename...>
10148  friend struct union_pw_multi_aff;
10149  template <typename...>
10150  friend struct union_set;
10151  template <typename...>
10152  friend struct union_set_list;
10153  template <typename...>
10154  friend struct val;
10155  template <typename...>
10156  friend struct val_list;
10157
10158  space() = default;
10159 private:
10160  template <typename base,
10161            typename std::enable_if<
10162              std::is_same<base, isl::space>{}, bool>::type = true>
10163  space(const base &obj) : isl::space(obj) {}
10164 public:
10165  static space from(const isl::space &obj) {
10166    return space(obj);
10167  }
10168  inline explicit space(const isl::ctx &ctx, const std::string &str);
10169  template <typename Domain>
10170  inline typed::space<Domain> add_named_tuple(const typed::id<Anonymous> &tuple_id, unsigned int dim) const;
10171  template <typename Domain>
10172  inline typed::space<Domain> add_named_tuple(const std::string &tuple_id, unsigned int dim) const;
10173  inline typed::space<> add_param(const typed::id<Anonymous> &id) const;
10174  inline typed::space<> add_param(const std::string &id) const;
10175  template <typename Domain>
10176  inline typed::space<Domain> add_unnamed_tuple(unsigned int dim) const;
10177  inline typed::space<> curry() const = delete;
10178  inline typed::space<> domain() const = delete;
10179  inline typed::multi_aff<> domain_map_multi_aff() const = delete;
10180  inline typed::pw_multi_aff<> domain_map_pw_multi_aff() const = delete;
10181  inline typed::space<> domain_reverse() const = delete;
10182  inline typed::id<> get_domain_tuple_id() const = delete;
10183  inline typed::space<> drop_all_params() const;
10184  inline typed::space<> flatten_domain() const = delete;
10185  inline typed::space<> flatten_range() const = delete;
10186  inline typed::multi_aff<> identity_multi_aff_on_domain() const = delete;
10187  inline typed::multi_pw_aff<> identity_multi_pw_aff_on_domain() const = delete;
10188  inline typed::pw_multi_aff<> identity_pw_multi_aff_on_domain() const = delete;
10189  inline typed::space<> map_from_set() const = delete;
10190  inline typed::multi_aff<> multi_aff(const typed::aff_list<> &list) const = delete;
10191  template <typename Domain>
10192  inline typed::multi_aff<Domain> multi_aff_on_domain(const typed::multi_val<Domain> &mv) const;
10193  inline typed::multi_id<> multi_id(const typed::id_list<> &list) const = delete;
10194  inline typed::multi_pw_aff<> multi_pw_aff(const typed::pw_aff_list<> &list) const = delete;
10195  inline typed::multi_union_pw_aff<> multi_union_pw_aff(const typed::union_pw_aff_list<> &list) const = delete;
10196  inline typed::multi_val<> multi_val(const typed::val_list<> &list) const = delete;
10197  inline typed::aff<Anonymous> param_aff_on_domain(const typed::id<Anonymous> &id) const;
10198  inline typed::aff<Anonymous> param_aff_on_domain(const std::string &id) const;
10199  inline typed::space<> params() const = delete;
10200  inline typed::space<> product(const typed::space<> &right) const = delete;
10201  inline typed::space<> range() const = delete;
10202  inline typed::multi_aff<> range_map_multi_aff() const = delete;
10203  inline typed::pw_multi_aff<> range_map_pw_multi_aff() const = delete;
10204  inline typed::space<> range_reverse() const = delete;
10205  inline typed::id<> get_range_tuple_id() const = delete;
10206  inline typed::space<> reverse() const = delete;
10207  inline typed::space<> set_domain_tuple(const typed::id<> &id) const = delete;
10208  inline typed::space<> set_domain_tuple(const std::string &id) const = delete;
10209  inline typed::space<> set_range_tuple(const typed::id<> &id) const = delete;
10210  inline typed::space<> set_range_tuple(const std::string &id) const = delete;
10211  inline typed::space<> uncurry() const = delete;
10212  static inline typed::space<> unit(const isl::ctx &ctx);
10213  inline typed::map<> universe_map() const = delete;
10214  inline typed::set<> universe_set() const;
10215  inline typed::space<> unwrap() const = delete;
10216  inline typed::space<> wrap() const = delete;
10217  inline typed::space<> wrapped_reverse() const = delete;
10218  inline typed::aff<> zero_aff_on_domain() const = delete;
10219  inline typed::multi_aff<> zero_multi_aff() const = delete;
10220  inline typed::multi_pw_aff<> zero_multi_pw_aff() const = delete;
10221  inline typed::multi_union_pw_aff<> zero_multi_union_pw_aff() const = delete;
10222  inline typed::multi_val<> zero_multi_val() const = delete;
10223};
10224
10225template <typename Domain>
10226struct space<Domain> : public isl::space {
10227  template <typename...>
10228  friend struct aff;
10229  template <typename...>
10230  friend struct aff_list;
10231  template <typename...>
10232  friend struct basic_map;
10233  template <typename...>
10234  friend struct basic_set;
10235  template <typename...>
10236  friend struct fixed_box;
10237  template <typename...>
10238  friend struct id;
10239  template <typename...>
10240  friend struct id_list;
10241  template <typename...>
10242  friend struct map;
10243  template <typename...>
10244  friend struct map_list;
10245  template <typename...>
10246  friend struct multi_aff;
10247  template <typename...>
10248  friend struct multi_id;
10249  template <typename...>
10250  friend struct multi_pw_aff;
10251  template <typename...>
10252  friend struct multi_union_pw_aff;
10253  template <typename...>
10254  friend struct multi_val;
10255  template <typename...>
10256  friend struct point;
10257  template <typename...>
10258  friend struct pw_aff;
10259  template <typename...>
10260  friend struct pw_aff_list;
10261  template <typename...>
10262  friend struct pw_multi_aff;
10263  template <typename...>
10264  friend struct pw_multi_aff_list;
10265  template <typename...>
10266  friend struct set;
10267  template <typename...>
10268  friend struct set_list;
10269  template <typename...>
10270  friend struct space;
10271  template <typename...>
10272  friend struct union_map;
10273  template <typename...>
10274  friend struct union_pw_aff;
10275  template <typename...>
10276  friend struct union_pw_aff_list;
10277  template <typename...>
10278  friend struct union_pw_multi_aff;
10279  template <typename...>
10280  friend struct union_set;
10281  template <typename...>
10282  friend struct union_set_list;
10283  template <typename...>
10284  friend struct val;
10285  template <typename...>
10286  friend struct val_list;
10287
10288  space() = default;
10289  template <typename Arg1,
10290            typename std::enable_if<
10291              std::is_base_of<Domain, Arg1>{},
10292            bool>::type = true>
10293  space(const space<Arg1> &obj) : isl::space(obj) {}
10294 private:
10295  template <typename base,
10296            typename std::enable_if<
10297              std::is_same<base, isl::space>{}, bool>::type = true>
10298  space(const base &obj) : isl::space(obj) {}
10299 public:
10300  static space from(const isl::space &obj) {
10301    return space(obj);
10302  }
10303  inline explicit space(const isl::ctx &ctx, const std::string &str);
10304  template <typename Range>
10305  inline typed::space<Domain, Range> add_named_tuple(const typed::id<Anonymous> &tuple_id, unsigned int dim) const;
10306  template <typename Range>
10307  inline typed::space<Domain, Range> add_named_tuple(const std::string &tuple_id, unsigned int dim) const;
10308  inline typed::space<Domain> add_param(const typed::id<Anonymous> &id) const;
10309  inline typed::space<Domain> add_param(const std::string &id) const;
10310  template <typename Range>
10311  inline typed::space<Domain, Range> add_unnamed_tuple(unsigned int dim) const;
10312  inline typed::space<Domain> curry() const = delete;
10313  inline typed::space<> domain() const;
10314  inline typed::multi_aff<Domain> domain_map_multi_aff() const = delete;
10315  inline typed::pw_multi_aff<Domain> domain_map_pw_multi_aff() const = delete;
10316  inline typed::space<Domain> domain_reverse() const = delete;
10317  inline typed::id<Domain> get_domain_tuple_id() const = delete;
10318  inline typed::space<Domain> drop_all_params() const;
10319  inline typed::space<Domain> flatten_domain() const = delete;
10320  inline typed::space<Domain> flatten_range() const = delete;
10321  inline typed::multi_aff<Domain, Domain> identity_multi_aff_on_domain() const;
10322  inline typed::multi_pw_aff<Domain, Domain> identity_multi_pw_aff_on_domain() const;
10323  inline typed::pw_multi_aff<Domain, Domain> identity_pw_multi_aff_on_domain() const;
10324  inline typed::space<Domain, Domain> map_from_set() const;
10325  inline typed::multi_aff<Domain> multi_aff(const typed::aff_list<Anonymous> &list) const;
10326  template <typename Range>
10327  inline typed::multi_aff<Domain, Range> multi_aff_on_domain(const typed::multi_val<Range> &mv) const;
10328  inline typed::multi_id<Domain> multi_id(const typed::id_list<Anonymous> &list) const;
10329  inline typed::multi_pw_aff<Domain> multi_pw_aff(const typed::pw_aff_list<Anonymous> &list) const;
10330  inline typed::multi_union_pw_aff<Domain> multi_union_pw_aff(const typed::union_pw_aff_list<Anonymous> &list) const;
10331  template <typename Arg1>
10332  inline typed::multi_union_pw_aff<Arg1, Domain> multi_union_pw_aff(const typed::union_pw_aff_list<Arg1, Anonymous> &list) const;
10333  inline typed::multi_val<Domain> multi_val(const typed::val_list<Anonymous> &list) const;
10334  inline typed::aff<Domain, Anonymous> param_aff_on_domain(const typed::id<Anonymous> &id) const;
10335  inline typed::aff<Domain, Anonymous> param_aff_on_domain(const std::string &id) const;
10336  inline typed::space<> params() const;
10337  template <typename Range>
10338  inline typed::space<pair<Domain, Range>> product(const typed::space<Range> &right) const;
10339  inline typed::space<Domain> range() const = delete;
10340  inline typed::multi_aff<Domain> range_map_multi_aff() const = delete;
10341  inline typed::pw_multi_aff<Domain> range_map_pw_multi_aff() const = delete;
10342  inline typed::space<Domain> range_reverse() const = delete;
10343  inline typed::id<Domain> get_range_tuple_id() const = delete;
10344  inline typed::space<Domain> reverse() const = delete;
10345  inline typed::space<Domain> set_domain_tuple(const typed::id<> &id) const = delete;
10346  inline typed::space<Domain> set_domain_tuple(const std::string &id) const = delete;
10347  template <typename Domain2>
10348  inline typed::space<Domain2> set_range_tuple(const typed::id<Anonymous> &id) const;
10349  template <typename Domain2>
10350  inline typed::space<Domain2> set_range_tuple(const std::string &id) const;
10351  inline typed::space<Domain> uncurry() const = delete;
10352  static inline typed::space<Domain> unit(const isl::ctx &ctx) = delete;
10353  inline typed::map<Domain> universe_map() const = delete;
10354  inline typed::set<Domain> universe_set() const;
10355  inline typed::space<Domain> unwrap() const = delete;
10356  inline typed::space<Domain> wrap() const = delete;
10357  inline typed::space<Domain> wrapped_reverse() const = delete;
10358  inline typed::aff<Domain, Anonymous> zero_aff_on_domain() const;
10359  inline typed::multi_aff<Domain> zero_multi_aff() const;
10360  inline typed::multi_pw_aff<Domain> zero_multi_pw_aff() const;
10361  inline typed::multi_union_pw_aff<Domain> zero_multi_union_pw_aff() const;
10362  inline typed::multi_val<Domain> zero_multi_val() const;
10363};
10364
10365template <typename Domain, typename Range>
10366struct space<Domain, Range> : public isl::space {
10367  template <typename...>
10368  friend struct aff;
10369  template <typename...>
10370  friend struct aff_list;
10371  template <typename...>
10372  friend struct basic_map;
10373  template <typename...>
10374  friend struct basic_set;
10375  template <typename...>
10376  friend struct fixed_box;
10377  template <typename...>
10378  friend struct id;
10379  template <typename...>
10380  friend struct id_list;
10381  template <typename...>
10382  friend struct map;
10383  template <typename...>
10384  friend struct map_list;
10385  template <typename...>
10386  friend struct multi_aff;
10387  template <typename...>
10388  friend struct multi_id;
10389  template <typename...>
10390  friend struct multi_pw_aff;
10391  template <typename...>
10392  friend struct multi_union_pw_aff;
10393  template <typename...>
10394  friend struct multi_val;
10395  template <typename...>
10396  friend struct point;
10397  template <typename...>
10398  friend struct pw_aff;
10399  template <typename...>
10400  friend struct pw_aff_list;
10401  template <typename...>
10402  friend struct pw_multi_aff;
10403  template <typename...>
10404  friend struct pw_multi_aff_list;
10405  template <typename...>
10406  friend struct set;
10407  template <typename...>
10408  friend struct set_list;
10409  template <typename...>
10410  friend struct space;
10411  template <typename...>
10412  friend struct union_map;
10413  template <typename...>
10414  friend struct union_pw_aff;
10415  template <typename...>
10416  friend struct union_pw_aff_list;
10417  template <typename...>
10418  friend struct union_pw_multi_aff;
10419  template <typename...>
10420  friend struct union_set;
10421  template <typename...>
10422  friend struct union_set_list;
10423  template <typename...>
10424  friend struct val;
10425  template <typename...>
10426  friend struct val_list;
10427
10428  space() = default;
10429  template <typename Arg1, typename Arg2,
10430            typename std::enable_if<
10431              std::is_base_of<Domain, Arg1>{} &&
10432              std::is_base_of<Range, Arg2>{},
10433            bool>::type = true>
10434  space(const space<Arg1, Arg2> &obj) : isl::space(obj) {}
10435 private:
10436  template <typename base,
10437            typename std::enable_if<
10438              std::is_same<base, isl::space>{}, bool>::type = true>
10439  space(const base &obj) : isl::space(obj) {}
10440 public:
10441  static space from(const isl::space &obj) {
10442    return space(obj);
10443  }
10444  inline explicit space(const isl::ctx &ctx, const std::string &str);
10445  inline typed::space<Domain, Range> add_named_tuple(const typed::id<> &tuple_id, unsigned int dim) const = delete;
10446  inline typed::space<Domain, Range> add_named_tuple(const std::string &tuple_id, unsigned int dim) const = delete;
10447  inline typed::space<Domain, Range> add_param(const typed::id<Anonymous> &id) const;
10448  inline typed::space<Domain, Range> add_param(const std::string &id) const;
10449  inline typed::space<Domain, Range> add_unnamed_tuple(unsigned int dim) const = delete;
10450  inline typed::space<Domain, Range> curry() const = delete;
10451  inline typed::space<Domain> domain() const;
10452  inline typed::multi_aff<pair<Domain, Range>, Domain> domain_map_multi_aff() const;
10453  inline typed::pw_multi_aff<pair<Domain, Range>, Domain> domain_map_pw_multi_aff() const;
10454  inline typed::space<Domain, Range> domain_reverse() const = delete;
10455  inline typed::id<Domain, Range> get_domain_tuple_id() const = delete;
10456  inline typed::space<Domain, Range> drop_all_params() const;
10457  inline typed::space<Domain, Range> flatten_domain() const = delete;
10458  inline typed::space<Domain, Range> flatten_range() const = delete;
10459  inline typed::multi_aff<Domain, Range> identity_multi_aff_on_domain() const = delete;
10460  inline typed::multi_pw_aff<Domain, Range> identity_multi_pw_aff_on_domain() const = delete;
10461  inline typed::pw_multi_aff<Domain, Range> identity_pw_multi_aff_on_domain() const = delete;
10462  inline typed::space<Domain, Range> map_from_set() const = delete;
10463  inline typed::multi_aff<Domain, Range> multi_aff(const typed::aff_list<Domain, Anonymous> &list) const;
10464  inline typed::multi_aff<Domain, Range> multi_aff_on_domain(const typed::multi_val<> &mv) const = delete;
10465  inline typed::multi_id<Domain, Range> multi_id(const typed::id_list<> &list) const = delete;
10466  inline typed::multi_pw_aff<Domain, Range> multi_pw_aff(const typed::pw_aff_list<Domain, Anonymous> &list) const;
10467  inline typed::multi_union_pw_aff<Domain, Range> multi_union_pw_aff(const typed::union_pw_aff_list<> &list) const = delete;
10468  inline typed::multi_val<Domain, Range> multi_val(const typed::val_list<> &list) const = delete;
10469  inline typed::aff<Domain, Range> param_aff_on_domain(const typed::id<> &id) const = delete;
10470  inline typed::aff<Domain, Range> param_aff_on_domain(const std::string &id) const = delete;
10471  inline typed::space<> params() const;
10472  template <typename Domain2, typename Range2>
10473  inline typed::space<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::space<Domain2, Range2> &right) const;
10474  inline typed::space<Range> range() const;
10475  inline typed::multi_aff<pair<Domain, Range>, Range> range_map_multi_aff() const;
10476  inline typed::pw_multi_aff<pair<Domain, Range>, Range> range_map_pw_multi_aff() const;
10477  inline typed::space<Domain, Range> range_reverse() const = delete;
10478  inline typed::id<Domain, Range> get_range_tuple_id() const = delete;
10479  inline typed::space<Range, Domain> reverse() const;
10480  template <typename Domain2>
10481  inline typed::space<Domain2, Range> set_domain_tuple(const typed::id<Anonymous> &id) const;
10482  template <typename Domain2>
10483  inline typed::space<Domain2, Range> set_domain_tuple(const std::string &id) const;
10484  template <typename Range2>
10485  inline typed::space<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
10486  template <typename Range2>
10487  inline typed::space<Domain, Range2> set_range_tuple(const std::string &id) const;
10488  inline typed::space<Domain, Range> uncurry() const = delete;
10489  static inline typed::space<Domain, Range> unit(const isl::ctx &ctx) = delete;
10490  inline typed::map<Domain, Range> universe_map() const;
10491  inline typed::set<Domain, Range> universe_set() const = delete;
10492  inline typed::space<Domain, Range> unwrap() const = delete;
10493  inline typed::space<pair<Domain, Range>> wrap() const;
10494  inline typed::space<Domain, Range> wrapped_reverse() const = delete;
10495  inline typed::aff<Domain, Range> zero_aff_on_domain() const = delete;
10496  inline typed::multi_aff<Domain, Range> zero_multi_aff() const;
10497  inline typed::multi_pw_aff<Domain, Range> zero_multi_pw_aff() const;
10498  inline typed::multi_union_pw_aff<Domain, Range> zero_multi_union_pw_aff() const;
10499  inline typed::multi_val<Domain, Range> zero_multi_val() const = delete;
10500};
10501
10502template <typename Domain, typename Range>
10503struct space<pair<Domain, Range>> : public isl::space {
10504  template <typename...>
10505  friend struct aff;
10506  template <typename...>
10507  friend struct aff_list;
10508  template <typename...>
10509  friend struct basic_map;
10510  template <typename...>
10511  friend struct basic_set;
10512  template <typename...>
10513  friend struct fixed_box;
10514  template <typename...>
10515  friend struct id;
10516  template <typename...>
10517  friend struct id_list;
10518  template <typename...>
10519  friend struct map;
10520  template <typename...>
10521  friend struct map_list;
10522  template <typename...>
10523  friend struct multi_aff;
10524  template <typename...>
10525  friend struct multi_id;
10526  template <typename...>
10527  friend struct multi_pw_aff;
10528  template <typename...>
10529  friend struct multi_union_pw_aff;
10530  template <typename...>
10531  friend struct multi_val;
10532  template <typename...>
10533  friend struct point;
10534  template <typename...>
10535  friend struct pw_aff;
10536  template <typename...>
10537  friend struct pw_aff_list;
10538  template <typename...>
10539  friend struct pw_multi_aff;
10540  template <typename...>
10541  friend struct pw_multi_aff_list;
10542  template <typename...>
10543  friend struct set;
10544  template <typename...>
10545  friend struct set_list;
10546  template <typename...>
10547  friend struct space;
10548  template <typename...>
10549  friend struct union_map;
10550  template <typename...>
10551  friend struct union_pw_aff;
10552  template <typename...>
10553  friend struct union_pw_aff_list;
10554  template <typename...>
10555  friend struct union_pw_multi_aff;
10556  template <typename...>
10557  friend struct union_set;
10558  template <typename...>
10559  friend struct union_set_list;
10560  template <typename...>
10561  friend struct val;
10562  template <typename...>
10563  friend struct val_list;
10564
10565  space() = default;
10566  template <typename Arg1, typename Arg2,
10567            typename std::enable_if<
10568              std::is_base_of<Domain, Arg1>{} &&
10569              std::is_base_of<Range, Arg2>{},
10570            bool>::type = true>
10571  space(const space<pair<Arg1, Arg2>> &obj) : isl::space(obj) {}
10572 private:
10573  template <typename base,
10574            typename std::enable_if<
10575              std::is_same<base, isl::space>{}, bool>::type = true>
10576  space(const base &obj) : isl::space(obj) {}
10577 public:
10578  static space from(const isl::space &obj) {
10579    return space(obj);
10580  }
10581  inline explicit space(const isl::ctx &ctx, const std::string &str);
10582  template <typename Arg2>
10583  inline typed::space<pair<Domain, Range>, Arg2> add_named_tuple(const typed::id<Anonymous> &tuple_id, unsigned int dim) const;
10584  template <typename Arg2>
10585  inline typed::space<pair<Domain, Range>, Arg2> add_named_tuple(const std::string &tuple_id, unsigned int dim) const;
10586  inline typed::space<pair<Domain, Range>> add_param(const typed::id<Anonymous> &id) const;
10587  inline typed::space<pair<Domain, Range>> add_param(const std::string &id) const;
10588  template <typename Arg2>
10589  inline typed::space<pair<Domain, Range>, Arg2> add_unnamed_tuple(unsigned int dim) const;
10590  inline typed::space<pair<Domain, Range>> curry() const = delete;
10591  inline typed::space<> domain() const;
10592  inline typed::multi_aff<pair<Domain, Range>> domain_map_multi_aff() const = delete;
10593  inline typed::pw_multi_aff<pair<Domain, Range>> domain_map_pw_multi_aff() const = delete;
10594  inline typed::space<pair<Domain, Range>> domain_reverse() const = delete;
10595  inline typed::id<pair<Domain, Range>> get_domain_tuple_id() const = delete;
10596  inline typed::space<pair<Domain, Range>> drop_all_params() const;
10597  inline typed::space<pair<Domain, Range>> flatten_domain() const = delete;
10598  inline typed::space<pair<Domain, Range>> flatten_range() const = delete;
10599  inline typed::multi_aff<pair<Domain, Range>, pair<Domain, Range>> identity_multi_aff_on_domain() const;
10600  inline typed::multi_pw_aff<pair<Domain, Range>, pair<Domain, Range>> identity_multi_pw_aff_on_domain() const;
10601  inline typed::pw_multi_aff<pair<Domain, Range>, pair<Domain, Range>> identity_pw_multi_aff_on_domain() const;
10602  inline typed::space<pair<Domain, Range>, pair<Domain, Range>> map_from_set() const;
10603  inline typed::multi_aff<pair<Domain, Range>> multi_aff(const typed::aff_list<Anonymous> &list) const;
10604  template <typename Arg2>
10605  inline typed::multi_aff<pair<Domain, Range>, Arg2> multi_aff_on_domain(const typed::multi_val<Arg2> &mv) const;
10606  inline typed::multi_id<pair<Domain, Range>> multi_id(const typed::id_list<Anonymous> &list) const;
10607  inline typed::multi_pw_aff<pair<Domain, Range>> multi_pw_aff(const typed::pw_aff_list<Anonymous> &list) const;
10608  inline typed::multi_union_pw_aff<pair<Domain, Range>> multi_union_pw_aff(const typed::union_pw_aff_list<Anonymous> &list) const;
10609  template <typename Arg2>
10610  inline typed::multi_union_pw_aff<Arg2, pair<Domain, Range>> multi_union_pw_aff(const typed::union_pw_aff_list<Arg2, Anonymous> &list) const;
10611  inline typed::multi_val<pair<Domain, Range>> multi_val(const typed::val_list<Anonymous> &list) const;
10612  inline typed::aff<pair<Domain, Range>, Anonymous> param_aff_on_domain(const typed::id<Anonymous> &id) const;
10613  inline typed::aff<pair<Domain, Range>, Anonymous> param_aff_on_domain(const std::string &id) const;
10614  inline typed::space<> params() const;
10615  template <typename Arg2>
10616  inline typed::space<pair<pair<Domain, Range>, Arg2>> product(const typed::space<Arg2> &right) const;
10617  inline typed::space<pair<Domain, Range>> range() const = delete;
10618  inline typed::multi_aff<pair<Domain, Range>> range_map_multi_aff() const = delete;
10619  inline typed::pw_multi_aff<pair<Domain, Range>> range_map_pw_multi_aff() const = delete;
10620  inline typed::space<pair<Domain, Range>> range_reverse() const = delete;
10621  inline typed::id<pair<Domain, Range>> get_range_tuple_id() const = delete;
10622  inline typed::space<pair<Domain, Range>> reverse() const = delete;
10623  inline typed::space<pair<Domain, Range>> set_domain_tuple(const typed::id<> &id) const = delete;
10624  inline typed::space<pair<Domain, Range>> set_domain_tuple(const std::string &id) const = delete;
10625  inline typed::space<pair<Domain, Range>> set_range_tuple(const typed::id<> &id) const = delete;
10626  inline typed::space<pair<Domain, Range>> set_range_tuple(const std::string &id) const = delete;
10627  inline typed::space<pair<Domain, Range>> uncurry() const = delete;
10628  static inline typed::space<pair<Domain, Range>> unit(const isl::ctx &ctx) = delete;
10629  inline typed::map<pair<Domain, Range>> universe_map() const = delete;
10630  inline typed::set<pair<Domain, Range>> universe_set() const;
10631  inline typed::space<Domain, Range> unwrap() const;
10632  inline typed::space<pair<Domain, Range>> wrap() const = delete;
10633  inline typed::space<pair<Range, Domain>> wrapped_reverse() const;
10634  inline typed::aff<pair<Domain, Range>, Anonymous> zero_aff_on_domain() const;
10635  inline typed::multi_aff<pair<Domain, Range>> zero_multi_aff() const;
10636  inline typed::multi_pw_aff<pair<Domain, Range>> zero_multi_pw_aff() const;
10637  inline typed::multi_union_pw_aff<pair<Domain, Range>> zero_multi_union_pw_aff() const;
10638  inline typed::multi_val<pair<Domain, Range>> zero_multi_val() const;
10639};
10640
10641template <typename Domain, typename Range, typename Range2>
10642struct space<pair<Domain, Range>, Range2> : public isl::space {
10643  template <typename...>
10644  friend struct aff;
10645  template <typename...>
10646  friend struct aff_list;
10647  template <typename...>
10648  friend struct basic_map;
10649  template <typename...>
10650  friend struct basic_set;
10651  template <typename...>
10652  friend struct fixed_box;
10653  template <typename...>
10654  friend struct id;
10655  template <typename...>
10656  friend struct id_list;
10657  template <typename...>
10658  friend struct map;
10659  template <typename...>
10660  friend struct map_list;
10661  template <typename...>
10662  friend struct multi_aff;
10663  template <typename...>
10664  friend struct multi_id;
10665  template <typename...>
10666  friend struct multi_pw_aff;
10667  template <typename...>
10668  friend struct multi_union_pw_aff;
10669  template <typename...>
10670  friend struct multi_val;
10671  template <typename...>
10672  friend struct point;
10673  template <typename...>
10674  friend struct pw_aff;
10675  template <typename...>
10676  friend struct pw_aff_list;
10677  template <typename...>
10678  friend struct pw_multi_aff;
10679  template <typename...>
10680  friend struct pw_multi_aff_list;
10681  template <typename...>
10682  friend struct set;
10683  template <typename...>
10684  friend struct set_list;
10685  template <typename...>
10686  friend struct space;
10687  template <typename...>
10688  friend struct union_map;
10689  template <typename...>
10690  friend struct union_pw_aff;
10691  template <typename...>
10692  friend struct union_pw_aff_list;
10693  template <typename...>
10694  friend struct union_pw_multi_aff;
10695  template <typename...>
10696  friend struct union_set;
10697  template <typename...>
10698  friend struct union_set_list;
10699  template <typename...>
10700  friend struct val;
10701  template <typename...>
10702  friend struct val_list;
10703
10704  space() = default;
10705  template <typename Arg1, typename Arg2, typename Arg3,
10706            typename std::enable_if<
10707              std::is_base_of<Domain, Arg1>{} &&
10708              std::is_base_of<Range, Arg2>{} &&
10709              std::is_base_of<Range2, Arg3>{},
10710            bool>::type = true>
10711  space(const space<pair<Arg1, Arg2>, Arg3> &obj) : isl::space(obj) {}
10712 private:
10713  template <typename base,
10714            typename std::enable_if<
10715              std::is_same<base, isl::space>{}, bool>::type = true>
10716  space(const base &obj) : isl::space(obj) {}
10717 public:
10718  static space from(const isl::space &obj) {
10719    return space(obj);
10720  }
10721  inline explicit space(const isl::ctx &ctx, const std::string &str);
10722  inline typed::space<pair<Domain, Range>, Range2> add_named_tuple(const typed::id<> &tuple_id, unsigned int dim) const = delete;
10723  inline typed::space<pair<Domain, Range>, Range2> add_named_tuple(const std::string &tuple_id, unsigned int dim) const = delete;
10724  inline typed::space<pair<Domain, Range>, Range2> add_param(const typed::id<Anonymous> &id) const;
10725  inline typed::space<pair<Domain, Range>, Range2> add_param(const std::string &id) const;
10726  inline typed::space<pair<Domain, Range>, Range2> add_unnamed_tuple(unsigned int dim) const = delete;
10727  inline typed::space<Domain, pair<Range, Range2>> curry() const;
10728  inline typed::space<pair<Domain, Range>> domain() const;
10729  inline typed::multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> domain_map_multi_aff() const;
10730  inline typed::pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> domain_map_pw_multi_aff() const;
10731  inline typed::space<pair<Range, Domain>, Range2> domain_reverse() const;
10732  inline typed::id<pair<Domain, Range>, Range2> get_domain_tuple_id() const = delete;
10733  inline typed::space<pair<Domain, Range>, Range2> drop_all_params() const;
10734  inline typed::space<Anonymous, Range2> flatten_domain() const;
10735  inline typed::space<pair<Domain, Range>, Range2> flatten_range() const = delete;
10736  inline typed::multi_aff<pair<Domain, Range>, Range2> identity_multi_aff_on_domain() const = delete;
10737  inline typed::multi_pw_aff<pair<Domain, Range>, Range2> identity_multi_pw_aff_on_domain() const = delete;
10738  inline typed::pw_multi_aff<pair<Domain, Range>, Range2> identity_pw_multi_aff_on_domain() const = delete;
10739  inline typed::space<pair<Domain, Range>, Range2> map_from_set() const = delete;
10740  inline typed::multi_aff<pair<Domain, Range>, Range2> multi_aff(const typed::aff_list<pair<Domain, Range>, Anonymous> &list) const;
10741  inline typed::multi_aff<pair<Domain, Range>, Range2> multi_aff_on_domain(const typed::multi_val<> &mv) const = delete;
10742  inline typed::multi_id<pair<Domain, Range>, Range2> multi_id(const typed::id_list<> &list) const = delete;
10743  inline typed::multi_pw_aff<pair<Domain, Range>, Range2> multi_pw_aff(const typed::pw_aff_list<pair<Domain, Range>, Anonymous> &list) const;
10744  inline typed::multi_union_pw_aff<pair<Domain, Range>, Range2> multi_union_pw_aff(const typed::union_pw_aff_list<> &list) const = delete;
10745  inline typed::multi_val<pair<Domain, Range>, Range2> multi_val(const typed::val_list<> &list) const = delete;
10746  inline typed::aff<pair<Domain, Range>, Range2> param_aff_on_domain(const typed::id<> &id) const = delete;
10747  inline typed::aff<pair<Domain, Range>, Range2> param_aff_on_domain(const std::string &id) const = delete;
10748  inline typed::space<> params() const;
10749  template <typename Domain2, typename Arg3>
10750  inline typed::space<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> product(const typed::space<Domain2, Arg3> &right) const;
10751  inline typed::space<Range2> range() const;
10752  inline typed::multi_aff<pair<pair<Domain, Range>, Range2>, Range2> range_map_multi_aff() const;
10753  inline typed::pw_multi_aff<pair<pair<Domain, Range>, Range2>, Range2> range_map_pw_multi_aff() const;
10754  inline typed::space<pair<Domain, Range>, Range2> range_reverse() const = delete;
10755  inline typed::id<pair<Domain, Range>, Range2> get_range_tuple_id() const = delete;
10756  inline typed::space<Range2, pair<Domain, Range>> reverse() const;
10757  inline typed::space<pair<Domain, Range>, Range2> set_domain_tuple(const typed::id<> &id) const = delete;
10758  inline typed::space<pair<Domain, Range>, Range2> set_domain_tuple(const std::string &id) const = delete;
10759  template <typename Arg2>
10760  inline typed::space<pair<Domain, Range>, Arg2> set_range_tuple(const typed::id<Anonymous> &id) const;
10761  template <typename Arg2>
10762  inline typed::space<pair<Domain, Range>, Arg2> set_range_tuple(const std::string &id) const;
10763  inline typed::space<pair<Domain, Range>, Range2> uncurry() const = delete;
10764  static inline typed::space<pair<Domain, Range>, Range2> unit(const isl::ctx &ctx) = delete;
10765  inline typed::map<pair<Domain, Range>, Range2> universe_map() const;
10766  inline typed::set<pair<Domain, Range>, Range2> universe_set() const = delete;
10767  inline typed::space<pair<Domain, Range>, Range2> unwrap() const = delete;
10768  inline typed::space<pair<pair<Domain, Range>, Range2>> wrap() const;
10769  inline typed::space<pair<Domain, Range>, Range2> wrapped_reverse() const = delete;
10770  inline typed::aff<pair<Domain, Range>, Range2> zero_aff_on_domain() const = delete;
10771  inline typed::multi_aff<pair<Domain, Range>, Range2> zero_multi_aff() const;
10772  inline typed::multi_pw_aff<pair<Domain, Range>, Range2> zero_multi_pw_aff() const;
10773  inline typed::multi_union_pw_aff<pair<Domain, Range>, Range2> zero_multi_union_pw_aff() const;
10774  inline typed::multi_val<pair<Domain, Range>, Range2> zero_multi_val() const = delete;
10775};
10776
10777template <typename Domain, typename Range, typename Range2>
10778struct space<Domain, pair<Range, Range2>> : public isl::space {
10779  template <typename...>
10780  friend struct aff;
10781  template <typename...>
10782  friend struct aff_list;
10783  template <typename...>
10784  friend struct basic_map;
10785  template <typename...>
10786  friend struct basic_set;
10787  template <typename...>
10788  friend struct fixed_box;
10789  template <typename...>
10790  friend struct id;
10791  template <typename...>
10792  friend struct id_list;
10793  template <typename...>
10794  friend struct map;
10795  template <typename...>
10796  friend struct map_list;
10797  template <typename...>
10798  friend struct multi_aff;
10799  template <typename...>
10800  friend struct multi_id;
10801  template <typename...>
10802  friend struct multi_pw_aff;
10803  template <typename...>
10804  friend struct multi_union_pw_aff;
10805  template <typename...>
10806  friend struct multi_val;
10807  template <typename...>
10808  friend struct point;
10809  template <typename...>
10810  friend struct pw_aff;
10811  template <typename...>
10812  friend struct pw_aff_list;
10813  template <typename...>
10814  friend struct pw_multi_aff;
10815  template <typename...>
10816  friend struct pw_multi_aff_list;
10817  template <typename...>
10818  friend struct set;
10819  template <typename...>
10820  friend struct set_list;
10821  template <typename...>
10822  friend struct space;
10823  template <typename...>
10824  friend struct union_map;
10825  template <typename...>
10826  friend struct union_pw_aff;
10827  template <typename...>
10828  friend struct union_pw_aff_list;
10829  template <typename...>
10830  friend struct union_pw_multi_aff;
10831  template <typename...>
10832  friend struct union_set;
10833  template <typename...>
10834  friend struct union_set_list;
10835  template <typename...>
10836  friend struct val;
10837  template <typename...>
10838  friend struct val_list;
10839
10840  space() = default;
10841  template <typename Arg1, typename Arg2, typename Arg3,
10842            typename std::enable_if<
10843              std::is_base_of<Domain, Arg1>{} &&
10844              std::is_base_of<Range, Arg2>{} &&
10845              std::is_base_of<Range2, Arg3>{},
10846            bool>::type = true>
10847  space(const space<Arg1, pair<Arg2, Arg3>> &obj) : isl::space(obj) {}
10848 private:
10849  template <typename base,
10850            typename std::enable_if<
10851              std::is_same<base, isl::space>{}, bool>::type = true>
10852  space(const base &obj) : isl::space(obj) {}
10853 public:
10854  static space from(const isl::space &obj) {
10855    return space(obj);
10856  }
10857  inline explicit space(const isl::ctx &ctx, const std::string &str);
10858  inline typed::space<Domain, pair<Range, Range2>> add_named_tuple(const typed::id<> &tuple_id, unsigned int dim) const = delete;
10859  inline typed::space<Domain, pair<Range, Range2>> add_named_tuple(const std::string &tuple_id, unsigned int dim) const = delete;
10860  inline typed::space<Domain, pair<Range, Range2>> add_param(const typed::id<Anonymous> &id) const;
10861  inline typed::space<Domain, pair<Range, Range2>> add_param(const std::string &id) const;
10862  inline typed::space<Domain, pair<Range, Range2>> add_unnamed_tuple(unsigned int dim) const = delete;
10863  inline typed::space<Domain, pair<Range, Range2>> curry() const = delete;
10864  inline typed::space<Domain> domain() const;
10865  inline typed::multi_aff<pair<Domain, pair<Range, Range2>>, Domain> domain_map_multi_aff() const;
10866  inline typed::pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain> domain_map_pw_multi_aff() const;
10867  inline typed::space<Domain, pair<Range, Range2>> domain_reverse() const = delete;
10868  inline typed::id<Domain, pair<Range, Range2>> get_domain_tuple_id() const = delete;
10869  inline typed::space<Domain, pair<Range, Range2>> drop_all_params() const;
10870  inline typed::space<Domain, pair<Range, Range2>> flatten_domain() const = delete;
10871  inline typed::space<Domain, Anonymous> flatten_range() const;
10872  inline typed::multi_aff<Domain, pair<Range, Range2>> identity_multi_aff_on_domain() const = delete;
10873  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> identity_multi_pw_aff_on_domain() const = delete;
10874  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> identity_pw_multi_aff_on_domain() const = delete;
10875  inline typed::space<Domain, pair<Range, Range2>> map_from_set() const = delete;
10876  inline typed::multi_aff<Domain, pair<Range, Range2>> multi_aff(const typed::aff_list<Domain, Anonymous> &list) const;
10877  inline typed::multi_aff<Domain, pair<Range, Range2>> multi_aff_on_domain(const typed::multi_val<> &mv) const = delete;
10878  inline typed::multi_id<Domain, pair<Range, Range2>> multi_id(const typed::id_list<> &list) const = delete;
10879  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> multi_pw_aff(const typed::pw_aff_list<Domain, Anonymous> &list) const;
10880  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> multi_union_pw_aff(const typed::union_pw_aff_list<> &list) const = delete;
10881  inline typed::multi_val<Domain, pair<Range, Range2>> multi_val(const typed::val_list<> &list) const = delete;
10882  inline typed::aff<Domain, pair<Range, Range2>> param_aff_on_domain(const typed::id<> &id) const = delete;
10883  inline typed::aff<Domain, pair<Range, Range2>> param_aff_on_domain(const std::string &id) const = delete;
10884  inline typed::space<> params() const;
10885  template <typename Domain2, typename Arg3>
10886  inline typed::space<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::space<Domain2, Arg3> &right) const;
10887  inline typed::space<pair<Range, Range2>> range() const;
10888  inline typed::multi_aff<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> range_map_multi_aff() const;
10889  inline typed::pw_multi_aff<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> range_map_pw_multi_aff() const;
10890  inline typed::space<Domain, pair<Range2, Range>> range_reverse() const;
10891  inline typed::id<Domain, pair<Range, Range2>> get_range_tuple_id() const = delete;
10892  inline typed::space<pair<Range, Range2>, Domain> reverse() const;
10893  template <typename Domain2>
10894  inline typed::space<Domain2, pair<Range, Range2>> set_domain_tuple(const typed::id<Anonymous> &id) const;
10895  template <typename Domain2>
10896  inline typed::space<Domain2, pair<Range, Range2>> set_domain_tuple(const std::string &id) const;
10897  inline typed::space<Domain, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
10898  inline typed::space<Domain, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
10899  inline typed::space<pair<Domain, Range>, Range2> uncurry() const;
10900  static inline typed::space<Domain, pair<Range, Range2>> unit(const isl::ctx &ctx) = delete;
10901  inline typed::map<Domain, pair<Range, Range2>> universe_map() const;
10902  inline typed::set<Domain, pair<Range, Range2>> universe_set() const = delete;
10903  inline typed::space<Domain, pair<Range, Range2>> unwrap() const = delete;
10904  inline typed::space<pair<Domain, pair<Range, Range2>>> wrap() const;
10905  inline typed::space<Domain, pair<Range, Range2>> wrapped_reverse() const = delete;
10906  inline typed::aff<Domain, pair<Range, Range2>> zero_aff_on_domain() const = delete;
10907  inline typed::multi_aff<Domain, pair<Range, Range2>> zero_multi_aff() const;
10908  inline typed::multi_pw_aff<Domain, pair<Range, Range2>> zero_multi_pw_aff() const;
10909  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> zero_multi_union_pw_aff() const;
10910  inline typed::multi_val<Domain, pair<Range, Range2>> zero_multi_val() const = delete;
10911};
10912
10913template <typename T1, typename T2, typename Range, typename Range2>
10914struct space<pair<T1, T2>, pair<Range, Range2>> : public isl::space {
10915  template <typename...>
10916  friend struct aff;
10917  template <typename...>
10918  friend struct aff_list;
10919  template <typename...>
10920  friend struct basic_map;
10921  template <typename...>
10922  friend struct basic_set;
10923  template <typename...>
10924  friend struct fixed_box;
10925  template <typename...>
10926  friend struct id;
10927  template <typename...>
10928  friend struct id_list;
10929  template <typename...>
10930  friend struct map;
10931  template <typename...>
10932  friend struct map_list;
10933  template <typename...>
10934  friend struct multi_aff;
10935  template <typename...>
10936  friend struct multi_id;
10937  template <typename...>
10938  friend struct multi_pw_aff;
10939  template <typename...>
10940  friend struct multi_union_pw_aff;
10941  template <typename...>
10942  friend struct multi_val;
10943  template <typename...>
10944  friend struct point;
10945  template <typename...>
10946  friend struct pw_aff;
10947  template <typename...>
10948  friend struct pw_aff_list;
10949  template <typename...>
10950  friend struct pw_multi_aff;
10951  template <typename...>
10952  friend struct pw_multi_aff_list;
10953  template <typename...>
10954  friend struct set;
10955  template <typename...>
10956  friend struct set_list;
10957  template <typename...>
10958  friend struct space;
10959  template <typename...>
10960  friend struct union_map;
10961  template <typename...>
10962  friend struct union_pw_aff;
10963  template <typename...>
10964  friend struct union_pw_aff_list;
10965  template <typename...>
10966  friend struct union_pw_multi_aff;
10967  template <typename...>
10968  friend struct union_set;
10969  template <typename...>
10970  friend struct union_set_list;
10971  template <typename...>
10972  friend struct val;
10973  template <typename...>
10974  friend struct val_list;
10975
10976  space() = default;
10977  template <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
10978            typename std::enable_if<
10979              std::is_base_of<T1, Arg1>{} &&
10980              std::is_base_of<T2, Arg2>{} &&
10981              std::is_base_of<Range, Arg3>{} &&
10982              std::is_base_of<Range2, Arg4>{},
10983            bool>::type = true>
10984  space(const space<pair<Arg1, Arg2>, pair<Arg3, Arg4>> &obj) : isl::space(obj) {}
10985 private:
10986  template <typename base,
10987            typename std::enable_if<
10988              std::is_same<base, isl::space>{}, bool>::type = true>
10989  space(const base &obj) : isl::space(obj) {}
10990 public:
10991  static space from(const isl::space &obj) {
10992    return space(obj);
10993  }
10994  inline explicit space(const isl::ctx &ctx, const std::string &str);
10995  inline typed::space<pair<T1, T2>, pair<Range, Range2>> add_named_tuple(const typed::id<> &tuple_id, unsigned int dim) const = delete;
10996  inline typed::space<pair<T1, T2>, pair<Range, Range2>> add_named_tuple(const std::string &tuple_id, unsigned int dim) const = delete;
10997  inline typed::space<pair<T1, T2>, pair<Range, Range2>> add_param(const typed::id<Anonymous> &id) const;
10998  inline typed::space<pair<T1, T2>, pair<Range, Range2>> add_param(const std::string &id) const;
10999  inline typed::space<pair<T1, T2>, pair<Range, Range2>> add_unnamed_tuple(unsigned int dim) const = delete;
11000  inline typed::space<T1, pair<T2, pair<Range, Range2>>> curry() const;
11001  inline typed::space<pair<T1, T2>> domain() const;
11002  inline typed::multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> domain_map_multi_aff() const;
11003  inline typed::pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> domain_map_pw_multi_aff() const;
11004  inline typed::space<pair<T2, T1>, pair<Range, Range2>> domain_reverse() const;
11005  inline typed::id<pair<T1, T2>, pair<Range, Range2>> get_domain_tuple_id() const = delete;
11006  inline typed::space<pair<T1, T2>, pair<Range, Range2>> drop_all_params() const;
11007  inline typed::space<Anonymous, pair<Range, Range2>> flatten_domain() const;
11008  inline typed::space<pair<T1, T2>, Anonymous> flatten_range() const;
11009  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> identity_multi_aff_on_domain() const = delete;
11010  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> identity_multi_pw_aff_on_domain() const = delete;
11011  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> identity_pw_multi_aff_on_domain() const = delete;
11012  inline typed::space<pair<T1, T2>, pair<Range, Range2>> map_from_set() const = delete;
11013  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> multi_aff(const typed::aff_list<pair<T1, T2>, Anonymous> &list) const;
11014  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> multi_aff_on_domain(const typed::multi_val<> &mv) const = delete;
11015  inline typed::multi_id<pair<T1, T2>, pair<Range, Range2>> multi_id(const typed::id_list<> &list) const = delete;
11016  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> multi_pw_aff(const typed::pw_aff_list<pair<T1, T2>, Anonymous> &list) const;
11017  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> multi_union_pw_aff(const typed::union_pw_aff_list<> &list) const = delete;
11018  inline typed::multi_val<pair<T1, T2>, pair<Range, Range2>> multi_val(const typed::val_list<> &list) const = delete;
11019  inline typed::aff<pair<T1, T2>, pair<Range, Range2>> param_aff_on_domain(const typed::id<> &id) const = delete;
11020  inline typed::aff<pair<T1, T2>, pair<Range, Range2>> param_aff_on_domain(const std::string &id) const = delete;
11021  inline typed::space<> params() const;
11022  template <typename Domain2, typename Arg2>
11023  inline typed::space<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::space<Domain2, Arg2> &right) const;
11024  inline typed::space<pair<Range, Range2>> range() const;
11025  inline typed::multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> range_map_multi_aff() const;
11026  inline typed::pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> range_map_pw_multi_aff() const;
11027  inline typed::space<pair<T1, T2>, pair<Range2, Range>> range_reverse() const;
11028  inline typed::id<pair<T1, T2>, pair<Range, Range2>> get_range_tuple_id() const = delete;
11029  inline typed::space<pair<Range, Range2>, pair<T1, T2>> reverse() const;
11030  inline typed::space<pair<T1, T2>, pair<Range, Range2>> set_domain_tuple(const typed::id<> &id) const = delete;
11031  inline typed::space<pair<T1, T2>, pair<Range, Range2>> set_domain_tuple(const std::string &id) const = delete;
11032  inline typed::space<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const typed::id<> &id) const = delete;
11033  inline typed::space<pair<T1, T2>, pair<Range, Range2>> set_range_tuple(const std::string &id) const = delete;
11034  inline typed::space<pair<pair<T1, T2>, Range>, Range2> uncurry() const;
11035  static inline typed::space<pair<T1, T2>, pair<Range, Range2>> unit(const isl::ctx &ctx) = delete;
11036  inline typed::map<pair<T1, T2>, pair<Range, Range2>> universe_map() const;
11037  inline typed::set<pair<T1, T2>, pair<Range, Range2>> universe_set() const = delete;
11038  inline typed::space<pair<T1, T2>, pair<Range, Range2>> unwrap() const = delete;
11039  inline typed::space<pair<pair<T1, T2>, pair<Range, Range2>>> wrap() const;
11040  inline typed::space<pair<T1, T2>, pair<Range, Range2>> wrapped_reverse() const = delete;
11041  inline typed::aff<pair<T1, T2>, pair<Range, Range2>> zero_aff_on_domain() const = delete;
11042  inline typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> zero_multi_aff() const;
11043  inline typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> zero_multi_pw_aff() const;
11044  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> zero_multi_union_pw_aff() const;
11045  inline typed::multi_val<pair<T1, T2>, pair<Range, Range2>> zero_multi_val() const = delete;
11046};
11047
11048template <typename Domain, typename Range>
11049struct union_map<Domain, Range> : public isl::union_map {
11050  template <typename...>
11051  friend struct aff;
11052  template <typename...>
11053  friend struct aff_list;
11054  template <typename...>
11055  friend struct basic_map;
11056  template <typename...>
11057  friend struct basic_set;
11058  template <typename...>
11059  friend struct fixed_box;
11060  template <typename...>
11061  friend struct id;
11062  template <typename...>
11063  friend struct id_list;
11064  template <typename...>
11065  friend struct map;
11066  template <typename...>
11067  friend struct map_list;
11068  template <typename...>
11069  friend struct multi_aff;
11070  template <typename...>
11071  friend struct multi_id;
11072  template <typename...>
11073  friend struct multi_pw_aff;
11074  template <typename...>
11075  friend struct multi_union_pw_aff;
11076  template <typename...>
11077  friend struct multi_val;
11078  template <typename...>
11079  friend struct point;
11080  template <typename...>
11081  friend struct pw_aff;
11082  template <typename...>
11083  friend struct pw_aff_list;
11084  template <typename...>
11085  friend struct pw_multi_aff;
11086  template <typename...>
11087  friend struct pw_multi_aff_list;
11088  template <typename...>
11089  friend struct set;
11090  template <typename...>
11091  friend struct set_list;
11092  template <typename...>
11093  friend struct space;
11094  template <typename...>
11095  friend struct union_map;
11096  template <typename...>
11097  friend struct union_pw_aff;
11098  template <typename...>
11099  friend struct union_pw_aff_list;
11100  template <typename...>
11101  friend struct union_pw_multi_aff;
11102  template <typename...>
11103  friend struct union_set;
11104  template <typename...>
11105  friend struct union_set_list;
11106  template <typename...>
11107  friend struct val;
11108  template <typename...>
11109  friend struct val_list;
11110
11111  union_map() = default;
11112  template <typename Arg1, typename Arg2,
11113            typename std::enable_if<
11114              std::is_base_of<Domain, Arg1>{} &&
11115              std::is_base_of<Range, Arg2>{},
11116            bool>::type = true>
11117  union_map(const union_map<Arg1, Arg2> &obj) : isl::union_map(obj) {}
11118 private:
11119  template <typename base,
11120            typename std::enable_if<
11121              std::is_same<base, isl::union_map>{}, bool>::type = true>
11122  union_map(const base &obj) : isl::union_map(obj) {}
11123 public:
11124  static union_map from(const isl::union_map &obj) {
11125    return union_map(obj);
11126  }
11127  inline /* implicit */ union_map(const typed::basic_map<Domain, Range> &bmap);
11128  inline /* implicit */ union_map(const typed::map<Domain, Range> &map);
11129  inline explicit union_map(const isl::ctx &ctx, const std::string &str);
11130  template <typename Domain2>
11131  inline typed::union_map<Domain2, Range> apply_domain(const typed::union_map<Domain, Domain2> &umap2) const;
11132  template <typename Domain2>
11133  inline typed::union_map<Domain2, Range> apply_domain(const typed::basic_map<Domain, Domain2> &umap2) const;
11134  template <typename Domain2>
11135  inline typed::union_map<Domain2, Range> apply_domain(const typed::map<Domain, Domain2> &umap2) const;
11136  template <typename Range2>
11137  inline typed::union_map<Domain, Range2> apply_range(const typed::union_map<Range, Range2> &umap2) const;
11138  template <typename Range2>
11139  inline typed::union_map<Domain, Range2> apply_range(const typed::basic_map<Range, Range2> &umap2) const;
11140  template <typename Range2>
11141  inline typed::union_map<Domain, Range2> apply_range(const typed::map<Range, Range2> &umap2) const;
11142  inline typed::map<Domain, Range> as_map() const;
11143  inline typed::multi_union_pw_aff<Domain, Range> as_multi_union_pw_aff() const;
11144  inline typed::union_pw_multi_aff<Domain, Range> as_union_pw_multi_aff() const;
11145  inline typed::union_set<Domain> bind_range(const typed::multi_id<Range> &tuple) const;
11146  inline typed::union_map<Domain, Range> coalesce() const;
11147  inline typed::union_map<Domain, Range> curry() const = delete;
11148  inline typed::union_set<Domain, Range> deltas() const = delete;
11149  inline typed::union_map<Domain, Range> detect_equalities() const;
11150  inline typed::union_set<Domain> domain() const;
11151  inline typed::union_map<Domain, Range> domain_factor_domain() const = delete;
11152  inline typed::union_map<Domain, Range> domain_factor_range() const = delete;
11153  inline typed::union_map<pair<Domain, Range>, Domain> domain_map() const;
11154  inline typed::union_pw_multi_aff<pair<Domain, Range>, Domain> domain_map_union_pw_multi_aff() const;
11155  template <typename Domain2>
11156  inline typed::union_map<pair<Domain, Domain2>, Range> domain_product(const typed::union_map<Domain2, Range> &umap2) const;
11157  template <typename Domain2>
11158  inline typed::union_map<pair<Domain, Domain2>, Range> domain_product(const typed::basic_map<Domain2, Range> &umap2) const;
11159  template <typename Domain2>
11160  inline typed::union_map<pair<Domain, Domain2>, Range> domain_product(const typed::map<Domain2, Range> &umap2) const;
11161  inline typed::union_map<Domain, Range> domain_reverse() const = delete;
11162  inline typed::union_map<Domain, Range> drop_unused_params() const;
11163  static inline typed::union_map<Domain, Range> empty(const isl::ctx &ctx);
11164  inline typed::union_map<Domain, Range> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
11165  inline typed::union_map<Domain, Range> eq_at(const typed::multi_pw_aff<> &mupa) const = delete;
11166  inline typed::union_map<Domain, Range> eq_at(const typed::union_pw_aff<> &mupa) const = delete;
11167  inline bool every_map(const std::function<bool(typed::map<Domain, Range>)> &test) const;
11168  inline typed::map<Domain, Range> extract_map(const typed::space<Domain, Range> &space) const;
11169  inline void foreach_map(const std::function<void(typed::map<Domain, Range>)> &fn) const;
11170  inline typed::union_map<Domain, Range> gist(const typed::union_map<Domain, Range> &context) const;
11171  inline typed::union_map<Domain, Range> gist(const typed::basic_map<Domain, Range> &context) const;
11172  inline typed::union_map<Domain, Range> gist(const typed::map<Domain, Range> &context) const;
11173  inline typed::union_map<Domain, Range> gist_domain(const typed::union_set<Domain> &uset) const;
11174  inline typed::union_map<Domain, Range> gist_domain(const typed::basic_set<Domain> &uset) const;
11175  inline typed::union_map<Domain, Range> gist_domain(const typed::point<Domain> &uset) const;
11176  inline typed::union_map<Domain, Range> gist_domain(const typed::set<Domain> &uset) const;
11177  inline typed::union_map<Domain, Range> gist_params(const typed::set<> &set) const;
11178  inline typed::union_map<Domain, Range> gist_params(const typed::basic_set<> &set) const;
11179  inline typed::union_map<Domain, Range> gist_params(const typed::point<> &set) const;
11180  inline typed::union_map<Domain, Range> intersect(const typed::union_map<Domain, Range> &umap2) const;
11181  inline typed::union_map<Domain, Range> intersect(const typed::basic_map<Domain, Range> &umap2) const;
11182  inline typed::union_map<Domain, Range> intersect(const typed::map<Domain, Range> &umap2) const;
11183  inline typed::union_map<Domain, Range> intersect_domain(const typed::space<Domain> &space) const;
11184  inline typed::union_map<Domain, Range> intersect_domain(const typed::union_set<Domain> &uset) const;
11185  inline typed::union_map<Domain, Range> intersect_domain_wrapped_domain(const typed::union_set<> &domain) const = delete;
11186  inline typed::union_map<Domain, Range> intersect_domain_wrapped_domain(const typed::basic_set<> &domain) const = delete;
11187  inline typed::union_map<Domain, Range> intersect_domain_wrapped_domain(const typed::point<> &domain) const = delete;
11188  inline typed::union_map<Domain, Range> intersect_domain_wrapped_domain(const typed::set<> &domain) const = delete;
11189  inline typed::union_map<Domain, Range> intersect_params(const typed::set<> &set) const;
11190  inline typed::union_map<Domain, Range> intersect_params(const typed::basic_set<> &set) const;
11191  inline typed::union_map<Domain, Range> intersect_params(const typed::point<> &set) const;
11192  inline typed::union_map<Domain, Range> intersect_range(const typed::space<Range> &space) const;
11193  inline typed::union_map<Domain, Range> intersect_range(const typed::union_set<Range> &uset) const;
11194  inline typed::union_map<Domain, Range> intersect_range_wrapped_domain(const typed::union_set<> &domain) const = delete;
11195  inline typed::union_map<Domain, Range> intersect_range_wrapped_domain(const typed::basic_set<> &domain) const = delete;
11196  inline typed::union_map<Domain, Range> intersect_range_wrapped_domain(const typed::point<> &domain) const = delete;
11197  inline typed::union_map<Domain, Range> intersect_range_wrapped_domain(const typed::set<> &domain) const = delete;
11198  inline typed::union_map<Domain, Range> lexmax() const;
11199  inline typed::union_map<Domain, Range> lexmin() const;
11200  inline typed::map_list<Domain, Range> map_list() const;
11201  inline typed::map_list<Domain, Range> get_map_list() const = delete;
11202  inline typed::set<> params() const;
11203  template <typename Domain2>
11204  inline typed::union_map<Domain2, Range> preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const;
11205  template <typename Domain2>
11206  inline typed::union_map<Domain2, Range> preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
11207  template <typename Domain2>
11208  inline typed::union_map<Domain2, Range> preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
11209  template <typename Domain2>
11210  inline typed::union_map<Domain2, Range> preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
11211  template <typename Range2>
11212  inline typed::union_map<Domain, Range2> preimage_range(const typed::multi_aff<Range2, Range> &ma) const;
11213  template <typename Range2>
11214  inline typed::union_map<Domain, Range2> preimage_range(const typed::pw_multi_aff<Range2, Range> &pma) const;
11215  template <typename Range2>
11216  inline typed::union_map<Domain, Range2> preimage_range(const typed::union_pw_multi_aff<Range2, Range> &upma) const;
11217  template <typename Domain2, typename Range2>
11218  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::union_map<Domain2, Range2> &umap2) const;
11219  template <typename Domain2, typename Range2>
11220  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::basic_map<Domain2, Range2> &umap2) const;
11221  template <typename Domain2, typename Range2>
11222  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> product(const typed::map<Domain2, Range2> &umap2) const;
11223  inline typed::union_map<Domain, Range> project_out_all_params() const;
11224  inline typed::union_map<Domain, Range> project_out_param(const typed::id<Anonymous> &id) const;
11225  inline typed::union_map<Domain, Range> project_out_param(const std::string &id) const;
11226  inline typed::union_map<Domain, Range> project_out_param(const typed::id_list<Anonymous> &list) const;
11227  inline typed::union_set<Range> range() const;
11228  inline typed::union_map<Domain, Range> range_factor_domain() const = delete;
11229  inline typed::union_map<Domain, Range> range_factor_range() const = delete;
11230  inline typed::union_map<pair<Domain, Range>, Range> range_map() const;
11231  template <typename Range2>
11232  inline typed::union_map<Domain, pair<Range, Range2>> range_product(const typed::union_map<Domain, Range2> &umap2) const;
11233  template <typename Range2>
11234  inline typed::union_map<Domain, pair<Range, Range2>> range_product(const typed::basic_map<Domain, Range2> &umap2) const;
11235  template <typename Range2>
11236  inline typed::union_map<Domain, pair<Range, Range2>> range_product(const typed::map<Domain, Range2> &umap2) const;
11237  inline typed::union_map<Domain, Range> range_reverse() const = delete;
11238  inline typed::union_map<Range, Domain> reverse() const;
11239  inline typed::space<> space() const;
11240  inline typed::space<Domain, Range> get_space() const = delete;
11241  inline typed::union_map<Domain, Range> subtract(const typed::union_map<Domain, Range> &umap2) const;
11242  inline typed::union_map<Domain, Range> subtract(const typed::basic_map<Domain, Range> &umap2) const;
11243  inline typed::union_map<Domain, Range> subtract(const typed::map<Domain, Range> &umap2) const;
11244  inline typed::union_map<Domain, Range> subtract_domain(const typed::union_set<Domain> &dom) const;
11245  inline typed::union_map<Domain, Range> subtract_domain(const typed::basic_set<Domain> &dom) const;
11246  inline typed::union_map<Domain, Range> subtract_domain(const typed::point<Domain> &dom) const;
11247  inline typed::union_map<Domain, Range> subtract_domain(const typed::set<Domain> &dom) const;
11248  inline typed::union_map<Domain, Range> subtract_range(const typed::union_set<Range> &dom) const;
11249  inline typed::union_map<Domain, Range> subtract_range(const typed::basic_set<Range> &dom) const;
11250  inline typed::union_map<Domain, Range> subtract_range(const typed::point<Range> &dom) const;
11251  inline typed::union_map<Domain, Range> subtract_range(const typed::set<Range> &dom) const;
11252  inline typed::union_map<Domain, Range> uncurry() const = delete;
11253  inline typed::union_map<Domain, Range> unite(const typed::union_map<Domain, Range> &umap2) const;
11254  inline typed::union_map<Domain, Range> unite(const typed::basic_map<Domain, Range> &umap2) const;
11255  inline typed::union_map<Domain, Range> unite(const typed::map<Domain, Range> &umap2) const;
11256  inline typed::union_map<Domain, Range> universe() const;
11257  inline typed::union_set<pair<Domain, Range>> wrap() const;
11258};
11259
11260template <typename Domain, typename Range, typename Range2>
11261struct union_map<pair<Domain, Range>, Range2> : public isl::union_map {
11262  template <typename...>
11263  friend struct aff;
11264  template <typename...>
11265  friend struct aff_list;
11266  template <typename...>
11267  friend struct basic_map;
11268  template <typename...>
11269  friend struct basic_set;
11270  template <typename...>
11271  friend struct fixed_box;
11272  template <typename...>
11273  friend struct id;
11274  template <typename...>
11275  friend struct id_list;
11276  template <typename...>
11277  friend struct map;
11278  template <typename...>
11279  friend struct map_list;
11280  template <typename...>
11281  friend struct multi_aff;
11282  template <typename...>
11283  friend struct multi_id;
11284  template <typename...>
11285  friend struct multi_pw_aff;
11286  template <typename...>
11287  friend struct multi_union_pw_aff;
11288  template <typename...>
11289  friend struct multi_val;
11290  template <typename...>
11291  friend struct point;
11292  template <typename...>
11293  friend struct pw_aff;
11294  template <typename...>
11295  friend struct pw_aff_list;
11296  template <typename...>
11297  friend struct pw_multi_aff;
11298  template <typename...>
11299  friend struct pw_multi_aff_list;
11300  template <typename...>
11301  friend struct set;
11302  template <typename...>
11303  friend struct set_list;
11304  template <typename...>
11305  friend struct space;
11306  template <typename...>
11307  friend struct union_map;
11308  template <typename...>
11309  friend struct union_pw_aff;
11310  template <typename...>
11311  friend struct union_pw_aff_list;
11312  template <typename...>
11313  friend struct union_pw_multi_aff;
11314  template <typename...>
11315  friend struct union_set;
11316  template <typename...>
11317  friend struct union_set_list;
11318  template <typename...>
11319  friend struct val;
11320  template <typename...>
11321  friend struct val_list;
11322
11323  union_map() = default;
11324  template <typename Arg1, typename Arg2, typename Arg3,
11325            typename std::enable_if<
11326              std::is_base_of<Domain, Arg1>{} &&
11327              std::is_base_of<Range, Arg2>{} &&
11328              std::is_base_of<Range2, Arg3>{},
11329            bool>::type = true>
11330  union_map(const union_map<pair<Arg1, Arg2>, Arg3> &obj) : isl::union_map(obj) {}
11331 private:
11332  template <typename base,
11333            typename std::enable_if<
11334              std::is_same<base, isl::union_map>{}, bool>::type = true>
11335  union_map(const base &obj) : isl::union_map(obj) {}
11336 public:
11337  static union_map from(const isl::union_map &obj) {
11338    return union_map(obj);
11339  }
11340  inline /* implicit */ union_map(const typed::basic_map<pair<Domain, Range>, Range2> &bmap);
11341  inline /* implicit */ union_map(const typed::map<pair<Domain, Range>, Range2> &map);
11342  inline explicit union_map(const isl::ctx &ctx, const std::string &str);
11343  template <typename Domain2>
11344  inline typed::union_map<Domain2, Range2> apply_domain(const typed::union_map<pair<Domain, Range>, Domain2> &umap2) const;
11345  template <typename Domain2>
11346  inline typed::union_map<Domain2, Range2> apply_domain(const typed::basic_map<pair<Domain, Range>, Domain2> &umap2) const;
11347  template <typename Domain2>
11348  inline typed::union_map<Domain2, Range2> apply_domain(const typed::map<pair<Domain, Range>, Domain2> &umap2) const;
11349  template <typename Arg3>
11350  inline typed::union_map<pair<Domain, Range>, Arg3> apply_range(const typed::union_map<Range2, Arg3> &umap2) const;
11351  template <typename Arg3>
11352  inline typed::union_map<pair<Domain, Range>, Arg3> apply_range(const typed::basic_map<Range2, Arg3> &umap2) const;
11353  template <typename Arg3>
11354  inline typed::union_map<pair<Domain, Range>, Arg3> apply_range(const typed::map<Range2, Arg3> &umap2) const;
11355  inline typed::map<pair<Domain, Range>, Range2> as_map() const;
11356  inline typed::multi_union_pw_aff<pair<Domain, Range>, Range2> as_multi_union_pw_aff() const;
11357  inline typed::union_pw_multi_aff<pair<Domain, Range>, Range2> as_union_pw_multi_aff() const;
11358  inline typed::union_set<pair<Domain, Range>> bind_range(const typed::multi_id<Range2> &tuple) const;
11359  inline typed::union_map<pair<Domain, Range>, Range2> coalesce() const;
11360  inline typed::union_map<Domain, pair<Range, Range2>> curry() const;
11361  inline typed::union_set<pair<Domain, Range>, Range2> deltas() const = delete;
11362  inline typed::union_map<pair<Domain, Range>, Range2> detect_equalities() const;
11363  inline typed::union_set<pair<Domain, Range>> domain() const;
11364  inline typed::union_map<Domain, Range2> domain_factor_domain() const;
11365  inline typed::union_map<Range, Range2> domain_factor_range() const;
11366  inline typed::union_map<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> domain_map() const;
11367  inline typed::union_pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> domain_map_union_pw_multi_aff() const;
11368  template <typename Domain2>
11369  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> domain_product(const typed::union_map<Domain2, Range2> &umap2) const;
11370  template <typename Domain2>
11371  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> domain_product(const typed::basic_map<Domain2, Range2> &umap2) const;
11372  template <typename Domain2>
11373  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> domain_product(const typed::map<Domain2, Range2> &umap2) const;
11374  inline typed::union_map<pair<Range, Domain>, Range2> domain_reverse() const;
11375  inline typed::union_map<pair<Domain, Range>, Range2> drop_unused_params() const;
11376  static inline typed::union_map<pair<Domain, Range>, Range2> empty(const isl::ctx &ctx);
11377  inline typed::union_map<pair<Domain, Range>, Range2> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
11378  inline typed::union_map<pair<Domain, Range>, Range2> eq_at(const typed::multi_pw_aff<> &mupa) const = delete;
11379  inline typed::union_map<pair<Domain, Range>, Range2> eq_at(const typed::union_pw_aff<> &mupa) const = delete;
11380  inline bool every_map(const std::function<bool(typed::map<pair<Domain, Range>, Range2>)> &test) const;
11381  inline typed::map<pair<Domain, Range>, Range2> extract_map(const typed::space<pair<Domain, Range>, Range2> &space) const;
11382  inline void foreach_map(const std::function<void(typed::map<pair<Domain, Range>, Range2>)> &fn) const;
11383  inline typed::union_map<pair<Domain, Range>, Range2> gist(const typed::union_map<pair<Domain, Range>, Range2> &context) const;
11384  inline typed::union_map<pair<Domain, Range>, Range2> gist(const typed::basic_map<pair<Domain, Range>, Range2> &context) const;
11385  inline typed::union_map<pair<Domain, Range>, Range2> gist(const typed::map<pair<Domain, Range>, Range2> &context) const;
11386  inline typed::union_map<pair<Domain, Range>, Range2> gist_domain(const typed::union_set<pair<Domain, Range>> &uset) const;
11387  inline typed::union_map<pair<Domain, Range>, Range2> gist_domain(const typed::basic_set<pair<Domain, Range>> &uset) const;
11388  inline typed::union_map<pair<Domain, Range>, Range2> gist_domain(const typed::point<pair<Domain, Range>> &uset) const;
11389  inline typed::union_map<pair<Domain, Range>, Range2> gist_domain(const typed::set<pair<Domain, Range>> &uset) const;
11390  inline typed::union_map<pair<Domain, Range>, Range2> gist_params(const typed::set<> &set) const;
11391  inline typed::union_map<pair<Domain, Range>, Range2> gist_params(const typed::basic_set<> &set) const;
11392  inline typed::union_map<pair<Domain, Range>, Range2> gist_params(const typed::point<> &set) const;
11393  inline typed::union_map<pair<Domain, Range>, Range2> intersect(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const;
11394  inline typed::union_map<pair<Domain, Range>, Range2> intersect(const typed::basic_map<pair<Domain, Range>, Range2> &umap2) const;
11395  inline typed::union_map<pair<Domain, Range>, Range2> intersect(const typed::map<pair<Domain, Range>, Range2> &umap2) const;
11396  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain(const typed::space<pair<Domain, Range>> &space) const;
11397  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain(const typed::union_set<pair<Domain, Range>> &uset) const;
11398  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::union_set<Domain> &domain) const;
11399  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::basic_set<Domain> &domain) const;
11400  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::point<Domain> &domain) const;
11401  inline typed::union_map<pair<Domain, Range>, Range2> intersect_domain_wrapped_domain(const typed::set<Domain> &domain) const;
11402  inline typed::union_map<pair<Domain, Range>, Range2> intersect_params(const typed::set<> &set) const;
11403  inline typed::union_map<pair<Domain, Range>, Range2> intersect_params(const typed::basic_set<> &set) const;
11404  inline typed::union_map<pair<Domain, Range>, Range2> intersect_params(const typed::point<> &set) const;
11405  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range(const typed::space<Range2> &space) const;
11406  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range(const typed::union_set<Range2> &uset) const;
11407  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::union_set<> &domain) const = delete;
11408  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::basic_set<> &domain) const = delete;
11409  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::point<> &domain) const = delete;
11410  inline typed::union_map<pair<Domain, Range>, Range2> intersect_range_wrapped_domain(const typed::set<> &domain) const = delete;
11411  inline typed::union_map<pair<Domain, Range>, Range2> lexmax() const;
11412  inline typed::union_map<pair<Domain, Range>, Range2> lexmin() const;
11413  inline typed::map_list<pair<Domain, Range>, Range2> map_list() const;
11414  inline typed::map_list<pair<Domain, Range>, Range2> get_map_list() const = delete;
11415  inline typed::set<> params() const;
11416  template <typename Domain2>
11417  inline typed::union_map<Domain2, Range2> preimage_domain(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const;
11418  template <typename Domain2>
11419  inline typed::union_map<Domain2, Range2> preimage_domain(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const;
11420  template <typename Domain2>
11421  inline typed::union_map<Domain2, Range2> preimage_domain(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const;
11422  template <typename Domain2>
11423  inline typed::union_map<Domain2, Range2> preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const;
11424  template <typename Arg3>
11425  inline typed::union_map<pair<Domain, Range>, Arg3> preimage_range(const typed::multi_aff<Arg3, Range2> &ma) const;
11426  template <typename Arg3>
11427  inline typed::union_map<pair<Domain, Range>, Arg3> preimage_range(const typed::pw_multi_aff<Arg3, Range2> &pma) const;
11428  template <typename Arg3>
11429  inline typed::union_map<pair<Domain, Range>, Arg3> preimage_range(const typed::union_pw_multi_aff<Arg3, Range2> &upma) const;
11430  template <typename Domain2, typename Arg3>
11431  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> product(const typed::union_map<Domain2, Arg3> &umap2) const;
11432  template <typename Domain2, typename Arg3>
11433  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> product(const typed::basic_map<Domain2, Arg3> &umap2) const;
11434  template <typename Domain2, typename Arg3>
11435  inline typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> product(const typed::map<Domain2, Arg3> &umap2) const;
11436  inline typed::union_map<pair<Domain, Range>, Range2> project_out_all_params() const;
11437  inline typed::union_map<pair<Domain, Range>, Range2> project_out_param(const typed::id<Anonymous> &id) const;
11438  inline typed::union_map<pair<Domain, Range>, Range2> project_out_param(const std::string &id) const;
11439  inline typed::union_map<pair<Domain, Range>, Range2> project_out_param(const typed::id_list<Anonymous> &list) const;
11440  inline typed::union_set<Range2> range() const;
11441  inline typed::union_map<pair<Domain, Range>, Range2> range_factor_domain() const = delete;
11442  inline typed::union_map<pair<Domain, Range>, Range2> range_factor_range() const = delete;
11443  inline typed::union_map<pair<pair<Domain, Range>, Range2>, Range2> range_map() const;
11444  template <typename Arg3>
11445  inline typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> range_product(const typed::union_map<pair<Domain, Range>, Arg3> &umap2) const;
11446  template <typename Arg3>
11447  inline typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> range_product(const typed::basic_map<pair<Domain, Range>, Arg3> &umap2) const;
11448  template <typename Arg3>
11449  inline typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> range_product(const typed::map<pair<Domain, Range>, Arg3> &umap2) const;
11450  inline typed::union_map<pair<Domain, Range>, Range2> range_reverse() const = delete;
11451  inline typed::union_map<Range2, pair<Domain, Range>> reverse() const;
11452  inline typed::space<> space() const;
11453  inline typed::space<pair<Domain, Range>, Range2> get_space() const = delete;
11454  inline typed::union_map<pair<Domain, Range>, Range2> subtract(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const;
11455  inline typed::union_map<pair<Domain, Range>, Range2> subtract(const typed::basic_map<pair<Domain, Range>, Range2> &umap2) const;
11456  inline typed::union_map<pair<Domain, Range>, Range2> subtract(const typed::map<pair<Domain, Range>, Range2> &umap2) const;
11457  inline typed::union_map<pair<Domain, Range>, Range2> subtract_domain(const typed::union_set<pair<Domain, Range>> &dom) const;
11458  inline typed::union_map<pair<Domain, Range>, Range2> subtract_domain(const typed::basic_set<pair<Domain, Range>> &dom) const;
11459  inline typed::union_map<pair<Domain, Range>, Range2> subtract_domain(const typed::point<pair<Domain, Range>> &dom) const;
11460  inline typed::union_map<pair<Domain, Range>, Range2> subtract_domain(const typed::set<pair<Domain, Range>> &dom) const;
11461  inline typed::union_map<pair<Domain, Range>, Range2> subtract_range(const typed::union_set<Range2> &dom) const;
11462  inline typed::union_map<pair<Domain, Range>, Range2> subtract_range(const typed::basic_set<Range2> &dom) const;
11463  inline typed::union_map<pair<Domain, Range>, Range2> subtract_range(const typed::point<Range2> &dom) const;
11464  inline typed::union_map<pair<Domain, Range>, Range2> subtract_range(const typed::set<Range2> &dom) const;
11465  inline typed::union_map<pair<Domain, Range>, Range2> uncurry() const = delete;
11466  inline typed::union_map<pair<Domain, Range>, Range2> unite(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const;
11467  inline typed::union_map<pair<Domain, Range>, Range2> unite(const typed::basic_map<pair<Domain, Range>, Range2> &umap2) const;
11468  inline typed::union_map<pair<Domain, Range>, Range2> unite(const typed::map<pair<Domain, Range>, Range2> &umap2) const;
11469  inline typed::union_map<pair<Domain, Range>, Range2> universe() const;
11470  inline typed::union_set<pair<pair<Domain, Range>, Range2>> wrap() const;
11471};
11472
11473template <typename Domain>
11474struct union_map<Domain, Domain> : public isl::union_map {
11475  template <typename...>
11476  friend struct aff;
11477  template <typename...>
11478  friend struct aff_list;
11479  template <typename...>
11480  friend struct basic_map;
11481  template <typename...>
11482  friend struct basic_set;
11483  template <typename...>
11484  friend struct fixed_box;
11485  template <typename...>
11486  friend struct id;
11487  template <typename...>
11488  friend struct id_list;
11489  template <typename...>
11490  friend struct map;
11491  template <typename...>
11492  friend struct map_list;
11493  template <typename...>
11494  friend struct multi_aff;
11495  template <typename...>
11496  friend struct multi_id;
11497  template <typename...>
11498  friend struct multi_pw_aff;
11499  template <typename...>
11500  friend struct multi_union_pw_aff;
11501  template <typename...>
11502  friend struct multi_val;
11503  template <typename...>
11504  friend struct point;
11505  template <typename...>
11506  friend struct pw_aff;
11507  template <typename...>
11508  friend struct pw_aff_list;
11509  template <typename...>
11510  friend struct pw_multi_aff;
11511  template <typename...>
11512  friend struct pw_multi_aff_list;
11513  template <typename...>
11514  friend struct set;
11515  template <typename...>
11516  friend struct set_list;
11517  template <typename...>
11518  friend struct space;
11519  template <typename...>
11520  friend struct union_map;
11521  template <typename...>
11522  friend struct union_pw_aff;
11523  template <typename...>
11524  friend struct union_pw_aff_list;
11525  template <typename...>
11526  friend struct union_pw_multi_aff;
11527  template <typename...>
11528  friend struct union_set;
11529  template <typename...>
11530  friend struct union_set_list;
11531  template <typename...>
11532  friend struct val;
11533  template <typename...>
11534  friend struct val_list;
11535
11536  union_map() = default;
11537  template <typename Arg1,
11538            typename std::enable_if<
11539              std::is_base_of<Domain, Arg1>{},
11540            bool>::type = true>
11541  union_map(const union_map<Arg1, Arg1> &obj) : isl::union_map(obj) {}
11542 private:
11543  template <typename base,
11544            typename std::enable_if<
11545              std::is_same<base, isl::union_map>{}, bool>::type = true>
11546  union_map(const base &obj) : isl::union_map(obj) {}
11547 public:
11548  static union_map from(const isl::union_map &obj) {
11549    return union_map(obj);
11550  }
11551  inline /* implicit */ union_map(const typed::basic_map<Domain, Domain> &bmap);
11552  inline /* implicit */ union_map(const typed::map<Domain, Domain> &map);
11553  inline explicit union_map(const isl::ctx &ctx, const std::string &str);
11554  template <typename Domain2>
11555  inline typed::union_map<Domain2, Domain> apply_domain(const typed::union_map<Domain, Domain2> &umap2) const;
11556  template <typename Domain2>
11557  inline typed::union_map<Domain2, Domain> apply_domain(const typed::basic_map<Domain, Domain2> &umap2) const;
11558  template <typename Domain2>
11559  inline typed::union_map<Domain2, Domain> apply_domain(const typed::map<Domain, Domain2> &umap2) const;
11560  template <typename Range2>
11561  inline typed::union_map<Domain, Range2> apply_range(const typed::union_map<Domain, Range2> &umap2) const;
11562  template <typename Range2>
11563  inline typed::union_map<Domain, Range2> apply_range(const typed::basic_map<Domain, Range2> &umap2) const;
11564  template <typename Range2>
11565  inline typed::union_map<Domain, Range2> apply_range(const typed::map<Domain, Range2> &umap2) const;
11566  inline typed::map<Domain, Domain> as_map() const;
11567  inline typed::multi_union_pw_aff<Domain, Domain> as_multi_union_pw_aff() const;
11568  inline typed::union_pw_multi_aff<Domain, Domain> as_union_pw_multi_aff() const;
11569  inline typed::union_set<Domain> bind_range(const typed::multi_id<Domain> &tuple) const;
11570  inline typed::union_map<Domain, Domain> coalesce() const;
11571  inline typed::union_map<Domain, Domain> curry() const = delete;
11572  inline typed::union_set<Domain> deltas() const;
11573  inline typed::union_map<Domain, Domain> detect_equalities() const;
11574  inline typed::union_set<Domain> domain() const;
11575  inline typed::union_map<Domain, Domain> domain_factor_domain() const = delete;
11576  inline typed::union_map<Domain, Domain> domain_factor_range() const = delete;
11577  inline typed::union_map<pair<Domain, Domain>, Domain> domain_map() const;
11578  inline typed::union_pw_multi_aff<pair<Domain, Domain>, Domain> domain_map_union_pw_multi_aff() const;
11579  template <typename Domain2>
11580  inline typed::union_map<pair<Domain, Domain2>, Domain> domain_product(const typed::union_map<Domain2, Domain> &umap2) const;
11581  template <typename Domain2>
11582  inline typed::union_map<pair<Domain, Domain2>, Domain> domain_product(const typed::basic_map<Domain2, Domain> &umap2) const;
11583  template <typename Domain2>
11584  inline typed::union_map<pair<Domain, Domain2>, Domain> domain_product(const typed::map<Domain2, Domain> &umap2) const;
11585  inline typed::union_map<Domain, Domain> domain_reverse() const = delete;
11586  inline typed::union_map<Domain, Domain> drop_unused_params() const;
11587  static inline typed::union_map<Domain, Domain> empty(const isl::ctx &ctx);
11588  template <typename Range>
11589  inline typed::union_map<Domain, Domain> eq_at(const typed::multi_union_pw_aff<Domain, Range> &mupa) const;
11590  template <typename Range>
11591  inline typed::union_map<Domain, Domain> eq_at(const typed::multi_pw_aff<Domain, Range> &mupa) const;
11592  inline typed::union_map<Domain, Domain> eq_at(const typed::union_pw_aff<Domain, Anonymous> &mupa) const;
11593  inline bool every_map(const std::function<bool(typed::map<Domain, Domain>)> &test) const;
11594  inline typed::map<Domain, Domain> extract_map(const typed::space<Domain, Domain> &space) const;
11595  inline void foreach_map(const std::function<void(typed::map<Domain, Domain>)> &fn) const;
11596  inline typed::union_map<Domain, Domain> gist(const typed::union_map<Domain, Domain> &context) const;
11597  inline typed::union_map<Domain, Domain> gist(const typed::basic_map<Domain, Domain> &context) const;
11598  inline typed::union_map<Domain, Domain> gist(const typed::map<Domain, Domain> &context) const;
11599  inline typed::union_map<Domain, Domain> gist_domain(const typed::union_set<Domain> &uset) const;
11600  inline typed::union_map<Domain, Domain> gist_domain(const typed::basic_set<Domain> &uset) const;
11601  inline typed::union_map<Domain, Domain> gist_domain(const typed::point<Domain> &uset) const;
11602  inline typed::union_map<Domain, Domain> gist_domain(const typed::set<Domain> &uset) const;
11603  inline typed::union_map<Domain, Domain> gist_params(const typed::set<> &set) const;
11604  inline typed::union_map<Domain, Domain> gist_params(const typed::basic_set<> &set) const;
11605  inline typed::union_map<Domain, Domain> gist_params(const typed::point<> &set) const;
11606  inline typed::union_map<Domain, Domain> intersect(const typed::union_map<Domain, Domain> &umap2) const;
11607  inline typed::union_map<Domain, Domain> intersect(const typed::basic_map<Domain, Domain> &umap2) const;
11608  inline typed::union_map<Domain, Domain> intersect(const typed::map<Domain, Domain> &umap2) const;
11609  inline typed::union_map<Domain, Domain> intersect_domain(const typed::space<Domain> &space) const;
11610  inline typed::union_map<Domain, Domain> intersect_domain(const typed::union_set<Domain> &uset) const;
11611  inline typed::union_map<Domain, Domain> intersect_domain_wrapped_domain(const typed::union_set<> &domain) const = delete;
11612  inline typed::union_map<Domain, Domain> intersect_domain_wrapped_domain(const typed::basic_set<> &domain) const = delete;
11613  inline typed::union_map<Domain, Domain> intersect_domain_wrapped_domain(const typed::point<> &domain) const = delete;
11614  inline typed::union_map<Domain, Domain> intersect_domain_wrapped_domain(const typed::set<> &domain) const = delete;
11615  inline typed::union_map<Domain, Domain> intersect_params(const typed::set<> &set) const;
11616  inline typed::union_map<Domain, Domain> intersect_params(const typed::basic_set<> &set) const;
11617  inline typed::union_map<Domain, Domain> intersect_params(const typed::point<> &set) const;
11618  inline typed::union_map<Domain, Domain> intersect_range(const typed::space<Domain> &space) const;
11619  inline typed::union_map<Domain, Domain> intersect_range(const typed::union_set<Domain> &uset) const;
11620  inline typed::union_map<Domain, Domain> intersect_range_wrapped_domain(const typed::union_set<> &domain) const = delete;
11621  inline typed::union_map<Domain, Domain> intersect_range_wrapped_domain(const typed::basic_set<> &domain) const = delete;
11622  inline typed::union_map<Domain, Domain> intersect_range_wrapped_domain(const typed::point<> &domain) const = delete;
11623  inline typed::union_map<Domain, Domain> intersect_range_wrapped_domain(const typed::set<> &domain) const = delete;
11624  inline typed::union_map<Domain, Domain> lexmax() const;
11625  inline typed::union_map<Domain, Domain> lexmin() const;
11626  inline typed::map_list<Domain, Domain> map_list() const;
11627  inline typed::map_list<Domain, Domain> get_map_list() const = delete;
11628  inline typed::set<> params() const;
11629  template <typename Domain2>
11630  inline typed::union_map<Domain2, Domain> preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const;
11631  template <typename Domain2>
11632  inline typed::union_map<Domain2, Domain> preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
11633  template <typename Domain2>
11634  inline typed::union_map<Domain2, Domain> preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
11635  template <typename Domain2>
11636  inline typed::union_map<Domain2, Domain> preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
11637  template <typename Range2>
11638  inline typed::union_map<Domain, Range2> preimage_range(const typed::multi_aff<Range2, Domain> &ma) const;
11639  template <typename Range2>
11640  inline typed::union_map<Domain, Range2> preimage_range(const typed::pw_multi_aff<Range2, Domain> &pma) const;
11641  template <typename Range2>
11642  inline typed::union_map<Domain, Range2> preimage_range(const typed::union_pw_multi_aff<Range2, Domain> &upma) const;
11643  template <typename Domain2, typename Range2>
11644  inline typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> product(const typed::union_map<Domain2, Range2> &umap2) const;
11645  template <typename Domain2, typename Range2>
11646  inline typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> product(const typed::basic_map<Domain2, Range2> &umap2) const;
11647  template <typename Domain2, typename Range2>
11648  inline typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> product(const typed::map<Domain2, Range2> &umap2) const;
11649  inline typed::union_map<Domain, Domain> project_out_all_params() const;
11650  inline typed::union_map<Domain, Domain> project_out_param(const typed::id<Anonymous> &id) const;
11651  inline typed::union_map<Domain, Domain> project_out_param(const std::string &id) const;
11652  inline typed::union_map<Domain, Domain> project_out_param(const typed::id_list<Anonymous> &list) const;
11653  inline typed::union_set<Domain> range() const;
11654  inline typed::union_map<Domain, Domain> range_factor_domain() const = delete;
11655  inline typed::union_map<Domain, Domain> range_factor_range() const = delete;
11656  inline typed::union_map<pair<Domain, Domain>, Domain> range_map() const;
11657  template <typename Range2>
11658  inline typed::union_map<Domain, pair<Domain, Range2>> range_product(const typed::union_map<Domain, Range2> &umap2) const;
11659  template <typename Range2>
11660  inline typed::union_map<Domain, pair<Domain, Range2>> range_product(const typed::basic_map<Domain, Range2> &umap2) const;
11661  template <typename Range2>
11662  inline typed::union_map<Domain, pair<Domain, Range2>> range_product(const typed::map<Domain, Range2> &umap2) const;
11663  inline typed::union_map<Domain, Domain> range_reverse() const = delete;
11664  inline typed::union_map<Domain, Domain> reverse() const;
11665  inline typed::space<> space() const;
11666  inline typed::space<Domain, Domain> get_space() const = delete;
11667  inline typed::union_map<Domain, Domain> subtract(const typed::union_map<Domain, Domain> &umap2) const;
11668  inline typed::union_map<Domain, Domain> subtract(const typed::basic_map<Domain, Domain> &umap2) const;
11669  inline typed::union_map<Domain, Domain> subtract(const typed::map<Domain, Domain> &umap2) const;
11670  inline typed::union_map<Domain, Domain> subtract_domain(const typed::union_set<Domain> &dom) const;
11671  inline typed::union_map<Domain, Domain> subtract_domain(const typed::basic_set<Domain> &dom) const;
11672  inline typed::union_map<Domain, Domain> subtract_domain(const typed::point<Domain> &dom) const;
11673  inline typed::union_map<Domain, Domain> subtract_domain(const typed::set<Domain> &dom) const;
11674  inline typed::union_map<Domain, Domain> subtract_range(const typed::union_set<Domain> &dom) const;
11675  inline typed::union_map<Domain, Domain> subtract_range(const typed::basic_set<Domain> &dom) const;
11676  inline typed::union_map<Domain, Domain> subtract_range(const typed::point<Domain> &dom) const;
11677  inline typed::union_map<Domain, Domain> subtract_range(const typed::set<Domain> &dom) const;
11678  inline typed::union_map<Domain, Domain> uncurry() const = delete;
11679  inline typed::union_map<Domain, Domain> unite(const typed::union_map<Domain, Domain> &umap2) const;
11680  inline typed::union_map<Domain, Domain> unite(const typed::basic_map<Domain, Domain> &umap2) const;
11681  inline typed::union_map<Domain, Domain> unite(const typed::map<Domain, Domain> &umap2) const;
11682  inline typed::union_map<Domain, Domain> universe() const;
11683  inline typed::union_set<pair<Domain, Domain>> wrap() const;
11684};
11685
11686template <typename Domain, typename Range, typename Range2>
11687struct union_map<Domain, pair<Range, Range2>> : public isl::union_map {
11688  template <typename...>
11689  friend struct aff;
11690  template <typename...>
11691  friend struct aff_list;
11692  template <typename...>
11693  friend struct basic_map;
11694  template <typename...>
11695  friend struct basic_set;
11696  template <typename...>
11697  friend struct fixed_box;
11698  template <typename...>
11699  friend struct id;
11700  template <typename...>
11701  friend struct id_list;
11702  template <typename...>
11703  friend struct map;
11704  template <typename...>
11705  friend struct map_list;
11706  template <typename...>
11707  friend struct multi_aff;
11708  template <typename...>
11709  friend struct multi_id;
11710  template <typename...>
11711  friend struct multi_pw_aff;
11712  template <typename...>
11713  friend struct multi_union_pw_aff;
11714  template <typename...>
11715  friend struct multi_val;
11716  template <typename...>
11717  friend struct point;
11718  template <typename...>
11719  friend struct pw_aff;
11720  template <typename...>
11721  friend struct pw_aff_list;
11722  template <typename...>
11723  friend struct pw_multi_aff;
11724  template <typename...>
11725  friend struct pw_multi_aff_list;
11726  template <typename...>
11727  friend struct set;
11728  template <typename...>
11729  friend struct set_list;
11730  template <typename...>
11731  friend struct space;
11732  template <typename...>
11733  friend struct union_map;
11734  template <typename...>
11735  friend struct union_pw_aff;
11736  template <typename...>
11737  friend struct union_pw_aff_list;
11738  template <typename...>
11739  friend struct union_pw_multi_aff;
11740  template <typename...>
11741  friend struct union_set;
11742  template <typename...>
11743  friend struct union_set_list;
11744  template <typename...>
11745  friend struct val;
11746  template <typename...>
11747  friend struct val_list;
11748
11749  union_map() = default;
11750  template <typename Arg1, typename Arg2, typename Arg3,
11751            typename std::enable_if<
11752              std::is_base_of<Domain, Arg1>{} &&
11753              std::is_base_of<Range, Arg2>{} &&
11754              std::is_base_of<Range2, Arg3>{},
11755            bool>::type = true>
11756  union_map(const union_map<Arg1, pair<Arg2, Arg3>> &obj) : isl::union_map(obj) {}
11757 private:
11758  template <typename base,
11759            typename std::enable_if<
11760              std::is_same<base, isl::union_map>{}, bool>::type = true>
11761  union_map(const base &obj) : isl::union_map(obj) {}
11762 public:
11763  static union_map from(const isl::union_map &obj) {
11764    return union_map(obj);
11765  }
11766  inline /* implicit */ union_map(const typed::basic_map<Domain, pair<Range, Range2>> &bmap);
11767  inline /* implicit */ union_map(const typed::map<Domain, pair<Range, Range2>> &map);
11768  inline explicit union_map(const isl::ctx &ctx, const std::string &str);
11769  template <typename Domain2>
11770  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::union_map<Domain, Domain2> &umap2) const;
11771  template <typename Domain2>
11772  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::basic_map<Domain, Domain2> &umap2) const;
11773  template <typename Domain2>
11774  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::map<Domain, Domain2> &umap2) const;
11775  template <typename Arg3>
11776  inline typed::union_map<Domain, Arg3> apply_range(const typed::union_map<pair<Range, Range2>, Arg3> &umap2) const;
11777  template <typename Arg3>
11778  inline typed::union_map<Domain, Arg3> apply_range(const typed::basic_map<pair<Range, Range2>, Arg3> &umap2) const;
11779  template <typename Arg3>
11780  inline typed::union_map<Domain, Arg3> apply_range(const typed::map<pair<Range, Range2>, Arg3> &umap2) const;
11781  inline typed::map<Domain, pair<Range, Range2>> as_map() const;
11782  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> as_multi_union_pw_aff() const;
11783  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> as_union_pw_multi_aff() const;
11784  inline typed::union_set<Domain> bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const;
11785  inline typed::union_map<Domain, pair<Range, Range2>> coalesce() const;
11786  inline typed::union_map<Domain, pair<Range, Range2>> curry() const = delete;
11787  inline typed::union_set<Domain, pair<Range, Range2>> deltas() const = delete;
11788  inline typed::union_map<Domain, pair<Range, Range2>> detect_equalities() const;
11789  inline typed::union_set<Domain> domain() const;
11790  inline typed::union_map<Domain, pair<Range, Range2>> domain_factor_domain() const = delete;
11791  inline typed::union_map<Domain, pair<Range, Range2>> domain_factor_range() const = delete;
11792  inline typed::union_map<pair<Domain, pair<Range, Range2>>, Domain> domain_map() const;
11793  inline typed::union_pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain> domain_map_union_pw_multi_aff() const;
11794  template <typename Domain2>
11795  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const;
11796  template <typename Domain2>
11797  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> domain_product(const typed::basic_map<Domain2, pair<Range, Range2>> &umap2) const;
11798  template <typename Domain2>
11799  inline typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> domain_product(const typed::map<Domain2, pair<Range, Range2>> &umap2) const;
11800  inline typed::union_map<Domain, pair<Range, Range2>> domain_reverse() const = delete;
11801  inline typed::union_map<Domain, pair<Range, Range2>> drop_unused_params() const;
11802  static inline typed::union_map<Domain, pair<Range, Range2>> empty(const isl::ctx &ctx);
11803  inline typed::union_map<Domain, pair<Range, Range2>> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
11804  inline typed::union_map<Domain, pair<Range, Range2>> eq_at(const typed::multi_pw_aff<> &mupa) const = delete;
11805  inline typed::union_map<Domain, pair<Range, Range2>> eq_at(const typed::union_pw_aff<> &mupa) const = delete;
11806  inline bool every_map(const std::function<bool(typed::map<Domain, pair<Range, Range2>>)> &test) const;
11807  inline typed::map<Domain, pair<Range, Range2>> extract_map(const typed::space<Domain, pair<Range, Range2>> &space) const;
11808  inline void foreach_map(const std::function<void(typed::map<Domain, pair<Range, Range2>>)> &fn) const;
11809  inline typed::union_map<Domain, pair<Range, Range2>> gist(const typed::union_map<Domain, pair<Range, Range2>> &context) const;
11810  inline typed::union_map<Domain, pair<Range, Range2>> gist(const typed::basic_map<Domain, pair<Range, Range2>> &context) const;
11811  inline typed::union_map<Domain, pair<Range, Range2>> gist(const typed::map<Domain, pair<Range, Range2>> &context) const;
11812  inline typed::union_map<Domain, pair<Range, Range2>> gist_domain(const typed::union_set<Domain> &uset) const;
11813  inline typed::union_map<Domain, pair<Range, Range2>> gist_domain(const typed::basic_set<Domain> &uset) const;
11814  inline typed::union_map<Domain, pair<Range, Range2>> gist_domain(const typed::point<Domain> &uset) const;
11815  inline typed::union_map<Domain, pair<Range, Range2>> gist_domain(const typed::set<Domain> &uset) const;
11816  inline typed::union_map<Domain, pair<Range, Range2>> gist_params(const typed::set<> &set) const;
11817  inline typed::union_map<Domain, pair<Range, Range2>> gist_params(const typed::basic_set<> &set) const;
11818  inline typed::union_map<Domain, pair<Range, Range2>> gist_params(const typed::point<> &set) const;
11819  inline typed::union_map<Domain, pair<Range, Range2>> intersect(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const;
11820  inline typed::union_map<Domain, pair<Range, Range2>> intersect(const typed::basic_map<Domain, pair<Range, Range2>> &umap2) const;
11821  inline typed::union_map<Domain, pair<Range, Range2>> intersect(const typed::map<Domain, pair<Range, Range2>> &umap2) const;
11822  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain(const typed::space<Domain> &space) const;
11823  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain(const typed::union_set<Domain> &uset) const;
11824  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<> &domain) const = delete;
11825  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::basic_set<> &domain) const = delete;
11826  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::point<> &domain) const = delete;
11827  inline typed::union_map<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::set<> &domain) const = delete;
11828  inline typed::union_map<Domain, pair<Range, Range2>> intersect_params(const typed::set<> &set) const;
11829  inline typed::union_map<Domain, pair<Range, Range2>> intersect_params(const typed::basic_set<> &set) const;
11830  inline typed::union_map<Domain, pair<Range, Range2>> intersect_params(const typed::point<> &set) const;
11831  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range(const typed::space<pair<Range, Range2>> &space) const;
11832  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const;
11833  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const;
11834  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::basic_set<Range> &domain) const;
11835  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::point<Range> &domain) const;
11836  inline typed::union_map<Domain, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::set<Range> &domain) const;
11837  inline typed::union_map<Domain, pair<Range, Range2>> lexmax() const;
11838  inline typed::union_map<Domain, pair<Range, Range2>> lexmin() const;
11839  inline typed::map_list<Domain, pair<Range, Range2>> map_list() const;
11840  inline typed::map_list<Domain, pair<Range, Range2>> get_map_list() const = delete;
11841  inline typed::set<> params() const;
11842  template <typename Domain2>
11843  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const;
11844  template <typename Domain2>
11845  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const;
11846  template <typename Domain2>
11847  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
11848  template <typename Domain2>
11849  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
11850  template <typename Arg3>
11851  inline typed::union_map<Domain, Arg3> preimage_range(const typed::multi_aff<Arg3, pair<Range, Range2>> &ma) const;
11852  template <typename Arg3>
11853  inline typed::union_map<Domain, Arg3> preimage_range(const typed::pw_multi_aff<Arg3, pair<Range, Range2>> &pma) const;
11854  template <typename Arg3>
11855  inline typed::union_map<Domain, Arg3> preimage_range(const typed::union_pw_multi_aff<Arg3, pair<Range, Range2>> &upma) const;
11856  template <typename Domain2, typename Arg3>
11857  inline typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::union_map<Domain2, Arg3> &umap2) const;
11858  template <typename Domain2, typename Arg3>
11859  inline typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::basic_map<Domain2, Arg3> &umap2) const;
11860  template <typename Domain2, typename Arg3>
11861  inline typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> product(const typed::map<Domain2, Arg3> &umap2) const;
11862  inline typed::union_map<Domain, pair<Range, Range2>> project_out_all_params() const;
11863  inline typed::union_map<Domain, pair<Range, Range2>> project_out_param(const typed::id<Anonymous> &id) const;
11864  inline typed::union_map<Domain, pair<Range, Range2>> project_out_param(const std::string &id) const;
11865  inline typed::union_map<Domain, pair<Range, Range2>> project_out_param(const typed::id_list<Anonymous> &list) const;
11866  inline typed::union_set<pair<Range, Range2>> range() const;
11867  inline typed::union_map<Domain, Range> range_factor_domain() const;
11868  inline typed::union_map<Domain, Range2> range_factor_range() const;
11869  inline typed::union_map<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> range_map() const;
11870  template <typename Arg3>
11871  inline typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::union_map<Domain, Arg3> &umap2) const;
11872  template <typename Arg3>
11873  inline typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::basic_map<Domain, Arg3> &umap2) const;
11874  template <typename Arg3>
11875  inline typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::map<Domain, Arg3> &umap2) const;
11876  inline typed::union_map<Domain, pair<Range2, Range>> range_reverse() const;
11877  inline typed::union_map<pair<Range, Range2>, Domain> reverse() const;
11878  inline typed::space<> space() const;
11879  inline typed::space<Domain, pair<Range, Range2>> get_space() const = delete;
11880  inline typed::union_map<Domain, pair<Range, Range2>> subtract(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const;
11881  inline typed::union_map<Domain, pair<Range, Range2>> subtract(const typed::basic_map<Domain, pair<Range, Range2>> &umap2) const;
11882  inline typed::union_map<Domain, pair<Range, Range2>> subtract(const typed::map<Domain, pair<Range, Range2>> &umap2) const;
11883  inline typed::union_map<Domain, pair<Range, Range2>> subtract_domain(const typed::union_set<Domain> &dom) const;
11884  inline typed::union_map<Domain, pair<Range, Range2>> subtract_domain(const typed::basic_set<Domain> &dom) const;
11885  inline typed::union_map<Domain, pair<Range, Range2>> subtract_domain(const typed::point<Domain> &dom) const;
11886  inline typed::union_map<Domain, pair<Range, Range2>> subtract_domain(const typed::set<Domain> &dom) const;
11887  inline typed::union_map<Domain, pair<Range, Range2>> subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const;
11888  inline typed::union_map<Domain, pair<Range, Range2>> subtract_range(const typed::basic_set<pair<Range, Range2>> &dom) const;
11889  inline typed::union_map<Domain, pair<Range, Range2>> subtract_range(const typed::point<pair<Range, Range2>> &dom) const;
11890  inline typed::union_map<Domain, pair<Range, Range2>> subtract_range(const typed::set<pair<Range, Range2>> &dom) const;
11891  inline typed::union_map<pair<Domain, Range>, Range2> uncurry() const;
11892  inline typed::union_map<Domain, pair<Range, Range2>> unite(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const;
11893  inline typed::union_map<Domain, pair<Range, Range2>> unite(const typed::basic_map<Domain, pair<Range, Range2>> &umap2) const;
11894  inline typed::union_map<Domain, pair<Range, Range2>> unite(const typed::map<Domain, pair<Range, Range2>> &umap2) const;
11895  inline typed::union_map<Domain, pair<Range, Range2>> universe() const;
11896  inline typed::union_set<pair<Domain, pair<Range, Range2>>> wrap() const;
11897};
11898
11899template <typename T1, typename T2>
11900struct union_map<pair<T1, T2>, pair<T1, T2>> : public isl::union_map {
11901  template <typename...>
11902  friend struct aff;
11903  template <typename...>
11904  friend struct aff_list;
11905  template <typename...>
11906  friend struct basic_map;
11907  template <typename...>
11908  friend struct basic_set;
11909  template <typename...>
11910  friend struct fixed_box;
11911  template <typename...>
11912  friend struct id;
11913  template <typename...>
11914  friend struct id_list;
11915  template <typename...>
11916  friend struct map;
11917  template <typename...>
11918  friend struct map_list;
11919  template <typename...>
11920  friend struct multi_aff;
11921  template <typename...>
11922  friend struct multi_id;
11923  template <typename...>
11924  friend struct multi_pw_aff;
11925  template <typename...>
11926  friend struct multi_union_pw_aff;
11927  template <typename...>
11928  friend struct multi_val;
11929  template <typename...>
11930  friend struct point;
11931  template <typename...>
11932  friend struct pw_aff;
11933  template <typename...>
11934  friend struct pw_aff_list;
11935  template <typename...>
11936  friend struct pw_multi_aff;
11937  template <typename...>
11938  friend struct pw_multi_aff_list;
11939  template <typename...>
11940  friend struct set;
11941  template <typename...>
11942  friend struct set_list;
11943  template <typename...>
11944  friend struct space;
11945  template <typename...>
11946  friend struct union_map;
11947  template <typename...>
11948  friend struct union_pw_aff;
11949  template <typename...>
11950  friend struct union_pw_aff_list;
11951  template <typename...>
11952  friend struct union_pw_multi_aff;
11953  template <typename...>
11954  friend struct union_set;
11955  template <typename...>
11956  friend struct union_set_list;
11957  template <typename...>
11958  friend struct val;
11959  template <typename...>
11960  friend struct val_list;
11961
11962  union_map() = default;
11963  template <typename Arg1, typename Arg2,
11964            typename std::enable_if<
11965              std::is_base_of<T1, Arg1>{} &&
11966              std::is_base_of<T2, Arg2>{},
11967            bool>::type = true>
11968  union_map(const union_map<pair<Arg1, Arg2>, pair<Arg1, Arg2>> &obj) : isl::union_map(obj) {}
11969 private:
11970  template <typename base,
11971            typename std::enable_if<
11972              std::is_same<base, isl::union_map>{}, bool>::type = true>
11973  union_map(const base &obj) : isl::union_map(obj) {}
11974 public:
11975  static union_map from(const isl::union_map &obj) {
11976    return union_map(obj);
11977  }
11978  inline /* implicit */ union_map(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &bmap);
11979  inline /* implicit */ union_map(const typed::map<pair<T1, T2>, pair<T1, T2>> &map);
11980  inline explicit union_map(const isl::ctx &ctx, const std::string &str);
11981  template <typename Domain2>
11982  inline typed::union_map<Domain2, pair<T1, T2>> apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const;
11983  template <typename Domain2>
11984  inline typed::union_map<Domain2, pair<T1, T2>> apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &umap2) const;
11985  template <typename Domain2>
11986  inline typed::union_map<Domain2, pair<T1, T2>> apply_domain(const typed::map<pair<T1, T2>, Domain2> &umap2) const;
11987  template <typename Range2>
11988  inline typed::union_map<pair<T1, T2>, Range2> apply_range(const typed::union_map<pair<T1, T2>, Range2> &umap2) const;
11989  template <typename Range2>
11990  inline typed::union_map<pair<T1, T2>, Range2> apply_range(const typed::basic_map<pair<T1, T2>, Range2> &umap2) const;
11991  template <typename Range2>
11992  inline typed::union_map<pair<T1, T2>, Range2> apply_range(const typed::map<pair<T1, T2>, Range2> &umap2) const;
11993  inline typed::map<pair<T1, T2>, pair<T1, T2>> as_map() const;
11994  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<T1, T2>> as_multi_union_pw_aff() const;
11995  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<T1, T2>> as_union_pw_multi_aff() const;
11996  inline typed::union_set<pair<T1, T2>> bind_range(const typed::multi_id<pair<T1, T2>> &tuple) const;
11997  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> coalesce() const;
11998  inline typed::union_map<T1, pair<T2, pair<T1, T2>>> curry() const;
11999  inline typed::union_set<pair<T1, T2>> deltas() const;
12000  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> detect_equalities() const;
12001  inline typed::union_set<pair<T1, T2>> domain() const;
12002  inline typed::union_map<T1, pair<T1, T2>> domain_factor_domain() const;
12003  inline typed::union_map<T2, pair<T1, T2>> domain_factor_range() const;
12004  inline typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> domain_map() const;
12005  inline typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> domain_map_union_pw_multi_aff() const;
12006  template <typename Domain2>
12007  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> domain_product(const typed::union_map<Domain2, pair<T1, T2>> &umap2) const;
12008  template <typename Domain2>
12009  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> domain_product(const typed::basic_map<Domain2, pair<T1, T2>> &umap2) const;
12010  template <typename Domain2>
12011  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> domain_product(const typed::map<Domain2, pair<T1, T2>> &umap2) const;
12012  inline typed::union_map<pair<T2, T1>, pair<T1, T2>> domain_reverse() const;
12013  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> drop_unused_params() const;
12014  static inline typed::union_map<pair<T1, T2>, pair<T1, T2>> empty(const isl::ctx &ctx);
12015  template <typename Range>
12016  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::multi_union_pw_aff<pair<T1, T2>, Range> &mupa) const;
12017  template <typename Range>
12018  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mupa) const;
12019  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> eq_at(const typed::union_pw_aff<pair<T1, T2>, Anonymous> &mupa) const;
12020  inline bool every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<T1, T2>>)> &test) const;
12021  inline typed::map<pair<T1, T2>, pair<T1, T2>> extract_map(const typed::space<pair<T1, T2>, pair<T1, T2>> &space) const;
12022  inline void foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<T1, T2>>)> &fn) const;
12023  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &context) const;
12024  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &context) const;
12025  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist(const typed::map<pair<T1, T2>, pair<T1, T2>> &context) const;
12026  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::union_set<pair<T1, T2>> &uset) const;
12027  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::basic_set<pair<T1, T2>> &uset) const;
12028  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::point<pair<T1, T2>> &uset) const;
12029  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist_domain(const typed::set<pair<T1, T2>> &uset) const;
12030  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist_params(const typed::set<> &set) const;
12031  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist_params(const typed::basic_set<> &set) const;
12032  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> gist_params(const typed::point<> &set) const;
12033  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
12034  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
12035  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect(const typed::map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
12036  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::space<pair<T1, T2>> &space) const;
12037  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const;
12038  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const;
12039  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::basic_set<T1> &domain) const;
12040  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::point<T1> &domain) const;
12041  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_domain_wrapped_domain(const typed::set<T1> &domain) const;
12042  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_params(const typed::set<> &set) const;
12043  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_params(const typed::basic_set<> &set) const;
12044  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_params(const typed::point<> &set) const;
12045  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::space<pair<T1, T2>> &space) const;
12046  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range(const typed::union_set<pair<T1, T2>> &uset) const;
12047  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::union_set<T1> &domain) const;
12048  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::basic_set<T1> &domain) const;
12049  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::point<T1> &domain) const;
12050  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> intersect_range_wrapped_domain(const typed::set<T1> &domain) const;
12051  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> lexmax() const;
12052  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> lexmin() const;
12053  inline typed::map_list<pair<T1, T2>, pair<T1, T2>> map_list() const;
12054  inline typed::map_list<pair<T1, T2>, pair<T1, T2>> get_map_list() const = delete;
12055  inline typed::set<> params() const;
12056  template <typename Domain2>
12057  inline typed::union_map<Domain2, pair<T1, T2>> preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const;
12058  template <typename Domain2>
12059  inline typed::union_map<Domain2, pair<T1, T2>> preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const;
12060  template <typename Domain2>
12061  inline typed::union_map<Domain2, pair<T1, T2>> preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const;
12062  template <typename Domain2>
12063  inline typed::union_map<Domain2, pair<T1, T2>> preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const;
12064  template <typename Range2>
12065  inline typed::union_map<pair<T1, T2>, Range2> preimage_range(const typed::multi_aff<Range2, pair<T1, T2>> &ma) const;
12066  template <typename Range2>
12067  inline typed::union_map<pair<T1, T2>, Range2> preimage_range(const typed::pw_multi_aff<Range2, pair<T1, T2>> &pma) const;
12068  template <typename Range2>
12069  inline typed::union_map<pair<T1, T2>, Range2> preimage_range(const typed::union_pw_multi_aff<Range2, pair<T1, T2>> &upma) const;
12070  template <typename Domain2, typename Range2>
12071  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> product(const typed::union_map<Domain2, Range2> &umap2) const;
12072  template <typename Domain2, typename Range2>
12073  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> product(const typed::basic_map<Domain2, Range2> &umap2) const;
12074  template <typename Domain2, typename Range2>
12075  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> product(const typed::map<Domain2, Range2> &umap2) const;
12076  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> project_out_all_params() const;
12077  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> project_out_param(const typed::id<Anonymous> &id) const;
12078  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> project_out_param(const std::string &id) const;
12079  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> project_out_param(const typed::id_list<Anonymous> &list) const;
12080  inline typed::union_set<pair<T1, T2>> range() const;
12081  inline typed::union_map<pair<T1, T2>, T1> range_factor_domain() const;
12082  inline typed::union_map<pair<T1, T2>, T2> range_factor_range() const;
12083  inline typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> range_map() const;
12084  template <typename Range2>
12085  inline typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> range_product(const typed::union_map<pair<T1, T2>, Range2> &umap2) const;
12086  template <typename Range2>
12087  inline typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> range_product(const typed::basic_map<pair<T1, T2>, Range2> &umap2) const;
12088  template <typename Range2>
12089  inline typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> range_product(const typed::map<pair<T1, T2>, Range2> &umap2) const;
12090  inline typed::union_map<pair<T1, T2>, pair<T2, T1>> range_reverse() const;
12091  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> reverse() const;
12092  inline typed::space<> space() const;
12093  inline typed::space<pair<T1, T2>, pair<T1, T2>> get_space() const = delete;
12094  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
12095  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
12096  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract(const typed::map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
12097  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const;
12098  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_domain(const typed::basic_set<pair<T1, T2>> &dom) const;
12099  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_domain(const typed::point<pair<T1, T2>> &dom) const;
12100  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_domain(const typed::set<pair<T1, T2>> &dom) const;
12101  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_range(const typed::union_set<pair<T1, T2>> &dom) const;
12102  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_range(const typed::basic_set<pair<T1, T2>> &dom) const;
12103  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_range(const typed::point<pair<T1, T2>> &dom) const;
12104  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> subtract_range(const typed::set<pair<T1, T2>> &dom) const;
12105  inline typed::union_map<pair<pair<T1, T2>, T1>, T2> uncurry() const;
12106  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> unite(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
12107  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> unite(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
12108  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> unite(const typed::map<pair<T1, T2>, pair<T1, T2>> &umap2) const;
12109  inline typed::union_map<pair<T1, T2>, pair<T1, T2>> universe() const;
12110  inline typed::union_set<pair<pair<T1, T2>, pair<T1, T2>>> wrap() const;
12111};
12112
12113template <typename T1, typename T2, typename Range, typename Range2>
12114struct union_map<pair<T1, T2>, pair<Range, Range2>> : public isl::union_map {
12115  template <typename...>
12116  friend struct aff;
12117  template <typename...>
12118  friend struct aff_list;
12119  template <typename...>
12120  friend struct basic_map;
12121  template <typename...>
12122  friend struct basic_set;
12123  template <typename...>
12124  friend struct fixed_box;
12125  template <typename...>
12126  friend struct id;
12127  template <typename...>
12128  friend struct id_list;
12129  template <typename...>
12130  friend struct map;
12131  template <typename...>
12132  friend struct map_list;
12133  template <typename...>
12134  friend struct multi_aff;
12135  template <typename...>
12136  friend struct multi_id;
12137  template <typename...>
12138  friend struct multi_pw_aff;
12139  template <typename...>
12140  friend struct multi_union_pw_aff;
12141  template <typename...>
12142  friend struct multi_val;
12143  template <typename...>
12144  friend struct point;
12145  template <typename...>
12146  friend struct pw_aff;
12147  template <typename...>
12148  friend struct pw_aff_list;
12149  template <typename...>
12150  friend struct pw_multi_aff;
12151  template <typename...>
12152  friend struct pw_multi_aff_list;
12153  template <typename...>
12154  friend struct set;
12155  template <typename...>
12156  friend struct set_list;
12157  template <typename...>
12158  friend struct space;
12159  template <typename...>
12160  friend struct union_map;
12161  template <typename...>
12162  friend struct union_pw_aff;
12163  template <typename...>
12164  friend struct union_pw_aff_list;
12165  template <typename...>
12166  friend struct union_pw_multi_aff;
12167  template <typename...>
12168  friend struct union_set;
12169  template <typename...>
12170  friend struct union_set_list;
12171  template <typename...>
12172  friend struct val;
12173  template <typename...>
12174  friend struct val_list;
12175
12176  union_map() = default;
12177  template <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
12178            typename std::enable_if<
12179              std::is_base_of<T1, Arg1>{} &&
12180              std::is_base_of<T2, Arg2>{} &&
12181              std::is_base_of<Range, Arg3>{} &&
12182              std::is_base_of<Range2, Arg4>{},
12183            bool>::type = true>
12184  union_map(const union_map<pair<Arg1, Arg2>, pair<Arg3, Arg4>> &obj) : isl::union_map(obj) {}
12185 private:
12186  template <typename base,
12187            typename std::enable_if<
12188              std::is_same<base, isl::union_map>{}, bool>::type = true>
12189  union_map(const base &obj) : isl::union_map(obj) {}
12190 public:
12191  static union_map from(const isl::union_map &obj) {
12192    return union_map(obj);
12193  }
12194  inline /* implicit */ union_map(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &bmap);
12195  inline /* implicit */ union_map(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map);
12196  inline explicit union_map(const isl::ctx &ctx, const std::string &str);
12197  template <typename Domain2>
12198  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const;
12199  template <typename Domain2>
12200  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &umap2) const;
12201  template <typename Domain2>
12202  inline typed::union_map<Domain2, pair<Range, Range2>> apply_domain(const typed::map<pair<T1, T2>, Domain2> &umap2) const;
12203  template <typename Arg2>
12204  inline typed::union_map<pair<T1, T2>, Arg2> apply_range(const typed::union_map<pair<Range, Range2>, Arg2> &umap2) const;
12205  template <typename Arg2>
12206  inline typed::union_map<pair<T1, T2>, Arg2> apply_range(const typed::basic_map<pair<Range, Range2>, Arg2> &umap2) const;
12207  template <typename Arg2>
12208  inline typed::union_map<pair<T1, T2>, Arg2> apply_range(const typed::map<pair<Range, Range2>, Arg2> &umap2) const;
12209  inline typed::map<pair<T1, T2>, pair<Range, Range2>> as_map() const;
12210  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> as_multi_union_pw_aff() const;
12211  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> as_union_pw_multi_aff() const;
12212  inline typed::union_set<pair<T1, T2>> bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const;
12213  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> coalesce() const;
12214  inline typed::union_map<T1, pair<T2, pair<Range, Range2>>> curry() const;
12215  inline typed::union_set<pair<T1, T2>, pair<Range, Range2>> deltas() const = delete;
12216  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> detect_equalities() const;
12217  inline typed::union_set<pair<T1, T2>> domain() const;
12218  inline typed::union_map<T1, pair<Range, Range2>> domain_factor_domain() const;
12219  inline typed::union_map<T2, pair<Range, Range2>> domain_factor_range() const;
12220  inline typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> domain_map() const;
12221  inline typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> domain_map_union_pw_multi_aff() const;
12222  template <typename Domain2>
12223  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const;
12224  template <typename Domain2>
12225  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> domain_product(const typed::basic_map<Domain2, pair<Range, Range2>> &umap2) const;
12226  template <typename Domain2>
12227  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> domain_product(const typed::map<Domain2, pair<Range, Range2>> &umap2) const;
12228  inline typed::union_map<pair<T2, T1>, pair<Range, Range2>> domain_reverse() const;
12229  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> drop_unused_params() const;
12230  static inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> empty(const isl::ctx &ctx);
12231  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::multi_union_pw_aff<> &mupa) const = delete;
12232  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::multi_pw_aff<> &mupa) const = delete;
12233  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> eq_at(const typed::union_pw_aff<> &mupa) const = delete;
12234  inline bool every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &test) const;
12235  inline typed::map<pair<T1, T2>, pair<Range, Range2>> extract_map(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const;
12236  inline void foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const;
12237  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &context) const;
12238  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &context) const;
12239  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist(const typed::map<pair<T1, T2>, pair<Range, Range2>> &context) const;
12240  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::union_set<pair<T1, T2>> &uset) const;
12241  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::basic_set<pair<T1, T2>> &uset) const;
12242  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::point<pair<T1, T2>> &uset) const;
12243  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist_domain(const typed::set<pair<T1, T2>> &uset) const;
12244  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::set<> &set) const;
12245  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::basic_set<> &set) const;
12246  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> gist_params(const typed::point<> &set) const;
12247  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
12248  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
12249  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect(const typed::map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
12250  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::space<pair<T1, T2>> &space) const;
12251  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const;
12252  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const;
12253  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::basic_set<T1> &domain) const;
12254  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::point<T1> &domain) const;
12255  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::set<T1> &domain) const;
12256  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::set<> &set) const;
12257  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::basic_set<> &set) const;
12258  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::point<> &set) const;
12259  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::space<pair<Range, Range2>> &space) const;
12260  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const;
12261  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const;
12262  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::basic_set<Range> &domain) const;
12263  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::point<Range> &domain) const;
12264  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> intersect_range_wrapped_domain(const typed::set<Range> &domain) const;
12265  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> lexmax() const;
12266  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> lexmin() const;
12267  inline typed::map_list<pair<T1, T2>, pair<Range, Range2>> map_list() const;
12268  inline typed::map_list<pair<T1, T2>, pair<Range, Range2>> get_map_list() const = delete;
12269  inline typed::set<> params() const;
12270  template <typename Domain2>
12271  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const;
12272  template <typename Domain2>
12273  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const;
12274  template <typename Domain2>
12275  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const;
12276  template <typename Domain2>
12277  inline typed::union_map<Domain2, pair<Range, Range2>> preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const;
12278  template <typename Arg2>
12279  inline typed::union_map<pair<T1, T2>, Arg2> preimage_range(const typed::multi_aff<Arg2, pair<Range, Range2>> &ma) const;
12280  template <typename Arg2>
12281  inline typed::union_map<pair<T1, T2>, Arg2> preimage_range(const typed::pw_multi_aff<Arg2, pair<Range, Range2>> &pma) const;
12282  template <typename Arg2>
12283  inline typed::union_map<pair<T1, T2>, Arg2> preimage_range(const typed::union_pw_multi_aff<Arg2, pair<Range, Range2>> &upma) const;
12284  template <typename Domain2, typename Arg2>
12285  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::union_map<Domain2, Arg2> &umap2) const;
12286  template <typename Domain2, typename Arg2>
12287  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::basic_map<Domain2, Arg2> &umap2) const;
12288  template <typename Domain2, typename Arg2>
12289  inline typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> product(const typed::map<Domain2, Arg2> &umap2) const;
12290  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> project_out_all_params() const;
12291  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> project_out_param(const typed::id<Anonymous> &id) const;
12292  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> project_out_param(const std::string &id) const;
12293  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> project_out_param(const typed::id_list<Anonymous> &list) const;
12294  inline typed::union_set<pair<Range, Range2>> range() const;
12295  inline typed::union_map<pair<T1, T2>, Range> range_factor_domain() const;
12296  inline typed::union_map<pair<T1, T2>, Range2> range_factor_range() const;
12297  inline typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> range_map() const;
12298  template <typename Arg2>
12299  inline typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::union_map<pair<T1, T2>, Arg2> &umap2) const;
12300  template <typename Arg2>
12301  inline typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::basic_map<pair<T1, T2>, Arg2> &umap2) const;
12302  template <typename Arg2>
12303  inline typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::map<pair<T1, T2>, Arg2> &umap2) const;
12304  inline typed::union_map<pair<T1, T2>, pair<Range2, Range>> range_reverse() const;
12305  inline typed::union_map<pair<Range, Range2>, pair<T1, T2>> reverse() const;
12306  inline typed::space<> space() const;
12307  inline typed::space<pair<T1, T2>, pair<Range, Range2>> get_space() const = delete;
12308  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
12309  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
12310  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract(const typed::map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
12311  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const;
12312  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::basic_set<pair<T1, T2>> &dom) const;
12313  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::point<pair<T1, T2>> &dom) const;
12314  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::set<pair<T1, T2>> &dom) const;
12315  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const;
12316  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_range(const typed::basic_set<pair<Range, Range2>> &dom) const;
12317  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_range(const typed::point<pair<Range, Range2>> &dom) const;
12318  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> subtract_range(const typed::set<pair<Range, Range2>> &dom) const;
12319  inline typed::union_map<pair<pair<T1, T2>, Range>, Range2> uncurry() const;
12320  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> unite(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
12321  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> unite(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
12322  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> unite(const typed::map<pair<T1, T2>, pair<Range, Range2>> &umap2) const;
12323  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> universe() const;
12324  inline typed::union_set<pair<pair<T1, T2>, pair<Range, Range2>>> wrap() const;
12325};
12326
12327template <>
12328struct union_pw_aff<Anonymous> : public isl::union_pw_aff {
12329  template <typename...>
12330  friend struct aff;
12331  template <typename...>
12332  friend struct aff_list;
12333  template <typename...>
12334  friend struct basic_map;
12335  template <typename...>
12336  friend struct basic_set;
12337  template <typename...>
12338  friend struct fixed_box;
12339  template <typename...>
12340  friend struct id;
12341  template <typename...>
12342  friend struct id_list;
12343  template <typename...>
12344  friend struct map;
12345  template <typename...>
12346  friend struct map_list;
12347  template <typename...>
12348  friend struct multi_aff;
12349  template <typename...>
12350  friend struct multi_id;
12351  template <typename...>
12352  friend struct multi_pw_aff;
12353  template <typename...>
12354  friend struct multi_union_pw_aff;
12355  template <typename...>
12356  friend struct multi_val;
12357  template <typename...>
12358  friend struct point;
12359  template <typename...>
12360  friend struct pw_aff;
12361  template <typename...>
12362  friend struct pw_aff_list;
12363  template <typename...>
12364  friend struct pw_multi_aff;
12365  template <typename...>
12366  friend struct pw_multi_aff_list;
12367  template <typename...>
12368  friend struct set;
12369  template <typename...>
12370  friend struct set_list;
12371  template <typename...>
12372  friend struct space;
12373  template <typename...>
12374  friend struct union_map;
12375  template <typename...>
12376  friend struct union_pw_aff;
12377  template <typename...>
12378  friend struct union_pw_aff_list;
12379  template <typename...>
12380  friend struct union_pw_multi_aff;
12381  template <typename...>
12382  friend struct union_set;
12383  template <typename...>
12384  friend struct union_set_list;
12385  template <typename...>
12386  friend struct val;
12387  template <typename...>
12388  friend struct val_list;
12389
12390  union_pw_aff() = default;
12391  union_pw_aff(const isl::union_pw_aff &obj) : isl::union_pw_aff(obj) {}
12392  static union_pw_aff from(const isl::union_pw_aff &obj) {
12393    return union_pw_aff(obj);
12394  }
12395  inline /* implicit */ union_pw_aff(const typed::aff<Anonymous> &aff);
12396  inline /* implicit */ union_pw_aff(const typed::pw_aff<Anonymous> &pa);
12397  inline explicit union_pw_aff(const isl::ctx &ctx, const std::string &str);
12398  inline typed::multi_union_pw_aff<Anonymous> add(const typed::multi_union_pw_aff<Anonymous> &multi2) const;
12399  inline typed::union_pw_aff<Anonymous> add(const typed::union_pw_aff<Anonymous> &upa2) const;
12400  inline typed::union_pw_multi_aff<Anonymous> add(const typed::union_pw_multi_aff<Anonymous> &upma2) const;
12401  inline typed::union_pw_aff<Anonymous> add(const typed::aff<Anonymous> &upa2) const;
12402  inline typed::union_pw_aff<Anonymous> add(const typed::pw_aff<Anonymous> &upa2) const;
12403  template <typename Range>
12404  inline typed::union_pw_multi_aff<Range> apply(const typed::union_pw_multi_aff<Anonymous, Range> &upma2) const;
12405  inline typed::multi_union_pw_aff<Anonymous> as_multi_union_pw_aff() const;
12406  inline typed::pw_multi_aff<Anonymous> as_pw_multi_aff() const;
12407  inline typed::union_map<Anonymous> as_union_map() const = delete;
12408  inline typed::union_pw_aff<Anonymous> at(int pos) const;
12409  inline typed::union_set<> bind(const typed::multi_id<Anonymous> &tuple) const;
12410  inline typed::union_set<> bind(const typed::id<Anonymous> &id) const;
12411  inline typed::union_set<> bind(const std::string &id) const;
12412  inline typed::union_pw_aff<Anonymous> coalesce() const;
12413  inline typed::union_set<> domain() const;
12414  inline typed::union_pw_aff<Anonymous> drop_unused_params() const;
12415  inline typed::pw_multi_aff<Anonymous> extract_pw_multi_aff(const typed::space<Anonymous> &space) const;
12416  inline typed::union_pw_aff<Anonymous> gist(const typed::union_set<> &context) const;
12417  inline typed::union_pw_aff<Anonymous> gist(const typed::basic_set<> &context) const;
12418  inline typed::union_pw_aff<Anonymous> gist(const typed::point<> &context) const;
12419  inline typed::union_pw_aff<Anonymous> gist(const typed::set<> &context) const;
12420  inline typed::multi_union_pw_aff<Anonymous> gist_params(const typed::set<> &context) const;
12421  inline typed::union_pw_aff<Anonymous> intersect_domain(const typed::space<> &space) const = delete;
12422  inline typed::union_pw_aff<Anonymous> intersect_domain(const typed::union_set<> &uset) const = delete;
12423  inline typed::union_pw_aff<Anonymous> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
12424  inline typed::union_pw_aff<Anonymous> intersect_domain_wrapped_domain(const typed::basic_set<> &uset) const = delete;
12425  inline typed::union_pw_aff<Anonymous> intersect_domain_wrapped_domain(const typed::point<> &uset) const = delete;
12426  inline typed::union_pw_aff<Anonymous> intersect_domain_wrapped_domain(const typed::set<> &uset) const = delete;
12427  inline typed::union_pw_aff<Anonymous> intersect_params(const typed::set<> &set) const;
12428  inline typed::union_pw_aff<Anonymous> intersect_params(const typed::basic_set<> &set) const;
12429  inline typed::union_pw_aff<Anonymous> intersect_params(const typed::point<> &set) const;
12430  inline typed::union_pw_aff_list<Anonymous> list() const;
12431  inline typed::multi_union_pw_aff<Anonymous> neg() const;
12432  inline typed::union_pw_multi_aff<Anonymous> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
12433  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_multi_aff<> &upma) const = delete;
12434  inline typed::union_pw_aff<Anonymous> pullback(const typed::multi_aff<> &upma) const = delete;
12435  inline typed::union_pw_aff<Anonymous> pullback(const typed::pw_multi_aff<> &upma) const = delete;
12436  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_aff<> &upma) const = delete;
12437  inline typed::pw_multi_aff_list<Anonymous> pw_multi_aff_list() const;
12438  inline typed::union_pw_multi_aff<Anonymous> range_factor_domain() const = delete;
12439  inline typed::union_pw_multi_aff<Anonymous> range_factor_range() const = delete;
12440  inline typed::multi_union_pw_aff<Anonymous> range_product(const typed::multi_union_pw_aff<> &multi2) const = delete;
12441  inline typed::union_pw_multi_aff<Anonymous> range_product(const typed::union_pw_multi_aff<> &upma2) const = delete;
12442  inline typed::multi_union_pw_aff<Anonymous> scale(const typed::multi_val<Anonymous> &mv) const;
12443  inline typed::multi_union_pw_aff<Anonymous> scale(const typed::val<Anonymous> &v) const;
12444  inline typed::multi_union_pw_aff<Anonymous> scale(long v) const;
12445  inline typed::multi_union_pw_aff<Anonymous> scale_down(const typed::multi_val<Anonymous> &mv) const;
12446  inline typed::multi_union_pw_aff<Anonymous> scale_down(const typed::val<Anonymous> &v) const;
12447  inline typed::multi_union_pw_aff<Anonymous> scale_down(long v) const;
12448  inline typed::multi_union_pw_aff<Anonymous> set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const;
12449  template <typename Domain2>
12450  inline typed::multi_union_pw_aff<Domain2> set_range_tuple(const typed::id<Anonymous> &id) const;
12451  template <typename Domain2>
12452  inline typed::multi_union_pw_aff<Domain2> set_range_tuple(const std::string &id) const;
12453  inline typed::space<> space() const;
12454  inline typed::space<Anonymous> get_space() const = delete;
12455  inline typed::multi_union_pw_aff<Anonymous> sub(const typed::multi_union_pw_aff<Anonymous> &multi2) const;
12456  inline typed::union_pw_aff<Anonymous> sub(const typed::union_pw_aff<Anonymous> &upa2) const;
12457  inline typed::union_pw_multi_aff<Anonymous> sub(const typed::union_pw_multi_aff<Anonymous> &upma2) const;
12458  inline typed::union_pw_aff<Anonymous> sub(const typed::aff<Anonymous> &upa2) const;
12459  inline typed::union_pw_aff<Anonymous> sub(const typed::pw_aff<Anonymous> &upa2) const;
12460  inline typed::union_pw_aff<Anonymous> subtract_domain(const typed::space<> &space) const = delete;
12461  inline typed::union_pw_aff<Anonymous> subtract_domain(const typed::union_set<> &uset) const = delete;
12462  inline typed::multi_union_pw_aff<Anonymous> union_add(const typed::multi_union_pw_aff<Anonymous> &mupa2) const;
12463  inline typed::union_pw_aff<Anonymous> union_add(const typed::union_pw_aff<Anonymous> &upa2) const;
12464  inline typed::union_pw_multi_aff<Anonymous> union_add(const typed::union_pw_multi_aff<Anonymous> &upma2) const;
12465  inline typed::union_pw_aff<Anonymous> union_add(const typed::aff<Anonymous> &upa2) const;
12466  inline typed::union_pw_aff<Anonymous> union_add(const typed::pw_aff<Anonymous> &upa2) const;
12467};
12468
12469template <typename Domain>
12470struct union_pw_aff<Domain, Anonymous> : public isl::union_pw_aff {
12471  template <typename...>
12472  friend struct aff;
12473  template <typename...>
12474  friend struct aff_list;
12475  template <typename...>
12476  friend struct basic_map;
12477  template <typename...>
12478  friend struct basic_set;
12479  template <typename...>
12480  friend struct fixed_box;
12481  template <typename...>
12482  friend struct id;
12483  template <typename...>
12484  friend struct id_list;
12485  template <typename...>
12486  friend struct map;
12487  template <typename...>
12488  friend struct map_list;
12489  template <typename...>
12490  friend struct multi_aff;
12491  template <typename...>
12492  friend struct multi_id;
12493  template <typename...>
12494  friend struct multi_pw_aff;
12495  template <typename...>
12496  friend struct multi_union_pw_aff;
12497  template <typename...>
12498  friend struct multi_val;
12499  template <typename...>
12500  friend struct point;
12501  template <typename...>
12502  friend struct pw_aff;
12503  template <typename...>
12504  friend struct pw_aff_list;
12505  template <typename...>
12506  friend struct pw_multi_aff;
12507  template <typename...>
12508  friend struct pw_multi_aff_list;
12509  template <typename...>
12510  friend struct set;
12511  template <typename...>
12512  friend struct set_list;
12513  template <typename...>
12514  friend struct space;
12515  template <typename...>
12516  friend struct union_map;
12517  template <typename...>
12518  friend struct union_pw_aff;
12519  template <typename...>
12520  friend struct union_pw_aff_list;
12521  template <typename...>
12522  friend struct union_pw_multi_aff;
12523  template <typename...>
12524  friend struct union_set;
12525  template <typename...>
12526  friend struct union_set_list;
12527  template <typename...>
12528  friend struct val;
12529  template <typename...>
12530  friend struct val_list;
12531
12532  union_pw_aff() = default;
12533  template <typename Arg1,
12534            typename std::enable_if<
12535              std::is_base_of<Domain, Arg1>{},
12536            bool>::type = true>
12537  union_pw_aff(const union_pw_aff<Arg1, Anonymous> &obj) : isl::union_pw_aff(obj) {}
12538 private:
12539  template <typename base,
12540            typename std::enable_if<
12541              std::is_same<base, isl::union_pw_aff>{}, bool>::type = true>
12542  union_pw_aff(const base &obj) : isl::union_pw_aff(obj) {}
12543 public:
12544  static union_pw_aff from(const isl::union_pw_aff &obj) {
12545    return union_pw_aff(obj);
12546  }
12547  inline /* implicit */ union_pw_aff(const typed::aff<Domain, Anonymous> &aff);
12548  inline /* implicit */ union_pw_aff(const typed::pw_aff<Domain, Anonymous> &pa);
12549  inline explicit union_pw_aff(const isl::ctx &ctx, const std::string &str);
12550  inline typed::multi_union_pw_aff<Domain, Anonymous> add(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const;
12551  inline typed::union_pw_aff<Domain, Anonymous> add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const;
12552  inline typed::union_pw_multi_aff<Domain, Anonymous> add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const;
12553  inline typed::union_pw_aff<Domain, Anonymous> add(const typed::aff<Domain, Anonymous> &upa2) const;
12554  inline typed::union_pw_aff<Domain, Anonymous> add(const typed::pw_aff<Domain, Anonymous> &upa2) const;
12555  template <typename Range2>
12556  inline typed::union_pw_multi_aff<Domain, Range2> apply(const typed::union_pw_multi_aff<Anonymous, Range2> &upma2) const;
12557  inline typed::multi_union_pw_aff<Domain, Anonymous> as_multi_union_pw_aff() const;
12558  inline typed::pw_multi_aff<Domain, Anonymous> as_pw_multi_aff() const;
12559  inline typed::union_map<Domain, Anonymous> as_union_map() const;
12560  inline typed::union_pw_aff<Domain, Anonymous> at(int pos) const;
12561  inline typed::union_set<Domain> bind(const typed::multi_id<Anonymous> &tuple) const;
12562  inline typed::union_set<Domain> bind(const typed::id<Anonymous> &id) const;
12563  inline typed::union_set<Domain> bind(const std::string &id) const;
12564  inline typed::union_pw_aff<Domain, Anonymous> coalesce() const;
12565  inline typed::union_set<Domain> domain() const;
12566  inline typed::union_pw_aff<Domain, Anonymous> drop_unused_params() const;
12567  inline typed::pw_multi_aff<Domain, Anonymous> extract_pw_multi_aff(const typed::space<Domain, Anonymous> &space) const;
12568  inline typed::union_pw_aff<Domain, Anonymous> gist(const typed::union_set<Domain> &context) const;
12569  inline typed::union_pw_aff<Domain, Anonymous> gist(const typed::basic_set<Domain> &context) const;
12570  inline typed::union_pw_aff<Domain, Anonymous> gist(const typed::point<Domain> &context) const;
12571  inline typed::union_pw_aff<Domain, Anonymous> gist(const typed::set<Domain> &context) const;
12572  inline typed::multi_union_pw_aff<Domain, Anonymous> gist_params(const typed::set<> &context) const;
12573  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain(const typed::space<Domain> &space) const;
12574  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain(const typed::union_set<Domain> &uset) const;
12575  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
12576  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain_wrapped_domain(const typed::basic_set<> &uset) const = delete;
12577  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain_wrapped_domain(const typed::point<> &uset) const = delete;
12578  inline typed::union_pw_aff<Domain, Anonymous> intersect_domain_wrapped_domain(const typed::set<> &uset) const = delete;
12579  inline typed::union_pw_aff<Domain, Anonymous> intersect_params(const typed::set<> &set) const;
12580  inline typed::union_pw_aff<Domain, Anonymous> intersect_params(const typed::basic_set<> &set) const;
12581  inline typed::union_pw_aff<Domain, Anonymous> intersect_params(const typed::point<> &set) const;
12582  inline typed::union_pw_aff_list<Domain, Anonymous> list() const;
12583  inline typed::multi_union_pw_aff<Domain, Anonymous> neg() const;
12584  inline typed::union_pw_multi_aff<Domain, Anonymous> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
12585  template <typename Domain2>
12586  inline typed::union_pw_aff<Domain2, Anonymous> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
12587  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_multi_aff<Domain> &upma) const;
12588  template <typename Domain2>
12589  inline typed::union_pw_aff<Domain2, Anonymous> pullback(const typed::multi_aff<Domain2, Domain> &upma) const;
12590  inline typed::union_pw_aff<Anonymous> pullback(const typed::multi_aff<Domain> &upma) const;
12591  template <typename Domain2>
12592  inline typed::union_pw_aff<Domain2, Anonymous> pullback(const typed::pw_multi_aff<Domain2, Domain> &upma) const;
12593  inline typed::union_pw_aff<Anonymous> pullback(const typed::pw_multi_aff<Domain> &upma) const;
12594  template <typename Domain2>
12595  inline typed::union_pw_aff<Domain2, Anonymous> pullback(const typed::union_pw_aff<Domain2, Domain> &upma) const;
12596  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_aff<Domain> &upma) const;
12597  inline typed::pw_multi_aff_list<Domain, Anonymous> pw_multi_aff_list() const;
12598  inline typed::union_pw_multi_aff<Domain, Anonymous> range_factor_domain() const = delete;
12599  inline typed::union_pw_multi_aff<Domain, Anonymous> range_factor_range() const = delete;
12600  template <typename Range2>
12601  inline typed::multi_union_pw_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const;
12602  template <typename Range2>
12603  inline typed::union_pw_multi_aff<Domain, pair<Anonymous, Range2>> range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const;
12604  inline typed::multi_union_pw_aff<Domain, Anonymous> scale(const typed::multi_val<Anonymous> &mv) const;
12605  inline typed::multi_union_pw_aff<Domain, Anonymous> scale(const typed::val<Anonymous> &v) const;
12606  inline typed::multi_union_pw_aff<Domain, Anonymous> scale(long v) const;
12607  inline typed::multi_union_pw_aff<Domain, Anonymous> scale_down(const typed::multi_val<Anonymous> &mv) const;
12608  inline typed::multi_union_pw_aff<Domain, Anonymous> scale_down(const typed::val<Anonymous> &v) const;
12609  inline typed::multi_union_pw_aff<Domain, Anonymous> scale_down(long v) const;
12610  inline typed::multi_union_pw_aff<Domain, Anonymous> set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const;
12611  template <typename Range2>
12612  inline typed::multi_union_pw_aff<Domain, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
12613  template <typename Range2>
12614  inline typed::multi_union_pw_aff<Domain, Range2> set_range_tuple(const std::string &id) const;
12615  inline typed::space<> space() const;
12616  inline typed::space<Domain, Anonymous> get_space() const = delete;
12617  inline typed::multi_union_pw_aff<Domain, Anonymous> sub(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const;
12618  inline typed::union_pw_aff<Domain, Anonymous> sub(const typed::union_pw_aff<Domain, Anonymous> &upa2) const;
12619  inline typed::union_pw_multi_aff<Domain, Anonymous> sub(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const;
12620  inline typed::union_pw_aff<Domain, Anonymous> sub(const typed::aff<Domain, Anonymous> &upa2) const;
12621  inline typed::union_pw_aff<Domain, Anonymous> sub(const typed::pw_aff<Domain, Anonymous> &upa2) const;
12622  inline typed::union_pw_aff<Domain, Anonymous> subtract_domain(const typed::space<Domain> &space) const;
12623  inline typed::union_pw_aff<Domain, Anonymous> subtract_domain(const typed::union_set<Domain> &uset) const;
12624  inline typed::multi_union_pw_aff<Domain, Anonymous> union_add(const typed::multi_union_pw_aff<Domain, Anonymous> &mupa2) const;
12625  inline typed::union_pw_aff<Domain, Anonymous> union_add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const;
12626  inline typed::union_pw_multi_aff<Domain, Anonymous> union_add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const;
12627  inline typed::union_pw_aff<Domain, Anonymous> union_add(const typed::aff<Domain, Anonymous> &upa2) const;
12628  inline typed::union_pw_aff<Domain, Anonymous> union_add(const typed::pw_aff<Domain, Anonymous> &upa2) const;
12629};
12630
12631template <typename Domain, typename Domain2>
12632struct union_pw_aff<pair<Domain, Domain2>, Anonymous> : public isl::union_pw_aff {
12633  template <typename...>
12634  friend struct aff;
12635  template <typename...>
12636  friend struct aff_list;
12637  template <typename...>
12638  friend struct basic_map;
12639  template <typename...>
12640  friend struct basic_set;
12641  template <typename...>
12642  friend struct fixed_box;
12643  template <typename...>
12644  friend struct id;
12645  template <typename...>
12646  friend struct id_list;
12647  template <typename...>
12648  friend struct map;
12649  template <typename...>
12650  friend struct map_list;
12651  template <typename...>
12652  friend struct multi_aff;
12653  template <typename...>
12654  friend struct multi_id;
12655  template <typename...>
12656  friend struct multi_pw_aff;
12657  template <typename...>
12658  friend struct multi_union_pw_aff;
12659  template <typename...>
12660  friend struct multi_val;
12661  template <typename...>
12662  friend struct point;
12663  template <typename...>
12664  friend struct pw_aff;
12665  template <typename...>
12666  friend struct pw_aff_list;
12667  template <typename...>
12668  friend struct pw_multi_aff;
12669  template <typename...>
12670  friend struct pw_multi_aff_list;
12671  template <typename...>
12672  friend struct set;
12673  template <typename...>
12674  friend struct set_list;
12675  template <typename...>
12676  friend struct space;
12677  template <typename...>
12678  friend struct union_map;
12679  template <typename...>
12680  friend struct union_pw_aff;
12681  template <typename...>
12682  friend struct union_pw_aff_list;
12683  template <typename...>
12684  friend struct union_pw_multi_aff;
12685  template <typename...>
12686  friend struct union_set;
12687  template <typename...>
12688  friend struct union_set_list;
12689  template <typename...>
12690  friend struct val;
12691  template <typename...>
12692  friend struct val_list;
12693
12694  union_pw_aff() = default;
12695  template <typename Arg1, typename Arg2,
12696            typename std::enable_if<
12697              std::is_base_of<Domain, Arg1>{} &&
12698              std::is_base_of<Domain2, Arg2>{},
12699            bool>::type = true>
12700  union_pw_aff(const union_pw_aff<pair<Arg1, Arg2>, Anonymous> &obj) : isl::union_pw_aff(obj) {}
12701 private:
12702  template <typename base,
12703            typename std::enable_if<
12704              std::is_same<base, isl::union_pw_aff>{}, bool>::type = true>
12705  union_pw_aff(const base &obj) : isl::union_pw_aff(obj) {}
12706 public:
12707  static union_pw_aff from(const isl::union_pw_aff &obj) {
12708    return union_pw_aff(obj);
12709  }
12710  inline /* implicit */ union_pw_aff(const typed::aff<pair<Domain, Domain2>, Anonymous> &aff);
12711  inline /* implicit */ union_pw_aff(const typed::pw_aff<pair<Domain, Domain2>, Anonymous> &pa);
12712  inline explicit union_pw_aff(const isl::ctx &ctx, const std::string &str);
12713  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> add(const typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> &multi2) const;
12714  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> add(const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const;
12715  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> add(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> &upma2) const;
12716  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> add(const typed::aff<pair<Domain, Domain2>, Anonymous> &upa2) const;
12717  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> add(const typed::pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const;
12718  template <typename Range2>
12719  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> apply(const typed::union_pw_multi_aff<Anonymous, Range2> &upma2) const;
12720  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> as_multi_union_pw_aff() const;
12721  inline typed::pw_multi_aff<pair<Domain, Domain2>, Anonymous> as_pw_multi_aff() const;
12722  inline typed::union_map<pair<Domain, Domain2>, Anonymous> as_union_map() const;
12723  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> at(int pos) const;
12724  inline typed::union_set<pair<Domain, Domain2>> bind(const typed::multi_id<Anonymous> &tuple) const;
12725  inline typed::union_set<pair<Domain, Domain2>> bind(const typed::id<Anonymous> &id) const;
12726  inline typed::union_set<pair<Domain, Domain2>> bind(const std::string &id) const;
12727  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> coalesce() const;
12728  inline typed::union_set<pair<Domain, Domain2>> domain() const;
12729  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> drop_unused_params() const;
12730  inline typed::pw_multi_aff<pair<Domain, Domain2>, Anonymous> extract_pw_multi_aff(const typed::space<pair<Domain, Domain2>, Anonymous> &space) const;
12731  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> gist(const typed::union_set<pair<Domain, Domain2>> &context) const;
12732  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> gist(const typed::basic_set<pair<Domain, Domain2>> &context) const;
12733  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> gist(const typed::point<pair<Domain, Domain2>> &context) const;
12734  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> gist(const typed::set<pair<Domain, Domain2>> &context) const;
12735  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> gist_params(const typed::set<> &context) const;
12736  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> intersect_domain(const typed::space<pair<Domain, Domain2>> &space) const;
12737  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> intersect_domain(const typed::union_set<pair<Domain, Domain2>> &uset) const;
12738  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> intersect_domain_wrapped_domain(const typed::union_set<Domain> &uset) const;
12739  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> intersect_domain_wrapped_domain(const typed::basic_set<Domain> &uset) const;
12740  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> intersect_domain_wrapped_domain(const typed::point<Domain> &uset) const;
12741  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> intersect_domain_wrapped_domain(const typed::set<Domain> &uset) const;
12742  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> intersect_params(const typed::set<> &set) const;
12743  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> intersect_params(const typed::basic_set<> &set) const;
12744  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> intersect_params(const typed::point<> &set) const;
12745  inline typed::union_pw_aff_list<pair<Domain, Domain2>, Anonymous> list() const;
12746  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> neg() const;
12747  template <typename Domain3>
12748  inline typed::union_pw_multi_aff<pair<Domain3, Domain2>, Anonymous> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain> &upma2) const;
12749  template <typename Arg2>
12750  inline typed::union_pw_aff<Arg2, Anonymous> pullback(const typed::union_pw_multi_aff<Arg2, pair<Domain, Domain2>> &upma) const;
12751  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_multi_aff<pair<Domain, Domain2>> &upma) const;
12752  template <typename Arg2>
12753  inline typed::union_pw_aff<Arg2, Anonymous> pullback(const typed::multi_aff<Arg2, pair<Domain, Domain2>> &upma) const;
12754  inline typed::union_pw_aff<Anonymous> pullback(const typed::multi_aff<pair<Domain, Domain2>> &upma) const;
12755  template <typename Arg2>
12756  inline typed::union_pw_aff<Arg2, Anonymous> pullback(const typed::pw_multi_aff<Arg2, pair<Domain, Domain2>> &upma) const;
12757  inline typed::union_pw_aff<Anonymous> pullback(const typed::pw_multi_aff<pair<Domain, Domain2>> &upma) const;
12758  template <typename Arg2>
12759  inline typed::union_pw_aff<Arg2, Anonymous> pullback(const typed::union_pw_aff<Arg2, pair<Domain, Domain2>> &upma) const;
12760  inline typed::union_pw_aff<Anonymous> pullback(const typed::union_pw_aff<pair<Domain, Domain2>> &upma) const;
12761  inline typed::pw_multi_aff_list<pair<Domain, Domain2>, Anonymous> pw_multi_aff_list() const;
12762  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> range_factor_domain() const = delete;
12763  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> range_factor_range() const = delete;
12764  template <typename Range2>
12765  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> range_product(const typed::multi_union_pw_aff<pair<Domain, Domain2>, Range2> &multi2) const;
12766  template <typename Range2>
12767  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> range_product(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> &upma2) const;
12768  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> scale(const typed::multi_val<Anonymous> &mv) const;
12769  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> scale(const typed::val<Anonymous> &v) const;
12770  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> scale(long v) const;
12771  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> scale_down(const typed::multi_val<Anonymous> &mv) const;
12772  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> scale_down(const typed::val<Anonymous> &v) const;
12773  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> scale_down(long v) const;
12774  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> set_at(int pos, const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &el) const;
12775  template <typename Range2>
12776  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Range2> set_range_tuple(const typed::id<Anonymous> &id) const;
12777  template <typename Range2>
12778  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Range2> set_range_tuple(const std::string &id) const;
12779  inline typed::space<> space() const;
12780  inline typed::space<pair<Domain, Domain2>, Anonymous> get_space() const = delete;
12781  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> sub(const typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> &multi2) const;
12782  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> sub(const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const;
12783  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> sub(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> &upma2) const;
12784  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> sub(const typed::aff<pair<Domain, Domain2>, Anonymous> &upa2) const;
12785  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> sub(const typed::pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const;
12786  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> subtract_domain(const typed::space<pair<Domain, Domain2>> &space) const;
12787  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> subtract_domain(const typed::union_set<pair<Domain, Domain2>> &uset) const;
12788  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> union_add(const typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> &mupa2) const;
12789  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> union_add(const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const;
12790  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> union_add(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> &upma2) const;
12791  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> union_add(const typed::aff<pair<Domain, Domain2>, Anonymous> &upa2) const;
12792  inline typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> union_add(const typed::pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const;
12793};
12794
12795template <>
12796struct union_pw_aff_list<Anonymous> : public isl::union_pw_aff_list {
12797  template <typename...>
12798  friend struct aff;
12799  template <typename...>
12800  friend struct aff_list;
12801  template <typename...>
12802  friend struct basic_map;
12803  template <typename...>
12804  friend struct basic_set;
12805  template <typename...>
12806  friend struct fixed_box;
12807  template <typename...>
12808  friend struct id;
12809  template <typename...>
12810  friend struct id_list;
12811  template <typename...>
12812  friend struct map;
12813  template <typename...>
12814  friend struct map_list;
12815  template <typename...>
12816  friend struct multi_aff;
12817  template <typename...>
12818  friend struct multi_id;
12819  template <typename...>
12820  friend struct multi_pw_aff;
12821  template <typename...>
12822  friend struct multi_union_pw_aff;
12823  template <typename...>
12824  friend struct multi_val;
12825  template <typename...>
12826  friend struct point;
12827  template <typename...>
12828  friend struct pw_aff;
12829  template <typename...>
12830  friend struct pw_aff_list;
12831  template <typename...>
12832  friend struct pw_multi_aff;
12833  template <typename...>
12834  friend struct pw_multi_aff_list;
12835  template <typename...>
12836  friend struct set;
12837  template <typename...>
12838  friend struct set_list;
12839  template <typename...>
12840  friend struct space;
12841  template <typename...>
12842  friend struct union_map;
12843  template <typename...>
12844  friend struct union_pw_aff;
12845  template <typename...>
12846  friend struct union_pw_aff_list;
12847  template <typename...>
12848  friend struct union_pw_multi_aff;
12849  template <typename...>
12850  friend struct union_set;
12851  template <typename...>
12852  friend struct union_set_list;
12853  template <typename...>
12854  friend struct val;
12855  template <typename...>
12856  friend struct val_list;
12857
12858  union_pw_aff_list() = default;
12859  union_pw_aff_list(const isl::union_pw_aff_list &obj) : isl::union_pw_aff_list(obj) {}
12860  static union_pw_aff_list from(const isl::union_pw_aff_list &obj) {
12861    return union_pw_aff_list(obj);
12862  }
12863  inline explicit union_pw_aff_list(const isl::ctx &ctx, int n);
12864  inline explicit union_pw_aff_list(const typed::union_pw_aff<Anonymous> &el);
12865  inline explicit union_pw_aff_list(const isl::ctx &ctx, const std::string &str);
12866  inline typed::union_pw_aff_list<Anonymous> add(const typed::union_pw_aff<Anonymous> &el) const;
12867  inline typed::union_pw_aff_list<Anonymous> add(const typed::aff<Anonymous> &el) const;
12868  inline typed::union_pw_aff_list<Anonymous> add(const typed::pw_aff<Anonymous> &el) const;
12869  inline typed::union_pw_aff<Anonymous> at(int index) const;
12870  inline typed::union_pw_aff<Anonymous> get_at(int index) const = delete;
12871  inline typed::union_pw_aff_list<Anonymous> drop(unsigned int first, unsigned int n) const;
12872  inline void foreach(const std::function<void(typed::union_pw_aff<Anonymous>)> &fn) const;
12873  inline void foreach_scc(const std::function<bool(typed::union_pw_aff<Anonymous>, typed::union_pw_aff<Anonymous>)> &follows, const std::function<void(typed::union_pw_aff_list<Anonymous>)> &fn) const;
12874  inline typed::union_pw_aff_list<Anonymous> set_at(int index, const typed::union_pw_aff<Anonymous> &el) const;
12875};
12876
12877template <typename Domain>
12878struct union_pw_aff_list<Domain, Anonymous> : public isl::union_pw_aff_list {
12879  template <typename...>
12880  friend struct aff;
12881  template <typename...>
12882  friend struct aff_list;
12883  template <typename...>
12884  friend struct basic_map;
12885  template <typename...>
12886  friend struct basic_set;
12887  template <typename...>
12888  friend struct fixed_box;
12889  template <typename...>
12890  friend struct id;
12891  template <typename...>
12892  friend struct id_list;
12893  template <typename...>
12894  friend struct map;
12895  template <typename...>
12896  friend struct map_list;
12897  template <typename...>
12898  friend struct multi_aff;
12899  template <typename...>
12900  friend struct multi_id;
12901  template <typename...>
12902  friend struct multi_pw_aff;
12903  template <typename...>
12904  friend struct multi_union_pw_aff;
12905  template <typename...>
12906  friend struct multi_val;
12907  template <typename...>
12908  friend struct point;
12909  template <typename...>
12910  friend struct pw_aff;
12911  template <typename...>
12912  friend struct pw_aff_list;
12913  template <typename...>
12914  friend struct pw_multi_aff;
12915  template <typename...>
12916  friend struct pw_multi_aff_list;
12917  template <typename...>
12918  friend struct set;
12919  template <typename...>
12920  friend struct set_list;
12921  template <typename...>
12922  friend struct space;
12923  template <typename...>
12924  friend struct union_map;
12925  template <typename...>
12926  friend struct union_pw_aff;
12927  template <typename...>
12928  friend struct union_pw_aff_list;
12929  template <typename...>
12930  friend struct union_pw_multi_aff;
12931  template <typename...>
12932  friend struct union_set;
12933  template <typename...>
12934  friend struct union_set_list;
12935  template <typename...>
12936  friend struct val;
12937  template <typename...>
12938  friend struct val_list;
12939
12940  union_pw_aff_list() = default;
12941  template <typename Arg1,
12942            typename std::enable_if<
12943              std::is_base_of<Domain, Arg1>{},
12944            bool>::type = true>
12945  union_pw_aff_list(const union_pw_aff_list<Arg1, Anonymous> &obj) : isl::union_pw_aff_list(obj) {}
12946 private:
12947  template <typename base,
12948            typename std::enable_if<
12949              std::is_same<base, isl::union_pw_aff_list>{}, bool>::type = true>
12950  union_pw_aff_list(const base &obj) : isl::union_pw_aff_list(obj) {}
12951 public:
12952  static union_pw_aff_list from(const isl::union_pw_aff_list &obj) {
12953    return union_pw_aff_list(obj);
12954  }
12955  inline explicit union_pw_aff_list(const isl::ctx &ctx, int n);
12956  inline explicit union_pw_aff_list(const typed::union_pw_aff<Domain, Anonymous> &el);
12957  inline explicit union_pw_aff_list(const isl::ctx &ctx, const std::string &str);
12958  inline typed::union_pw_aff_list<Domain, Anonymous> add(const typed::union_pw_aff<Domain, Anonymous> &el) const;
12959  inline typed::union_pw_aff_list<Domain, Anonymous> add(const typed::aff<Domain, Anonymous> &el) const;
12960  inline typed::union_pw_aff_list<Domain, Anonymous> add(const typed::pw_aff<Domain, Anonymous> &el) const;
12961  inline typed::union_pw_aff<Domain, Anonymous> at(int index) const;
12962  inline typed::union_pw_aff<Domain, Anonymous> get_at(int index) const = delete;
12963  inline typed::union_pw_aff_list<Domain, Anonymous> drop(unsigned int first, unsigned int n) const;
12964  inline void foreach(const std::function<void(typed::union_pw_aff<Domain, Anonymous>)> &fn) const;
12965  inline void foreach_scc(const std::function<bool(typed::union_pw_aff<Domain, Anonymous>, typed::union_pw_aff<Domain, Anonymous>)> &follows, const std::function<void(typed::union_pw_aff_list<Domain, Anonymous>)> &fn) const;
12966  inline typed::union_pw_aff_list<Domain, Anonymous> set_at(int index, const typed::union_pw_aff<Domain, Anonymous> &el) const;
12967};
12968
12969template <typename Domain>
12970struct union_pw_multi_aff<Domain> : public isl::union_pw_multi_aff {
12971  template <typename...>
12972  friend struct aff;
12973  template <typename...>
12974  friend struct aff_list;
12975  template <typename...>
12976  friend struct basic_map;
12977  template <typename...>
12978  friend struct basic_set;
12979  template <typename...>
12980  friend struct fixed_box;
12981  template <typename...>
12982  friend struct id;
12983  template <typename...>
12984  friend struct id_list;
12985  template <typename...>
12986  friend struct map;
12987  template <typename...>
12988  friend struct map_list;
12989  template <typename...>
12990  friend struct multi_aff;
12991  template <typename...>
12992  friend struct multi_id;
12993  template <typename...>
12994  friend struct multi_pw_aff;
12995  template <typename...>
12996  friend struct multi_union_pw_aff;
12997  template <typename...>
12998  friend struct multi_val;
12999  template <typename...>
13000  friend struct point;
13001  template <typename...>
13002  friend struct pw_aff;
13003  template <typename...>
13004  friend struct pw_aff_list;
13005  template <typename...>
13006  friend struct pw_multi_aff;
13007  template <typename...>
13008  friend struct pw_multi_aff_list;
13009  template <typename...>
13010  friend struct set;
13011  template <typename...>
13012  friend struct set_list;
13013  template <typename...>
13014  friend struct space;
13015  template <typename...>
13016  friend struct union_map;
13017  template <typename...>
13018  friend struct union_pw_aff;
13019  template <typename...>
13020  friend struct union_pw_aff_list;
13021  template <typename...>
13022  friend struct union_pw_multi_aff;
13023  template <typename...>
13024  friend struct union_set;
13025  template <typename...>
13026  friend struct union_set_list;
13027  template <typename...>
13028  friend struct val;
13029  template <typename...>
13030  friend struct val_list;
13031
13032  union_pw_multi_aff() = default;
13033  template <typename Arg1,
13034            typename std::enable_if<
13035              std::is_base_of<Domain, Arg1>{},
13036            bool>::type = true>
13037  union_pw_multi_aff(const union_pw_multi_aff<Arg1> &obj) : isl::union_pw_multi_aff(obj) {}
13038 private:
13039  template <typename base,
13040            typename std::enable_if<
13041              std::is_same<base, isl::union_pw_multi_aff>{}, bool>::type = true>
13042  union_pw_multi_aff(const base &obj) : isl::union_pw_multi_aff(obj) {}
13043 public:
13044  static union_pw_multi_aff from(const isl::union_pw_multi_aff &obj) {
13045    return union_pw_multi_aff(obj);
13046  }
13047  inline /* implicit */ union_pw_multi_aff(const typed::multi_aff<Domain> &ma);
13048  inline /* implicit */ union_pw_multi_aff(const typed::pw_multi_aff<Domain> &pma);
13049  inline /* implicit */ union_pw_multi_aff(const typed::union_pw_aff<Domain> &upa);
13050  inline explicit union_pw_multi_aff(const isl::ctx &ctx, const std::string &str);
13051  inline typed::union_pw_multi_aff<Domain> add(const typed::union_pw_multi_aff<Domain> &upma2) const;
13052  inline typed::union_pw_multi_aff<Domain> add(const typed::multi_aff<Domain> &upma2) const;
13053  inline typed::union_pw_multi_aff<Domain> add(const typed::pw_multi_aff<Domain> &upma2) const;
13054  inline typed::union_pw_multi_aff<Domain> add(const typed::union_pw_aff<Domain> &upma2) const;
13055  template <typename Range>
13056  inline typed::union_pw_multi_aff<Range> apply(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
13057  template <typename Range>
13058  inline typed::union_pw_multi_aff<Range> apply(const typed::multi_aff<Domain, Range> &upma2) const;
13059  template <typename Range>
13060  inline typed::union_pw_multi_aff<Range> apply(const typed::pw_multi_aff<Domain, Range> &upma2) const;
13061  inline typed::union_pw_multi_aff<Anonymous> apply(const typed::union_pw_aff<Domain, Anonymous> &upma2) const;
13062  inline typed::multi_union_pw_aff<Domain> as_multi_union_pw_aff() const;
13063  inline typed::pw_multi_aff<Domain> as_pw_multi_aff() const;
13064  inline typed::union_map<Domain> as_union_map() const = delete;
13065  inline typed::union_pw_multi_aff<Domain> coalesce() const;
13066  inline typed::union_set<> domain() const;
13067  inline typed::union_pw_multi_aff<Domain> drop_unused_params() const;
13068  static inline typed::union_pw_multi_aff<Domain> empty(const isl::ctx &ctx);
13069  inline typed::pw_multi_aff<Domain> extract_pw_multi_aff(const typed::space<Domain> &space) const;
13070  inline typed::union_pw_multi_aff<Domain> gist(const typed::union_set<> &context) const;
13071  inline typed::union_pw_multi_aff<Domain> gist(const typed::basic_set<> &context) const;
13072  inline typed::union_pw_multi_aff<Domain> gist(const typed::point<> &context) const;
13073  inline typed::union_pw_multi_aff<Domain> gist(const typed::set<> &context) const;
13074  inline typed::union_pw_multi_aff<Domain> intersect_domain(const typed::space<> &space) const = delete;
13075  inline typed::union_pw_multi_aff<Domain> intersect_domain(const typed::union_set<> &uset) const = delete;
13076  inline typed::union_pw_multi_aff<Domain> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
13077  inline typed::union_pw_multi_aff<Domain> intersect_domain_wrapped_domain(const typed::basic_set<> &uset) const = delete;
13078  inline typed::union_pw_multi_aff<Domain> intersect_domain_wrapped_domain(const typed::point<> &uset) const = delete;
13079  inline typed::union_pw_multi_aff<Domain> intersect_domain_wrapped_domain(const typed::set<> &uset) const = delete;
13080  inline typed::union_pw_multi_aff<Domain> intersect_params(const typed::set<> &set) const;
13081  inline typed::union_pw_multi_aff<Domain> intersect_params(const typed::basic_set<> &set) const;
13082  inline typed::union_pw_multi_aff<Domain> intersect_params(const typed::point<> &set) const;
13083  inline typed::union_pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
13084  inline typed::union_pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::multi_aff<> &upma2) const = delete;
13085  inline typed::union_pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &upma2) const = delete;
13086  inline typed::union_pw_multi_aff<Domain> preimage_domain_wrapped_domain(const typed::union_pw_aff<> &upma2) const = delete;
13087  inline typed::union_pw_multi_aff<Domain> pullback(const typed::union_pw_multi_aff<> &upma2) const = delete;
13088  inline typed::union_pw_multi_aff<Domain> pullback(const typed::multi_aff<> &upma2) const = delete;
13089  inline typed::union_pw_multi_aff<Domain> pullback(const typed::pw_multi_aff<> &upma2) const = delete;
13090  inline typed::union_pw_multi_aff<Domain> pullback(const typed::union_pw_aff<> &upma2) const = delete;
13091  inline typed::pw_multi_aff_list<Domain> pw_multi_aff_list() const;
13092  inline typed::pw_multi_aff_list<Domain> get_pw_multi_aff_list() const = delete;
13093  inline typed::union_pw_multi_aff<Domain> range_factor_domain() const = delete;
13094  inline typed::union_pw_multi_aff<Domain> range_factor_range() const = delete;
13095  inline typed::union_pw_multi_aff<Domain> range_product(const typed::union_pw_multi_aff<> &upma2) const = delete;
13096  inline typed::union_pw_multi_aff<Domain> range_product(const typed::multi_aff<> &upma2) const = delete;
13097  inline typed::union_pw_multi_aff<Domain> range_product(const typed::pw_multi_aff<> &upma2) const = delete;
13098  inline typed::union_pw_multi_aff<Domain> range_product(const typed::union_pw_aff<> &upma2) const = delete;
13099  inline typed::space<> space() const;
13100  inline typed::space<Domain> get_space() const = delete;
13101  inline typed::union_pw_multi_aff<Domain> sub(const typed::union_pw_multi_aff<Domain> &upma2) const;
13102  inline typed::union_pw_multi_aff<Domain> sub(const typed::multi_aff<Domain> &upma2) const;
13103  inline typed::union_pw_multi_aff<Domain> sub(const typed::pw_multi_aff<Domain> &upma2) const;
13104  inline typed::union_pw_multi_aff<Domain> sub(const typed::union_pw_aff<Domain> &upma2) const;
13105  inline typed::union_pw_multi_aff<Domain> subtract_domain(const typed::space<> &space) const = delete;
13106  inline typed::union_pw_multi_aff<Domain> subtract_domain(const typed::union_set<> &uset) const = delete;
13107  inline typed::union_pw_multi_aff<Domain> union_add(const typed::union_pw_multi_aff<Domain> &upma2) const;
13108  inline typed::union_pw_multi_aff<Domain> union_add(const typed::multi_aff<Domain> &upma2) const;
13109  inline typed::union_pw_multi_aff<Domain> union_add(const typed::pw_multi_aff<Domain> &upma2) const;
13110  inline typed::union_pw_multi_aff<Domain> union_add(const typed::union_pw_aff<Domain> &upma2) const;
13111};
13112
13113template <typename Domain, typename Range>
13114struct union_pw_multi_aff<Domain, Range> : public isl::union_pw_multi_aff {
13115  template <typename...>
13116  friend struct aff;
13117  template <typename...>
13118  friend struct aff_list;
13119  template <typename...>
13120  friend struct basic_map;
13121  template <typename...>
13122  friend struct basic_set;
13123  template <typename...>
13124  friend struct fixed_box;
13125  template <typename...>
13126  friend struct id;
13127  template <typename...>
13128  friend struct id_list;
13129  template <typename...>
13130  friend struct map;
13131  template <typename...>
13132  friend struct map_list;
13133  template <typename...>
13134  friend struct multi_aff;
13135  template <typename...>
13136  friend struct multi_id;
13137  template <typename...>
13138  friend struct multi_pw_aff;
13139  template <typename...>
13140  friend struct multi_union_pw_aff;
13141  template <typename...>
13142  friend struct multi_val;
13143  template <typename...>
13144  friend struct point;
13145  template <typename...>
13146  friend struct pw_aff;
13147  template <typename...>
13148  friend struct pw_aff_list;
13149  template <typename...>
13150  friend struct pw_multi_aff;
13151  template <typename...>
13152  friend struct pw_multi_aff_list;
13153  template <typename...>
13154  friend struct set;
13155  template <typename...>
13156  friend struct set_list;
13157  template <typename...>
13158  friend struct space;
13159  template <typename...>
13160  friend struct union_map;
13161  template <typename...>
13162  friend struct union_pw_aff;
13163  template <typename...>
13164  friend struct union_pw_aff_list;
13165  template <typename...>
13166  friend struct union_pw_multi_aff;
13167  template <typename...>
13168  friend struct union_set;
13169  template <typename...>
13170  friend struct union_set_list;
13171  template <typename...>
13172  friend struct val;
13173  template <typename...>
13174  friend struct val_list;
13175
13176  union_pw_multi_aff() = default;
13177  template <typename Arg1, typename Arg2,
13178            typename std::enable_if<
13179              std::is_base_of<Domain, Arg1>{} &&
13180              std::is_base_of<Range, Arg2>{},
13181            bool>::type = true>
13182  union_pw_multi_aff(const union_pw_multi_aff<Arg1, Arg2> &obj) : isl::union_pw_multi_aff(obj) {}
13183 private:
13184  template <typename base,
13185            typename std::enable_if<
13186              std::is_same<base, isl::union_pw_multi_aff>{}, bool>::type = true>
13187  union_pw_multi_aff(const base &obj) : isl::union_pw_multi_aff(obj) {}
13188 public:
13189  static union_pw_multi_aff from(const isl::union_pw_multi_aff &obj) {
13190    return union_pw_multi_aff(obj);
13191  }
13192  inline /* implicit */ union_pw_multi_aff(const typed::multi_aff<Domain, Range> &ma);
13193  inline /* implicit */ union_pw_multi_aff(const typed::pw_multi_aff<Domain, Range> &pma);
13194  inline /* implicit */ union_pw_multi_aff(const typed::union_pw_aff<Domain, Range> &upa);
13195  inline explicit union_pw_multi_aff(const isl::ctx &ctx, const std::string &str);
13196  inline typed::union_pw_multi_aff<Domain, Range> add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
13197  inline typed::union_pw_multi_aff<Domain, Range> add(const typed::multi_aff<Domain, Range> &upma2) const;
13198  inline typed::union_pw_multi_aff<Domain, Range> add(const typed::pw_multi_aff<Domain, Range> &upma2) const;
13199  inline typed::union_pw_multi_aff<Domain, Range> add(const typed::union_pw_aff<Domain, Range> &upma2) const;
13200  template <typename Range2>
13201  inline typed::union_pw_multi_aff<Domain, Range2> apply(const typed::union_pw_multi_aff<Range, Range2> &upma2) const;
13202  template <typename Range2>
13203  inline typed::union_pw_multi_aff<Domain, Range2> apply(const typed::multi_aff<Range, Range2> &upma2) const;
13204  template <typename Range2>
13205  inline typed::union_pw_multi_aff<Domain, Range2> apply(const typed::pw_multi_aff<Range, Range2> &upma2) const;
13206  inline typed::union_pw_multi_aff<Domain, Anonymous> apply(const typed::union_pw_aff<Range, Anonymous> &upma2) const;
13207  inline typed::multi_union_pw_aff<Domain, Range> as_multi_union_pw_aff() const;
13208  inline typed::pw_multi_aff<Domain, Range> as_pw_multi_aff() const;
13209  inline typed::union_map<Domain, Range> as_union_map() const;
13210  inline typed::union_pw_multi_aff<Domain, Range> coalesce() const;
13211  inline typed::union_set<Domain> domain() const;
13212  inline typed::union_pw_multi_aff<Domain, Range> drop_unused_params() const;
13213  static inline typed::union_pw_multi_aff<Domain, Range> empty(const isl::ctx &ctx);
13214  inline typed::pw_multi_aff<Domain, Range> extract_pw_multi_aff(const typed::space<Domain, Range> &space) const;
13215  inline typed::union_pw_multi_aff<Domain, Range> gist(const typed::union_set<Domain> &context) const;
13216  inline typed::union_pw_multi_aff<Domain, Range> gist(const typed::basic_set<Domain> &context) const;
13217  inline typed::union_pw_multi_aff<Domain, Range> gist(const typed::point<Domain> &context) const;
13218  inline typed::union_pw_multi_aff<Domain, Range> gist(const typed::set<Domain> &context) const;
13219  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain(const typed::space<Domain> &space) const;
13220  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain(const typed::union_set<Domain> &uset) const;
13221  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
13222  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain_wrapped_domain(const typed::basic_set<> &uset) const = delete;
13223  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain_wrapped_domain(const typed::point<> &uset) const = delete;
13224  inline typed::union_pw_multi_aff<Domain, Range> intersect_domain_wrapped_domain(const typed::set<> &uset) const = delete;
13225  inline typed::union_pw_multi_aff<Domain, Range> intersect_params(const typed::set<> &set) const;
13226  inline typed::union_pw_multi_aff<Domain, Range> intersect_params(const typed::basic_set<> &set) const;
13227  inline typed::union_pw_multi_aff<Domain, Range> intersect_params(const typed::point<> &set) const;
13228  inline typed::union_pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
13229  inline typed::union_pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::multi_aff<> &upma2) const = delete;
13230  inline typed::union_pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &upma2) const = delete;
13231  inline typed::union_pw_multi_aff<Domain, Range> preimage_domain_wrapped_domain(const typed::union_pw_aff<> &upma2) const = delete;
13232  template <typename Domain2>
13233  inline typed::union_pw_multi_aff<Domain2, Range> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const;
13234  inline typed::union_pw_multi_aff<Range> pullback(const typed::union_pw_multi_aff<Domain> &upma2) const;
13235  template <typename Domain2>
13236  inline typed::union_pw_multi_aff<Domain2, Range> pullback(const typed::multi_aff<Domain2, Domain> &upma2) const;
13237  inline typed::union_pw_multi_aff<Range> pullback(const typed::multi_aff<Domain> &upma2) const;
13238  template <typename Domain2>
13239  inline typed::union_pw_multi_aff<Domain2, Range> pullback(const typed::pw_multi_aff<Domain2, Domain> &upma2) const;
13240  inline typed::union_pw_multi_aff<Range> pullback(const typed::pw_multi_aff<Domain> &upma2) const;
13241  template <typename Domain2>
13242  inline typed::union_pw_multi_aff<Domain2, Range> pullback(const typed::union_pw_aff<Domain2, Domain> &upma2) const;
13243  inline typed::union_pw_multi_aff<Range> pullback(const typed::union_pw_aff<Domain> &upma2) const;
13244  inline typed::pw_multi_aff_list<Domain, Range> pw_multi_aff_list() const;
13245  inline typed::pw_multi_aff_list<Domain, Range> get_pw_multi_aff_list() const = delete;
13246  inline typed::union_pw_multi_aff<Domain, Range> range_factor_domain() const = delete;
13247  inline typed::union_pw_multi_aff<Domain, Range> range_factor_range() const = delete;
13248  template <typename Range2>
13249  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const;
13250  template <typename Range2>
13251  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> range_product(const typed::multi_aff<Domain, Range2> &upma2) const;
13252  template <typename Range2>
13253  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> range_product(const typed::pw_multi_aff<Domain, Range2> &upma2) const;
13254  inline typed::union_pw_multi_aff<Domain, pair<Range, Anonymous>> range_product(const typed::union_pw_aff<Domain, Anonymous> &upma2) const;
13255  inline typed::space<> space() const;
13256  inline typed::space<Domain, Range> get_space() const = delete;
13257  inline typed::union_pw_multi_aff<Domain, Range> sub(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
13258  inline typed::union_pw_multi_aff<Domain, Range> sub(const typed::multi_aff<Domain, Range> &upma2) const;
13259  inline typed::union_pw_multi_aff<Domain, Range> sub(const typed::pw_multi_aff<Domain, Range> &upma2) const;
13260  inline typed::union_pw_multi_aff<Domain, Range> sub(const typed::union_pw_aff<Domain, Range> &upma2) const;
13261  inline typed::union_pw_multi_aff<Domain, Range> subtract_domain(const typed::space<Domain> &space) const;
13262  inline typed::union_pw_multi_aff<Domain, Range> subtract_domain(const typed::union_set<Domain> &uset) const;
13263  inline typed::union_pw_multi_aff<Domain, Range> union_add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const;
13264  inline typed::union_pw_multi_aff<Domain, Range> union_add(const typed::multi_aff<Domain, Range> &upma2) const;
13265  inline typed::union_pw_multi_aff<Domain, Range> union_add(const typed::pw_multi_aff<Domain, Range> &upma2) const;
13266  inline typed::union_pw_multi_aff<Domain, Range> union_add(const typed::union_pw_aff<Domain, Range> &upma2) const;
13267};
13268
13269template <typename Domain, typename Domain2, typename Range>
13270struct union_pw_multi_aff<pair<Domain, Domain2>, Range> : public isl::union_pw_multi_aff {
13271  template <typename...>
13272  friend struct aff;
13273  template <typename...>
13274  friend struct aff_list;
13275  template <typename...>
13276  friend struct basic_map;
13277  template <typename...>
13278  friend struct basic_set;
13279  template <typename...>
13280  friend struct fixed_box;
13281  template <typename...>
13282  friend struct id;
13283  template <typename...>
13284  friend struct id_list;
13285  template <typename...>
13286  friend struct map;
13287  template <typename...>
13288  friend struct map_list;
13289  template <typename...>
13290  friend struct multi_aff;
13291  template <typename...>
13292  friend struct multi_id;
13293  template <typename...>
13294  friend struct multi_pw_aff;
13295  template <typename...>
13296  friend struct multi_union_pw_aff;
13297  template <typename...>
13298  friend struct multi_val;
13299  template <typename...>
13300  friend struct point;
13301  template <typename...>
13302  friend struct pw_aff;
13303  template <typename...>
13304  friend struct pw_aff_list;
13305  template <typename...>
13306  friend struct pw_multi_aff;
13307  template <typename...>
13308  friend struct pw_multi_aff_list;
13309  template <typename...>
13310  friend struct set;
13311  template <typename...>
13312  friend struct set_list;
13313  template <typename...>
13314  friend struct space;
13315  template <typename...>
13316  friend struct union_map;
13317  template <typename...>
13318  friend struct union_pw_aff;
13319  template <typename...>
13320  friend struct union_pw_aff_list;
13321  template <typename...>
13322  friend struct union_pw_multi_aff;
13323  template <typename...>
13324  friend struct union_set;
13325  template <typename...>
13326  friend struct union_set_list;
13327  template <typename...>
13328  friend struct val;
13329  template <typename...>
13330  friend struct val_list;
13331
13332  union_pw_multi_aff() = default;
13333  template <typename Arg1, typename Arg2, typename Arg3,
13334            typename std::enable_if<
13335              std::is_base_of<Domain, Arg1>{} &&
13336              std::is_base_of<Domain2, Arg2>{} &&
13337              std::is_base_of<Range, Arg3>{},
13338            bool>::type = true>
13339  union_pw_multi_aff(const union_pw_multi_aff<pair<Arg1, Arg2>, Arg3> &obj) : isl::union_pw_multi_aff(obj) {}
13340 private:
13341  template <typename base,
13342            typename std::enable_if<
13343              std::is_same<base, isl::union_pw_multi_aff>{}, bool>::type = true>
13344  union_pw_multi_aff(const base &obj) : isl::union_pw_multi_aff(obj) {}
13345 public:
13346  static union_pw_multi_aff from(const isl::union_pw_multi_aff &obj) {
13347    return union_pw_multi_aff(obj);
13348  }
13349  inline /* implicit */ union_pw_multi_aff(const typed::multi_aff<pair<Domain, Domain2>, Range> &ma);
13350  inline /* implicit */ union_pw_multi_aff(const typed::pw_multi_aff<pair<Domain, Domain2>, Range> &pma);
13351  inline /* implicit */ union_pw_multi_aff(const typed::union_pw_aff<pair<Domain, Domain2>, Range> &upa);
13352  inline explicit union_pw_multi_aff(const isl::ctx &ctx, const std::string &str);
13353  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> add(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const;
13354  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> add(const typed::multi_aff<pair<Domain, Domain2>, Range> &upma2) const;
13355  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> add(const typed::pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const;
13356  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> add(const typed::union_pw_aff<pair<Domain, Domain2>, Range> &upma2) const;
13357  template <typename Range2>
13358  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> apply(const typed::union_pw_multi_aff<Range, Range2> &upma2) const;
13359  template <typename Range2>
13360  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> apply(const typed::multi_aff<Range, Range2> &upma2) const;
13361  template <typename Range2>
13362  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> apply(const typed::pw_multi_aff<Range, Range2> &upma2) const;
13363  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> apply(const typed::union_pw_aff<Range, Anonymous> &upma2) const;
13364  inline typed::multi_union_pw_aff<pair<Domain, Domain2>, Range> as_multi_union_pw_aff() const;
13365  inline typed::pw_multi_aff<pair<Domain, Domain2>, Range> as_pw_multi_aff() const;
13366  inline typed::union_map<pair<Domain, Domain2>, Range> as_union_map() const;
13367  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> coalesce() const;
13368  inline typed::union_set<pair<Domain, Domain2>> domain() const;
13369  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> drop_unused_params() const;
13370  static inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> empty(const isl::ctx &ctx);
13371  inline typed::pw_multi_aff<pair<Domain, Domain2>, Range> extract_pw_multi_aff(const typed::space<pair<Domain, Domain2>, Range> &space) const;
13372  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> gist(const typed::union_set<pair<Domain, Domain2>> &context) const;
13373  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> gist(const typed::basic_set<pair<Domain, Domain2>> &context) const;
13374  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> gist(const typed::point<pair<Domain, Domain2>> &context) const;
13375  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> gist(const typed::set<pair<Domain, Domain2>> &context) const;
13376  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> intersect_domain(const typed::space<pair<Domain, Domain2>> &space) const;
13377  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> intersect_domain(const typed::union_set<pair<Domain, Domain2>> &uset) const;
13378  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> intersect_domain_wrapped_domain(const typed::union_set<Domain> &uset) const;
13379  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> intersect_domain_wrapped_domain(const typed::basic_set<Domain> &uset) const;
13380  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> intersect_domain_wrapped_domain(const typed::point<Domain> &uset) const;
13381  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> intersect_domain_wrapped_domain(const typed::set<Domain> &uset) const;
13382  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> intersect_params(const typed::set<> &set) const;
13383  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> intersect_params(const typed::basic_set<> &set) const;
13384  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> intersect_params(const typed::point<> &set) const;
13385  template <typename Domain3>
13386  inline typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain> &upma2) const;
13387  template <typename Domain3>
13388  inline typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range> preimage_domain_wrapped_domain(const typed::multi_aff<Domain3, Domain> &upma2) const;
13389  template <typename Domain3>
13390  inline typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range> preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain> &upma2) const;
13391  template <typename Domain3>
13392  inline typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range> preimage_domain_wrapped_domain(const typed::union_pw_aff<Domain3, Domain> &upma2) const;
13393  template <typename Arg3>
13394  inline typed::union_pw_multi_aff<Arg3, Range> pullback(const typed::union_pw_multi_aff<Arg3, pair<Domain, Domain2>> &upma2) const;
13395  inline typed::union_pw_multi_aff<Range> pullback(const typed::union_pw_multi_aff<pair<Domain, Domain2>> &upma2) const;
13396  template <typename Arg3>
13397  inline typed::union_pw_multi_aff<Arg3, Range> pullback(const typed::multi_aff<Arg3, pair<Domain, Domain2>> &upma2) const;
13398  inline typed::union_pw_multi_aff<Range> pullback(const typed::multi_aff<pair<Domain, Domain2>> &upma2) const;
13399  template <typename Arg3>
13400  inline typed::union_pw_multi_aff<Arg3, Range> pullback(const typed::pw_multi_aff<Arg3, pair<Domain, Domain2>> &upma2) const;
13401  inline typed::union_pw_multi_aff<Range> pullback(const typed::pw_multi_aff<pair<Domain, Domain2>> &upma2) const;
13402  template <typename Arg3>
13403  inline typed::union_pw_multi_aff<Arg3, Range> pullback(const typed::union_pw_aff<Arg3, pair<Domain, Domain2>> &upma2) const;
13404  inline typed::union_pw_multi_aff<Range> pullback(const typed::union_pw_aff<pair<Domain, Domain2>> &upma2) const;
13405  inline typed::pw_multi_aff_list<pair<Domain, Domain2>, Range> pw_multi_aff_list() const;
13406  inline typed::pw_multi_aff_list<pair<Domain, Domain2>, Range> get_pw_multi_aff_list() const = delete;
13407  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> range_factor_domain() const = delete;
13408  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> range_factor_range() const = delete;
13409  template <typename Range2>
13410  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> range_product(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> &upma2) const;
13411  template <typename Range2>
13412  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> range_product(const typed::multi_aff<pair<Domain, Domain2>, Range2> &upma2) const;
13413  template <typename Range2>
13414  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> range_product(const typed::pw_multi_aff<pair<Domain, Domain2>, Range2> &upma2) const;
13415  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> range_product(const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &upma2) const;
13416  inline typed::space<> space() const;
13417  inline typed::space<pair<Domain, Domain2>, Range> get_space() const = delete;
13418  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> sub(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const;
13419  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> sub(const typed::multi_aff<pair<Domain, Domain2>, Range> &upma2) const;
13420  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> sub(const typed::pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const;
13421  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> sub(const typed::union_pw_aff<pair<Domain, Domain2>, Range> &upma2) const;
13422  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> subtract_domain(const typed::space<pair<Domain, Domain2>> &space) const;
13423  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> subtract_domain(const typed::union_set<pair<Domain, Domain2>> &uset) const;
13424  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> union_add(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const;
13425  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> union_add(const typed::multi_aff<pair<Domain, Domain2>, Range> &upma2) const;
13426  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> union_add(const typed::pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const;
13427  inline typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> union_add(const typed::union_pw_aff<pair<Domain, Domain2>, Range> &upma2) const;
13428};
13429
13430template <typename Domain, typename Range, typename Range2>
13431struct union_pw_multi_aff<Domain, pair<Range, Range2>> : public isl::union_pw_multi_aff {
13432  template <typename...>
13433  friend struct aff;
13434  template <typename...>
13435  friend struct aff_list;
13436  template <typename...>
13437  friend struct basic_map;
13438  template <typename...>
13439  friend struct basic_set;
13440  template <typename...>
13441  friend struct fixed_box;
13442  template <typename...>
13443  friend struct id;
13444  template <typename...>
13445  friend struct id_list;
13446  template <typename...>
13447  friend struct map;
13448  template <typename...>
13449  friend struct map_list;
13450  template <typename...>
13451  friend struct multi_aff;
13452  template <typename...>
13453  friend struct multi_id;
13454  template <typename...>
13455  friend struct multi_pw_aff;
13456  template <typename...>
13457  friend struct multi_union_pw_aff;
13458  template <typename...>
13459  friend struct multi_val;
13460  template <typename...>
13461  friend struct point;
13462  template <typename...>
13463  friend struct pw_aff;
13464  template <typename...>
13465  friend struct pw_aff_list;
13466  template <typename...>
13467  friend struct pw_multi_aff;
13468  template <typename...>
13469  friend struct pw_multi_aff_list;
13470  template <typename...>
13471  friend struct set;
13472  template <typename...>
13473  friend struct set_list;
13474  template <typename...>
13475  friend struct space;
13476  template <typename...>
13477  friend struct union_map;
13478  template <typename...>
13479  friend struct union_pw_aff;
13480  template <typename...>
13481  friend struct union_pw_aff_list;
13482  template <typename...>
13483  friend struct union_pw_multi_aff;
13484  template <typename...>
13485  friend struct union_set;
13486  template <typename...>
13487  friend struct union_set_list;
13488  template <typename...>
13489  friend struct val;
13490  template <typename...>
13491  friend struct val_list;
13492
13493  union_pw_multi_aff() = default;
13494  template <typename Arg1, typename Arg2, typename Arg3,
13495            typename std::enable_if<
13496              std::is_base_of<Domain, Arg1>{} &&
13497              std::is_base_of<Range, Arg2>{} &&
13498              std::is_base_of<Range2, Arg3>{},
13499            bool>::type = true>
13500  union_pw_multi_aff(const union_pw_multi_aff<Arg1, pair<Arg2, Arg3>> &obj) : isl::union_pw_multi_aff(obj) {}
13501 private:
13502  template <typename base,
13503            typename std::enable_if<
13504              std::is_same<base, isl::union_pw_multi_aff>{}, bool>::type = true>
13505  union_pw_multi_aff(const base &obj) : isl::union_pw_multi_aff(obj) {}
13506 public:
13507  static union_pw_multi_aff from(const isl::union_pw_multi_aff &obj) {
13508    return union_pw_multi_aff(obj);
13509  }
13510  inline /* implicit */ union_pw_multi_aff(const typed::multi_aff<Domain, pair<Range, Range2>> &ma);
13511  inline /* implicit */ union_pw_multi_aff(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma);
13512  inline /* implicit */ union_pw_multi_aff(const typed::union_pw_aff<Domain, pair<Range, Range2>> &upa);
13513  inline explicit union_pw_multi_aff(const isl::ctx &ctx, const std::string &str);
13514  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
13515  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::multi_aff<Domain, pair<Range, Range2>> &upma2) const;
13516  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
13517  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> add(const typed::union_pw_aff<Domain, pair<Range, Range2>> &upma2) const;
13518  template <typename Arg3>
13519  inline typed::union_pw_multi_aff<Domain, Arg3> apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg3> &upma2) const;
13520  template <typename Arg3>
13521  inline typed::union_pw_multi_aff<Domain, Arg3> apply(const typed::multi_aff<pair<Range, Range2>, Arg3> &upma2) const;
13522  template <typename Arg3>
13523  inline typed::union_pw_multi_aff<Domain, Arg3> apply(const typed::pw_multi_aff<pair<Range, Range2>, Arg3> &upma2) const;
13524  inline typed::union_pw_multi_aff<Domain, Anonymous> apply(const typed::union_pw_aff<pair<Range, Range2>, Anonymous> &upma2) const;
13525  inline typed::multi_union_pw_aff<Domain, pair<Range, Range2>> as_multi_union_pw_aff() const;
13526  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> as_pw_multi_aff() const;
13527  inline typed::union_map<Domain, pair<Range, Range2>> as_union_map() const;
13528  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> coalesce() const;
13529  inline typed::union_set<Domain> domain() const;
13530  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> drop_unused_params() const;
13531  static inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> empty(const isl::ctx &ctx);
13532  inline typed::pw_multi_aff<Domain, pair<Range, Range2>> extract_pw_multi_aff(const typed::space<Domain, pair<Range, Range2>> &space) const;
13533  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> gist(const typed::union_set<Domain> &context) const;
13534  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> gist(const typed::basic_set<Domain> &context) const;
13535  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> gist(const typed::point<Domain> &context) const;
13536  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> gist(const typed::set<Domain> &context) const;
13537  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::space<Domain> &space) const;
13538  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain(const typed::union_set<Domain> &uset) const;
13539  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<> &uset) const = delete;
13540  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::basic_set<> &uset) const = delete;
13541  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::point<> &uset) const = delete;
13542  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::set<> &uset) const = delete;
13543  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_params(const typed::set<> &set) const;
13544  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_params(const typed::basic_set<> &set) const;
13545  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> intersect_params(const typed::point<> &set) const;
13546  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<> &upma2) const = delete;
13547  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::multi_aff<> &upma2) const = delete;
13548  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::pw_multi_aff<> &upma2) const = delete;
13549  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::union_pw_aff<> &upma2) const = delete;
13550  template <typename Domain2>
13551  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const;
13552  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<Domain> &upma2) const;
13553  template <typename Domain2>
13554  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_aff<Domain2, Domain> &upma2) const;
13555  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::multi_aff<Domain> &upma2) const;
13556  template <typename Domain2>
13557  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::pw_multi_aff<Domain2, Domain> &upma2) const;
13558  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::pw_multi_aff<Domain> &upma2) const;
13559  template <typename Domain2>
13560  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::union_pw_aff<Domain2, Domain> &upma2) const;
13561  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::union_pw_aff<Domain> &upma2) const;
13562  inline typed::pw_multi_aff_list<Domain, pair<Range, Range2>> pw_multi_aff_list() const;
13563  inline typed::pw_multi_aff_list<Domain, pair<Range, Range2>> get_pw_multi_aff_list() const = delete;
13564  inline typed::union_pw_multi_aff<Domain, Range> range_factor_domain() const;
13565  inline typed::union_pw_multi_aff<Domain, Range2> range_factor_range() const;
13566  template <typename Arg3>
13567  inline typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::union_pw_multi_aff<Domain, Arg3> &upma2) const;
13568  template <typename Arg3>
13569  inline typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::multi_aff<Domain, Arg3> &upma2) const;
13570  template <typename Arg3>
13571  inline typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> range_product(const typed::pw_multi_aff<Domain, Arg3> &upma2) const;
13572  inline typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Anonymous>> range_product(const typed::union_pw_aff<Domain, Anonymous> &upma2) const;
13573  inline typed::space<> space() const;
13574  inline typed::space<Domain, pair<Range, Range2>> get_space() const = delete;
13575  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
13576  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::multi_aff<Domain, pair<Range, Range2>> &upma2) const;
13577  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
13578  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> sub(const typed::union_pw_aff<Domain, pair<Range, Range2>> &upma2) const;
13579  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::space<Domain> &space) const;
13580  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> subtract_domain(const typed::union_set<Domain> &uset) const;
13581  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
13582  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::multi_aff<Domain, pair<Range, Range2>> &upma2) const;
13583  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const;
13584  inline typed::union_pw_multi_aff<Domain, pair<Range, Range2>> union_add(const typed::union_pw_aff<Domain, pair<Range, Range2>> &upma2) const;
13585};
13586
13587template <typename T1, typename T2, typename Range, typename Range2>
13588struct union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> : public isl::union_pw_multi_aff {
13589  template <typename...>
13590  friend struct aff;
13591  template <typename...>
13592  friend struct aff_list;
13593  template <typename...>
13594  friend struct basic_map;
13595  template <typename...>
13596  friend struct basic_set;
13597  template <typename...>
13598  friend struct fixed_box;
13599  template <typename...>
13600  friend struct id;
13601  template <typename...>
13602  friend struct id_list;
13603  template <typename...>
13604  friend struct map;
13605  template <typename...>
13606  friend struct map_list;
13607  template <typename...>
13608  friend struct multi_aff;
13609  template <typename...>
13610  friend struct multi_id;
13611  template <typename...>
13612  friend struct multi_pw_aff;
13613  template <typename...>
13614  friend struct multi_union_pw_aff;
13615  template <typename...>
13616  friend struct multi_val;
13617  template <typename...>
13618  friend struct point;
13619  template <typename...>
13620  friend struct pw_aff;
13621  template <typename...>
13622  friend struct pw_aff_list;
13623  template <typename...>
13624  friend struct pw_multi_aff;
13625  template <typename...>
13626  friend struct pw_multi_aff_list;
13627  template <typename...>
13628  friend struct set;
13629  template <typename...>
13630  friend struct set_list;
13631  template <typename...>
13632  friend struct space;
13633  template <typename...>
13634  friend struct union_map;
13635  template <typename...>
13636  friend struct union_pw_aff;
13637  template <typename...>
13638  friend struct union_pw_aff_list;
13639  template <typename...>
13640  friend struct union_pw_multi_aff;
13641  template <typename...>
13642  friend struct union_set;
13643  template <typename...>
13644  friend struct union_set_list;
13645  template <typename...>
13646  friend struct val;
13647  template <typename...>
13648  friend struct val_list;
13649
13650  union_pw_multi_aff() = default;
13651  template <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
13652            typename std::enable_if<
13653              std::is_base_of<T1, Arg1>{} &&
13654              std::is_base_of<T2, Arg2>{} &&
13655              std::is_base_of<Range, Arg3>{} &&
13656              std::is_base_of<Range2, Arg4>{},
13657            bool>::type = true>
13658  union_pw_multi_aff(const union_pw_multi_aff<pair<Arg1, Arg2>, pair<Arg3, Arg4>> &obj) : isl::union_pw_multi_aff(obj) {}
13659 private:
13660  template <typename base,
13661            typename std::enable_if<
13662              std::is_same<base, isl::union_pw_multi_aff>{}, bool>::type = true>
13663  union_pw_multi_aff(const base &obj) : isl::union_pw_multi_aff(obj) {}
13664 public:
13665  static union_pw_multi_aff from(const isl::union_pw_multi_aff &obj) {
13666    return union_pw_multi_aff(obj);
13667  }
13668  inline /* implicit */ union_pw_multi_aff(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &ma);
13669  inline /* implicit */ union_pw_multi_aff(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma);
13670  inline /* implicit */ union_pw_multi_aff(const typed::union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upa);
13671  inline explicit union_pw_multi_aff(const isl::ctx &ctx, const std::string &str);
13672  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13673  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13674  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13675  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> add(const typed::union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13676  template <typename Arg2>
13677  inline typed::union_pw_multi_aff<pair<T1, T2>, Arg2> apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg2> &upma2) const;
13678  template <typename Arg2>
13679  inline typed::union_pw_multi_aff<pair<T1, T2>, Arg2> apply(const typed::multi_aff<pair<Range, Range2>, Arg2> &upma2) const;
13680  template <typename Arg2>
13681  inline typed::union_pw_multi_aff<pair<T1, T2>, Arg2> apply(const typed::pw_multi_aff<pair<Range, Range2>, Arg2> &upma2) const;
13682  inline typed::union_pw_multi_aff<pair<T1, T2>, Anonymous> apply(const typed::union_pw_aff<pair<Range, Range2>, Anonymous> &upma2) const;
13683  inline typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> as_multi_union_pw_aff() const;
13684  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> as_pw_multi_aff() const;
13685  inline typed::union_map<pair<T1, T2>, pair<Range, Range2>> as_union_map() const;
13686  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> coalesce() const;
13687  inline typed::union_set<pair<T1, T2>> domain() const;
13688  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> drop_unused_params() const;
13689  static inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> empty(const isl::ctx &ctx);
13690  inline typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> extract_pw_multi_aff(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const;
13691  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::union_set<pair<T1, T2>> &context) const;
13692  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::basic_set<pair<T1, T2>> &context) const;
13693  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::point<pair<T1, T2>> &context) const;
13694  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> gist(const typed::set<pair<T1, T2>> &context) const;
13695  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::space<pair<T1, T2>> &space) const;
13696  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const;
13697  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::union_set<T1> &uset) const;
13698  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::basic_set<T1> &uset) const;
13699  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::point<T1> &uset) const;
13700  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_domain_wrapped_domain(const typed::set<T1> &uset) const;
13701  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::set<> &set) const;
13702  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::basic_set<> &set) const;
13703  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> intersect_params(const typed::point<> &set) const;
13704  template <typename Domain3>
13705  inline typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, T1> &upma2) const;
13706  template <typename Domain3>
13707  inline typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::multi_aff<Domain3, T1> &upma2) const;
13708  template <typename Domain3>
13709  inline typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, T1> &upma2) const;
13710  template <typename Domain3>
13711  inline typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> preimage_domain_wrapped_domain(const typed::union_pw_aff<Domain3, T1> &upma2) const;
13712  template <typename Domain2>
13713  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma2) const;
13714  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::union_pw_multi_aff<pair<T1, T2>> &upma2) const;
13715  template <typename Domain2>
13716  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::multi_aff<Domain2, pair<T1, T2>> &upma2) const;
13717  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::multi_aff<pair<T1, T2>> &upma2) const;
13718  template <typename Domain2>
13719  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &upma2) const;
13720  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::pw_multi_aff<pair<T1, T2>> &upma2) const;
13721  template <typename Domain2>
13722  inline typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> pullback(const typed::union_pw_aff<Domain2, pair<T1, T2>> &upma2) const;
13723  inline typed::union_pw_multi_aff<pair<Range, Range2>> pullback(const typed::union_pw_aff<pair<T1, T2>> &upma2) const;
13724  inline typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>> pw_multi_aff_list() const;
13725  inline typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>> get_pw_multi_aff_list() const = delete;
13726  inline typed::union_pw_multi_aff<pair<T1, T2>, Range> range_factor_domain() const;
13727  inline typed::union_pw_multi_aff<pair<T1, T2>, Range2> range_factor_range() const;
13728  template <typename Arg2>
13729  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::union_pw_multi_aff<pair<T1, T2>, Arg2> &upma2) const;
13730  template <typename Arg2>
13731  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::multi_aff<pair<T1, T2>, Arg2> &upma2) const;
13732  template <typename Arg2>
13733  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> range_product(const typed::pw_multi_aff<pair<T1, T2>, Arg2> &upma2) const;
13734  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Anonymous>> range_product(const typed::union_pw_aff<pair<T1, T2>, Anonymous> &upma2) const;
13735  inline typed::space<> space() const;
13736  inline typed::space<pair<T1, T2>, pair<Range, Range2>> get_space() const = delete;
13737  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13738  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13739  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13740  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> sub(const typed::union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13741  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::space<pair<T1, T2>> &space) const;
13742  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> subtract_domain(const typed::union_set<pair<T1, T2>> &uset) const;
13743  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13744  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13745  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13746  inline typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> union_add(const typed::union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const;
13747};
13748
13749template <>
13750struct union_set<> : public isl::union_set {
13751  template <typename...>
13752  friend struct aff;
13753  template <typename...>
13754  friend struct aff_list;
13755  template <typename...>
13756  friend struct basic_map;
13757  template <typename...>
13758  friend struct basic_set;
13759  template <typename...>
13760  friend struct fixed_box;
13761  template <typename...>
13762  friend struct id;
13763  template <typename...>
13764  friend struct id_list;
13765  template <typename...>
13766  friend struct map;
13767  template <typename...>
13768  friend struct map_list;
13769  template <typename...>
13770  friend struct multi_aff;
13771  template <typename...>
13772  friend struct multi_id;
13773  template <typename...>
13774  friend struct multi_pw_aff;
13775  template <typename...>
13776  friend struct multi_union_pw_aff;
13777  template <typename...>
13778  friend struct multi_val;
13779  template <typename...>
13780  friend struct point;
13781  template <typename...>
13782  friend struct pw_aff;
13783  template <typename...>
13784  friend struct pw_aff_list;
13785  template <typename...>
13786  friend struct pw_multi_aff;
13787  template <typename...>
13788  friend struct pw_multi_aff_list;
13789  template <typename...>
13790  friend struct set;
13791  template <typename...>
13792  friend struct set_list;
13793  template <typename...>
13794  friend struct space;
13795  template <typename...>
13796  friend struct union_map;
13797  template <typename...>
13798  friend struct union_pw_aff;
13799  template <typename...>
13800  friend struct union_pw_aff_list;
13801  template <typename...>
13802  friend struct union_pw_multi_aff;
13803  template <typename...>
13804  friend struct union_set;
13805  template <typename...>
13806  friend struct union_set_list;
13807  template <typename...>
13808  friend struct val;
13809  template <typename...>
13810  friend struct val_list;
13811
13812  union_set() = default;
13813 private:
13814  template <typename base,
13815            typename std::enable_if<
13816              std::is_same<base, isl::union_set>{}, bool>::type = true>
13817  union_set(const base &obj) : isl::union_set(obj) {}
13818 public:
13819  static union_set from(const isl::union_set &obj) {
13820    return union_set(obj);
13821  }
13822  inline /* implicit */ union_set(const typed::basic_set<> &bset);
13823  inline /* implicit */ union_set(const typed::point<> &pnt);
13824  inline /* implicit */ union_set(const typed::set<> &set);
13825  inline explicit union_set(const isl::ctx &ctx, const std::string &str);
13826  inline typed::union_set<> apply(const typed::union_map<> &umap) const = delete;
13827  inline typed::union_set<> apply(const typed::basic_map<> &umap) const = delete;
13828  inline typed::union_set<> apply(const typed::map<> &umap) const = delete;
13829  inline typed::set<> as_set() const = delete;
13830  inline typed::union_set<> coalesce() const;
13831  inline typed::union_set<> detect_equalities() const;
13832  inline typed::union_set<> drop_unused_params() const;
13833  static inline typed::union_set<> empty(const isl::ctx &ctx);
13834  inline bool every_set(const std::function<bool(typed::set<>)> &test) const;
13835  inline typed::set<> extract_set(const typed::space<> &space) const;
13836  inline void foreach_point(const std::function<void(typed::point<>)> &fn) const;
13837  inline void foreach_set(const std::function<void(typed::set<>)> &fn) const;
13838  inline typed::union_set<> gist(const typed::union_set<> &context) const;
13839  inline typed::union_set<> gist(const typed::basic_set<> &context) const;
13840  inline typed::union_set<> gist(const typed::point<> &context) const;
13841  inline typed::union_set<> gist(const typed::set<> &context) const;
13842  inline typed::union_set<> gist_params(const typed::set<> &set) const = delete;
13843  inline typed::union_set<> gist_params(const typed::basic_set<> &set) const = delete;
13844  inline typed::union_set<> gist_params(const typed::point<> &set) const = delete;
13845  inline typed::union_map<> identity() const = delete;
13846  inline typed::union_set<> intersect(const typed::union_set<> &uset2) const;
13847  inline typed::union_set<> intersect(const typed::basic_set<> &uset2) const;
13848  inline typed::union_set<> intersect(const typed::point<> &uset2) const;
13849  inline typed::union_set<> intersect(const typed::set<> &uset2) const;
13850  inline typed::union_set<> intersect_params(const typed::set<> &set) const = delete;
13851  inline typed::union_set<> intersect_params(const typed::basic_set<> &set) const = delete;
13852  inline typed::union_set<> intersect_params(const typed::point<> &set) const = delete;
13853  inline typed::union_set<> lexmax() const = delete;
13854  inline typed::union_set<> lexmin() const = delete;
13855  inline typed::set<> params() const = delete;
13856  inline typed::union_set<> preimage(const typed::multi_aff<> &ma) const = delete;
13857  inline typed::union_set<> preimage(const typed::pw_multi_aff<> &pma) const = delete;
13858  inline typed::union_set<> preimage(const typed::union_pw_multi_aff<> &upma) const = delete;
13859  inline typed::union_set<> project_out_all_params() const;
13860  inline typed::set_list<> set_list() const;
13861  inline typed::set_list<> get_set_list() const = delete;
13862  inline typed::space<> space() const;
13863  inline typed::space<> get_space() const = delete;
13864  inline typed::union_set<> subtract(const typed::union_set<> &uset2) const;
13865  inline typed::union_set<> subtract(const typed::basic_set<> &uset2) const;
13866  inline typed::union_set<> subtract(const typed::point<> &uset2) const;
13867  inline typed::union_set<> subtract(const typed::set<> &uset2) const;
13868  inline typed::union_set<> unite(const typed::union_set<> &uset2) const;
13869  inline typed::union_set<> unite(const typed::basic_set<> &uset2) const;
13870  inline typed::union_set<> unite(const typed::point<> &uset2) const;
13871  inline typed::union_set<> unite(const typed::set<> &uset2) const;
13872  inline typed::union_set<> universe() const;
13873  inline typed::union_map<> unwrap() const = delete;
13874};
13875
13876template <typename Domain>
13877struct union_set<Domain> : public isl::union_set {
13878  template <typename...>
13879  friend struct aff;
13880  template <typename...>
13881  friend struct aff_list;
13882  template <typename...>
13883  friend struct basic_map;
13884  template <typename...>
13885  friend struct basic_set;
13886  template <typename...>
13887  friend struct fixed_box;
13888  template <typename...>
13889  friend struct id;
13890  template <typename...>
13891  friend struct id_list;
13892  template <typename...>
13893  friend struct map;
13894  template <typename...>
13895  friend struct map_list;
13896  template <typename...>
13897  friend struct multi_aff;
13898  template <typename...>
13899  friend struct multi_id;
13900  template <typename...>
13901  friend struct multi_pw_aff;
13902  template <typename...>
13903  friend struct multi_union_pw_aff;
13904  template <typename...>
13905  friend struct multi_val;
13906  template <typename...>
13907  friend struct point;
13908  template <typename...>
13909  friend struct pw_aff;
13910  template <typename...>
13911  friend struct pw_aff_list;
13912  template <typename...>
13913  friend struct pw_multi_aff;
13914  template <typename...>
13915  friend struct pw_multi_aff_list;
13916  template <typename...>
13917  friend struct set;
13918  template <typename...>
13919  friend struct set_list;
13920  template <typename...>
13921  friend struct space;
13922  template <typename...>
13923  friend struct union_map;
13924  template <typename...>
13925  friend struct union_pw_aff;
13926  template <typename...>
13927  friend struct union_pw_aff_list;
13928  template <typename...>
13929  friend struct union_pw_multi_aff;
13930  template <typename...>
13931  friend struct union_set;
13932  template <typename...>
13933  friend struct union_set_list;
13934  template <typename...>
13935  friend struct val;
13936  template <typename...>
13937  friend struct val_list;
13938
13939  union_set() = default;
13940  template <typename Arg1,
13941            typename std::enable_if<
13942              std::is_base_of<Domain, Arg1>{},
13943            bool>::type = true>
13944  union_set(const union_set<Arg1> &obj) : isl::union_set(obj) {}
13945 private:
13946  template <typename base,
13947            typename std::enable_if<
13948              std::is_same<base, isl::union_set>{}, bool>::type = true>
13949  union_set(const base &obj) : isl::union_set(obj) {}
13950 public:
13951  static union_set from(const isl::union_set &obj) {
13952    return union_set(obj);
13953  }
13954  inline /* implicit */ union_set(const typed::basic_set<Domain> &bset);
13955  inline /* implicit */ union_set(const typed::point<Domain> &pnt);
13956  inline /* implicit */ union_set(const typed::set<Domain> &set);
13957  inline explicit union_set(const isl::ctx &ctx, const std::string &str);
13958  template <typename Range>
13959  inline typed::union_set<Range> apply(const typed::union_map<Domain, Range> &umap) const;
13960  template <typename Range>
13961  inline typed::union_set<Range> apply(const typed::basic_map<Domain, Range> &umap) const;
13962  template <typename Range>
13963  inline typed::union_set<Range> apply(const typed::map<Domain, Range> &umap) const;
13964  inline typed::set<Domain> as_set() const;
13965  inline typed::union_set<Domain> coalesce() const;
13966  inline typed::union_set<Domain> detect_equalities() const;
13967  inline typed::union_set<Domain> drop_unused_params() const;
13968  static inline typed::union_set<Domain> empty(const isl::ctx &ctx);
13969  inline bool every_set(const std::function<bool(typed::set<Domain>)> &test) const;
13970  inline typed::set<Domain> extract_set(const typed::space<Domain> &space) const;
13971  inline void foreach_point(const std::function<void(typed::point<Domain>)> &fn) const;
13972  inline void foreach_set(const std::function<void(typed::set<Domain>)> &fn) const;
13973  inline typed::union_set<Domain> gist(const typed::union_set<Domain> &context) const;
13974  inline typed::union_set<Domain> gist(const typed::basic_set<Domain> &context) const;
13975  inline typed::union_set<Domain> gist(const typed::point<Domain> &context) const;
13976  inline typed::union_set<Domain> gist(const typed::set<Domain> &context) const;
13977  inline typed::union_set<Domain> gist_params(const typed::set<> &set) const;
13978  inline typed::union_set<Domain> gist_params(const typed::basic_set<> &set) const;
13979  inline typed::union_set<Domain> gist_params(const typed::point<> &set) const;
13980  inline typed::union_map<Domain, Domain> identity() const;
13981  inline typed::union_set<Domain> intersect(const typed::union_set<Domain> &uset2) const;
13982  inline typed::union_set<Domain> intersect(const typed::basic_set<Domain> &uset2) const;
13983  inline typed::union_set<Domain> intersect(const typed::point<Domain> &uset2) const;
13984  inline typed::union_set<Domain> intersect(const typed::set<Domain> &uset2) const;
13985  inline typed::union_set<Domain> intersect_params(const typed::set<> &set) const;
13986  inline typed::union_set<Domain> intersect_params(const typed::basic_set<> &set) const;
13987  inline typed::union_set<Domain> intersect_params(const typed::point<> &set) const;
13988  inline typed::union_set<Domain> lexmax() const;
13989  inline typed::union_set<Domain> lexmin() const;
13990  inline typed::set<> params() const;
13991  template <typename Domain2>
13992  inline typed::union_set<Domain2> preimage(const typed::multi_aff<Domain2, Domain> &ma) const;
13993  template <typename Domain2>
13994  inline typed::union_set<Domain2> preimage(const typed::pw_multi_aff<Domain2, Domain> &pma) const;
13995  template <typename Domain2>
13996  inline typed::union_set<Domain2> preimage(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const;
13997  inline typed::union_set<Domain> project_out_all_params() const;
13998  inline typed::set_list<Domain> set_list() const;
13999  inline typed::set_list<Domain> get_set_list() const = delete;
14000  inline typed::space<> space() const;
14001  inline typed::space<Domain> get_space() const = delete;
14002  inline typed::union_set<Domain> subtract(const typed::union_set<Domain> &uset2) const;
14003  inline typed::union_set<Domain> subtract(const typed::basic_set<Domain> &uset2) const;
14004  inline typed::union_set<Domain> subtract(const typed::point<Domain> &uset2) const;
14005  inline typed::union_set<Domain> subtract(const typed::set<Domain> &uset2) const;
14006  inline typed::union_set<Domain> unite(const typed::union_set<Domain> &uset2) const;
14007  inline typed::union_set<Domain> unite(const typed::basic_set<Domain> &uset2) const;
14008  inline typed::union_set<Domain> unite(const typed::point<Domain> &uset2) const;
14009  inline typed::union_set<Domain> unite(const typed::set<Domain> &uset2) const;
14010  inline typed::union_set<Domain> universe() const;
14011  inline typed::union_map<Domain> unwrap() const = delete;
14012};
14013
14014template <typename Domain, typename Range>
14015struct union_set<pair<Domain, Range>> : public isl::union_set {
14016  template <typename...>
14017  friend struct aff;
14018  template <typename...>
14019  friend struct aff_list;
14020  template <typename...>
14021  friend struct basic_map;
14022  template <typename...>
14023  friend struct basic_set;
14024  template <typename...>
14025  friend struct fixed_box;
14026  template <typename...>
14027  friend struct id;
14028  template <typename...>
14029  friend struct id_list;
14030  template <typename...>
14031  friend struct map;
14032  template <typename...>
14033  friend struct map_list;
14034  template <typename...>
14035  friend struct multi_aff;
14036  template <typename...>
14037  friend struct multi_id;
14038  template <typename...>
14039  friend struct multi_pw_aff;
14040  template <typename...>
14041  friend struct multi_union_pw_aff;
14042  template <typename...>
14043  friend struct multi_val;
14044  template <typename...>
14045  friend struct point;
14046  template <typename...>
14047  friend struct pw_aff;
14048  template <typename...>
14049  friend struct pw_aff_list;
14050  template <typename...>
14051  friend struct pw_multi_aff;
14052  template <typename...>
14053  friend struct pw_multi_aff_list;
14054  template <typename...>
14055  friend struct set;
14056  template <typename...>
14057  friend struct set_list;
14058  template <typename...>
14059  friend struct space;
14060  template <typename...>
14061  friend struct union_map;
14062  template <typename...>
14063  friend struct union_pw_aff;
14064  template <typename...>
14065  friend struct union_pw_aff_list;
14066  template <typename...>
14067  friend struct union_pw_multi_aff;
14068  template <typename...>
14069  friend struct union_set;
14070  template <typename...>
14071  friend struct union_set_list;
14072  template <typename...>
14073  friend struct val;
14074  template <typename...>
14075  friend struct val_list;
14076
14077  union_set() = default;
14078  template <typename Arg1, typename Arg2,
14079            typename std::enable_if<
14080              std::is_base_of<Domain, Arg1>{} &&
14081              std::is_base_of<Range, Arg2>{},
14082            bool>::type = true>
14083  union_set(const union_set<pair<Arg1, Arg2>> &obj) : isl::union_set(obj) {}
14084 private:
14085  template <typename base,
14086            typename std::enable_if<
14087              std::is_same<base, isl::union_set>{}, bool>::type = true>
14088  union_set(const base &obj) : isl::union_set(obj) {}
14089 public:
14090  static union_set from(const isl::union_set &obj) {
14091    return union_set(obj);
14092  }
14093  inline /* implicit */ union_set(const typed::basic_set<pair<Domain, Range>> &bset);
14094  inline /* implicit */ union_set(const typed::point<pair<Domain, Range>> &pnt);
14095  inline /* implicit */ union_set(const typed::set<pair<Domain, Range>> &set);
14096  inline explicit union_set(const isl::ctx &ctx, const std::string &str);
14097  template <typename Arg2>
14098  inline typed::union_set<Arg2> apply(const typed::union_map<pair<Domain, Range>, Arg2> &umap) const;
14099  template <typename Arg2>
14100  inline typed::union_set<Arg2> apply(const typed::basic_map<pair<Domain, Range>, Arg2> &umap) const;
14101  template <typename Arg2>
14102  inline typed::union_set<Arg2> apply(const typed::map<pair<Domain, Range>, Arg2> &umap) const;
14103  inline typed::set<pair<Domain, Range>> as_set() const;
14104  inline typed::union_set<pair<Domain, Range>> coalesce() const;
14105  inline typed::union_set<pair<Domain, Range>> detect_equalities() const;
14106  inline typed::union_set<pair<Domain, Range>> drop_unused_params() const;
14107  static inline typed::union_set<pair<Domain, Range>> empty(const isl::ctx &ctx);
14108  inline bool every_set(const std::function<bool(typed::set<pair<Domain, Range>>)> &test) const;
14109  inline typed::set<pair<Domain, Range>> extract_set(const typed::space<pair<Domain, Range>> &space) const;
14110  inline void foreach_point(const std::function<void(typed::point<pair<Domain, Range>>)> &fn) const;
14111  inline void foreach_set(const std::function<void(typed::set<pair<Domain, Range>>)> &fn) const;
14112  inline typed::union_set<pair<Domain, Range>> gist(const typed::union_set<pair<Domain, Range>> &context) const;
14113  inline typed::union_set<pair<Domain, Range>> gist(const typed::basic_set<pair<Domain, Range>> &context) const;
14114  inline typed::union_set<pair<Domain, Range>> gist(const typed::point<pair<Domain, Range>> &context) const;
14115  inline typed::union_set<pair<Domain, Range>> gist(const typed::set<pair<Domain, Range>> &context) const;
14116  inline typed::union_set<pair<Domain, Range>> gist_params(const typed::set<> &set) const;
14117  inline typed::union_set<pair<Domain, Range>> gist_params(const typed::basic_set<> &set) const;
14118  inline typed::union_set<pair<Domain, Range>> gist_params(const typed::point<> &set) const;
14119  inline typed::union_map<pair<Domain, Range>, pair<Domain, Range>> identity() const;
14120  inline typed::union_set<pair<Domain, Range>> intersect(const typed::union_set<pair<Domain, Range>> &uset2) const;
14121  inline typed::union_set<pair<Domain, Range>> intersect(const typed::basic_set<pair<Domain, Range>> &uset2) const;
14122  inline typed::union_set<pair<Domain, Range>> intersect(const typed::point<pair<Domain, Range>> &uset2) const;
14123  inline typed::union_set<pair<Domain, Range>> intersect(const typed::set<pair<Domain, Range>> &uset2) const;
14124  inline typed::union_set<pair<Domain, Range>> intersect_params(const typed::set<> &set) const;
14125  inline typed::union_set<pair<Domain, Range>> intersect_params(const typed::basic_set<> &set) const;
14126  inline typed::union_set<pair<Domain, Range>> intersect_params(const typed::point<> &set) const;
14127  inline typed::union_set<pair<Domain, Range>> lexmax() const;
14128  inline typed::union_set<pair<Domain, Range>> lexmin() const;
14129  inline typed::set<> params() const;
14130  template <typename Domain2>
14131  inline typed::union_set<Domain2> preimage(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const;
14132  template <typename Domain2>
14133  inline typed::union_set<Domain2> preimage(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const;
14134  template <typename Domain2>
14135  inline typed::union_set<Domain2> preimage(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const;
14136  inline typed::union_set<pair<Domain, Range>> project_out_all_params() const;
14137  inline typed::set_list<pair<Domain, Range>> set_list() const;
14138  inline typed::set_list<pair<Domain, Range>> get_set_list() const = delete;
14139  inline typed::space<> space() const;
14140  inline typed::space<pair<Domain, Range>> get_space() const = delete;
14141  inline typed::union_set<pair<Domain, Range>> subtract(const typed::union_set<pair<Domain, Range>> &uset2) const;
14142  inline typed::union_set<pair<Domain, Range>> subtract(const typed::basic_set<pair<Domain, Range>> &uset2) const;
14143  inline typed::union_set<pair<Domain, Range>> subtract(const typed::point<pair<Domain, Range>> &uset2) const;
14144  inline typed::union_set<pair<Domain, Range>> subtract(const typed::set<pair<Domain, Range>> &uset2) const;
14145  inline typed::union_set<pair<Domain, Range>> unite(const typed::union_set<pair<Domain, Range>> &uset2) const;
14146  inline typed::union_set<pair<Domain, Range>> unite(const typed::basic_set<pair<Domain, Range>> &uset2) const;
14147  inline typed::union_set<pair<Domain, Range>> unite(const typed::point<pair<Domain, Range>> &uset2) const;
14148  inline typed::union_set<pair<Domain, Range>> unite(const typed::set<pair<Domain, Range>> &uset2) const;
14149  inline typed::union_set<pair<Domain, Range>> universe() const;
14150  inline typed::union_map<Domain, Range> unwrap() const;
14151};
14152
14153template <>
14154struct union_set_list<> : public isl::union_set_list {
14155  template <typename...>
14156  friend struct aff;
14157  template <typename...>
14158  friend struct aff_list;
14159  template <typename...>
14160  friend struct basic_map;
14161  template <typename...>
14162  friend struct basic_set;
14163  template <typename...>
14164  friend struct fixed_box;
14165  template <typename...>
14166  friend struct id;
14167  template <typename...>
14168  friend struct id_list;
14169  template <typename...>
14170  friend struct map;
14171  template <typename...>
14172  friend struct map_list;
14173  template <typename...>
14174  friend struct multi_aff;
14175  template <typename...>
14176  friend struct multi_id;
14177  template <typename...>
14178  friend struct multi_pw_aff;
14179  template <typename...>
14180  friend struct multi_union_pw_aff;
14181  template <typename...>
14182  friend struct multi_val;
14183  template <typename...>
14184  friend struct point;
14185  template <typename...>
14186  friend struct pw_aff;
14187  template <typename...>
14188  friend struct pw_aff_list;
14189  template <typename...>
14190  friend struct pw_multi_aff;
14191  template <typename...>
14192  friend struct pw_multi_aff_list;
14193  template <typename...>
14194  friend struct set;
14195  template <typename...>
14196  friend struct set_list;
14197  template <typename...>
14198  friend struct space;
14199  template <typename...>
14200  friend struct union_map;
14201  template <typename...>
14202  friend struct union_pw_aff;
14203  template <typename...>
14204  friend struct union_pw_aff_list;
14205  template <typename...>
14206  friend struct union_pw_multi_aff;
14207  template <typename...>
14208  friend struct union_set;
14209  template <typename...>
14210  friend struct union_set_list;
14211  template <typename...>
14212  friend struct val;
14213  template <typename...>
14214  friend struct val_list;
14215
14216  union_set_list() = default;
14217 private:
14218  template <typename base,
14219            typename std::enable_if<
14220              std::is_same<base, isl::union_set_list>{}, bool>::type = true>
14221  union_set_list(const base &obj) : isl::union_set_list(obj) {}
14222 public:
14223  static union_set_list from(const isl::union_set_list &obj) {
14224    return union_set_list(obj);
14225  }
14226  inline explicit union_set_list(const isl::ctx &ctx, int n);
14227  inline explicit union_set_list(const typed::union_set<> &el);
14228  inline explicit union_set_list(const isl::ctx &ctx, const std::string &str);
14229  inline typed::union_set_list<> add(const typed::union_set<> &el) const;
14230  inline typed::union_set_list<> add(const typed::basic_set<> &el) const;
14231  inline typed::union_set_list<> add(const typed::point<> &el) const;
14232  inline typed::union_set_list<> add(const typed::set<> &el) const;
14233  inline typed::union_set<> at(int index) const = delete;
14234  inline typed::union_set<> get_at(int index) const = delete;
14235  inline typed::union_set_list<> drop(unsigned int first, unsigned int n) const;
14236  inline void foreach(const std::function<void(typed::union_set<>)> &fn) const;
14237  inline void foreach_scc(const std::function<bool(typed::union_set<>, typed::union_set<>)> &follows, const std::function<void(typed::union_set_list<>)> &fn) const;
14238  inline typed::union_set_list<> set_at(int index, const typed::union_set<> &el) const = delete;
14239};
14240
14241template <typename Domain>
14242struct union_set_list<Domain> : public isl::union_set_list {
14243  template <typename...>
14244  friend struct aff;
14245  template <typename...>
14246  friend struct aff_list;
14247  template <typename...>
14248  friend struct basic_map;
14249  template <typename...>
14250  friend struct basic_set;
14251  template <typename...>
14252  friend struct fixed_box;
14253  template <typename...>
14254  friend struct id;
14255  template <typename...>
14256  friend struct id_list;
14257  template <typename...>
14258  friend struct map;
14259  template <typename...>
14260  friend struct map_list;
14261  template <typename...>
14262  friend struct multi_aff;
14263  template <typename...>
14264  friend struct multi_id;
14265  template <typename...>
14266  friend struct multi_pw_aff;
14267  template <typename...>
14268  friend struct multi_union_pw_aff;
14269  template <typename...>
14270  friend struct multi_val;
14271  template <typename...>
14272  friend struct point;
14273  template <typename...>
14274  friend struct pw_aff;
14275  template <typename...>
14276  friend struct pw_aff_list;
14277  template <typename...>
14278  friend struct pw_multi_aff;
14279  template <typename...>
14280  friend struct pw_multi_aff_list;
14281  template <typename...>
14282  friend struct set;
14283  template <typename...>
14284  friend struct set_list;
14285  template <typename...>
14286  friend struct space;
14287  template <typename...>
14288  friend struct union_map;
14289  template <typename...>
14290  friend struct union_pw_aff;
14291  template <typename...>
14292  friend struct union_pw_aff_list;
14293  template <typename...>
14294  friend struct union_pw_multi_aff;
14295  template <typename...>
14296  friend struct union_set;
14297  template <typename...>
14298  friend struct union_set_list;
14299  template <typename...>
14300  friend struct val;
14301  template <typename...>
14302  friend struct val_list;
14303
14304  union_set_list() = default;
14305  template <typename Arg1,
14306            typename std::enable_if<
14307              std::is_base_of<Domain, Arg1>{},
14308            bool>::type = true>
14309  union_set_list(const union_set_list<Arg1> &obj) : isl::union_set_list(obj) {}
14310 private:
14311  template <typename base,
14312            typename std::enable_if<
14313              std::is_same<base, isl::union_set_list>{}, bool>::type = true>
14314  union_set_list(const base &obj) : isl::union_set_list(obj) {}
14315 public:
14316  static union_set_list from(const isl::union_set_list &obj) {
14317    return union_set_list(obj);
14318  }
14319  inline explicit union_set_list(const isl::ctx &ctx, int n);
14320  inline explicit union_set_list(const typed::union_set<Domain> &el);
14321  inline explicit union_set_list(const isl::ctx &ctx, const std::string &str);
14322  inline typed::union_set_list<Domain> add(const typed::union_set<Domain> &el) const;
14323  inline typed::union_set_list<Domain> add(const typed::basic_set<Domain> &el) const;
14324  inline typed::union_set_list<Domain> add(const typed::point<Domain> &el) const;
14325  inline typed::union_set_list<Domain> add(const typed::set<Domain> &el) const;
14326  inline typed::union_set<Domain> at(int index) const;
14327  inline typed::union_set<Domain> get_at(int index) const = delete;
14328  inline typed::union_set_list<Domain> drop(unsigned int first, unsigned int n) const;
14329  inline void foreach(const std::function<void(typed::union_set<Domain>)> &fn) const;
14330  inline void foreach_scc(const std::function<bool(typed::union_set<Domain>, typed::union_set<Domain>)> &follows, const std::function<void(typed::union_set_list<Domain>)> &fn) const;
14331  inline typed::union_set_list<Domain> set_at(int index, const typed::union_set<Anonymous> &el) const;
14332};
14333
14334template <>
14335struct val<Anonymous> : public isl::val {
14336  template <typename...>
14337  friend struct aff;
14338  template <typename...>
14339  friend struct aff_list;
14340  template <typename...>
14341  friend struct basic_map;
14342  template <typename...>
14343  friend struct basic_set;
14344  template <typename...>
14345  friend struct fixed_box;
14346  template <typename...>
14347  friend struct id;
14348  template <typename...>
14349  friend struct id_list;
14350  template <typename...>
14351  friend struct map;
14352  template <typename...>
14353  friend struct map_list;
14354  template <typename...>
14355  friend struct multi_aff;
14356  template <typename...>
14357  friend struct multi_id;
14358  template <typename...>
14359  friend struct multi_pw_aff;
14360  template <typename...>
14361  friend struct multi_union_pw_aff;
14362  template <typename...>
14363  friend struct multi_val;
14364  template <typename...>
14365  friend struct point;
14366  template <typename...>
14367  friend struct pw_aff;
14368  template <typename...>
14369  friend struct pw_aff_list;
14370  template <typename...>
14371  friend struct pw_multi_aff;
14372  template <typename...>
14373  friend struct pw_multi_aff_list;
14374  template <typename...>
14375  friend struct set;
14376  template <typename...>
14377  friend struct set_list;
14378  template <typename...>
14379  friend struct space;
14380  template <typename...>
14381  friend struct union_map;
14382  template <typename...>
14383  friend struct union_pw_aff;
14384  template <typename...>
14385  friend struct union_pw_aff_list;
14386  template <typename...>
14387  friend struct union_pw_multi_aff;
14388  template <typename...>
14389  friend struct union_set;
14390  template <typename...>
14391  friend struct union_set_list;
14392  template <typename...>
14393  friend struct val;
14394  template <typename...>
14395  friend struct val_list;
14396
14397  val() = default;
14398  val(const isl::val &obj) : isl::val(obj) {}
14399  static val from(const isl::val &obj) {
14400    return val(obj);
14401  }
14402  inline explicit val(const isl::ctx &ctx, long i);
14403  inline explicit val(const isl::ctx &ctx, const std::string &str);
14404  inline typed::val<Anonymous> add(const typed::val<Anonymous> &v2) const;
14405  inline typed::val<Anonymous> add(long v2) const;
14406  inline typed::val<Anonymous> ceil() const;
14407  inline long get_den_si() const = delete;
14408  inline typed::val<Anonymous> floor() const;
14409  inline typed::val<Anonymous> max(const typed::val<Anonymous> &v2) const;
14410  inline typed::val<Anonymous> max(long v2) const;
14411  inline typed::val<Anonymous> min(const typed::val<Anonymous> &v2) const;
14412  inline typed::val<Anonymous> min(long v2) const;
14413  inline typed::val<Anonymous> mod(const typed::val<Anonymous> &v2) const;
14414  inline typed::val<Anonymous> mod(long v2) const;
14415  inline typed::val<Anonymous> neg() const;
14416  inline long get_num_si() const = delete;
14417  inline typed::val<Anonymous> sub(const typed::val<Anonymous> &v2) const;
14418  inline typed::val<Anonymous> sub(long v2) const;
14419};
14420
14421template <>
14422struct val_list<Anonymous> : public isl::val_list {
14423  template <typename...>
14424  friend struct aff;
14425  template <typename...>
14426  friend struct aff_list;
14427  template <typename...>
14428  friend struct basic_map;
14429  template <typename...>
14430  friend struct basic_set;
14431  template <typename...>
14432  friend struct fixed_box;
14433  template <typename...>
14434  friend struct id;
14435  template <typename...>
14436  friend struct id_list;
14437  template <typename...>
14438  friend struct map;
14439  template <typename...>
14440  friend struct map_list;
14441  template <typename...>
14442  friend struct multi_aff;
14443  template <typename...>
14444  friend struct multi_id;
14445  template <typename...>
14446  friend struct multi_pw_aff;
14447  template <typename...>
14448  friend struct multi_union_pw_aff;
14449  template <typename...>
14450  friend struct multi_val;
14451  template <typename...>
14452  friend struct point;
14453  template <typename...>
14454  friend struct pw_aff;
14455  template <typename...>
14456  friend struct pw_aff_list;
14457  template <typename...>
14458  friend struct pw_multi_aff;
14459  template <typename...>
14460  friend struct pw_multi_aff_list;
14461  template <typename...>
14462  friend struct set;
14463  template <typename...>
14464  friend struct set_list;
14465  template <typename...>
14466  friend struct space;
14467  template <typename...>
14468  friend struct union_map;
14469  template <typename...>
14470  friend struct union_pw_aff;
14471  template <typename...>
14472  friend struct union_pw_aff_list;
14473  template <typename...>
14474  friend struct union_pw_multi_aff;
14475  template <typename...>
14476  friend struct union_set;
14477  template <typename...>
14478  friend struct union_set_list;
14479  template <typename...>
14480  friend struct val;
14481  template <typename...>
14482  friend struct val_list;
14483
14484  val_list() = default;
14485  val_list(const isl::val_list &obj) : isl::val_list(obj) {}
14486  static val_list from(const isl::val_list &obj) {
14487    return val_list(obj);
14488  }
14489  inline explicit val_list(const isl::ctx &ctx, int n);
14490  inline explicit val_list(const typed::val<Anonymous> &el);
14491  inline explicit val_list(const isl::ctx &ctx, const std::string &str);
14492  inline typed::val_list<Anonymous> add(const typed::val<Anonymous> &el) const;
14493  inline typed::val_list<Anonymous> add(long el) const;
14494  inline typed::val<Anonymous> at(int index) const;
14495  inline typed::val<Anonymous> get_at(int index) const = delete;
14496  inline typed::val_list<Anonymous> drop(unsigned int first, unsigned int n) const;
14497  inline void foreach(const std::function<void(typed::val<Anonymous>)> &fn) const;
14498  inline void foreach_scc(const std::function<bool(typed::val<Anonymous>, typed::val<Anonymous>)> &follows, const std::function<void(typed::val_list<Anonymous>)> &fn) const;
14499  inline typed::val_list<Anonymous> set_at(int index, const typed::val<Anonymous> &el) const;
14500  inline typed::val_list<Anonymous> set_at(int index, long el) const;
14501};
14502
14503typed::aff<Anonymous>::aff(const isl::ctx &ctx, const std::string &str)
14504  : isl::aff(ctx, str)
14505{
14506}
14507
14508typed::aff<Anonymous> typed::aff<Anonymous>::add(const typed::aff<Anonymous> &aff2) const
14509{
14510  auto res = isl::aff::add(aff2);
14511  return typed::aff<Anonymous>(res);
14512}
14513
14514typed::multi_aff<Anonymous> typed::aff<Anonymous>::add(const typed::multi_aff<Anonymous> &multi2) const
14515{
14516  auto res = isl::aff::add(multi2);
14517  return typed::multi_aff<Anonymous>(res);
14518}
14519
14520typed::multi_pw_aff<Anonymous> typed::aff<Anonymous>::add(const typed::multi_pw_aff<Anonymous> &multi2) const
14521{
14522  auto res = isl::aff::add(multi2);
14523  return typed::multi_pw_aff<Anonymous>(res);
14524}
14525
14526typed::multi_union_pw_aff<Anonymous> typed::aff<Anonymous>::add(const typed::multi_union_pw_aff<Anonymous> &multi2) const
14527{
14528  auto res = isl::aff::add(multi2);
14529  return typed::multi_union_pw_aff<Anonymous>(res);
14530}
14531
14532typed::pw_aff<Anonymous> typed::aff<Anonymous>::add(const typed::pw_aff<Anonymous> &pwaff2) const
14533{
14534  auto res = isl::aff::add(pwaff2);
14535  return typed::pw_aff<Anonymous>(res);
14536}
14537
14538typed::pw_multi_aff<Anonymous> typed::aff<Anonymous>::add(const typed::pw_multi_aff<Anonymous> &pma2) const
14539{
14540  auto res = isl::aff::add(pma2);
14541  return typed::pw_multi_aff<Anonymous>(res);
14542}
14543
14544typed::union_pw_aff<Anonymous> typed::aff<Anonymous>::add(const typed::union_pw_aff<Anonymous> &upa2) const
14545{
14546  auto res = isl::aff::add(upa2);
14547  return typed::union_pw_aff<Anonymous>(res);
14548}
14549
14550typed::union_pw_multi_aff<Anonymous> typed::aff<Anonymous>::add(const typed::union_pw_multi_aff<Anonymous> &upma2) const
14551{
14552  auto res = isl::aff::add(upma2);
14553  return typed::union_pw_multi_aff<Anonymous>(res);
14554}
14555
14556typed::aff<Anonymous> typed::aff<Anonymous>::add_constant(const typed::val<Anonymous> &v) const
14557{
14558  auto res = isl::aff::add_constant(v);
14559  return typed::aff<Anonymous>(res);
14560}
14561
14562typed::aff<Anonymous> typed::aff<Anonymous>::add_constant(long v) const
14563{
14564  auto res = isl::aff::add_constant(v);
14565  return typed::aff<Anonymous>(res);
14566}
14567
14568typed::multi_aff<Anonymous> typed::aff<Anonymous>::add_constant(const typed::multi_val<Anonymous> &mv) const
14569{
14570  auto res = isl::aff::add_constant(mv);
14571  return typed::multi_aff<Anonymous>(res);
14572}
14573
14574template <typename Range>
14575typed::union_pw_multi_aff<Range> typed::aff<Anonymous>::apply(const typed::union_pw_multi_aff<Anonymous, Range> &upma2) const
14576{
14577  auto res = isl::aff::apply(upma2);
14578  return typed::union_pw_multi_aff<Range>(res);
14579}
14580
14581typed::aff<Anonymous> typed::aff<Anonymous>::as_aff() const
14582{
14583  auto res = isl::aff::as_aff();
14584  return typed::aff<Anonymous>(res);
14585}
14586
14587typed::multi_aff<Anonymous> typed::aff<Anonymous>::as_multi_aff() const
14588{
14589  auto res = isl::aff::as_multi_aff();
14590  return typed::multi_aff<Anonymous>(res);
14591}
14592
14593typed::multi_union_pw_aff<Anonymous> typed::aff<Anonymous>::as_multi_union_pw_aff() const
14594{
14595  auto res = isl::aff::as_multi_union_pw_aff();
14596  return typed::multi_union_pw_aff<Anonymous>(res);
14597}
14598
14599typed::pw_multi_aff<Anonymous> typed::aff<Anonymous>::as_pw_multi_aff() const
14600{
14601  auto res = isl::aff::as_pw_multi_aff();
14602  return typed::pw_multi_aff<Anonymous>(res);
14603}
14604
14605typed::set<Anonymous> typed::aff<Anonymous>::as_set() const
14606{
14607  auto res = isl::aff::as_set();
14608  return typed::set<Anonymous>(res);
14609}
14610
14611typed::aff<Anonymous> typed::aff<Anonymous>::at(int pos) const
14612{
14613  auto res = isl::aff::at(pos);
14614  return typed::aff<Anonymous>(res);
14615}
14616
14617typed::basic_set<> typed::aff<Anonymous>::bind(const typed::id<Anonymous> &id) const
14618{
14619  auto res = isl::aff::bind(id);
14620  return typed::basic_set<>(res);
14621}
14622
14623typed::basic_set<> typed::aff<Anonymous>::bind(const std::string &id) const
14624{
14625  auto res = isl::aff::bind(id);
14626  return typed::basic_set<>(res);
14627}
14628
14629typed::basic_set<> typed::aff<Anonymous>::bind(const typed::multi_id<Anonymous> &tuple) const
14630{
14631  auto res = isl::aff::bind(tuple);
14632  return typed::basic_set<>(res);
14633}
14634
14635typed::aff<Anonymous> typed::aff<Anonymous>::ceil() const
14636{
14637  auto res = isl::aff::ceil();
14638  return typed::aff<Anonymous>(res);
14639}
14640
14641typed::pw_aff<Anonymous> typed::aff<Anonymous>::coalesce() const
14642{
14643  auto res = isl::aff::coalesce();
14644  return typed::pw_aff<Anonymous>(res);
14645}
14646
14647typed::pw_aff<Anonymous> typed::aff<Anonymous>::cond(const typed::pw_aff<Anonymous> &pwaff_true, const typed::pw_aff<Anonymous> &pwaff_false) const
14648{
14649  auto res = isl::aff::cond(pwaff_true, pwaff_false);
14650  return typed::pw_aff<Anonymous>(res);
14651}
14652
14653typed::multi_val<Anonymous> typed::aff<Anonymous>::constant_multi_val() const
14654{
14655  auto res = isl::aff::constant_multi_val();
14656  return typed::multi_val<Anonymous>(res);
14657}
14658
14659typed::val<Anonymous> typed::aff<Anonymous>::constant_val() const
14660{
14661  auto res = isl::aff::constant_val();
14662  return typed::val<Anonymous>(res);
14663}
14664
14665typed::set<> typed::aff<Anonymous>::domain() const
14666{
14667  auto res = isl::aff::domain();
14668  return typed::set<>(res);
14669}
14670
14671typed::pw_aff<Anonymous> typed::aff<Anonymous>::drop_unused_params() const
14672{
14673  auto res = isl::aff::drop_unused_params();
14674  return typed::pw_aff<Anonymous>(res);
14675}
14676
14677typed::pw_multi_aff<Anonymous> typed::aff<Anonymous>::extract_pw_multi_aff(const typed::space<Anonymous> &space) const
14678{
14679  auto res = isl::aff::extract_pw_multi_aff(space);
14680  return typed::pw_multi_aff<Anonymous>(res);
14681}
14682
14683typed::aff<Anonymous> typed::aff<Anonymous>::floor() const
14684{
14685  auto res = isl::aff::floor();
14686  return typed::aff<Anonymous>(res);
14687}
14688
14689typed::aff<Anonymous> typed::aff<Anonymous>::gist(const typed::set<> &context) const
14690{
14691  auto res = isl::aff::gist(context);
14692  return typed::aff<Anonymous>(res);
14693}
14694
14695typed::union_pw_aff<Anonymous> typed::aff<Anonymous>::gist(const typed::union_set<> &context) const
14696{
14697  auto res = isl::aff::gist(context);
14698  return typed::union_pw_aff<Anonymous>(res);
14699}
14700
14701typed::aff<Anonymous> typed::aff<Anonymous>::gist(const typed::basic_set<> &context) const
14702{
14703  auto res = isl::aff::gist(context);
14704  return typed::aff<Anonymous>(res);
14705}
14706
14707typed::aff<Anonymous> typed::aff<Anonymous>::gist(const typed::point<> &context) const
14708{
14709  auto res = isl::aff::gist(context);
14710  return typed::aff<Anonymous>(res);
14711}
14712
14713typed::aff<Anonymous> typed::aff<Anonymous>::gist_params(const typed::set<> &context) const
14714{
14715  auto res = isl::aff::gist_params(context);
14716  return typed::aff<Anonymous>(res);
14717}
14718
14719typed::aff<Anonymous> typed::aff<Anonymous>::gist_params(const typed::basic_set<> &context) const
14720{
14721  auto res = isl::aff::gist_params(context);
14722  return typed::aff<Anonymous>(res);
14723}
14724
14725typed::aff<Anonymous> typed::aff<Anonymous>::gist_params(const typed::point<> &context) const
14726{
14727  auto res = isl::aff::gist_params(context);
14728  return typed::aff<Anonymous>(res);
14729}
14730
14731typed::multi_aff<Anonymous, Anonymous> typed::aff<Anonymous>::identity() const
14732{
14733  auto res = isl::aff::identity();
14734  return typed::multi_aff<Anonymous, Anonymous>(res);
14735}
14736
14737template <typename Domain>
14738typed::pw_aff<Domain, Anonymous> typed::aff<Anonymous>::insert_domain(const typed::space<Domain> &domain) const
14739{
14740  auto res = isl::aff::insert_domain(domain);
14741  return typed::pw_aff<Domain, Anonymous>(res);
14742}
14743
14744typed::pw_aff<Anonymous> typed::aff<Anonymous>::intersect_params(const typed::set<> &set) const
14745{
14746  auto res = isl::aff::intersect_params(set);
14747  return typed::pw_aff<Anonymous>(res);
14748}
14749
14750typed::aff_list<Anonymous> typed::aff<Anonymous>::list() const
14751{
14752  auto res = isl::aff::list();
14753  return typed::aff_list<Anonymous>(res);
14754}
14755
14756typed::multi_pw_aff<Anonymous> typed::aff<Anonymous>::max(const typed::multi_pw_aff<Anonymous> &multi2) const
14757{
14758  auto res = isl::aff::max(multi2);
14759  return typed::multi_pw_aff<Anonymous>(res);
14760}
14761
14762typed::pw_aff<Anonymous> typed::aff<Anonymous>::max(const typed::pw_aff<Anonymous> &pwaff2) const
14763{
14764  auto res = isl::aff::max(pwaff2);
14765  return typed::pw_aff<Anonymous>(res);
14766}
14767
14768typed::multi_val<Anonymous> typed::aff<Anonymous>::max_multi_val() const
14769{
14770  auto res = isl::aff::max_multi_val();
14771  return typed::multi_val<Anonymous>(res);
14772}
14773
14774typed::val<Anonymous> typed::aff<Anonymous>::max_val() const
14775{
14776  auto res = isl::aff::max_val();
14777  return typed::val<Anonymous>(res);
14778}
14779
14780typed::multi_pw_aff<Anonymous> typed::aff<Anonymous>::min(const typed::multi_pw_aff<Anonymous> &multi2) const
14781{
14782  auto res = isl::aff::min(multi2);
14783  return typed::multi_pw_aff<Anonymous>(res);
14784}
14785
14786typed::pw_aff<Anonymous> typed::aff<Anonymous>::min(const typed::pw_aff<Anonymous> &pwaff2) const
14787{
14788  auto res = isl::aff::min(pwaff2);
14789  return typed::pw_aff<Anonymous>(res);
14790}
14791
14792typed::multi_val<Anonymous> typed::aff<Anonymous>::min_multi_val() const
14793{
14794  auto res = isl::aff::min_multi_val();
14795  return typed::multi_val<Anonymous>(res);
14796}
14797
14798typed::val<Anonymous> typed::aff<Anonymous>::min_val() const
14799{
14800  auto res = isl::aff::min_val();
14801  return typed::val<Anonymous>(res);
14802}
14803
14804typed::aff<Anonymous> typed::aff<Anonymous>::mod(const typed::val<Anonymous> &mod) const
14805{
14806  auto res = isl::aff::mod(mod);
14807  return typed::aff<Anonymous>(res);
14808}
14809
14810typed::aff<Anonymous> typed::aff<Anonymous>::mod(long mod) const
14811{
14812  auto res = isl::aff::mod(mod);
14813  return typed::aff<Anonymous>(res);
14814}
14815
14816typed::aff<Anonymous> typed::aff<Anonymous>::neg() const
14817{
14818  auto res = isl::aff::neg();
14819  return typed::aff<Anonymous>(res);
14820}
14821
14822typed::set<> typed::aff<Anonymous>::params() const
14823{
14824  auto res = isl::aff::params();
14825  return typed::set<>(res);
14826}
14827
14828template <typename Range>
14829typed::multi_aff<pair<Anonymous, Range>> typed::aff<Anonymous>::product(const typed::multi_aff<Range> &multi2) const
14830{
14831  auto res = isl::aff::product(multi2);
14832  return typed::multi_aff<pair<Anonymous, Range>>(res);
14833}
14834
14835template <typename Range>
14836typed::multi_pw_aff<pair<Anonymous, Range>> typed::aff<Anonymous>::product(const typed::multi_pw_aff<Range> &multi2) const
14837{
14838  auto res = isl::aff::product(multi2);
14839  return typed::multi_pw_aff<pair<Anonymous, Range>>(res);
14840}
14841
14842template <typename Range>
14843typed::pw_multi_aff<pair<Anonymous, Range>> typed::aff<Anonymous>::product(const typed::pw_multi_aff<Range> &pma2) const
14844{
14845  auto res = isl::aff::product(pma2);
14846  return typed::pw_multi_aff<pair<Anonymous, Range>>(res);
14847}
14848
14849typed::pw_multi_aff_list<Anonymous> typed::aff<Anonymous>::pw_multi_aff_list() const
14850{
14851  auto res = isl::aff::pw_multi_aff_list();
14852  return typed::pw_multi_aff_list<Anonymous>(res);
14853}
14854
14855typed::aff<Anonymous> typed::aff<Anonymous>::scale(const typed::val<Anonymous> &v) const
14856{
14857  auto res = isl::aff::scale(v);
14858  return typed::aff<Anonymous>(res);
14859}
14860
14861typed::aff<Anonymous> typed::aff<Anonymous>::scale(long v) const
14862{
14863  auto res = isl::aff::scale(v);
14864  return typed::aff<Anonymous>(res);
14865}
14866
14867typed::multi_aff<Anonymous> typed::aff<Anonymous>::scale(const typed::multi_val<Anonymous> &mv) const
14868{
14869  auto res = isl::aff::scale(mv);
14870  return typed::multi_aff<Anonymous>(res);
14871}
14872
14873typed::aff<Anonymous> typed::aff<Anonymous>::scale_down(const typed::val<Anonymous> &v) const
14874{
14875  auto res = isl::aff::scale_down(v);
14876  return typed::aff<Anonymous>(res);
14877}
14878
14879typed::aff<Anonymous> typed::aff<Anonymous>::scale_down(long v) const
14880{
14881  auto res = isl::aff::scale_down(v);
14882  return typed::aff<Anonymous>(res);
14883}
14884
14885typed::multi_aff<Anonymous> typed::aff<Anonymous>::scale_down(const typed::multi_val<Anonymous> &mv) const
14886{
14887  auto res = isl::aff::scale_down(mv);
14888  return typed::multi_aff<Anonymous>(res);
14889}
14890
14891typed::multi_aff<Anonymous> typed::aff<Anonymous>::set_at(int pos, const typed::aff<Anonymous> &el) const
14892{
14893  auto res = isl::aff::set_at(pos, el);
14894  return typed::multi_aff<Anonymous>(res);
14895}
14896
14897typed::multi_pw_aff<Anonymous> typed::aff<Anonymous>::set_at(int pos, const typed::pw_aff<Anonymous> &el) const
14898{
14899  auto res = isl::aff::set_at(pos, el);
14900  return typed::multi_pw_aff<Anonymous>(res);
14901}
14902
14903typed::multi_union_pw_aff<Anonymous> typed::aff<Anonymous>::set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const
14904{
14905  auto res = isl::aff::set_at(pos, el);
14906  return typed::multi_union_pw_aff<Anonymous>(res);
14907}
14908
14909template <typename Domain2>
14910typed::multi_aff<Domain2> typed::aff<Anonymous>::set_range_tuple(const typed::id<Anonymous> &id) const
14911{
14912  auto res = isl::aff::set_range_tuple(id);
14913  return typed::multi_aff<Domain2>(res);
14914}
14915
14916template <typename Domain2>
14917typed::multi_aff<Domain2> typed::aff<Anonymous>::set_range_tuple(const std::string &id) const
14918{
14919  auto res = isl::aff::set_range_tuple(id);
14920  return typed::multi_aff<Domain2>(res);
14921}
14922
14923typed::space<Anonymous> typed::aff<Anonymous>::space() const
14924{
14925  auto res = isl::aff::space();
14926  return typed::space<Anonymous>(res);
14927}
14928
14929typed::aff<Anonymous> typed::aff<Anonymous>::sub(const typed::aff<Anonymous> &aff2) const
14930{
14931  auto res = isl::aff::sub(aff2);
14932  return typed::aff<Anonymous>(res);
14933}
14934
14935typed::multi_aff<Anonymous> typed::aff<Anonymous>::sub(const typed::multi_aff<Anonymous> &multi2) const
14936{
14937  auto res = isl::aff::sub(multi2);
14938  return typed::multi_aff<Anonymous>(res);
14939}
14940
14941typed::multi_pw_aff<Anonymous> typed::aff<Anonymous>::sub(const typed::multi_pw_aff<Anonymous> &multi2) const
14942{
14943  auto res = isl::aff::sub(multi2);
14944  return typed::multi_pw_aff<Anonymous>(res);
14945}
14946
14947typed::multi_union_pw_aff<Anonymous> typed::aff<Anonymous>::sub(const typed::multi_union_pw_aff<Anonymous> &multi2) const
14948{
14949  auto res = isl::aff::sub(multi2);
14950  return typed::multi_union_pw_aff<Anonymous>(res);
14951}
14952
14953typed::pw_aff<Anonymous> typed::aff<Anonymous>::sub(const typed::pw_aff<Anonymous> &pwaff2) const
14954{
14955  auto res = isl::aff::sub(pwaff2);
14956  return typed::pw_aff<Anonymous>(res);
14957}
14958
14959typed::pw_multi_aff<Anonymous> typed::aff<Anonymous>::sub(const typed::pw_multi_aff<Anonymous> &pma2) const
14960{
14961  auto res = isl::aff::sub(pma2);
14962  return typed::pw_multi_aff<Anonymous>(res);
14963}
14964
14965typed::union_pw_aff<Anonymous> typed::aff<Anonymous>::sub(const typed::union_pw_aff<Anonymous> &upa2) const
14966{
14967  auto res = isl::aff::sub(upa2);
14968  return typed::union_pw_aff<Anonymous>(res);
14969}
14970
14971typed::union_pw_multi_aff<Anonymous> typed::aff<Anonymous>::sub(const typed::union_pw_multi_aff<Anonymous> &upma2) const
14972{
14973  auto res = isl::aff::sub(upma2);
14974  return typed::union_pw_multi_aff<Anonymous>(res);
14975}
14976
14977typed::multi_pw_aff<Anonymous> typed::aff<Anonymous>::to_multi_pw_aff() const
14978{
14979  auto res = isl::aff::to_multi_pw_aff();
14980  return typed::multi_pw_aff<Anonymous>(res);
14981}
14982
14983typed::multi_union_pw_aff<Anonymous> typed::aff<Anonymous>::to_multi_union_pw_aff() const
14984{
14985  auto res = isl::aff::to_multi_union_pw_aff();
14986  return typed::multi_union_pw_aff<Anonymous>(res);
14987}
14988
14989typed::pw_multi_aff<Anonymous> typed::aff<Anonymous>::to_pw_multi_aff() const
14990{
14991  auto res = isl::aff::to_pw_multi_aff();
14992  return typed::pw_multi_aff<Anonymous>(res);
14993}
14994
14995typed::union_pw_aff<Anonymous> typed::aff<Anonymous>::to_union_pw_aff() const
14996{
14997  auto res = isl::aff::to_union_pw_aff();
14998  return typed::union_pw_aff<Anonymous>(res);
14999}
15000
15001typed::union_pw_multi_aff<Anonymous> typed::aff<Anonymous>::to_union_pw_multi_aff() const
15002{
15003  auto res = isl::aff::to_union_pw_multi_aff();
15004  return typed::union_pw_multi_aff<Anonymous>(res);
15005}
15006
15007template <typename Domain>
15008typed::aff<Domain, Anonymous> typed::aff<Anonymous>::unbind_params_insert_domain(const typed::multi_id<Domain> &domain) const
15009{
15010  auto res = isl::aff::unbind_params_insert_domain(domain);
15011  return typed::aff<Domain, Anonymous>(res);
15012}
15013
15014typed::multi_pw_aff<Anonymous> typed::aff<Anonymous>::union_add(const typed::multi_pw_aff<Anonymous> &mpa2) const
15015{
15016  auto res = isl::aff::union_add(mpa2);
15017  return typed::multi_pw_aff<Anonymous>(res);
15018}
15019
15020typed::multi_union_pw_aff<Anonymous> typed::aff<Anonymous>::union_add(const typed::multi_union_pw_aff<Anonymous> &mupa2) const
15021{
15022  auto res = isl::aff::union_add(mupa2);
15023  return typed::multi_union_pw_aff<Anonymous>(res);
15024}
15025
15026typed::pw_aff<Anonymous> typed::aff<Anonymous>::union_add(const typed::pw_aff<Anonymous> &pwaff2) const
15027{
15028  auto res = isl::aff::union_add(pwaff2);
15029  return typed::pw_aff<Anonymous>(res);
15030}
15031
15032typed::pw_multi_aff<Anonymous> typed::aff<Anonymous>::union_add(const typed::pw_multi_aff<Anonymous> &pma2) const
15033{
15034  auto res = isl::aff::union_add(pma2);
15035  return typed::pw_multi_aff<Anonymous>(res);
15036}
15037
15038typed::union_pw_aff<Anonymous> typed::aff<Anonymous>::union_add(const typed::union_pw_aff<Anonymous> &upa2) const
15039{
15040  auto res = isl::aff::union_add(upa2);
15041  return typed::union_pw_aff<Anonymous>(res);
15042}
15043
15044typed::union_pw_multi_aff<Anonymous> typed::aff<Anonymous>::union_add(const typed::union_pw_multi_aff<Anonymous> &upma2) const
15045{
15046  auto res = isl::aff::union_add(upma2);
15047  return typed::union_pw_multi_aff<Anonymous>(res);
15048}
15049
15050template <typename Domain>
15051typed::aff<Domain, Anonymous>::aff(const isl::ctx &ctx, const std::string &str)
15052  : isl::aff(ctx, str)
15053{
15054}
15055
15056template <typename Domain>
15057typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add(const typed::aff<Domain, Anonymous> &aff2) const
15058{
15059  auto res = isl::aff::add(aff2);
15060  return typed::aff<Domain, Anonymous>(res);
15061}
15062
15063template <typename Domain>
15064typed::multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add(const typed::multi_aff<Domain, Anonymous> &multi2) const
15065{
15066  auto res = isl::aff::add(multi2);
15067  return typed::multi_aff<Domain, Anonymous>(res);
15068}
15069
15070template <typename Domain>
15071typed::multi_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const
15072{
15073  auto res = isl::aff::add(multi2);
15074  return typed::multi_pw_aff<Domain, Anonymous>(res);
15075}
15076
15077template <typename Domain>
15078typed::multi_union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const
15079{
15080  auto res = isl::aff::add(multi2);
15081  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
15082}
15083
15084template <typename Domain>
15085typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
15086{
15087  auto res = isl::aff::add(pwaff2);
15088  return typed::pw_aff<Domain, Anonymous>(res);
15089}
15090
15091template <typename Domain>
15092typed::pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const
15093{
15094  auto res = isl::aff::add(pma2);
15095  return typed::pw_multi_aff<Domain, Anonymous>(res);
15096}
15097
15098template <typename Domain>
15099typed::union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const
15100{
15101  auto res = isl::aff::add(upa2);
15102  return typed::union_pw_aff<Domain, Anonymous>(res);
15103}
15104
15105template <typename Domain>
15106typed::union_pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const
15107{
15108  auto res = isl::aff::add(upma2);
15109  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
15110}
15111
15112template <typename Domain>
15113typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add_constant(const typed::val<Anonymous> &v) const
15114{
15115  auto res = isl::aff::add_constant(v);
15116  return typed::aff<Domain, Anonymous>(res);
15117}
15118
15119template <typename Domain>
15120typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add_constant(long v) const
15121{
15122  auto res = isl::aff::add_constant(v);
15123  return typed::aff<Domain, Anonymous>(res);
15124}
15125
15126template <typename Domain>
15127typed::multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::add_constant(const typed::multi_val<Anonymous> &mv) const
15128{
15129  auto res = isl::aff::add_constant(mv);
15130  return typed::multi_aff<Domain, Anonymous>(res);
15131}
15132
15133template <typename Domain>
15134template <typename Range2>
15135typed::union_pw_multi_aff<Domain, Range2> typed::aff<Domain, Anonymous>::apply(const typed::union_pw_multi_aff<Anonymous, Range2> &upma2) const
15136{
15137  auto res = isl::aff::apply(upma2);
15138  return typed::union_pw_multi_aff<Domain, Range2>(res);
15139}
15140
15141template <typename Domain>
15142typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::as_aff() const
15143{
15144  auto res = isl::aff::as_aff();
15145  return typed::aff<Domain, Anonymous>(res);
15146}
15147
15148template <typename Domain>
15149typed::map<Domain, Anonymous> typed::aff<Domain, Anonymous>::as_map() const
15150{
15151  auto res = isl::aff::as_map();
15152  return typed::map<Domain, Anonymous>(res);
15153}
15154
15155template <typename Domain>
15156typed::multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::as_multi_aff() const
15157{
15158  auto res = isl::aff::as_multi_aff();
15159  return typed::multi_aff<Domain, Anonymous>(res);
15160}
15161
15162template <typename Domain>
15163typed::multi_union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::as_multi_union_pw_aff() const
15164{
15165  auto res = isl::aff::as_multi_union_pw_aff();
15166  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
15167}
15168
15169template <typename Domain>
15170typed::pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::as_pw_multi_aff() const
15171{
15172  auto res = isl::aff::as_pw_multi_aff();
15173  return typed::pw_multi_aff<Domain, Anonymous>(res);
15174}
15175
15176template <typename Domain>
15177typed::union_map<Domain, Anonymous> typed::aff<Domain, Anonymous>::as_union_map() const
15178{
15179  auto res = isl::aff::as_union_map();
15180  return typed::union_map<Domain, Anonymous>(res);
15181}
15182
15183template <typename Domain>
15184typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::at(int pos) const
15185{
15186  auto res = isl::aff::at(pos);
15187  return typed::aff<Domain, Anonymous>(res);
15188}
15189
15190template <typename Domain>
15191typed::basic_set<Domain> typed::aff<Domain, Anonymous>::bind(const typed::id<Anonymous> &id) const
15192{
15193  auto res = isl::aff::bind(id);
15194  return typed::basic_set<Domain>(res);
15195}
15196
15197template <typename Domain>
15198typed::basic_set<Domain> typed::aff<Domain, Anonymous>::bind(const std::string &id) const
15199{
15200  auto res = isl::aff::bind(id);
15201  return typed::basic_set<Domain>(res);
15202}
15203
15204template <typename Domain>
15205typed::basic_set<Domain> typed::aff<Domain, Anonymous>::bind(const typed::multi_id<Anonymous> &tuple) const
15206{
15207  auto res = isl::aff::bind(tuple);
15208  return typed::basic_set<Domain>(res);
15209}
15210
15211template <typename Domain>
15212typed::pw_aff<Anonymous> typed::aff<Domain, Anonymous>::bind_domain(const typed::multi_id<Domain> &tuple) const
15213{
15214  auto res = isl::aff::bind_domain(tuple);
15215  return typed::pw_aff<Anonymous>(res);
15216}
15217
15218template <typename Domain>
15219typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::ceil() const
15220{
15221  auto res = isl::aff::ceil();
15222  return typed::aff<Domain, Anonymous>(res);
15223}
15224
15225template <typename Domain>
15226typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::coalesce() const
15227{
15228  auto res = isl::aff::coalesce();
15229  return typed::pw_aff<Domain, Anonymous>(res);
15230}
15231
15232template <typename Domain>
15233typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::cond(const typed::pw_aff<Domain, Anonymous> &pwaff_true, const typed::pw_aff<Domain, Anonymous> &pwaff_false) const
15234{
15235  auto res = isl::aff::cond(pwaff_true, pwaff_false);
15236  return typed::pw_aff<Domain, Anonymous>(res);
15237}
15238
15239template <typename Domain>
15240typed::multi_val<Anonymous> typed::aff<Domain, Anonymous>::constant_multi_val() const
15241{
15242  auto res = isl::aff::constant_multi_val();
15243  return typed::multi_val<Anonymous>(res);
15244}
15245
15246template <typename Domain>
15247typed::val<Anonymous> typed::aff<Domain, Anonymous>::constant_val() const
15248{
15249  auto res = isl::aff::constant_val();
15250  return typed::val<Anonymous>(res);
15251}
15252
15253template <typename Domain>
15254typed::set<Domain> typed::aff<Domain, Anonymous>::domain() const
15255{
15256  auto res = isl::aff::domain();
15257  return typed::set<Domain>(res);
15258}
15259
15260template <typename Domain>
15261typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::drop_unused_params() const
15262{
15263  auto res = isl::aff::drop_unused_params();
15264  return typed::pw_aff<Domain, Anonymous>(res);
15265}
15266
15267template <typename Domain>
15268typed::pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::extract_pw_multi_aff(const typed::space<Domain, Anonymous> &space) const
15269{
15270  auto res = isl::aff::extract_pw_multi_aff(space);
15271  return typed::pw_multi_aff<Domain, Anonymous>(res);
15272}
15273
15274template <typename Domain>
15275typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::floor() const
15276{
15277  auto res = isl::aff::floor();
15278  return typed::aff<Domain, Anonymous>(res);
15279}
15280
15281template <typename Domain>
15282typed::set<Domain> typed::aff<Domain, Anonymous>::ge_set(const typed::aff<Domain, Anonymous> &aff2) const
15283{
15284  auto res = isl::aff::ge_set(aff2);
15285  return typed::set<Domain>(res);
15286}
15287
15288template <typename Domain>
15289typed::set<Domain> typed::aff<Domain, Anonymous>::ge_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
15290{
15291  auto res = isl::aff::ge_set(pwaff2);
15292  return typed::set<Domain>(res);
15293}
15294
15295template <typename Domain>
15296typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::gist(const typed::set<Domain> &context) const
15297{
15298  auto res = isl::aff::gist(context);
15299  return typed::aff<Domain, Anonymous>(res);
15300}
15301
15302template <typename Domain>
15303typed::union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::gist(const typed::union_set<Domain> &context) const
15304{
15305  auto res = isl::aff::gist(context);
15306  return typed::union_pw_aff<Domain, Anonymous>(res);
15307}
15308
15309template <typename Domain>
15310typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::gist(const typed::basic_set<Domain> &context) const
15311{
15312  auto res = isl::aff::gist(context);
15313  return typed::aff<Domain, Anonymous>(res);
15314}
15315
15316template <typename Domain>
15317typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::gist(const typed::point<Domain> &context) const
15318{
15319  auto res = isl::aff::gist(context);
15320  return typed::aff<Domain, Anonymous>(res);
15321}
15322
15323template <typename Domain>
15324typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::gist_params(const typed::set<> &context) const
15325{
15326  auto res = isl::aff::gist_params(context);
15327  return typed::aff<Domain, Anonymous>(res);
15328}
15329
15330template <typename Domain>
15331typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::gist_params(const typed::basic_set<> &context) const
15332{
15333  auto res = isl::aff::gist_params(context);
15334  return typed::aff<Domain, Anonymous>(res);
15335}
15336
15337template <typename Domain>
15338typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::gist_params(const typed::point<> &context) const
15339{
15340  auto res = isl::aff::gist_params(context);
15341  return typed::aff<Domain, Anonymous>(res);
15342}
15343
15344template <typename Domain>
15345typed::set<Domain> typed::aff<Domain, Anonymous>::gt_set(const typed::aff<Domain, Anonymous> &aff2) const
15346{
15347  auto res = isl::aff::gt_set(aff2);
15348  return typed::set<Domain>(res);
15349}
15350
15351template <typename Domain>
15352typed::set<Domain> typed::aff<Domain, Anonymous>::gt_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
15353{
15354  auto res = isl::aff::gt_set(pwaff2);
15355  return typed::set<Domain>(res);
15356}
15357
15358template <typename Domain>
15359typed::multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::identity() const
15360{
15361  auto res = isl::aff::identity();
15362  return typed::multi_aff<Domain, Anonymous>(res);
15363}
15364
15365template <typename Domain>
15366typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::intersect_domain(const typed::set<Domain> &set) const
15367{
15368  auto res = isl::aff::intersect_domain(set);
15369  return typed::pw_aff<Domain, Anonymous>(res);
15370}
15371
15372template <typename Domain>
15373typed::union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::intersect_domain(const typed::space<Domain> &space) const
15374{
15375  auto res = isl::aff::intersect_domain(space);
15376  return typed::union_pw_aff<Domain, Anonymous>(res);
15377}
15378
15379template <typename Domain>
15380typed::union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::intersect_domain(const typed::union_set<Domain> &uset) const
15381{
15382  auto res = isl::aff::intersect_domain(uset);
15383  return typed::union_pw_aff<Domain, Anonymous>(res);
15384}
15385
15386template <typename Domain>
15387typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::intersect_params(const typed::set<> &set) const
15388{
15389  auto res = isl::aff::intersect_params(set);
15390  return typed::pw_aff<Domain, Anonymous>(res);
15391}
15392
15393template <typename Domain>
15394typed::set<Domain> typed::aff<Domain, Anonymous>::le_set(const typed::aff<Domain, Anonymous> &aff2) const
15395{
15396  auto res = isl::aff::le_set(aff2);
15397  return typed::set<Domain>(res);
15398}
15399
15400template <typename Domain>
15401typed::set<Domain> typed::aff<Domain, Anonymous>::le_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
15402{
15403  auto res = isl::aff::le_set(pwaff2);
15404  return typed::set<Domain>(res);
15405}
15406
15407template <typename Domain>
15408typed::aff_list<Domain, Anonymous> typed::aff<Domain, Anonymous>::list() const
15409{
15410  auto res = isl::aff::list();
15411  return typed::aff_list<Domain, Anonymous>(res);
15412}
15413
15414template <typename Domain>
15415typed::set<Domain> typed::aff<Domain, Anonymous>::lt_set(const typed::aff<Domain, Anonymous> &aff2) const
15416{
15417  auto res = isl::aff::lt_set(aff2);
15418  return typed::set<Domain>(res);
15419}
15420
15421template <typename Domain>
15422typed::set<Domain> typed::aff<Domain, Anonymous>::lt_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
15423{
15424  auto res = isl::aff::lt_set(pwaff2);
15425  return typed::set<Domain>(res);
15426}
15427
15428template <typename Domain>
15429typed::multi_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::max(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const
15430{
15431  auto res = isl::aff::max(multi2);
15432  return typed::multi_pw_aff<Domain, Anonymous>(res);
15433}
15434
15435template <typename Domain>
15436typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::max(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
15437{
15438  auto res = isl::aff::max(pwaff2);
15439  return typed::pw_aff<Domain, Anonymous>(res);
15440}
15441
15442template <typename Domain>
15443typed::multi_val<Anonymous> typed::aff<Domain, Anonymous>::max_multi_val() const
15444{
15445  auto res = isl::aff::max_multi_val();
15446  return typed::multi_val<Anonymous>(res);
15447}
15448
15449template <typename Domain>
15450typed::val<Anonymous> typed::aff<Domain, Anonymous>::max_val() const
15451{
15452  auto res = isl::aff::max_val();
15453  return typed::val<Anonymous>(res);
15454}
15455
15456template <typename Domain>
15457typed::multi_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::min(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const
15458{
15459  auto res = isl::aff::min(multi2);
15460  return typed::multi_pw_aff<Domain, Anonymous>(res);
15461}
15462
15463template <typename Domain>
15464typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::min(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
15465{
15466  auto res = isl::aff::min(pwaff2);
15467  return typed::pw_aff<Domain, Anonymous>(res);
15468}
15469
15470template <typename Domain>
15471typed::multi_val<Anonymous> typed::aff<Domain, Anonymous>::min_multi_val() const
15472{
15473  auto res = isl::aff::min_multi_val();
15474  return typed::multi_val<Anonymous>(res);
15475}
15476
15477template <typename Domain>
15478typed::val<Anonymous> typed::aff<Domain, Anonymous>::min_val() const
15479{
15480  auto res = isl::aff::min_val();
15481  return typed::val<Anonymous>(res);
15482}
15483
15484template <typename Domain>
15485typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::mod(const typed::val<Anonymous> &mod) const
15486{
15487  auto res = isl::aff::mod(mod);
15488  return typed::aff<Domain, Anonymous>(res);
15489}
15490
15491template <typename Domain>
15492typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::mod(long mod) const
15493{
15494  auto res = isl::aff::mod(mod);
15495  return typed::aff<Domain, Anonymous>(res);
15496}
15497
15498template <typename Domain>
15499typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::neg() const
15500{
15501  auto res = isl::aff::neg();
15502  return typed::aff<Domain, Anonymous>(res);
15503}
15504
15505template <typename Domain>
15506typed::set<> typed::aff<Domain, Anonymous>::params() const
15507{
15508  auto res = isl::aff::params();
15509  return typed::set<>(res);
15510}
15511
15512template <typename Domain>
15513template <typename Domain2, typename Range2>
15514typed::multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> typed::aff<Domain, Anonymous>::product(const typed::multi_aff<Domain2, Range2> &multi2) const
15515{
15516  auto res = isl::aff::product(multi2);
15517  return typed::multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>>(res);
15518}
15519
15520template <typename Domain>
15521template <typename Domain2, typename Range2>
15522typed::multi_pw_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> typed::aff<Domain, Anonymous>::product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const
15523{
15524  auto res = isl::aff::product(multi2);
15525  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>>(res);
15526}
15527
15528template <typename Domain>
15529template <typename Domain2, typename Range2>
15530typed::pw_multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> typed::aff<Domain, Anonymous>::product(const typed::pw_multi_aff<Domain2, Range2> &pma2) const
15531{
15532  auto res = isl::aff::product(pma2);
15533  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>>(res);
15534}
15535
15536template <typename Domain>
15537template <typename Domain2>
15538typed::aff<Domain2, Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::multi_aff<Domain2, Domain> &ma) const
15539{
15540  auto res = isl::aff::pullback(ma);
15541  return typed::aff<Domain2, Anonymous>(res);
15542}
15543
15544template <typename Domain>
15545typed::aff<Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::multi_aff<Domain> &ma) const
15546{
15547  auto res = isl::aff::pullback(ma);
15548  return typed::aff<Anonymous>(res);
15549}
15550
15551template <typename Domain>
15552template <typename Domain2>
15553typed::pw_aff<Domain2, Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
15554{
15555  auto res = isl::aff::pullback(mpa);
15556  return typed::pw_aff<Domain2, Anonymous>(res);
15557}
15558
15559template <typename Domain>
15560typed::pw_aff<Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::multi_pw_aff<Domain> &mpa) const
15561{
15562  auto res = isl::aff::pullback(mpa);
15563  return typed::pw_aff<Anonymous>(res);
15564}
15565
15566template <typename Domain>
15567template <typename Domain2>
15568typed::pw_aff<Domain2, Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::pw_multi_aff<Domain2, Domain> &pma) const
15569{
15570  auto res = isl::aff::pullback(pma);
15571  return typed::pw_aff<Domain2, Anonymous>(res);
15572}
15573
15574template <typename Domain>
15575typed::pw_aff<Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::pw_multi_aff<Domain> &pma) const
15576{
15577  auto res = isl::aff::pullback(pma);
15578  return typed::pw_aff<Anonymous>(res);
15579}
15580
15581template <typename Domain>
15582template <typename Domain2>
15583typed::union_pw_aff<Domain2, Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
15584{
15585  auto res = isl::aff::pullback(upma);
15586  return typed::union_pw_aff<Domain2, Anonymous>(res);
15587}
15588
15589template <typename Domain>
15590typed::union_pw_aff<Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::union_pw_multi_aff<Domain> &upma) const
15591{
15592  auto res = isl::aff::pullback(upma);
15593  return typed::union_pw_aff<Anonymous>(res);
15594}
15595
15596template <typename Domain>
15597template <typename Domain2>
15598typed::aff<Domain2, Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::aff<Domain2, Domain> &ma) const
15599{
15600  auto res = isl::aff::pullback(ma);
15601  return typed::aff<Domain2, Anonymous>(res);
15602}
15603
15604template <typename Domain>
15605typed::aff<Anonymous> typed::aff<Domain, Anonymous>::pullback(const typed::aff<Domain> &ma) const
15606{
15607  auto res = isl::aff::pullback(ma);
15608  return typed::aff<Anonymous>(res);
15609}
15610
15611template <typename Domain>
15612typed::pw_multi_aff_list<Domain, Anonymous> typed::aff<Domain, Anonymous>::pw_multi_aff_list() const
15613{
15614  auto res = isl::aff::pw_multi_aff_list();
15615  return typed::pw_multi_aff_list<Domain, Anonymous>(res);
15616}
15617
15618template <typename Domain>
15619template <typename Range2>
15620typed::multi_aff<Domain, pair<Anonymous, Range2>> typed::aff<Domain, Anonymous>::range_product(const typed::multi_aff<Domain, Range2> &multi2) const
15621{
15622  auto res = isl::aff::range_product(multi2);
15623  return typed::multi_aff<Domain, pair<Anonymous, Range2>>(res);
15624}
15625
15626template <typename Domain>
15627template <typename Range2>
15628typed::multi_pw_aff<Domain, pair<Anonymous, Range2>> typed::aff<Domain, Anonymous>::range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const
15629{
15630  auto res = isl::aff::range_product(multi2);
15631  return typed::multi_pw_aff<Domain, pair<Anonymous, Range2>>(res);
15632}
15633
15634template <typename Domain>
15635template <typename Range2>
15636typed::multi_union_pw_aff<Domain, pair<Anonymous, Range2>> typed::aff<Domain, Anonymous>::range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const
15637{
15638  auto res = isl::aff::range_product(multi2);
15639  return typed::multi_union_pw_aff<Domain, pair<Anonymous, Range2>>(res);
15640}
15641
15642template <typename Domain>
15643template <typename Range2>
15644typed::pw_multi_aff<Domain, pair<Anonymous, Range2>> typed::aff<Domain, Anonymous>::range_product(const typed::pw_multi_aff<Domain, Range2> &pma2) const
15645{
15646  auto res = isl::aff::range_product(pma2);
15647  return typed::pw_multi_aff<Domain, pair<Anonymous, Range2>>(res);
15648}
15649
15650template <typename Domain>
15651template <typename Range2>
15652typed::union_pw_multi_aff<Domain, pair<Anonymous, Range2>> typed::aff<Domain, Anonymous>::range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const
15653{
15654  auto res = isl::aff::range_product(upma2);
15655  return typed::union_pw_multi_aff<Domain, pair<Anonymous, Range2>>(res);
15656}
15657
15658template <typename Domain>
15659typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::scale(const typed::val<Anonymous> &v) const
15660{
15661  auto res = isl::aff::scale(v);
15662  return typed::aff<Domain, Anonymous>(res);
15663}
15664
15665template <typename Domain>
15666typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::scale(long v) const
15667{
15668  auto res = isl::aff::scale(v);
15669  return typed::aff<Domain, Anonymous>(res);
15670}
15671
15672template <typename Domain>
15673typed::multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::scale(const typed::multi_val<Anonymous> &mv) const
15674{
15675  auto res = isl::aff::scale(mv);
15676  return typed::multi_aff<Domain, Anonymous>(res);
15677}
15678
15679template <typename Domain>
15680typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::scale_down(const typed::val<Anonymous> &v) const
15681{
15682  auto res = isl::aff::scale_down(v);
15683  return typed::aff<Domain, Anonymous>(res);
15684}
15685
15686template <typename Domain>
15687typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::scale_down(long v) const
15688{
15689  auto res = isl::aff::scale_down(v);
15690  return typed::aff<Domain, Anonymous>(res);
15691}
15692
15693template <typename Domain>
15694typed::multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::scale_down(const typed::multi_val<Anonymous> &mv) const
15695{
15696  auto res = isl::aff::scale_down(mv);
15697  return typed::multi_aff<Domain, Anonymous>(res);
15698}
15699
15700template <typename Domain>
15701typed::multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::set_at(int pos, const typed::aff<Domain, Anonymous> &el) const
15702{
15703  auto res = isl::aff::set_at(pos, el);
15704  return typed::multi_aff<Domain, Anonymous>(res);
15705}
15706
15707template <typename Domain>
15708typed::multi_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const
15709{
15710  auto res = isl::aff::set_at(pos, el);
15711  return typed::multi_pw_aff<Domain, Anonymous>(res);
15712}
15713
15714template <typename Domain>
15715typed::multi_union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const
15716{
15717  auto res = isl::aff::set_at(pos, el);
15718  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
15719}
15720
15721template <typename Domain>
15722template <typename Range2>
15723typed::multi_aff<Domain, Range2> typed::aff<Domain, Anonymous>::set_range_tuple(const typed::id<Anonymous> &id) const
15724{
15725  auto res = isl::aff::set_range_tuple(id);
15726  return typed::multi_aff<Domain, Range2>(res);
15727}
15728
15729template <typename Domain>
15730template <typename Range2>
15731typed::multi_aff<Domain, Range2> typed::aff<Domain, Anonymous>::set_range_tuple(const std::string &id) const
15732{
15733  auto res = isl::aff::set_range_tuple(id);
15734  return typed::multi_aff<Domain, Range2>(res);
15735}
15736
15737template <typename Domain>
15738typed::space<Domain, Anonymous> typed::aff<Domain, Anonymous>::space() const
15739{
15740  auto res = isl::aff::space();
15741  return typed::space<Domain, Anonymous>(res);
15742}
15743
15744template <typename Domain>
15745typed::aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::sub(const typed::aff<Domain, Anonymous> &aff2) const
15746{
15747  auto res = isl::aff::sub(aff2);
15748  return typed::aff<Domain, Anonymous>(res);
15749}
15750
15751template <typename Domain>
15752typed::multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::sub(const typed::multi_aff<Domain, Anonymous> &multi2) const
15753{
15754  auto res = isl::aff::sub(multi2);
15755  return typed::multi_aff<Domain, Anonymous>(res);
15756}
15757
15758template <typename Domain>
15759typed::multi_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::sub(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const
15760{
15761  auto res = isl::aff::sub(multi2);
15762  return typed::multi_pw_aff<Domain, Anonymous>(res);
15763}
15764
15765template <typename Domain>
15766typed::multi_union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::sub(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const
15767{
15768  auto res = isl::aff::sub(multi2);
15769  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
15770}
15771
15772template <typename Domain>
15773typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::sub(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
15774{
15775  auto res = isl::aff::sub(pwaff2);
15776  return typed::pw_aff<Domain, Anonymous>(res);
15777}
15778
15779template <typename Domain>
15780typed::pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::sub(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const
15781{
15782  auto res = isl::aff::sub(pma2);
15783  return typed::pw_multi_aff<Domain, Anonymous>(res);
15784}
15785
15786template <typename Domain>
15787typed::union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::sub(const typed::union_pw_aff<Domain, Anonymous> &upa2) const
15788{
15789  auto res = isl::aff::sub(upa2);
15790  return typed::union_pw_aff<Domain, Anonymous>(res);
15791}
15792
15793template <typename Domain>
15794typed::union_pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::sub(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const
15795{
15796  auto res = isl::aff::sub(upma2);
15797  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
15798}
15799
15800template <typename Domain>
15801typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::subtract_domain(const typed::set<Domain> &set) const
15802{
15803  auto res = isl::aff::subtract_domain(set);
15804  return typed::pw_aff<Domain, Anonymous>(res);
15805}
15806
15807template <typename Domain>
15808typed::union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::subtract_domain(const typed::space<Domain> &space) const
15809{
15810  auto res = isl::aff::subtract_domain(space);
15811  return typed::union_pw_aff<Domain, Anonymous>(res);
15812}
15813
15814template <typename Domain>
15815typed::union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::subtract_domain(const typed::union_set<Domain> &uset) const
15816{
15817  auto res = isl::aff::subtract_domain(uset);
15818  return typed::union_pw_aff<Domain, Anonymous>(res);
15819}
15820
15821template <typename Domain>
15822typed::multi_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::to_multi_pw_aff() const
15823{
15824  auto res = isl::aff::to_multi_pw_aff();
15825  return typed::multi_pw_aff<Domain, Anonymous>(res);
15826}
15827
15828template <typename Domain>
15829typed::multi_union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::to_multi_union_pw_aff() const
15830{
15831  auto res = isl::aff::to_multi_union_pw_aff();
15832  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
15833}
15834
15835template <typename Domain>
15836typed::pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::to_pw_multi_aff() const
15837{
15838  auto res = isl::aff::to_pw_multi_aff();
15839  return typed::pw_multi_aff<Domain, Anonymous>(res);
15840}
15841
15842template <typename Domain>
15843typed::union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::to_union_pw_aff() const
15844{
15845  auto res = isl::aff::to_union_pw_aff();
15846  return typed::union_pw_aff<Domain, Anonymous>(res);
15847}
15848
15849template <typename Domain>
15850typed::union_pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::to_union_pw_multi_aff() const
15851{
15852  auto res = isl::aff::to_union_pw_multi_aff();
15853  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
15854}
15855
15856template <typename Domain>
15857typed::multi_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::union_add(const typed::multi_pw_aff<Domain, Anonymous> &mpa2) const
15858{
15859  auto res = isl::aff::union_add(mpa2);
15860  return typed::multi_pw_aff<Domain, Anonymous>(res);
15861}
15862
15863template <typename Domain>
15864typed::multi_union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::union_add(const typed::multi_union_pw_aff<Domain, Anonymous> &mupa2) const
15865{
15866  auto res = isl::aff::union_add(mupa2);
15867  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
15868}
15869
15870template <typename Domain>
15871typed::pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::union_add(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
15872{
15873  auto res = isl::aff::union_add(pwaff2);
15874  return typed::pw_aff<Domain, Anonymous>(res);
15875}
15876
15877template <typename Domain>
15878typed::pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::union_add(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const
15879{
15880  auto res = isl::aff::union_add(pma2);
15881  return typed::pw_multi_aff<Domain, Anonymous>(res);
15882}
15883
15884template <typename Domain>
15885typed::union_pw_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::union_add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const
15886{
15887  auto res = isl::aff::union_add(upa2);
15888  return typed::union_pw_aff<Domain, Anonymous>(res);
15889}
15890
15891template <typename Domain>
15892typed::union_pw_multi_aff<Domain, Anonymous> typed::aff<Domain, Anonymous>::union_add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const
15893{
15894  auto res = isl::aff::union_add(upma2);
15895  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
15896}
15897
15898template <typename Domain2, typename Range2>
15899typed::aff<pair<Domain2, Range2>, Anonymous>::aff(const isl::ctx &ctx, const std::string &str)
15900  : isl::aff(ctx, str)
15901{
15902}
15903
15904template <typename Domain2, typename Range2>
15905typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const
15906{
15907  auto res = isl::aff::add(aff2);
15908  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
15909}
15910
15911template <typename Domain2, typename Range2>
15912typed::multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add(const typed::multi_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
15913{
15914  auto res = isl::aff::add(multi2);
15915  return typed::multi_aff<pair<Domain2, Range2>, Anonymous>(res);
15916}
15917
15918template <typename Domain2, typename Range2>
15919typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
15920{
15921  auto res = isl::aff::add(multi2);
15922  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
15923}
15924
15925template <typename Domain2, typename Range2>
15926typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
15927{
15928  auto res = isl::aff::add(multi2);
15929  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
15930}
15931
15932template <typename Domain2, typename Range2>
15933typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
15934{
15935  auto res = isl::aff::add(pwaff2);
15936  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
15937}
15938
15939template <typename Domain2, typename Range2>
15940typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const
15941{
15942  auto res = isl::aff::add(pma2);
15943  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
15944}
15945
15946template <typename Domain2, typename Range2>
15947typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const
15948{
15949  auto res = isl::aff::add(upa2);
15950  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
15951}
15952
15953template <typename Domain2, typename Range2>
15954typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const
15955{
15956  auto res = isl::aff::add(upma2);
15957  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
15958}
15959
15960template <typename Domain2, typename Range2>
15961typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add_constant(const typed::val<Anonymous> &v) const
15962{
15963  auto res = isl::aff::add_constant(v);
15964  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
15965}
15966
15967template <typename Domain2, typename Range2>
15968typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add_constant(long v) const
15969{
15970  auto res = isl::aff::add_constant(v);
15971  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
15972}
15973
15974template <typename Domain2, typename Range2>
15975typed::multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::add_constant(const typed::multi_val<Anonymous> &mv) const
15976{
15977  auto res = isl::aff::add_constant(mv);
15978  return typed::multi_aff<pair<Domain2, Range2>, Anonymous>(res);
15979}
15980
15981template <typename Domain2, typename Range2>
15982template <typename Arg1>
15983typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1> typed::aff<pair<Domain2, Range2>, Anonymous>::apply(const typed::union_pw_multi_aff<Anonymous, Arg1> &upma2) const
15984{
15985  auto res = isl::aff::apply(upma2);
15986  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1>(res);
15987}
15988
15989template <typename Domain2, typename Range2>
15990typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::as_aff() const
15991{
15992  auto res = isl::aff::as_aff();
15993  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
15994}
15995
15996template <typename Domain2, typename Range2>
15997typed::map<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::as_map() const
15998{
15999  auto res = isl::aff::as_map();
16000  return typed::map<pair<Domain2, Range2>, Anonymous>(res);
16001}
16002
16003template <typename Domain2, typename Range2>
16004typed::multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::as_multi_aff() const
16005{
16006  auto res = isl::aff::as_multi_aff();
16007  return typed::multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16008}
16009
16010template <typename Domain2, typename Range2>
16011typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::as_multi_union_pw_aff() const
16012{
16013  auto res = isl::aff::as_multi_union_pw_aff();
16014  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16015}
16016
16017template <typename Domain2, typename Range2>
16018typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::as_pw_multi_aff() const
16019{
16020  auto res = isl::aff::as_pw_multi_aff();
16021  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16022}
16023
16024template <typename Domain2, typename Range2>
16025typed::union_map<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::as_union_map() const
16026{
16027  auto res = isl::aff::as_union_map();
16028  return typed::union_map<pair<Domain2, Range2>, Anonymous>(res);
16029}
16030
16031template <typename Domain2, typename Range2>
16032typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::at(int pos) const
16033{
16034  auto res = isl::aff::at(pos);
16035  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16036}
16037
16038template <typename Domain2, typename Range2>
16039typed::basic_set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::bind(const typed::id<Anonymous> &id) const
16040{
16041  auto res = isl::aff::bind(id);
16042  return typed::basic_set<pair<Domain2, Range2>>(res);
16043}
16044
16045template <typename Domain2, typename Range2>
16046typed::basic_set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::bind(const std::string &id) const
16047{
16048  auto res = isl::aff::bind(id);
16049  return typed::basic_set<pair<Domain2, Range2>>(res);
16050}
16051
16052template <typename Domain2, typename Range2>
16053typed::basic_set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::bind(const typed::multi_id<Anonymous> &tuple) const
16054{
16055  auto res = isl::aff::bind(tuple);
16056  return typed::basic_set<pair<Domain2, Range2>>(res);
16057}
16058
16059template <typename Domain2, typename Range2>
16060typed::pw_aff<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const
16061{
16062  auto res = isl::aff::bind_domain(tuple);
16063  return typed::pw_aff<Anonymous>(res);
16064}
16065
16066template <typename Domain2, typename Range2>
16067typed::pw_aff<Range2, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const
16068{
16069  auto res = isl::aff::bind_domain_wrapped_domain(tuple);
16070  return typed::pw_aff<Range2, Anonymous>(res);
16071}
16072
16073template <typename Domain2, typename Range2>
16074typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::ceil() const
16075{
16076  auto res = isl::aff::ceil();
16077  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16078}
16079
16080template <typename Domain2, typename Range2>
16081typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::coalesce() const
16082{
16083  auto res = isl::aff::coalesce();
16084  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16085}
16086
16087template <typename Domain2, typename Range2>
16088typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::cond(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff_true, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff_false) const
16089{
16090  auto res = isl::aff::cond(pwaff_true, pwaff_false);
16091  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16092}
16093
16094template <typename Domain2, typename Range2>
16095typed::multi_val<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::constant_multi_val() const
16096{
16097  auto res = isl::aff::constant_multi_val();
16098  return typed::multi_val<Anonymous>(res);
16099}
16100
16101template <typename Domain2, typename Range2>
16102typed::val<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::constant_val() const
16103{
16104  auto res = isl::aff::constant_val();
16105  return typed::val<Anonymous>(res);
16106}
16107
16108template <typename Domain2, typename Range2>
16109typed::set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::domain() const
16110{
16111  auto res = isl::aff::domain();
16112  return typed::set<pair<Domain2, Range2>>(res);
16113}
16114
16115template <typename Domain2, typename Range2>
16116typed::aff<pair<Range2, Domain2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::domain_reverse() const
16117{
16118  auto res = isl::aff::domain_reverse();
16119  return typed::aff<pair<Range2, Domain2>, Anonymous>(res);
16120}
16121
16122template <typename Domain2, typename Range2>
16123typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::drop_unused_params() const
16124{
16125  auto res = isl::aff::drop_unused_params();
16126  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16127}
16128
16129template <typename Domain2, typename Range2>
16130typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::extract_pw_multi_aff(const typed::space<pair<Domain2, Range2>, Anonymous> &space) const
16131{
16132  auto res = isl::aff::extract_pw_multi_aff(space);
16133  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16134}
16135
16136template <typename Domain2, typename Range2>
16137typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::floor() const
16138{
16139  auto res = isl::aff::floor();
16140  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16141}
16142
16143template <typename Domain2, typename Range2>
16144typed::set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::ge_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const
16145{
16146  auto res = isl::aff::ge_set(aff2);
16147  return typed::set<pair<Domain2, Range2>>(res);
16148}
16149
16150template <typename Domain2, typename Range2>
16151typed::set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::ge_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
16152{
16153  auto res = isl::aff::ge_set(pwaff2);
16154  return typed::set<pair<Domain2, Range2>>(res);
16155}
16156
16157template <typename Domain2, typename Range2>
16158typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::gist(const typed::set<pair<Domain2, Range2>> &context) const
16159{
16160  auto res = isl::aff::gist(context);
16161  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16162}
16163
16164template <typename Domain2, typename Range2>
16165typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::gist(const typed::union_set<pair<Domain2, Range2>> &context) const
16166{
16167  auto res = isl::aff::gist(context);
16168  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16169}
16170
16171template <typename Domain2, typename Range2>
16172typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::gist(const typed::basic_set<pair<Domain2, Range2>> &context) const
16173{
16174  auto res = isl::aff::gist(context);
16175  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16176}
16177
16178template <typename Domain2, typename Range2>
16179typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::gist(const typed::point<pair<Domain2, Range2>> &context) const
16180{
16181  auto res = isl::aff::gist(context);
16182  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16183}
16184
16185template <typename Domain2, typename Range2>
16186typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::gist_params(const typed::set<> &context) const
16187{
16188  auto res = isl::aff::gist_params(context);
16189  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16190}
16191
16192template <typename Domain2, typename Range2>
16193typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::gist_params(const typed::basic_set<> &context) const
16194{
16195  auto res = isl::aff::gist_params(context);
16196  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16197}
16198
16199template <typename Domain2, typename Range2>
16200typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::gist_params(const typed::point<> &context) const
16201{
16202  auto res = isl::aff::gist_params(context);
16203  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16204}
16205
16206template <typename Domain2, typename Range2>
16207typed::set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::gt_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const
16208{
16209  auto res = isl::aff::gt_set(aff2);
16210  return typed::set<pair<Domain2, Range2>>(res);
16211}
16212
16213template <typename Domain2, typename Range2>
16214typed::set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::gt_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
16215{
16216  auto res = isl::aff::gt_set(pwaff2);
16217  return typed::set<pair<Domain2, Range2>>(res);
16218}
16219
16220template <typename Domain2, typename Range2>
16221typed::multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::identity() const
16222{
16223  auto res = isl::aff::identity();
16224  return typed::multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16225}
16226
16227template <typename Domain2, typename Range2>
16228typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::intersect_domain(const typed::set<pair<Domain2, Range2>> &set) const
16229{
16230  auto res = isl::aff::intersect_domain(set);
16231  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16232}
16233
16234template <typename Domain2, typename Range2>
16235typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::intersect_domain(const typed::space<pair<Domain2, Range2>> &space) const
16236{
16237  auto res = isl::aff::intersect_domain(space);
16238  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16239}
16240
16241template <typename Domain2, typename Range2>
16242typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const
16243{
16244  auto res = isl::aff::intersect_domain(uset);
16245  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16246}
16247
16248template <typename Domain2, typename Range2>
16249typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::intersect_domain_wrapped_domain(const typed::union_set<Domain2> &uset) const
16250{
16251  auto res = isl::aff::intersect_domain_wrapped_domain(uset);
16252  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16253}
16254
16255template <typename Domain2, typename Range2>
16256typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::intersect_params(const typed::set<> &set) const
16257{
16258  auto res = isl::aff::intersect_params(set);
16259  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16260}
16261
16262template <typename Domain2, typename Range2>
16263typed::set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::le_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const
16264{
16265  auto res = isl::aff::le_set(aff2);
16266  return typed::set<pair<Domain2, Range2>>(res);
16267}
16268
16269template <typename Domain2, typename Range2>
16270typed::set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::le_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
16271{
16272  auto res = isl::aff::le_set(pwaff2);
16273  return typed::set<pair<Domain2, Range2>>(res);
16274}
16275
16276template <typename Domain2, typename Range2>
16277typed::aff_list<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::list() const
16278{
16279  auto res = isl::aff::list();
16280  return typed::aff_list<pair<Domain2, Range2>, Anonymous>(res);
16281}
16282
16283template <typename Domain2, typename Range2>
16284typed::set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::lt_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const
16285{
16286  auto res = isl::aff::lt_set(aff2);
16287  return typed::set<pair<Domain2, Range2>>(res);
16288}
16289
16290template <typename Domain2, typename Range2>
16291typed::set<pair<Domain2, Range2>> typed::aff<pair<Domain2, Range2>, Anonymous>::lt_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
16292{
16293  auto res = isl::aff::lt_set(pwaff2);
16294  return typed::set<pair<Domain2, Range2>>(res);
16295}
16296
16297template <typename Domain2, typename Range2>
16298typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::max(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
16299{
16300  auto res = isl::aff::max(multi2);
16301  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16302}
16303
16304template <typename Domain2, typename Range2>
16305typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::max(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
16306{
16307  auto res = isl::aff::max(pwaff2);
16308  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16309}
16310
16311template <typename Domain2, typename Range2>
16312typed::multi_val<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::max_multi_val() const
16313{
16314  auto res = isl::aff::max_multi_val();
16315  return typed::multi_val<Anonymous>(res);
16316}
16317
16318template <typename Domain2, typename Range2>
16319typed::val<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::max_val() const
16320{
16321  auto res = isl::aff::max_val();
16322  return typed::val<Anonymous>(res);
16323}
16324
16325template <typename Domain2, typename Range2>
16326typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::min(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
16327{
16328  auto res = isl::aff::min(multi2);
16329  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16330}
16331
16332template <typename Domain2, typename Range2>
16333typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::min(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
16334{
16335  auto res = isl::aff::min(pwaff2);
16336  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16337}
16338
16339template <typename Domain2, typename Range2>
16340typed::multi_val<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::min_multi_val() const
16341{
16342  auto res = isl::aff::min_multi_val();
16343  return typed::multi_val<Anonymous>(res);
16344}
16345
16346template <typename Domain2, typename Range2>
16347typed::val<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::min_val() const
16348{
16349  auto res = isl::aff::min_val();
16350  return typed::val<Anonymous>(res);
16351}
16352
16353template <typename Domain2, typename Range2>
16354typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::mod(const typed::val<Anonymous> &mod) const
16355{
16356  auto res = isl::aff::mod(mod);
16357  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16358}
16359
16360template <typename Domain2, typename Range2>
16361typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::mod(long mod) const
16362{
16363  auto res = isl::aff::mod(mod);
16364  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16365}
16366
16367template <typename Domain2, typename Range2>
16368typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::neg() const
16369{
16370  auto res = isl::aff::neg();
16371  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16372}
16373
16374template <typename Domain2, typename Range2>
16375typed::set<> typed::aff<pair<Domain2, Range2>, Anonymous>::params() const
16376{
16377  auto res = isl::aff::params();
16378  return typed::set<>(res);
16379}
16380
16381template <typename Domain2, typename Range2>
16382template <typename Domain3>
16383typed::pw_multi_aff<pair<Domain3, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain2> &pma2) const
16384{
16385  auto res = isl::aff::preimage_domain_wrapped_domain(pma2);
16386  return typed::pw_multi_aff<pair<Domain3, Range2>, Anonymous>(res);
16387}
16388
16389template <typename Domain2, typename Range2>
16390template <typename Domain3>
16391typed::union_pw_multi_aff<pair<Domain3, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain2> &upma2) const
16392{
16393  auto res = isl::aff::preimage_domain_wrapped_domain(upma2);
16394  return typed::union_pw_multi_aff<pair<Domain3, Range2>, Anonymous>(res);
16395}
16396
16397template <typename Domain2, typename Range2>
16398template <typename Arg1, typename Arg2>
16399typed::multi_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> typed::aff<pair<Domain2, Range2>, Anonymous>::product(const typed::multi_aff<Arg1, Arg2> &multi2) const
16400{
16401  auto res = isl::aff::product(multi2);
16402  return typed::multi_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>>(res);
16403}
16404
16405template <typename Domain2, typename Range2>
16406template <typename Arg1, typename Arg2>
16407typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> typed::aff<pair<Domain2, Range2>, Anonymous>::product(const typed::multi_pw_aff<Arg1, Arg2> &multi2) const
16408{
16409  auto res = isl::aff::product(multi2);
16410  return typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>>(res);
16411}
16412
16413template <typename Domain2, typename Range2>
16414template <typename Arg1, typename Arg2>
16415typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> typed::aff<pair<Domain2, Range2>, Anonymous>::product(const typed::pw_multi_aff<Arg1, Arg2> &pma2) const
16416{
16417  auto res = isl::aff::product(pma2);
16418  return typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>>(res);
16419}
16420
16421template <typename Domain2, typename Range2>
16422template <typename Arg1>
16423typed::aff<Arg1, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::multi_aff<Arg1, pair<Domain2, Range2>> &ma) const
16424{
16425  auto res = isl::aff::pullback(ma);
16426  return typed::aff<Arg1, Anonymous>(res);
16427}
16428
16429template <typename Domain2, typename Range2>
16430typed::aff<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma) const
16431{
16432  auto res = isl::aff::pullback(ma);
16433  return typed::aff<Anonymous>(res);
16434}
16435
16436template <typename Domain2, typename Range2>
16437template <typename Arg1>
16438typed::pw_aff<Arg1, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::multi_pw_aff<Arg1, pair<Domain2, Range2>> &mpa) const
16439{
16440  auto res = isl::aff::pullback(mpa);
16441  return typed::pw_aff<Arg1, Anonymous>(res);
16442}
16443
16444template <typename Domain2, typename Range2>
16445typed::pw_aff<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa) const
16446{
16447  auto res = isl::aff::pullback(mpa);
16448  return typed::pw_aff<Anonymous>(res);
16449}
16450
16451template <typename Domain2, typename Range2>
16452template <typename Arg1>
16453typed::pw_aff<Arg1, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::pw_multi_aff<Arg1, pair<Domain2, Range2>> &pma) const
16454{
16455  auto res = isl::aff::pullback(pma);
16456  return typed::pw_aff<Arg1, Anonymous>(res);
16457}
16458
16459template <typename Domain2, typename Range2>
16460typed::pw_aff<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma) const
16461{
16462  auto res = isl::aff::pullback(pma);
16463  return typed::pw_aff<Anonymous>(res);
16464}
16465
16466template <typename Domain2, typename Range2>
16467template <typename Arg1>
16468typed::union_pw_aff<Arg1, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::union_pw_multi_aff<Arg1, pair<Domain2, Range2>> &upma) const
16469{
16470  auto res = isl::aff::pullback(upma);
16471  return typed::union_pw_aff<Arg1, Anonymous>(res);
16472}
16473
16474template <typename Domain2, typename Range2>
16475typed::union_pw_aff<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma) const
16476{
16477  auto res = isl::aff::pullback(upma);
16478  return typed::union_pw_aff<Anonymous>(res);
16479}
16480
16481template <typename Domain2, typename Range2>
16482template <typename Arg1>
16483typed::aff<Arg1, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::aff<Arg1, pair<Domain2, Range2>> &ma) const
16484{
16485  auto res = isl::aff::pullback(ma);
16486  return typed::aff<Arg1, Anonymous>(res);
16487}
16488
16489template <typename Domain2, typename Range2>
16490typed::aff<Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::aff<pair<Domain2, Range2>> &ma) const
16491{
16492  auto res = isl::aff::pullback(ma);
16493  return typed::aff<Anonymous>(res);
16494}
16495
16496template <typename Domain2, typename Range2>
16497typed::pw_multi_aff_list<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::pw_multi_aff_list() const
16498{
16499  auto res = isl::aff::pw_multi_aff_list();
16500  return typed::pw_multi_aff_list<pair<Domain2, Range2>, Anonymous>(res);
16501}
16502
16503template <typename Domain2, typename Range2>
16504template <typename Arg1>
16505typed::multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> typed::aff<pair<Domain2, Range2>, Anonymous>::range_product(const typed::multi_aff<pair<Domain2, Range2>, Arg1> &multi2) const
16506{
16507  auto res = isl::aff::range_product(multi2);
16508  return typed::multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>>(res);
16509}
16510
16511template <typename Domain2, typename Range2>
16512template <typename Arg1>
16513typed::multi_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> typed::aff<pair<Domain2, Range2>, Anonymous>::range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg1> &multi2) const
16514{
16515  auto res = isl::aff::range_product(multi2);
16516  return typed::multi_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>>(res);
16517}
16518
16519template <typename Domain2, typename Range2>
16520template <typename Arg1>
16521typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> typed::aff<pair<Domain2, Range2>, Anonymous>::range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg1> &multi2) const
16522{
16523  auto res = isl::aff::range_product(multi2);
16524  return typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>>(res);
16525}
16526
16527template <typename Domain2, typename Range2>
16528template <typename Arg1>
16529typed::pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> typed::aff<pair<Domain2, Range2>, Anonymous>::range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> &pma2) const
16530{
16531  auto res = isl::aff::range_product(pma2);
16532  return typed::pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>>(res);
16533}
16534
16535template <typename Domain2, typename Range2>
16536template <typename Arg1>
16537typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> typed::aff<pair<Domain2, Range2>, Anonymous>::range_product(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1> &upma2) const
16538{
16539  auto res = isl::aff::range_product(upma2);
16540  return typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>>(res);
16541}
16542
16543template <typename Domain2, typename Range2>
16544typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::scale(const typed::val<Anonymous> &v) const
16545{
16546  auto res = isl::aff::scale(v);
16547  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16548}
16549
16550template <typename Domain2, typename Range2>
16551typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::scale(long v) const
16552{
16553  auto res = isl::aff::scale(v);
16554  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16555}
16556
16557template <typename Domain2, typename Range2>
16558typed::multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::scale(const typed::multi_val<Anonymous> &mv) const
16559{
16560  auto res = isl::aff::scale(mv);
16561  return typed::multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16562}
16563
16564template <typename Domain2, typename Range2>
16565typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::scale_down(const typed::val<Anonymous> &v) const
16566{
16567  auto res = isl::aff::scale_down(v);
16568  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16569}
16570
16571template <typename Domain2, typename Range2>
16572typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::scale_down(long v) const
16573{
16574  auto res = isl::aff::scale_down(v);
16575  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16576}
16577
16578template <typename Domain2, typename Range2>
16579typed::multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::scale_down(const typed::multi_val<Anonymous> &mv) const
16580{
16581  auto res = isl::aff::scale_down(mv);
16582  return typed::multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16583}
16584
16585template <typename Domain2, typename Range2>
16586typed::multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::set_at(int pos, const typed::aff<pair<Domain2, Range2>, Anonymous> &el) const
16587{
16588  auto res = isl::aff::set_at(pos, el);
16589  return typed::multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16590}
16591
16592template <typename Domain2, typename Range2>
16593typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
16594{
16595  auto res = isl::aff::set_at(pos, el);
16596  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16597}
16598
16599template <typename Domain2, typename Range2>
16600typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
16601{
16602  auto res = isl::aff::set_at(pos, el);
16603  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16604}
16605
16606template <typename Domain2, typename Range2>
16607template <typename Arg1>
16608typed::multi_aff<pair<Domain2, Range2>, Arg1> typed::aff<pair<Domain2, Range2>, Anonymous>::set_range_tuple(const typed::id<Anonymous> &id) const
16609{
16610  auto res = isl::aff::set_range_tuple(id);
16611  return typed::multi_aff<pair<Domain2, Range2>, Arg1>(res);
16612}
16613
16614template <typename Domain2, typename Range2>
16615template <typename Arg1>
16616typed::multi_aff<pair<Domain2, Range2>, Arg1> typed::aff<pair<Domain2, Range2>, Anonymous>::set_range_tuple(const std::string &id) const
16617{
16618  auto res = isl::aff::set_range_tuple(id);
16619  return typed::multi_aff<pair<Domain2, Range2>, Arg1>(res);
16620}
16621
16622template <typename Domain2, typename Range2>
16623typed::space<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::space() const
16624{
16625  auto res = isl::aff::space();
16626  return typed::space<pair<Domain2, Range2>, Anonymous>(res);
16627}
16628
16629template <typename Domain2, typename Range2>
16630typed::aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff2) const
16631{
16632  auto res = isl::aff::sub(aff2);
16633  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
16634}
16635
16636template <typename Domain2, typename Range2>
16637typed::multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::multi_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
16638{
16639  auto res = isl::aff::sub(multi2);
16640  return typed::multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16641}
16642
16643template <typename Domain2, typename Range2>
16644typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
16645{
16646  auto res = isl::aff::sub(multi2);
16647  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16648}
16649
16650template <typename Domain2, typename Range2>
16651typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
16652{
16653  auto res = isl::aff::sub(multi2);
16654  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16655}
16656
16657template <typename Domain2, typename Range2>
16658typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
16659{
16660  auto res = isl::aff::sub(pwaff2);
16661  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16662}
16663
16664template <typename Domain2, typename Range2>
16665typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const
16666{
16667  auto res = isl::aff::sub(pma2);
16668  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16669}
16670
16671template <typename Domain2, typename Range2>
16672typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const
16673{
16674  auto res = isl::aff::sub(upa2);
16675  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16676}
16677
16678template <typename Domain2, typename Range2>
16679typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const
16680{
16681  auto res = isl::aff::sub(upma2);
16682  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16683}
16684
16685template <typename Domain2, typename Range2>
16686typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::subtract_domain(const typed::set<pair<Domain2, Range2>> &set) const
16687{
16688  auto res = isl::aff::subtract_domain(set);
16689  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16690}
16691
16692template <typename Domain2, typename Range2>
16693typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::subtract_domain(const typed::space<pair<Domain2, Range2>> &space) const
16694{
16695  auto res = isl::aff::subtract_domain(space);
16696  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16697}
16698
16699template <typename Domain2, typename Range2>
16700typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::subtract_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const
16701{
16702  auto res = isl::aff::subtract_domain(uset);
16703  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16704}
16705
16706template <typename Domain2, typename Range2>
16707typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::to_multi_pw_aff() const
16708{
16709  auto res = isl::aff::to_multi_pw_aff();
16710  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16711}
16712
16713template <typename Domain2, typename Range2>
16714typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::to_multi_union_pw_aff() const
16715{
16716  auto res = isl::aff::to_multi_union_pw_aff();
16717  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16718}
16719
16720template <typename Domain2, typename Range2>
16721typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::to_pw_multi_aff() const
16722{
16723  auto res = isl::aff::to_pw_multi_aff();
16724  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16725}
16726
16727template <typename Domain2, typename Range2>
16728typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::to_union_pw_aff() const
16729{
16730  auto res = isl::aff::to_union_pw_aff();
16731  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16732}
16733
16734template <typename Domain2, typename Range2>
16735typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::to_union_pw_multi_aff() const
16736{
16737  auto res = isl::aff::to_union_pw_multi_aff();
16738  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16739}
16740
16741template <typename Domain2, typename Range2>
16742typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &mpa2) const
16743{
16744  auto res = isl::aff::union_add(mpa2);
16745  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16746}
16747
16748template <typename Domain2, typename Range2>
16749typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &mupa2) const
16750{
16751  auto res = isl::aff::union_add(mupa2);
16752  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16753}
16754
16755template <typename Domain2, typename Range2>
16756typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
16757{
16758  auto res = isl::aff::union_add(pwaff2);
16759  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16760}
16761
16762template <typename Domain2, typename Range2>
16763typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const
16764{
16765  auto res = isl::aff::union_add(pma2);
16766  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16767}
16768
16769template <typename Domain2, typename Range2>
16770typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const
16771{
16772  auto res = isl::aff::union_add(upa2);
16773  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
16774}
16775
16776template <typename Domain2, typename Range2>
16777typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const
16778{
16779  auto res = isl::aff::union_add(upma2);
16780  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
16781}
16782
16783typed::aff_list<Anonymous>::aff_list(const isl::ctx &ctx, int n)
16784  : isl::aff_list(ctx, n)
16785{
16786}
16787
16788typed::aff_list<Anonymous>::aff_list(const typed::aff<Anonymous> &el)
16789  : isl::aff_list(el)
16790{
16791}
16792
16793typed::aff_list<Anonymous>::aff_list(const isl::ctx &ctx, const std::string &str)
16794  : isl::aff_list(ctx, str)
16795{
16796}
16797
16798typed::aff_list<Anonymous> typed::aff_list<Anonymous>::add(const typed::aff<Anonymous> &el) const
16799{
16800  auto res = isl::aff_list::add(el);
16801  return typed::aff_list<Anonymous>(res);
16802}
16803
16804typed::aff<Anonymous> typed::aff_list<Anonymous>::at(int index) const
16805{
16806  auto res = isl::aff_list::at(index);
16807  return typed::aff<Anonymous>(res);
16808}
16809
16810typed::aff_list<Anonymous> typed::aff_list<Anonymous>::drop(unsigned int first, unsigned int n) const
16811{
16812  auto res = isl::aff_list::drop(first, n);
16813  return typed::aff_list<Anonymous>(res);
16814}
16815
16816void typed::aff_list<Anonymous>::foreach(const std::function<void(typed::aff<Anonymous>)> &fn) const
16817{
16818  auto lambda_fn = [&] (isl::aff arg0) {
16819    return fn(typed::aff<Anonymous>(arg0));
16820  };
16821  return isl::aff_list::foreach(lambda_fn);
16822}
16823
16824void typed::aff_list<Anonymous>::foreach_scc(const std::function<bool(typed::aff<Anonymous>, typed::aff<Anonymous>)> &follows, const std::function<void(typed::aff_list<Anonymous>)> &fn) const
16825{
16826  auto lambda_follows = [&] (isl::aff arg0, isl::aff arg1) {
16827    return follows(typed::aff<Anonymous>(arg0), typed::aff<Anonymous>(arg1));
16828  };
16829  auto lambda_fn = [&] (isl::aff_list arg0) {
16830    return fn(typed::aff_list<Anonymous>(arg0));
16831  };
16832  return isl::aff_list::foreach_scc(lambda_follows, lambda_fn);
16833}
16834
16835typed::aff_list<Anonymous> typed::aff_list<Anonymous>::set_at(int index, const typed::aff<Anonymous> &el) const
16836{
16837  auto res = isl::aff_list::set_at(index, el);
16838  return typed::aff_list<Anonymous>(res);
16839}
16840
16841template <typename Domain>
16842typed::aff_list<Domain, Anonymous>::aff_list(const isl::ctx &ctx, int n)
16843  : isl::aff_list(ctx, n)
16844{
16845}
16846
16847template <typename Domain>
16848typed::aff_list<Domain, Anonymous>::aff_list(const typed::aff<Domain, Anonymous> &el)
16849  : isl::aff_list(el)
16850{
16851}
16852
16853template <typename Domain>
16854typed::aff_list<Domain, Anonymous>::aff_list(const isl::ctx &ctx, const std::string &str)
16855  : isl::aff_list(ctx, str)
16856{
16857}
16858
16859template <typename Domain>
16860typed::aff_list<Domain, Anonymous> typed::aff_list<Domain, Anonymous>::add(const typed::aff<Domain, Anonymous> &el) const
16861{
16862  auto res = isl::aff_list::add(el);
16863  return typed::aff_list<Domain, Anonymous>(res);
16864}
16865
16866template <typename Domain>
16867typed::aff<Domain, Anonymous> typed::aff_list<Domain, Anonymous>::at(int index) const
16868{
16869  auto res = isl::aff_list::at(index);
16870  return typed::aff<Domain, Anonymous>(res);
16871}
16872
16873template <typename Domain>
16874typed::aff_list<Domain, Anonymous> typed::aff_list<Domain, Anonymous>::drop(unsigned int first, unsigned int n) const
16875{
16876  auto res = isl::aff_list::drop(first, n);
16877  return typed::aff_list<Domain, Anonymous>(res);
16878}
16879
16880template <typename Domain>
16881void typed::aff_list<Domain, Anonymous>::foreach(const std::function<void(typed::aff<Domain, Anonymous>)> &fn) const
16882{
16883  auto lambda_fn = [&] (isl::aff arg0) {
16884    return fn(typed::aff<Domain, Anonymous>(arg0));
16885  };
16886  return isl::aff_list::foreach(lambda_fn);
16887}
16888
16889template <typename Domain>
16890void typed::aff_list<Domain, Anonymous>::foreach_scc(const std::function<bool(typed::aff<Domain, Anonymous>, typed::aff<Domain, Anonymous>)> &follows, const std::function<void(typed::aff_list<Domain, Anonymous>)> &fn) const
16891{
16892  auto lambda_follows = [&] (isl::aff arg0, isl::aff arg1) {
16893    return follows(typed::aff<Domain, Anonymous>(arg0), typed::aff<Domain, Anonymous>(arg1));
16894  };
16895  auto lambda_fn = [&] (isl::aff_list arg0) {
16896    return fn(typed::aff_list<Domain, Anonymous>(arg0));
16897  };
16898  return isl::aff_list::foreach_scc(lambda_follows, lambda_fn);
16899}
16900
16901template <typename Domain>
16902typed::aff_list<Domain, Anonymous> typed::aff_list<Domain, Anonymous>::set_at(int index, const typed::aff<Domain, Anonymous> &el) const
16903{
16904  auto res = isl::aff_list::set_at(index, el);
16905  return typed::aff_list<Domain, Anonymous>(res);
16906}
16907
16908template <typename Domain, typename Range>
16909typed::basic_map<Domain, Range>::basic_map(const isl::ctx &ctx, const std::string &str)
16910  : isl::basic_map(ctx, str)
16911{
16912}
16913
16914template <typename Domain, typename Range>
16915template <typename Domain2>
16916typed::basic_map<Domain2, Range> typed::basic_map<Domain, Range>::apply_domain(const typed::basic_map<Domain, Domain2> &bmap2) const
16917{
16918  auto res = isl::basic_map::apply_domain(bmap2);
16919  return typed::basic_map<Domain2, Range>(res);
16920}
16921
16922template <typename Domain, typename Range>
16923template <typename Domain2>
16924typed::map<Domain2, Range> typed::basic_map<Domain, Range>::apply_domain(const typed::map<Domain, Domain2> &map2) const
16925{
16926  auto res = isl::basic_map::apply_domain(map2);
16927  return typed::map<Domain2, Range>(res);
16928}
16929
16930template <typename Domain, typename Range>
16931template <typename Domain2>
16932typed::union_map<Domain2, Range> typed::basic_map<Domain, Range>::apply_domain(const typed::union_map<Domain, Domain2> &umap2) const
16933{
16934  auto res = isl::basic_map::apply_domain(umap2);
16935  return typed::union_map<Domain2, Range>(res);
16936}
16937
16938template <typename Domain, typename Range>
16939template <typename Range2>
16940typed::basic_map<Domain, Range2> typed::basic_map<Domain, Range>::apply_range(const typed::basic_map<Range, Range2> &bmap2) const
16941{
16942  auto res = isl::basic_map::apply_range(bmap2);
16943  return typed::basic_map<Domain, Range2>(res);
16944}
16945
16946template <typename Domain, typename Range>
16947template <typename Range2>
16948typed::map<Domain, Range2> typed::basic_map<Domain, Range>::apply_range(const typed::map<Range, Range2> &map2) const
16949{
16950  auto res = isl::basic_map::apply_range(map2);
16951  return typed::map<Domain, Range2>(res);
16952}
16953
16954template <typename Domain, typename Range>
16955template <typename Range2>
16956typed::union_map<Domain, Range2> typed::basic_map<Domain, Range>::apply_range(const typed::union_map<Range, Range2> &umap2) const
16957{
16958  auto res = isl::basic_map::apply_range(umap2);
16959  return typed::union_map<Domain, Range2>(res);
16960}
16961
16962template <typename Domain, typename Range>
16963typed::map<Domain, Range> typed::basic_map<Domain, Range>::as_map() const
16964{
16965  auto res = isl::basic_map::as_map();
16966  return typed::map<Domain, Range>(res);
16967}
16968
16969template <typename Domain, typename Range>
16970typed::multi_union_pw_aff<Domain, Range> typed::basic_map<Domain, Range>::as_multi_union_pw_aff() const
16971{
16972  auto res = isl::basic_map::as_multi_union_pw_aff();
16973  return typed::multi_union_pw_aff<Domain, Range>(res);
16974}
16975
16976template <typename Domain, typename Range>
16977typed::pw_multi_aff<Domain, Range> typed::basic_map<Domain, Range>::as_pw_multi_aff() const
16978{
16979  auto res = isl::basic_map::as_pw_multi_aff();
16980  return typed::pw_multi_aff<Domain, Range>(res);
16981}
16982
16983template <typename Domain, typename Range>
16984typed::union_pw_multi_aff<Domain, Range> typed::basic_map<Domain, Range>::as_union_pw_multi_aff() const
16985{
16986  auto res = isl::basic_map::as_union_pw_multi_aff();
16987  return typed::union_pw_multi_aff<Domain, Range>(res);
16988}
16989
16990template <typename Domain, typename Range>
16991typed::set<Range> typed::basic_map<Domain, Range>::bind_domain(const typed::multi_id<Domain> &tuple) const
16992{
16993  auto res = isl::basic_map::bind_domain(tuple);
16994  return typed::set<Range>(res);
16995}
16996
16997template <typename Domain, typename Range>
16998typed::set<Domain> typed::basic_map<Domain, Range>::bind_range(const typed::multi_id<Range> &tuple) const
16999{
17000  auto res = isl::basic_map::bind_range(tuple);
17001  return typed::set<Domain>(res);
17002}
17003
17004template <typename Domain, typename Range>
17005typed::map<Domain, Range> typed::basic_map<Domain, Range>::coalesce() const
17006{
17007  auto res = isl::basic_map::coalesce();
17008  return typed::map<Domain, Range>(res);
17009}
17010
17011template <typename Domain, typename Range>
17012typed::basic_map<Domain, Range> typed::basic_map<Domain, Range>::detect_equalities() const
17013{
17014  auto res = isl::basic_map::detect_equalities();
17015  return typed::basic_map<Domain, Range>(res);
17016}
17017
17018template <typename Domain, typename Range>
17019typed::set<Domain> typed::basic_map<Domain, Range>::domain() const
17020{
17021  auto res = isl::basic_map::domain();
17022  return typed::set<Domain>(res);
17023}
17024
17025template <typename Domain, typename Range>
17026typed::union_map<pair<Domain, Range>, Domain> typed::basic_map<Domain, Range>::domain_map() const
17027{
17028  auto res = isl::basic_map::domain_map();
17029  return typed::union_map<pair<Domain, Range>, Domain>(res);
17030}
17031
17032template <typename Domain, typename Range>
17033typed::union_pw_multi_aff<pair<Domain, Range>, Domain> typed::basic_map<Domain, Range>::domain_map_union_pw_multi_aff() const
17034{
17035  auto res = isl::basic_map::domain_map_union_pw_multi_aff();
17036  return typed::union_pw_multi_aff<pair<Domain, Range>, Domain>(res);
17037}
17038
17039template <typename Domain, typename Range>
17040template <typename Domain2>
17041typed::map<pair<Domain, Domain2>, Range> typed::basic_map<Domain, Range>::domain_product(const typed::map<Domain2, Range> &map2) const
17042{
17043  auto res = isl::basic_map::domain_product(map2);
17044  return typed::map<pair<Domain, Domain2>, Range>(res);
17045}
17046
17047template <typename Domain, typename Range>
17048template <typename Domain2>
17049typed::union_map<pair<Domain, Domain2>, Range> typed::basic_map<Domain, Range>::domain_product(const typed::union_map<Domain2, Range> &umap2) const
17050{
17051  auto res = isl::basic_map::domain_product(umap2);
17052  return typed::union_map<pair<Domain, Domain2>, Range>(res);
17053}
17054
17055template <typename Domain, typename Range>
17056typed::map<Domain, Range> typed::basic_map<Domain, Range>::drop_unused_params() const
17057{
17058  auto res = isl::basic_map::drop_unused_params();
17059  return typed::map<Domain, Range>(res);
17060}
17061
17062template <typename Domain, typename Range>
17063bool typed::basic_map<Domain, Range>::every_map(const std::function<bool(typed::map<Domain, Range>)> &test) const
17064{
17065  auto lambda_test = [&] (isl::map arg0) {
17066    return test(typed::map<Domain, Range>(arg0));
17067  };
17068  return isl::basic_map::every_map(lambda_test);
17069}
17070
17071template <typename Domain, typename Range>
17072typed::map<Domain, Range> typed::basic_map<Domain, Range>::extract_map(const typed::space<Domain, Range> &space) const
17073{
17074  auto res = isl::basic_map::extract_map(space);
17075  return typed::map<Domain, Range>(res);
17076}
17077
17078template <typename Domain, typename Range>
17079void typed::basic_map<Domain, Range>::foreach_basic_map(const std::function<void(typed::basic_map<Domain, Range>)> &fn) const
17080{
17081  auto lambda_fn = [&] (isl::basic_map arg0) {
17082    return fn(typed::basic_map<Domain, Range>(arg0));
17083  };
17084  return isl::basic_map::foreach_basic_map(lambda_fn);
17085}
17086
17087template <typename Domain, typename Range>
17088void typed::basic_map<Domain, Range>::foreach_map(const std::function<void(typed::map<Domain, Range>)> &fn) const
17089{
17090  auto lambda_fn = [&] (isl::map arg0) {
17091    return fn(typed::map<Domain, Range>(arg0));
17092  };
17093  return isl::basic_map::foreach_map(lambda_fn);
17094}
17095
17096template <typename Domain, typename Range>
17097typed::basic_map<Domain, Range> typed::basic_map<Domain, Range>::gist(const typed::basic_map<Domain, Range> &context) const
17098{
17099  auto res = isl::basic_map::gist(context);
17100  return typed::basic_map<Domain, Range>(res);
17101}
17102
17103template <typename Domain, typename Range>
17104typed::map<Domain, Range> typed::basic_map<Domain, Range>::gist(const typed::map<Domain, Range> &context) const
17105{
17106  auto res = isl::basic_map::gist(context);
17107  return typed::map<Domain, Range>(res);
17108}
17109
17110template <typename Domain, typename Range>
17111typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::gist(const typed::union_map<Domain, Range> &context) const
17112{
17113  auto res = isl::basic_map::gist(context);
17114  return typed::union_map<Domain, Range>(res);
17115}
17116
17117template <typename Domain, typename Range>
17118typed::map<Domain, Range> typed::basic_map<Domain, Range>::gist_domain(const typed::set<Domain> &context) const
17119{
17120  auto res = isl::basic_map::gist_domain(context);
17121  return typed::map<Domain, Range>(res);
17122}
17123
17124template <typename Domain, typename Range>
17125typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::gist_domain(const typed::union_set<Domain> &uset) const
17126{
17127  auto res = isl::basic_map::gist_domain(uset);
17128  return typed::union_map<Domain, Range>(res);
17129}
17130
17131template <typename Domain, typename Range>
17132typed::map<Domain, Range> typed::basic_map<Domain, Range>::gist_params(const typed::set<> &context) const
17133{
17134  auto res = isl::basic_map::gist_params(context);
17135  return typed::map<Domain, Range>(res);
17136}
17137
17138template <typename Domain, typename Range>
17139typed::basic_map<Domain, Range> typed::basic_map<Domain, Range>::intersect(const typed::basic_map<Domain, Range> &bmap2) const
17140{
17141  auto res = isl::basic_map::intersect(bmap2);
17142  return typed::basic_map<Domain, Range>(res);
17143}
17144
17145template <typename Domain, typename Range>
17146typed::map<Domain, Range> typed::basic_map<Domain, Range>::intersect(const typed::map<Domain, Range> &map2) const
17147{
17148  auto res = isl::basic_map::intersect(map2);
17149  return typed::map<Domain, Range>(res);
17150}
17151
17152template <typename Domain, typename Range>
17153typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::intersect(const typed::union_map<Domain, Range> &umap2) const
17154{
17155  auto res = isl::basic_map::intersect(umap2);
17156  return typed::union_map<Domain, Range>(res);
17157}
17158
17159template <typename Domain, typename Range>
17160typed::basic_map<Domain, Range> typed::basic_map<Domain, Range>::intersect_domain(const typed::basic_set<Domain> &bset) const
17161{
17162  auto res = isl::basic_map::intersect_domain(bset);
17163  return typed::basic_map<Domain, Range>(res);
17164}
17165
17166template <typename Domain, typename Range>
17167typed::map<Domain, Range> typed::basic_map<Domain, Range>::intersect_domain(const typed::set<Domain> &set) const
17168{
17169  auto res = isl::basic_map::intersect_domain(set);
17170  return typed::map<Domain, Range>(res);
17171}
17172
17173template <typename Domain, typename Range>
17174typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::intersect_domain(const typed::space<Domain> &space) const
17175{
17176  auto res = isl::basic_map::intersect_domain(space);
17177  return typed::union_map<Domain, Range>(res);
17178}
17179
17180template <typename Domain, typename Range>
17181typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::intersect_domain(const typed::union_set<Domain> &uset) const
17182{
17183  auto res = isl::basic_map::intersect_domain(uset);
17184  return typed::union_map<Domain, Range>(res);
17185}
17186
17187template <typename Domain, typename Range>
17188typed::basic_map<Domain, Range> typed::basic_map<Domain, Range>::intersect_domain(const typed::point<Domain> &bset) const
17189{
17190  auto res = isl::basic_map::intersect_domain(bset);
17191  return typed::basic_map<Domain, Range>(res);
17192}
17193
17194template <typename Domain, typename Range>
17195typed::map<Domain, Range> typed::basic_map<Domain, Range>::intersect_params(const typed::set<> &params) const
17196{
17197  auto res = isl::basic_map::intersect_params(params);
17198  return typed::map<Domain, Range>(res);
17199}
17200
17201template <typename Domain, typename Range>
17202typed::basic_map<Domain, Range> typed::basic_map<Domain, Range>::intersect_range(const typed::basic_set<Range> &bset) const
17203{
17204  auto res = isl::basic_map::intersect_range(bset);
17205  return typed::basic_map<Domain, Range>(res);
17206}
17207
17208template <typename Domain, typename Range>
17209typed::map<Domain, Range> typed::basic_map<Domain, Range>::intersect_range(const typed::set<Range> &set) const
17210{
17211  auto res = isl::basic_map::intersect_range(set);
17212  return typed::map<Domain, Range>(res);
17213}
17214
17215template <typename Domain, typename Range>
17216typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::intersect_range(const typed::space<Range> &space) const
17217{
17218  auto res = isl::basic_map::intersect_range(space);
17219  return typed::union_map<Domain, Range>(res);
17220}
17221
17222template <typename Domain, typename Range>
17223typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::intersect_range(const typed::union_set<Range> &uset) const
17224{
17225  auto res = isl::basic_map::intersect_range(uset);
17226  return typed::union_map<Domain, Range>(res);
17227}
17228
17229template <typename Domain, typename Range>
17230typed::basic_map<Domain, Range> typed::basic_map<Domain, Range>::intersect_range(const typed::point<Range> &bset) const
17231{
17232  auto res = isl::basic_map::intersect_range(bset);
17233  return typed::basic_map<Domain, Range>(res);
17234}
17235
17236template <typename Domain, typename Range>
17237typed::map<Domain, Range> typed::basic_map<Domain, Range>::lexmax() const
17238{
17239  auto res = isl::basic_map::lexmax();
17240  return typed::map<Domain, Range>(res);
17241}
17242
17243template <typename Domain, typename Range>
17244typed::pw_multi_aff<Domain, Range> typed::basic_map<Domain, Range>::lexmax_pw_multi_aff() const
17245{
17246  auto res = isl::basic_map::lexmax_pw_multi_aff();
17247  return typed::pw_multi_aff<Domain, Range>(res);
17248}
17249
17250template <typename Domain, typename Range>
17251typed::map<Domain, Range> typed::basic_map<Domain, Range>::lexmin() const
17252{
17253  auto res = isl::basic_map::lexmin();
17254  return typed::map<Domain, Range>(res);
17255}
17256
17257template <typename Domain, typename Range>
17258typed::pw_multi_aff<Domain, Range> typed::basic_map<Domain, Range>::lexmin_pw_multi_aff() const
17259{
17260  auto res = isl::basic_map::lexmin_pw_multi_aff();
17261  return typed::pw_multi_aff<Domain, Range>(res);
17262}
17263
17264template <typename Domain, typename Range>
17265typed::map<Domain, Range> typed::basic_map<Domain, Range>::lower_bound(const typed::multi_pw_aff<Domain, Range> &lower) const
17266{
17267  auto res = isl::basic_map::lower_bound(lower);
17268  return typed::map<Domain, Range>(res);
17269}
17270
17271template <typename Domain, typename Range>
17272typed::map_list<Domain, Range> typed::basic_map<Domain, Range>::map_list() const
17273{
17274  auto res = isl::basic_map::map_list();
17275  return typed::map_list<Domain, Range>(res);
17276}
17277
17278template <typename Domain, typename Range>
17279typed::multi_pw_aff<Domain, Range> typed::basic_map<Domain, Range>::max_multi_pw_aff() const
17280{
17281  auto res = isl::basic_map::max_multi_pw_aff();
17282  return typed::multi_pw_aff<Domain, Range>(res);
17283}
17284
17285template <typename Domain, typename Range>
17286typed::multi_pw_aff<Domain, Range> typed::basic_map<Domain, Range>::min_multi_pw_aff() const
17287{
17288  auto res = isl::basic_map::min_multi_pw_aff();
17289  return typed::multi_pw_aff<Domain, Range>(res);
17290}
17291
17292template <typename Domain, typename Range>
17293typed::set<> typed::basic_map<Domain, Range>::params() const
17294{
17295  auto res = isl::basic_map::params();
17296  return typed::set<>(res);
17297}
17298
17299template <typename Domain, typename Range>
17300template <typename Domain2>
17301typed::map<Domain2, Range> typed::basic_map<Domain, Range>::preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const
17302{
17303  auto res = isl::basic_map::preimage_domain(ma);
17304  return typed::map<Domain2, Range>(res);
17305}
17306
17307template <typename Domain, typename Range>
17308template <typename Domain2>
17309typed::map<Domain2, Range> typed::basic_map<Domain, Range>::preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
17310{
17311  auto res = isl::basic_map::preimage_domain(mpa);
17312  return typed::map<Domain2, Range>(res);
17313}
17314
17315template <typename Domain, typename Range>
17316template <typename Domain2>
17317typed::map<Domain2, Range> typed::basic_map<Domain, Range>::preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const
17318{
17319  auto res = isl::basic_map::preimage_domain(pma);
17320  return typed::map<Domain2, Range>(res);
17321}
17322
17323template <typename Domain, typename Range>
17324template <typename Domain2>
17325typed::union_map<Domain2, Range> typed::basic_map<Domain, Range>::preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
17326{
17327  auto res = isl::basic_map::preimage_domain(upma);
17328  return typed::union_map<Domain2, Range>(res);
17329}
17330
17331template <typename Domain, typename Range>
17332template <typename Range2>
17333typed::map<Domain, Range2> typed::basic_map<Domain, Range>::preimage_range(const typed::multi_aff<Range2, Range> &ma) const
17334{
17335  auto res = isl::basic_map::preimage_range(ma);
17336  return typed::map<Domain, Range2>(res);
17337}
17338
17339template <typename Domain, typename Range>
17340template <typename Range2>
17341typed::map<Domain, Range2> typed::basic_map<Domain, Range>::preimage_range(const typed::pw_multi_aff<Range2, Range> &pma) const
17342{
17343  auto res = isl::basic_map::preimage_range(pma);
17344  return typed::map<Domain, Range2>(res);
17345}
17346
17347template <typename Domain, typename Range>
17348template <typename Range2>
17349typed::union_map<Domain, Range2> typed::basic_map<Domain, Range>::preimage_range(const typed::union_pw_multi_aff<Range2, Range> &upma) const
17350{
17351  auto res = isl::basic_map::preimage_range(upma);
17352  return typed::union_map<Domain, Range2>(res);
17353}
17354
17355template <typename Domain, typename Range>
17356template <typename Domain2, typename Range2>
17357typed::map<pair<Domain, Domain2>, pair<Range, Range2>> typed::basic_map<Domain, Range>::product(const typed::map<Domain2, Range2> &map2) const
17358{
17359  auto res = isl::basic_map::product(map2);
17360  return typed::map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
17361}
17362
17363template <typename Domain, typename Range>
17364template <typename Domain2, typename Range2>
17365typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::basic_map<Domain, Range>::product(const typed::union_map<Domain2, Range2> &umap2) const
17366{
17367  auto res = isl::basic_map::product(umap2);
17368  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
17369}
17370
17371template <typename Domain, typename Range>
17372typed::map<Domain, Range> typed::basic_map<Domain, Range>::project_out_all_params() const
17373{
17374  auto res = isl::basic_map::project_out_all_params();
17375  return typed::map<Domain, Range>(res);
17376}
17377
17378template <typename Domain, typename Range>
17379typed::map<Domain, Range> typed::basic_map<Domain, Range>::project_out_param(const typed::id<Anonymous> &id) const
17380{
17381  auto res = isl::basic_map::project_out_param(id);
17382  return typed::map<Domain, Range>(res);
17383}
17384
17385template <typename Domain, typename Range>
17386typed::map<Domain, Range> typed::basic_map<Domain, Range>::project_out_param(const std::string &id) const
17387{
17388  auto res = isl::basic_map::project_out_param(id);
17389  return typed::map<Domain, Range>(res);
17390}
17391
17392template <typename Domain, typename Range>
17393typed::map<Domain, Range> typed::basic_map<Domain, Range>::project_out_param(const typed::id_list<Anonymous> &list) const
17394{
17395  auto res = isl::basic_map::project_out_param(list);
17396  return typed::map<Domain, Range>(res);
17397}
17398
17399template <typename Domain, typename Range>
17400typed::set<Range> typed::basic_map<Domain, Range>::range() const
17401{
17402  auto res = isl::basic_map::range();
17403  return typed::set<Range>(res);
17404}
17405
17406template <typename Domain, typename Range>
17407typed::fixed_box<Domain, Range> typed::basic_map<Domain, Range>::range_lattice_tile() const
17408{
17409  auto res = isl::basic_map::range_lattice_tile();
17410  return typed::fixed_box<Domain, Range>(res);
17411}
17412
17413template <typename Domain, typename Range>
17414typed::union_map<pair<Domain, Range>, Range> typed::basic_map<Domain, Range>::range_map() const
17415{
17416  auto res = isl::basic_map::range_map();
17417  return typed::union_map<pair<Domain, Range>, Range>(res);
17418}
17419
17420template <typename Domain, typename Range>
17421template <typename Range2>
17422typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, Range>::range_product(const typed::map<Domain, Range2> &map2) const
17423{
17424  auto res = isl::basic_map::range_product(map2);
17425  return typed::map<Domain, pair<Range, Range2>>(res);
17426}
17427
17428template <typename Domain, typename Range>
17429template <typename Range2>
17430typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, Range>::range_product(const typed::union_map<Domain, Range2> &umap2) const
17431{
17432  auto res = isl::basic_map::range_product(umap2);
17433  return typed::union_map<Domain, pair<Range, Range2>>(res);
17434}
17435
17436template <typename Domain, typename Range>
17437typed::fixed_box<Domain, Range> typed::basic_map<Domain, Range>::range_simple_fixed_box_hull() const
17438{
17439  auto res = isl::basic_map::range_simple_fixed_box_hull();
17440  return typed::fixed_box<Domain, Range>(res);
17441}
17442
17443template <typename Domain, typename Range>
17444typed::basic_map<Range, Domain> typed::basic_map<Domain, Range>::reverse() const
17445{
17446  auto res = isl::basic_map::reverse();
17447  return typed::basic_map<Range, Domain>(res);
17448}
17449
17450template <typename Domain, typename Range>
17451template <typename Domain2>
17452typed::map<Domain2, Range> typed::basic_map<Domain, Range>::set_domain_tuple(const typed::id<Anonymous> &id) const
17453{
17454  auto res = isl::basic_map::set_domain_tuple(id);
17455  return typed::map<Domain2, Range>(res);
17456}
17457
17458template <typename Domain, typename Range>
17459template <typename Domain2>
17460typed::map<Domain2, Range> typed::basic_map<Domain, Range>::set_domain_tuple(const std::string &id) const
17461{
17462  auto res = isl::basic_map::set_domain_tuple(id);
17463  return typed::map<Domain2, Range>(res);
17464}
17465
17466template <typename Domain, typename Range>
17467template <typename Range2>
17468typed::map<Domain, Range2> typed::basic_map<Domain, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
17469{
17470  auto res = isl::basic_map::set_range_tuple(id);
17471  return typed::map<Domain, Range2>(res);
17472}
17473
17474template <typename Domain, typename Range>
17475template <typename Range2>
17476typed::map<Domain, Range2> typed::basic_map<Domain, Range>::set_range_tuple(const std::string &id) const
17477{
17478  auto res = isl::basic_map::set_range_tuple(id);
17479  return typed::map<Domain, Range2>(res);
17480}
17481
17482template <typename Domain, typename Range>
17483typed::space<Domain, Range> typed::basic_map<Domain, Range>::space() const
17484{
17485  auto res = isl::basic_map::space();
17486  return typed::space<Domain, Range>(res);
17487}
17488
17489template <typename Domain, typename Range>
17490typed::map<Domain, Range> typed::basic_map<Domain, Range>::subtract(const typed::map<Domain, Range> &map2) const
17491{
17492  auto res = isl::basic_map::subtract(map2);
17493  return typed::map<Domain, Range>(res);
17494}
17495
17496template <typename Domain, typename Range>
17497typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::subtract(const typed::union_map<Domain, Range> &umap2) const
17498{
17499  auto res = isl::basic_map::subtract(umap2);
17500  return typed::union_map<Domain, Range>(res);
17501}
17502
17503template <typename Domain, typename Range>
17504typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::subtract_domain(const typed::union_set<Domain> &dom) const
17505{
17506  auto res = isl::basic_map::subtract_domain(dom);
17507  return typed::union_map<Domain, Range>(res);
17508}
17509
17510template <typename Domain, typename Range>
17511typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::subtract_range(const typed::union_set<Range> &dom) const
17512{
17513  auto res = isl::basic_map::subtract_range(dom);
17514  return typed::union_map<Domain, Range>(res);
17515}
17516
17517template <typename Domain, typename Range>
17518typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::to_union_map() const
17519{
17520  auto res = isl::basic_map::to_union_map();
17521  return typed::union_map<Domain, Range>(res);
17522}
17523
17524template <typename Domain, typename Range>
17525typed::map<Domain, Range> typed::basic_map<Domain, Range>::unite(const typed::basic_map<Domain, Range> &bmap2) const
17526{
17527  auto res = isl::basic_map::unite(bmap2);
17528  return typed::map<Domain, Range>(res);
17529}
17530
17531template <typename Domain, typename Range>
17532typed::map<Domain, Range> typed::basic_map<Domain, Range>::unite(const typed::map<Domain, Range> &map2) const
17533{
17534  auto res = isl::basic_map::unite(map2);
17535  return typed::map<Domain, Range>(res);
17536}
17537
17538template <typename Domain, typename Range>
17539typed::union_map<Domain, Range> typed::basic_map<Domain, Range>::unite(const typed::union_map<Domain, Range> &umap2) const
17540{
17541  auto res = isl::basic_map::unite(umap2);
17542  return typed::union_map<Domain, Range>(res);
17543}
17544
17545template <typename Domain, typename Range>
17546typed::map<Domain, Range> typed::basic_map<Domain, Range>::upper_bound(const typed::multi_pw_aff<Domain, Range> &upper) const
17547{
17548  auto res = isl::basic_map::upper_bound(upper);
17549  return typed::map<Domain, Range>(res);
17550}
17551
17552template <typename Domain, typename Range>
17553typed::set<pair<Domain, Range>> typed::basic_map<Domain, Range>::wrap() const
17554{
17555  auto res = isl::basic_map::wrap();
17556  return typed::set<pair<Domain, Range>>(res);
17557}
17558
17559template <typename Domain, typename Range, typename Range2>
17560typed::basic_map<pair<Domain, Range>, Range2>::basic_map(const isl::ctx &ctx, const std::string &str)
17561  : isl::basic_map(ctx, str)
17562{
17563}
17564
17565template <typename Domain, typename Range, typename Range2>
17566template <typename Domain2>
17567typed::basic_map<Domain2, Range2> typed::basic_map<pair<Domain, Range>, Range2>::apply_domain(const typed::basic_map<pair<Domain, Range>, Domain2> &bmap2) const
17568{
17569  auto res = isl::basic_map::apply_domain(bmap2);
17570  return typed::basic_map<Domain2, Range2>(res);
17571}
17572
17573template <typename Domain, typename Range, typename Range2>
17574template <typename Domain2>
17575typed::map<Domain2, Range2> typed::basic_map<pair<Domain, Range>, Range2>::apply_domain(const typed::map<pair<Domain, Range>, Domain2> &map2) const
17576{
17577  auto res = isl::basic_map::apply_domain(map2);
17578  return typed::map<Domain2, Range2>(res);
17579}
17580
17581template <typename Domain, typename Range, typename Range2>
17582template <typename Domain2>
17583typed::union_map<Domain2, Range2> typed::basic_map<pair<Domain, Range>, Range2>::apply_domain(const typed::union_map<pair<Domain, Range>, Domain2> &umap2) const
17584{
17585  auto res = isl::basic_map::apply_domain(umap2);
17586  return typed::union_map<Domain2, Range2>(res);
17587}
17588
17589template <typename Domain, typename Range, typename Range2>
17590template <typename Arg3>
17591typed::basic_map<pair<Domain, Range>, Arg3> typed::basic_map<pair<Domain, Range>, Range2>::apply_range(const typed::basic_map<Range2, Arg3> &bmap2) const
17592{
17593  auto res = isl::basic_map::apply_range(bmap2);
17594  return typed::basic_map<pair<Domain, Range>, Arg3>(res);
17595}
17596
17597template <typename Domain, typename Range, typename Range2>
17598template <typename Arg3>
17599typed::map<pair<Domain, Range>, Arg3> typed::basic_map<pair<Domain, Range>, Range2>::apply_range(const typed::map<Range2, Arg3> &map2) const
17600{
17601  auto res = isl::basic_map::apply_range(map2);
17602  return typed::map<pair<Domain, Range>, Arg3>(res);
17603}
17604
17605template <typename Domain, typename Range, typename Range2>
17606template <typename Arg3>
17607typed::union_map<pair<Domain, Range>, Arg3> typed::basic_map<pair<Domain, Range>, Range2>::apply_range(const typed::union_map<Range2, Arg3> &umap2) const
17608{
17609  auto res = isl::basic_map::apply_range(umap2);
17610  return typed::union_map<pair<Domain, Range>, Arg3>(res);
17611}
17612
17613template <typename Domain, typename Range, typename Range2>
17614typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::as_map() const
17615{
17616  auto res = isl::basic_map::as_map();
17617  return typed::map<pair<Domain, Range>, Range2>(res);
17618}
17619
17620template <typename Domain, typename Range, typename Range2>
17621typed::multi_union_pw_aff<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::as_multi_union_pw_aff() const
17622{
17623  auto res = isl::basic_map::as_multi_union_pw_aff();
17624  return typed::multi_union_pw_aff<pair<Domain, Range>, Range2>(res);
17625}
17626
17627template <typename Domain, typename Range, typename Range2>
17628typed::pw_multi_aff<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::as_pw_multi_aff() const
17629{
17630  auto res = isl::basic_map::as_pw_multi_aff();
17631  return typed::pw_multi_aff<pair<Domain, Range>, Range2>(res);
17632}
17633
17634template <typename Domain, typename Range, typename Range2>
17635typed::union_pw_multi_aff<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::as_union_pw_multi_aff() const
17636{
17637  auto res = isl::basic_map::as_union_pw_multi_aff();
17638  return typed::union_pw_multi_aff<pair<Domain, Range>, Range2>(res);
17639}
17640
17641template <typename Domain, typename Range, typename Range2>
17642typed::set<Range2> typed::basic_map<pair<Domain, Range>, Range2>::bind_domain(const typed::multi_id<pair<Domain, Range>> &tuple) const
17643{
17644  auto res = isl::basic_map::bind_domain(tuple);
17645  return typed::set<Range2>(res);
17646}
17647
17648template <typename Domain, typename Range, typename Range2>
17649typed::set<pair<Domain, Range>> typed::basic_map<pair<Domain, Range>, Range2>::bind_range(const typed::multi_id<Range2> &tuple) const
17650{
17651  auto res = isl::basic_map::bind_range(tuple);
17652  return typed::set<pair<Domain, Range>>(res);
17653}
17654
17655template <typename Domain, typename Range, typename Range2>
17656typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::coalesce() const
17657{
17658  auto res = isl::basic_map::coalesce();
17659  return typed::map<pair<Domain, Range>, Range2>(res);
17660}
17661
17662template <typename Domain, typename Range, typename Range2>
17663typed::map<Domain, pair<Range, Range2>> typed::basic_map<pair<Domain, Range>, Range2>::curry() const
17664{
17665  auto res = isl::basic_map::curry();
17666  return typed::map<Domain, pair<Range, Range2>>(res);
17667}
17668
17669template <typename Domain, typename Range, typename Range2>
17670typed::basic_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::detect_equalities() const
17671{
17672  auto res = isl::basic_map::detect_equalities();
17673  return typed::basic_map<pair<Domain, Range>, Range2>(res);
17674}
17675
17676template <typename Domain, typename Range, typename Range2>
17677typed::set<pair<Domain, Range>> typed::basic_map<pair<Domain, Range>, Range2>::domain() const
17678{
17679  auto res = isl::basic_map::domain();
17680  return typed::set<pair<Domain, Range>>(res);
17681}
17682
17683template <typename Domain, typename Range, typename Range2>
17684typed::map<Domain, Range2> typed::basic_map<pair<Domain, Range>, Range2>::domain_factor_domain() const
17685{
17686  auto res = isl::basic_map::domain_factor_domain();
17687  return typed::map<Domain, Range2>(res);
17688}
17689
17690template <typename Domain, typename Range, typename Range2>
17691typed::map<Range, Range2> typed::basic_map<pair<Domain, Range>, Range2>::domain_factor_range() const
17692{
17693  auto res = isl::basic_map::domain_factor_range();
17694  return typed::map<Range, Range2>(res);
17695}
17696
17697template <typename Domain, typename Range, typename Range2>
17698typed::union_map<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> typed::basic_map<pair<Domain, Range>, Range2>::domain_map() const
17699{
17700  auto res = isl::basic_map::domain_map();
17701  return typed::union_map<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>>(res);
17702}
17703
17704template <typename Domain, typename Range, typename Range2>
17705typed::union_pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> typed::basic_map<pair<Domain, Range>, Range2>::domain_map_union_pw_multi_aff() const
17706{
17707  auto res = isl::basic_map::domain_map_union_pw_multi_aff();
17708  return typed::union_pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>>(res);
17709}
17710
17711template <typename Domain, typename Range, typename Range2>
17712template <typename Domain2>
17713typed::map<pair<pair<Domain, Range>, Domain2>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::domain_product(const typed::map<Domain2, Range2> &map2) const
17714{
17715  auto res = isl::basic_map::domain_product(map2);
17716  return typed::map<pair<pair<Domain, Range>, Domain2>, Range2>(res);
17717}
17718
17719template <typename Domain, typename Range, typename Range2>
17720template <typename Domain2>
17721typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::domain_product(const typed::union_map<Domain2, Range2> &umap2) const
17722{
17723  auto res = isl::basic_map::domain_product(umap2);
17724  return typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2>(res);
17725}
17726
17727template <typename Domain, typename Range, typename Range2>
17728typed::map<pair<Range, Domain>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::domain_reverse() const
17729{
17730  auto res = isl::basic_map::domain_reverse();
17731  return typed::map<pair<Range, Domain>, Range2>(res);
17732}
17733
17734template <typename Domain, typename Range, typename Range2>
17735typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::drop_unused_params() const
17736{
17737  auto res = isl::basic_map::drop_unused_params();
17738  return typed::map<pair<Domain, Range>, Range2>(res);
17739}
17740
17741template <typename Domain, typename Range, typename Range2>
17742bool typed::basic_map<pair<Domain, Range>, Range2>::every_map(const std::function<bool(typed::map<pair<Domain, Range>, Range2>)> &test) const
17743{
17744  auto lambda_test = [&] (isl::map arg0) {
17745    return test(typed::map<pair<Domain, Range>, Range2>(arg0));
17746  };
17747  return isl::basic_map::every_map(lambda_test);
17748}
17749
17750template <typename Domain, typename Range, typename Range2>
17751typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::extract_map(const typed::space<pair<Domain, Range>, Range2> &space) const
17752{
17753  auto res = isl::basic_map::extract_map(space);
17754  return typed::map<pair<Domain, Range>, Range2>(res);
17755}
17756
17757template <typename Domain, typename Range, typename Range2>
17758typed::basic_map<Anonymous, Range2> typed::basic_map<pair<Domain, Range>, Range2>::flatten_domain() const
17759{
17760  auto res = isl::basic_map::flatten_domain();
17761  return typed::basic_map<Anonymous, Range2>(res);
17762}
17763
17764template <typename Domain, typename Range, typename Range2>
17765void typed::basic_map<pair<Domain, Range>, Range2>::foreach_basic_map(const std::function<void(typed::basic_map<pair<Domain, Range>, Range2>)> &fn) const
17766{
17767  auto lambda_fn = [&] (isl::basic_map arg0) {
17768    return fn(typed::basic_map<pair<Domain, Range>, Range2>(arg0));
17769  };
17770  return isl::basic_map::foreach_basic_map(lambda_fn);
17771}
17772
17773template <typename Domain, typename Range, typename Range2>
17774void typed::basic_map<pair<Domain, Range>, Range2>::foreach_map(const std::function<void(typed::map<pair<Domain, Range>, Range2>)> &fn) const
17775{
17776  auto lambda_fn = [&] (isl::map arg0) {
17777    return fn(typed::map<pair<Domain, Range>, Range2>(arg0));
17778  };
17779  return isl::basic_map::foreach_map(lambda_fn);
17780}
17781
17782template <typename Domain, typename Range, typename Range2>
17783typed::basic_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::gist(const typed::basic_map<pair<Domain, Range>, Range2> &context) const
17784{
17785  auto res = isl::basic_map::gist(context);
17786  return typed::basic_map<pair<Domain, Range>, Range2>(res);
17787}
17788
17789template <typename Domain, typename Range, typename Range2>
17790typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::gist(const typed::map<pair<Domain, Range>, Range2> &context) const
17791{
17792  auto res = isl::basic_map::gist(context);
17793  return typed::map<pair<Domain, Range>, Range2>(res);
17794}
17795
17796template <typename Domain, typename Range, typename Range2>
17797typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::gist(const typed::union_map<pair<Domain, Range>, Range2> &context) const
17798{
17799  auto res = isl::basic_map::gist(context);
17800  return typed::union_map<pair<Domain, Range>, Range2>(res);
17801}
17802
17803template <typename Domain, typename Range, typename Range2>
17804typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::gist_domain(const typed::set<pair<Domain, Range>> &context) const
17805{
17806  auto res = isl::basic_map::gist_domain(context);
17807  return typed::map<pair<Domain, Range>, Range2>(res);
17808}
17809
17810template <typename Domain, typename Range, typename Range2>
17811typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::gist_domain(const typed::union_set<pair<Domain, Range>> &uset) const
17812{
17813  auto res = isl::basic_map::gist_domain(uset);
17814  return typed::union_map<pair<Domain, Range>, Range2>(res);
17815}
17816
17817template <typename Domain, typename Range, typename Range2>
17818typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::gist_params(const typed::set<> &context) const
17819{
17820  auto res = isl::basic_map::gist_params(context);
17821  return typed::map<pair<Domain, Range>, Range2>(res);
17822}
17823
17824template <typename Domain, typename Range, typename Range2>
17825typed::basic_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect(const typed::basic_map<pair<Domain, Range>, Range2> &bmap2) const
17826{
17827  auto res = isl::basic_map::intersect(bmap2);
17828  return typed::basic_map<pair<Domain, Range>, Range2>(res);
17829}
17830
17831template <typename Domain, typename Range, typename Range2>
17832typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect(const typed::map<pair<Domain, Range>, Range2> &map2) const
17833{
17834  auto res = isl::basic_map::intersect(map2);
17835  return typed::map<pair<Domain, Range>, Range2>(res);
17836}
17837
17838template <typename Domain, typename Range, typename Range2>
17839typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const
17840{
17841  auto res = isl::basic_map::intersect(umap2);
17842  return typed::union_map<pair<Domain, Range>, Range2>(res);
17843}
17844
17845template <typename Domain, typename Range, typename Range2>
17846typed::basic_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_domain(const typed::basic_set<pair<Domain, Range>> &bset) const
17847{
17848  auto res = isl::basic_map::intersect_domain(bset);
17849  return typed::basic_map<pair<Domain, Range>, Range2>(res);
17850}
17851
17852template <typename Domain, typename Range, typename Range2>
17853typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_domain(const typed::set<pair<Domain, Range>> &set) const
17854{
17855  auto res = isl::basic_map::intersect_domain(set);
17856  return typed::map<pair<Domain, Range>, Range2>(res);
17857}
17858
17859template <typename Domain, typename Range, typename Range2>
17860typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_domain(const typed::space<pair<Domain, Range>> &space) const
17861{
17862  auto res = isl::basic_map::intersect_domain(space);
17863  return typed::union_map<pair<Domain, Range>, Range2>(res);
17864}
17865
17866template <typename Domain, typename Range, typename Range2>
17867typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_domain(const typed::union_set<pair<Domain, Range>> &uset) const
17868{
17869  auto res = isl::basic_map::intersect_domain(uset);
17870  return typed::union_map<pair<Domain, Range>, Range2>(res);
17871}
17872
17873template <typename Domain, typename Range, typename Range2>
17874typed::basic_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_domain(const typed::point<pair<Domain, Range>> &bset) const
17875{
17876  auto res = isl::basic_map::intersect_domain(bset);
17877  return typed::basic_map<pair<Domain, Range>, Range2>(res);
17878}
17879
17880template <typename Domain, typename Range, typename Range2>
17881typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::set<Domain> &domain) const
17882{
17883  auto res = isl::basic_map::intersect_domain_wrapped_domain(domain);
17884  return typed::map<pair<Domain, Range>, Range2>(res);
17885}
17886
17887template <typename Domain, typename Range, typename Range2>
17888typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::union_set<Domain> &domain) const
17889{
17890  auto res = isl::basic_map::intersect_domain_wrapped_domain(domain);
17891  return typed::union_map<pair<Domain, Range>, Range2>(res);
17892}
17893
17894template <typename Domain, typename Range, typename Range2>
17895typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_params(const typed::set<> &params) const
17896{
17897  auto res = isl::basic_map::intersect_params(params);
17898  return typed::map<pair<Domain, Range>, Range2>(res);
17899}
17900
17901template <typename Domain, typename Range, typename Range2>
17902typed::basic_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_range(const typed::basic_set<Range2> &bset) const
17903{
17904  auto res = isl::basic_map::intersect_range(bset);
17905  return typed::basic_map<pair<Domain, Range>, Range2>(res);
17906}
17907
17908template <typename Domain, typename Range, typename Range2>
17909typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_range(const typed::set<Range2> &set) const
17910{
17911  auto res = isl::basic_map::intersect_range(set);
17912  return typed::map<pair<Domain, Range>, Range2>(res);
17913}
17914
17915template <typename Domain, typename Range, typename Range2>
17916typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_range(const typed::space<Range2> &space) const
17917{
17918  auto res = isl::basic_map::intersect_range(space);
17919  return typed::union_map<pair<Domain, Range>, Range2>(res);
17920}
17921
17922template <typename Domain, typename Range, typename Range2>
17923typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_range(const typed::union_set<Range2> &uset) const
17924{
17925  auto res = isl::basic_map::intersect_range(uset);
17926  return typed::union_map<pair<Domain, Range>, Range2>(res);
17927}
17928
17929template <typename Domain, typename Range, typename Range2>
17930typed::basic_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::intersect_range(const typed::point<Range2> &bset) const
17931{
17932  auto res = isl::basic_map::intersect_range(bset);
17933  return typed::basic_map<pair<Domain, Range>, Range2>(res);
17934}
17935
17936template <typename Domain, typename Range, typename Range2>
17937typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::lexmax() const
17938{
17939  auto res = isl::basic_map::lexmax();
17940  return typed::map<pair<Domain, Range>, Range2>(res);
17941}
17942
17943template <typename Domain, typename Range, typename Range2>
17944typed::pw_multi_aff<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::lexmax_pw_multi_aff() const
17945{
17946  auto res = isl::basic_map::lexmax_pw_multi_aff();
17947  return typed::pw_multi_aff<pair<Domain, Range>, Range2>(res);
17948}
17949
17950template <typename Domain, typename Range, typename Range2>
17951typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::lexmin() const
17952{
17953  auto res = isl::basic_map::lexmin();
17954  return typed::map<pair<Domain, Range>, Range2>(res);
17955}
17956
17957template <typename Domain, typename Range, typename Range2>
17958typed::pw_multi_aff<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::lexmin_pw_multi_aff() const
17959{
17960  auto res = isl::basic_map::lexmin_pw_multi_aff();
17961  return typed::pw_multi_aff<pair<Domain, Range>, Range2>(res);
17962}
17963
17964template <typename Domain, typename Range, typename Range2>
17965typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::lower_bound(const typed::multi_pw_aff<pair<Domain, Range>, Range2> &lower) const
17966{
17967  auto res = isl::basic_map::lower_bound(lower);
17968  return typed::map<pair<Domain, Range>, Range2>(res);
17969}
17970
17971template <typename Domain, typename Range, typename Range2>
17972typed::map_list<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::map_list() const
17973{
17974  auto res = isl::basic_map::map_list();
17975  return typed::map_list<pair<Domain, Range>, Range2>(res);
17976}
17977
17978template <typename Domain, typename Range, typename Range2>
17979typed::multi_pw_aff<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::max_multi_pw_aff() const
17980{
17981  auto res = isl::basic_map::max_multi_pw_aff();
17982  return typed::multi_pw_aff<pair<Domain, Range>, Range2>(res);
17983}
17984
17985template <typename Domain, typename Range, typename Range2>
17986typed::multi_pw_aff<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::min_multi_pw_aff() const
17987{
17988  auto res = isl::basic_map::min_multi_pw_aff();
17989  return typed::multi_pw_aff<pair<Domain, Range>, Range2>(res);
17990}
17991
17992template <typename Domain, typename Range, typename Range2>
17993typed::set<> typed::basic_map<pair<Domain, Range>, Range2>::params() const
17994{
17995  auto res = isl::basic_map::params();
17996  return typed::set<>(res);
17997}
17998
17999template <typename Domain, typename Range, typename Range2>
18000template <typename Domain2>
18001typed::map<Domain2, Range2> typed::basic_map<pair<Domain, Range>, Range2>::preimage_domain(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const
18002{
18003  auto res = isl::basic_map::preimage_domain(ma);
18004  return typed::map<Domain2, Range2>(res);
18005}
18006
18007template <typename Domain, typename Range, typename Range2>
18008template <typename Domain2>
18009typed::map<Domain2, Range2> typed::basic_map<pair<Domain, Range>, Range2>::preimage_domain(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const
18010{
18011  auto res = isl::basic_map::preimage_domain(mpa);
18012  return typed::map<Domain2, Range2>(res);
18013}
18014
18015template <typename Domain, typename Range, typename Range2>
18016template <typename Domain2>
18017typed::map<Domain2, Range2> typed::basic_map<pair<Domain, Range>, Range2>::preimage_domain(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const
18018{
18019  auto res = isl::basic_map::preimage_domain(pma);
18020  return typed::map<Domain2, Range2>(res);
18021}
18022
18023template <typename Domain, typename Range, typename Range2>
18024template <typename Domain2>
18025typed::union_map<Domain2, Range2> typed::basic_map<pair<Domain, Range>, Range2>::preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const
18026{
18027  auto res = isl::basic_map::preimage_domain(upma);
18028  return typed::union_map<Domain2, Range2>(res);
18029}
18030
18031template <typename Domain, typename Range, typename Range2>
18032template <typename Arg3>
18033typed::map<pair<Domain, Range>, Arg3> typed::basic_map<pair<Domain, Range>, Range2>::preimage_range(const typed::multi_aff<Arg3, Range2> &ma) const
18034{
18035  auto res = isl::basic_map::preimage_range(ma);
18036  return typed::map<pair<Domain, Range>, Arg3>(res);
18037}
18038
18039template <typename Domain, typename Range, typename Range2>
18040template <typename Arg3>
18041typed::map<pair<Domain, Range>, Arg3> typed::basic_map<pair<Domain, Range>, Range2>::preimage_range(const typed::pw_multi_aff<Arg3, Range2> &pma) const
18042{
18043  auto res = isl::basic_map::preimage_range(pma);
18044  return typed::map<pair<Domain, Range>, Arg3>(res);
18045}
18046
18047template <typename Domain, typename Range, typename Range2>
18048template <typename Arg3>
18049typed::union_map<pair<Domain, Range>, Arg3> typed::basic_map<pair<Domain, Range>, Range2>::preimage_range(const typed::union_pw_multi_aff<Arg3, Range2> &upma) const
18050{
18051  auto res = isl::basic_map::preimage_range(upma);
18052  return typed::union_map<pair<Domain, Range>, Arg3>(res);
18053}
18054
18055template <typename Domain, typename Range, typename Range2>
18056template <typename Domain2, typename Arg3>
18057typed::map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> typed::basic_map<pair<Domain, Range>, Range2>::product(const typed::map<Domain2, Arg3> &map2) const
18058{
18059  auto res = isl::basic_map::product(map2);
18060  return typed::map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>>(res);
18061}
18062
18063template <typename Domain, typename Range, typename Range2>
18064template <typename Domain2, typename Arg3>
18065typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> typed::basic_map<pair<Domain, Range>, Range2>::product(const typed::union_map<Domain2, Arg3> &umap2) const
18066{
18067  auto res = isl::basic_map::product(umap2);
18068  return typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>>(res);
18069}
18070
18071template <typename Domain, typename Range, typename Range2>
18072typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::project_out_all_params() const
18073{
18074  auto res = isl::basic_map::project_out_all_params();
18075  return typed::map<pair<Domain, Range>, Range2>(res);
18076}
18077
18078template <typename Domain, typename Range, typename Range2>
18079typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::project_out_param(const typed::id<Anonymous> &id) const
18080{
18081  auto res = isl::basic_map::project_out_param(id);
18082  return typed::map<pair<Domain, Range>, Range2>(res);
18083}
18084
18085template <typename Domain, typename Range, typename Range2>
18086typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::project_out_param(const std::string &id) const
18087{
18088  auto res = isl::basic_map::project_out_param(id);
18089  return typed::map<pair<Domain, Range>, Range2>(res);
18090}
18091
18092template <typename Domain, typename Range, typename Range2>
18093typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::project_out_param(const typed::id_list<Anonymous> &list) const
18094{
18095  auto res = isl::basic_map::project_out_param(list);
18096  return typed::map<pair<Domain, Range>, Range2>(res);
18097}
18098
18099template <typename Domain, typename Range, typename Range2>
18100typed::set<Range2> typed::basic_map<pair<Domain, Range>, Range2>::range() const
18101{
18102  auto res = isl::basic_map::range();
18103  return typed::set<Range2>(res);
18104}
18105
18106template <typename Domain, typename Range, typename Range2>
18107typed::fixed_box<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::range_lattice_tile() const
18108{
18109  auto res = isl::basic_map::range_lattice_tile();
18110  return typed::fixed_box<pair<Domain, Range>, Range2>(res);
18111}
18112
18113template <typename Domain, typename Range, typename Range2>
18114typed::union_map<pair<pair<Domain, Range>, Range2>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::range_map() const
18115{
18116  auto res = isl::basic_map::range_map();
18117  return typed::union_map<pair<pair<Domain, Range>, Range2>, Range2>(res);
18118}
18119
18120template <typename Domain, typename Range, typename Range2>
18121template <typename Arg3>
18122typed::map<pair<Domain, Range>, pair<Range2, Arg3>> typed::basic_map<pair<Domain, Range>, Range2>::range_product(const typed::map<pair<Domain, Range>, Arg3> &map2) const
18123{
18124  auto res = isl::basic_map::range_product(map2);
18125  return typed::map<pair<Domain, Range>, pair<Range2, Arg3>>(res);
18126}
18127
18128template <typename Domain, typename Range, typename Range2>
18129template <typename Arg3>
18130typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> typed::basic_map<pair<Domain, Range>, Range2>::range_product(const typed::union_map<pair<Domain, Range>, Arg3> &umap2) const
18131{
18132  auto res = isl::basic_map::range_product(umap2);
18133  return typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>>(res);
18134}
18135
18136template <typename Domain, typename Range, typename Range2>
18137typed::fixed_box<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::range_simple_fixed_box_hull() const
18138{
18139  auto res = isl::basic_map::range_simple_fixed_box_hull();
18140  return typed::fixed_box<pair<Domain, Range>, Range2>(res);
18141}
18142
18143template <typename Domain, typename Range, typename Range2>
18144typed::basic_map<Range2, pair<Domain, Range>> typed::basic_map<pair<Domain, Range>, Range2>::reverse() const
18145{
18146  auto res = isl::basic_map::reverse();
18147  return typed::basic_map<Range2, pair<Domain, Range>>(res);
18148}
18149
18150template <typename Domain, typename Range, typename Range2>
18151template <typename Arg2>
18152typed::map<pair<Domain, Range>, Arg2> typed::basic_map<pair<Domain, Range>, Range2>::set_range_tuple(const typed::id<Anonymous> &id) const
18153{
18154  auto res = isl::basic_map::set_range_tuple(id);
18155  return typed::map<pair<Domain, Range>, Arg2>(res);
18156}
18157
18158template <typename Domain, typename Range, typename Range2>
18159template <typename Arg2>
18160typed::map<pair<Domain, Range>, Arg2> typed::basic_map<pair<Domain, Range>, Range2>::set_range_tuple(const std::string &id) const
18161{
18162  auto res = isl::basic_map::set_range_tuple(id);
18163  return typed::map<pair<Domain, Range>, Arg2>(res);
18164}
18165
18166template <typename Domain, typename Range, typename Range2>
18167typed::space<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::space() const
18168{
18169  auto res = isl::basic_map::space();
18170  return typed::space<pair<Domain, Range>, Range2>(res);
18171}
18172
18173template <typename Domain, typename Range, typename Range2>
18174typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::subtract(const typed::map<pair<Domain, Range>, Range2> &map2) const
18175{
18176  auto res = isl::basic_map::subtract(map2);
18177  return typed::map<pair<Domain, Range>, Range2>(res);
18178}
18179
18180template <typename Domain, typename Range, typename Range2>
18181typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::subtract(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const
18182{
18183  auto res = isl::basic_map::subtract(umap2);
18184  return typed::union_map<pair<Domain, Range>, Range2>(res);
18185}
18186
18187template <typename Domain, typename Range, typename Range2>
18188typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::subtract_domain(const typed::union_set<pair<Domain, Range>> &dom) const
18189{
18190  auto res = isl::basic_map::subtract_domain(dom);
18191  return typed::union_map<pair<Domain, Range>, Range2>(res);
18192}
18193
18194template <typename Domain, typename Range, typename Range2>
18195typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::subtract_range(const typed::union_set<Range2> &dom) const
18196{
18197  auto res = isl::basic_map::subtract_range(dom);
18198  return typed::union_map<pair<Domain, Range>, Range2>(res);
18199}
18200
18201template <typename Domain, typename Range, typename Range2>
18202typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::to_union_map() const
18203{
18204  auto res = isl::basic_map::to_union_map();
18205  return typed::union_map<pair<Domain, Range>, Range2>(res);
18206}
18207
18208template <typename Domain, typename Range, typename Range2>
18209typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::unite(const typed::basic_map<pair<Domain, Range>, Range2> &bmap2) const
18210{
18211  auto res = isl::basic_map::unite(bmap2);
18212  return typed::map<pair<Domain, Range>, Range2>(res);
18213}
18214
18215template <typename Domain, typename Range, typename Range2>
18216typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::unite(const typed::map<pair<Domain, Range>, Range2> &map2) const
18217{
18218  auto res = isl::basic_map::unite(map2);
18219  return typed::map<pair<Domain, Range>, Range2>(res);
18220}
18221
18222template <typename Domain, typename Range, typename Range2>
18223typed::union_map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::unite(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const
18224{
18225  auto res = isl::basic_map::unite(umap2);
18226  return typed::union_map<pair<Domain, Range>, Range2>(res);
18227}
18228
18229template <typename Domain, typename Range, typename Range2>
18230typed::map<pair<Domain, Range>, Range2> typed::basic_map<pair<Domain, Range>, Range2>::upper_bound(const typed::multi_pw_aff<pair<Domain, Range>, Range2> &upper) const
18231{
18232  auto res = isl::basic_map::upper_bound(upper);
18233  return typed::map<pair<Domain, Range>, Range2>(res);
18234}
18235
18236template <typename Domain, typename Range, typename Range2>
18237typed::set<pair<pair<Domain, Range>, Range2>> typed::basic_map<pair<Domain, Range>, Range2>::wrap() const
18238{
18239  auto res = isl::basic_map::wrap();
18240  return typed::set<pair<pair<Domain, Range>, Range2>>(res);
18241}
18242
18243template <typename Domain>
18244typed::basic_map<Domain, Domain>::basic_map(const isl::ctx &ctx, const std::string &str)
18245  : isl::basic_map(ctx, str)
18246{
18247}
18248
18249template <typename Domain>
18250template <typename Domain2>
18251typed::basic_map<Domain2, Domain> typed::basic_map<Domain, Domain>::apply_domain(const typed::basic_map<Domain, Domain2> &bmap2) const
18252{
18253  auto res = isl::basic_map::apply_domain(bmap2);
18254  return typed::basic_map<Domain2, Domain>(res);
18255}
18256
18257template <typename Domain>
18258template <typename Domain2>
18259typed::map<Domain2, Domain> typed::basic_map<Domain, Domain>::apply_domain(const typed::map<Domain, Domain2> &map2) const
18260{
18261  auto res = isl::basic_map::apply_domain(map2);
18262  return typed::map<Domain2, Domain>(res);
18263}
18264
18265template <typename Domain>
18266template <typename Domain2>
18267typed::union_map<Domain2, Domain> typed::basic_map<Domain, Domain>::apply_domain(const typed::union_map<Domain, Domain2> &umap2) const
18268{
18269  auto res = isl::basic_map::apply_domain(umap2);
18270  return typed::union_map<Domain2, Domain>(res);
18271}
18272
18273template <typename Domain>
18274template <typename Range2>
18275typed::basic_map<Domain, Range2> typed::basic_map<Domain, Domain>::apply_range(const typed::basic_map<Domain, Range2> &bmap2) const
18276{
18277  auto res = isl::basic_map::apply_range(bmap2);
18278  return typed::basic_map<Domain, Range2>(res);
18279}
18280
18281template <typename Domain>
18282template <typename Range2>
18283typed::map<Domain, Range2> typed::basic_map<Domain, Domain>::apply_range(const typed::map<Domain, Range2> &map2) const
18284{
18285  auto res = isl::basic_map::apply_range(map2);
18286  return typed::map<Domain, Range2>(res);
18287}
18288
18289template <typename Domain>
18290template <typename Range2>
18291typed::union_map<Domain, Range2> typed::basic_map<Domain, Domain>::apply_range(const typed::union_map<Domain, Range2> &umap2) const
18292{
18293  auto res = isl::basic_map::apply_range(umap2);
18294  return typed::union_map<Domain, Range2>(res);
18295}
18296
18297template <typename Domain>
18298typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::as_map() const
18299{
18300  auto res = isl::basic_map::as_map();
18301  return typed::map<Domain, Domain>(res);
18302}
18303
18304template <typename Domain>
18305typed::multi_union_pw_aff<Domain, Domain> typed::basic_map<Domain, Domain>::as_multi_union_pw_aff() const
18306{
18307  auto res = isl::basic_map::as_multi_union_pw_aff();
18308  return typed::multi_union_pw_aff<Domain, Domain>(res);
18309}
18310
18311template <typename Domain>
18312typed::pw_multi_aff<Domain, Domain> typed::basic_map<Domain, Domain>::as_pw_multi_aff() const
18313{
18314  auto res = isl::basic_map::as_pw_multi_aff();
18315  return typed::pw_multi_aff<Domain, Domain>(res);
18316}
18317
18318template <typename Domain>
18319typed::union_pw_multi_aff<Domain, Domain> typed::basic_map<Domain, Domain>::as_union_pw_multi_aff() const
18320{
18321  auto res = isl::basic_map::as_union_pw_multi_aff();
18322  return typed::union_pw_multi_aff<Domain, Domain>(res);
18323}
18324
18325template <typename Domain>
18326typed::set<Domain> typed::basic_map<Domain, Domain>::bind_domain(const typed::multi_id<Domain> &tuple) const
18327{
18328  auto res = isl::basic_map::bind_domain(tuple);
18329  return typed::set<Domain>(res);
18330}
18331
18332template <typename Domain>
18333typed::set<Domain> typed::basic_map<Domain, Domain>::bind_range(const typed::multi_id<Domain> &tuple) const
18334{
18335  auto res = isl::basic_map::bind_range(tuple);
18336  return typed::set<Domain>(res);
18337}
18338
18339template <typename Domain>
18340typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::coalesce() const
18341{
18342  auto res = isl::basic_map::coalesce();
18343  return typed::map<Domain, Domain>(res);
18344}
18345
18346template <typename Domain>
18347typed::basic_set<Domain> typed::basic_map<Domain, Domain>::deltas() const
18348{
18349  auto res = isl::basic_map::deltas();
18350  return typed::basic_set<Domain>(res);
18351}
18352
18353template <typename Domain>
18354typed::basic_map<Domain, Domain> typed::basic_map<Domain, Domain>::detect_equalities() const
18355{
18356  auto res = isl::basic_map::detect_equalities();
18357  return typed::basic_map<Domain, Domain>(res);
18358}
18359
18360template <typename Domain>
18361typed::set<Domain> typed::basic_map<Domain, Domain>::domain() const
18362{
18363  auto res = isl::basic_map::domain();
18364  return typed::set<Domain>(res);
18365}
18366
18367template <typename Domain>
18368typed::union_map<pair<Domain, Domain>, Domain> typed::basic_map<Domain, Domain>::domain_map() const
18369{
18370  auto res = isl::basic_map::domain_map();
18371  return typed::union_map<pair<Domain, Domain>, Domain>(res);
18372}
18373
18374template <typename Domain>
18375typed::union_pw_multi_aff<pair<Domain, Domain>, Domain> typed::basic_map<Domain, Domain>::domain_map_union_pw_multi_aff() const
18376{
18377  auto res = isl::basic_map::domain_map_union_pw_multi_aff();
18378  return typed::union_pw_multi_aff<pair<Domain, Domain>, Domain>(res);
18379}
18380
18381template <typename Domain>
18382template <typename Domain2>
18383typed::map<pair<Domain, Domain2>, Domain> typed::basic_map<Domain, Domain>::domain_product(const typed::map<Domain2, Domain> &map2) const
18384{
18385  auto res = isl::basic_map::domain_product(map2);
18386  return typed::map<pair<Domain, Domain2>, Domain>(res);
18387}
18388
18389template <typename Domain>
18390template <typename Domain2>
18391typed::union_map<pair<Domain, Domain2>, Domain> typed::basic_map<Domain, Domain>::domain_product(const typed::union_map<Domain2, Domain> &umap2) const
18392{
18393  auto res = isl::basic_map::domain_product(umap2);
18394  return typed::union_map<pair<Domain, Domain2>, Domain>(res);
18395}
18396
18397template <typename Domain>
18398typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::drop_unused_params() const
18399{
18400  auto res = isl::basic_map::drop_unused_params();
18401  return typed::map<Domain, Domain>(res);
18402}
18403
18404template <typename Domain>
18405template <typename Range>
18406typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::eq_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
18407{
18408  auto res = isl::basic_map::eq_at(mpa);
18409  return typed::map<Domain, Domain>(res);
18410}
18411
18412template <typename Domain>
18413template <typename Range>
18414typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::eq_at(const typed::multi_union_pw_aff<Domain, Range> &mupa) const
18415{
18416  auto res = isl::basic_map::eq_at(mupa);
18417  return typed::union_map<Domain, Domain>(res);
18418}
18419
18420template <typename Domain>
18421bool typed::basic_map<Domain, Domain>::every_map(const std::function<bool(typed::map<Domain, Domain>)> &test) const
18422{
18423  auto lambda_test = [&] (isl::map arg0) {
18424    return test(typed::map<Domain, Domain>(arg0));
18425  };
18426  return isl::basic_map::every_map(lambda_test);
18427}
18428
18429template <typename Domain>
18430typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::extract_map(const typed::space<Domain, Domain> &space) const
18431{
18432  auto res = isl::basic_map::extract_map(space);
18433  return typed::map<Domain, Domain>(res);
18434}
18435
18436template <typename Domain>
18437void typed::basic_map<Domain, Domain>::foreach_basic_map(const std::function<void(typed::basic_map<Domain, Domain>)> &fn) const
18438{
18439  auto lambda_fn = [&] (isl::basic_map arg0) {
18440    return fn(typed::basic_map<Domain, Domain>(arg0));
18441  };
18442  return isl::basic_map::foreach_basic_map(lambda_fn);
18443}
18444
18445template <typename Domain>
18446void typed::basic_map<Domain, Domain>::foreach_map(const std::function<void(typed::map<Domain, Domain>)> &fn) const
18447{
18448  auto lambda_fn = [&] (isl::map arg0) {
18449    return fn(typed::map<Domain, Domain>(arg0));
18450  };
18451  return isl::basic_map::foreach_map(lambda_fn);
18452}
18453
18454template <typename Domain>
18455typed::basic_map<Domain, Domain> typed::basic_map<Domain, Domain>::gist(const typed::basic_map<Domain, Domain> &context) const
18456{
18457  auto res = isl::basic_map::gist(context);
18458  return typed::basic_map<Domain, Domain>(res);
18459}
18460
18461template <typename Domain>
18462typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::gist(const typed::map<Domain, Domain> &context) const
18463{
18464  auto res = isl::basic_map::gist(context);
18465  return typed::map<Domain, Domain>(res);
18466}
18467
18468template <typename Domain>
18469typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::gist(const typed::union_map<Domain, Domain> &context) const
18470{
18471  auto res = isl::basic_map::gist(context);
18472  return typed::union_map<Domain, Domain>(res);
18473}
18474
18475template <typename Domain>
18476typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::gist_domain(const typed::set<Domain> &context) const
18477{
18478  auto res = isl::basic_map::gist_domain(context);
18479  return typed::map<Domain, Domain>(res);
18480}
18481
18482template <typename Domain>
18483typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::gist_domain(const typed::union_set<Domain> &uset) const
18484{
18485  auto res = isl::basic_map::gist_domain(uset);
18486  return typed::union_map<Domain, Domain>(res);
18487}
18488
18489template <typename Domain>
18490typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::gist_params(const typed::set<> &context) const
18491{
18492  auto res = isl::basic_map::gist_params(context);
18493  return typed::map<Domain, Domain>(res);
18494}
18495
18496template <typename Domain>
18497typed::basic_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect(const typed::basic_map<Domain, Domain> &bmap2) const
18498{
18499  auto res = isl::basic_map::intersect(bmap2);
18500  return typed::basic_map<Domain, Domain>(res);
18501}
18502
18503template <typename Domain>
18504typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect(const typed::map<Domain, Domain> &map2) const
18505{
18506  auto res = isl::basic_map::intersect(map2);
18507  return typed::map<Domain, Domain>(res);
18508}
18509
18510template <typename Domain>
18511typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect(const typed::union_map<Domain, Domain> &umap2) const
18512{
18513  auto res = isl::basic_map::intersect(umap2);
18514  return typed::union_map<Domain, Domain>(res);
18515}
18516
18517template <typename Domain>
18518typed::basic_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_domain(const typed::basic_set<Domain> &bset) const
18519{
18520  auto res = isl::basic_map::intersect_domain(bset);
18521  return typed::basic_map<Domain, Domain>(res);
18522}
18523
18524template <typename Domain>
18525typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_domain(const typed::set<Domain> &set) const
18526{
18527  auto res = isl::basic_map::intersect_domain(set);
18528  return typed::map<Domain, Domain>(res);
18529}
18530
18531template <typename Domain>
18532typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_domain(const typed::space<Domain> &space) const
18533{
18534  auto res = isl::basic_map::intersect_domain(space);
18535  return typed::union_map<Domain, Domain>(res);
18536}
18537
18538template <typename Domain>
18539typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_domain(const typed::union_set<Domain> &uset) const
18540{
18541  auto res = isl::basic_map::intersect_domain(uset);
18542  return typed::union_map<Domain, Domain>(res);
18543}
18544
18545template <typename Domain>
18546typed::basic_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_domain(const typed::point<Domain> &bset) const
18547{
18548  auto res = isl::basic_map::intersect_domain(bset);
18549  return typed::basic_map<Domain, Domain>(res);
18550}
18551
18552template <typename Domain>
18553typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_params(const typed::set<> &params) const
18554{
18555  auto res = isl::basic_map::intersect_params(params);
18556  return typed::map<Domain, Domain>(res);
18557}
18558
18559template <typename Domain>
18560typed::basic_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_range(const typed::basic_set<Domain> &bset) const
18561{
18562  auto res = isl::basic_map::intersect_range(bset);
18563  return typed::basic_map<Domain, Domain>(res);
18564}
18565
18566template <typename Domain>
18567typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_range(const typed::set<Domain> &set) const
18568{
18569  auto res = isl::basic_map::intersect_range(set);
18570  return typed::map<Domain, Domain>(res);
18571}
18572
18573template <typename Domain>
18574typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_range(const typed::space<Domain> &space) const
18575{
18576  auto res = isl::basic_map::intersect_range(space);
18577  return typed::union_map<Domain, Domain>(res);
18578}
18579
18580template <typename Domain>
18581typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_range(const typed::union_set<Domain> &uset) const
18582{
18583  auto res = isl::basic_map::intersect_range(uset);
18584  return typed::union_map<Domain, Domain>(res);
18585}
18586
18587template <typename Domain>
18588typed::basic_map<Domain, Domain> typed::basic_map<Domain, Domain>::intersect_range(const typed::point<Domain> &bset) const
18589{
18590  auto res = isl::basic_map::intersect_range(bset);
18591  return typed::basic_map<Domain, Domain>(res);
18592}
18593
18594template <typename Domain>
18595template <typename Range>
18596typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::lex_ge_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
18597{
18598  auto res = isl::basic_map::lex_ge_at(mpa);
18599  return typed::map<Domain, Domain>(res);
18600}
18601
18602template <typename Domain>
18603template <typename Range>
18604typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::lex_gt_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
18605{
18606  auto res = isl::basic_map::lex_gt_at(mpa);
18607  return typed::map<Domain, Domain>(res);
18608}
18609
18610template <typename Domain>
18611template <typename Range>
18612typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::lex_le_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
18613{
18614  auto res = isl::basic_map::lex_le_at(mpa);
18615  return typed::map<Domain, Domain>(res);
18616}
18617
18618template <typename Domain>
18619template <typename Range>
18620typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::lex_lt_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
18621{
18622  auto res = isl::basic_map::lex_lt_at(mpa);
18623  return typed::map<Domain, Domain>(res);
18624}
18625
18626template <typename Domain>
18627typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::lexmax() const
18628{
18629  auto res = isl::basic_map::lexmax();
18630  return typed::map<Domain, Domain>(res);
18631}
18632
18633template <typename Domain>
18634typed::pw_multi_aff<Domain, Domain> typed::basic_map<Domain, Domain>::lexmax_pw_multi_aff() const
18635{
18636  auto res = isl::basic_map::lexmax_pw_multi_aff();
18637  return typed::pw_multi_aff<Domain, Domain>(res);
18638}
18639
18640template <typename Domain>
18641typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::lexmin() const
18642{
18643  auto res = isl::basic_map::lexmin();
18644  return typed::map<Domain, Domain>(res);
18645}
18646
18647template <typename Domain>
18648typed::pw_multi_aff<Domain, Domain> typed::basic_map<Domain, Domain>::lexmin_pw_multi_aff() const
18649{
18650  auto res = isl::basic_map::lexmin_pw_multi_aff();
18651  return typed::pw_multi_aff<Domain, Domain>(res);
18652}
18653
18654template <typename Domain>
18655typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::lower_bound(const typed::multi_pw_aff<Domain, Domain> &lower) const
18656{
18657  auto res = isl::basic_map::lower_bound(lower);
18658  return typed::map<Domain, Domain>(res);
18659}
18660
18661template <typename Domain>
18662typed::map_list<Domain, Domain> typed::basic_map<Domain, Domain>::map_list() const
18663{
18664  auto res = isl::basic_map::map_list();
18665  return typed::map_list<Domain, Domain>(res);
18666}
18667
18668template <typename Domain>
18669typed::multi_pw_aff<Domain, Domain> typed::basic_map<Domain, Domain>::max_multi_pw_aff() const
18670{
18671  auto res = isl::basic_map::max_multi_pw_aff();
18672  return typed::multi_pw_aff<Domain, Domain>(res);
18673}
18674
18675template <typename Domain>
18676typed::multi_pw_aff<Domain, Domain> typed::basic_map<Domain, Domain>::min_multi_pw_aff() const
18677{
18678  auto res = isl::basic_map::min_multi_pw_aff();
18679  return typed::multi_pw_aff<Domain, Domain>(res);
18680}
18681
18682template <typename Domain>
18683typed::set<> typed::basic_map<Domain, Domain>::params() const
18684{
18685  auto res = isl::basic_map::params();
18686  return typed::set<>(res);
18687}
18688
18689template <typename Domain>
18690template <typename Domain2>
18691typed::map<Domain2, Domain> typed::basic_map<Domain, Domain>::preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const
18692{
18693  auto res = isl::basic_map::preimage_domain(ma);
18694  return typed::map<Domain2, Domain>(res);
18695}
18696
18697template <typename Domain>
18698template <typename Domain2>
18699typed::map<Domain2, Domain> typed::basic_map<Domain, Domain>::preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
18700{
18701  auto res = isl::basic_map::preimage_domain(mpa);
18702  return typed::map<Domain2, Domain>(res);
18703}
18704
18705template <typename Domain>
18706template <typename Domain2>
18707typed::map<Domain2, Domain> typed::basic_map<Domain, Domain>::preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const
18708{
18709  auto res = isl::basic_map::preimage_domain(pma);
18710  return typed::map<Domain2, Domain>(res);
18711}
18712
18713template <typename Domain>
18714template <typename Domain2>
18715typed::union_map<Domain2, Domain> typed::basic_map<Domain, Domain>::preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
18716{
18717  auto res = isl::basic_map::preimage_domain(upma);
18718  return typed::union_map<Domain2, Domain>(res);
18719}
18720
18721template <typename Domain>
18722template <typename Range2>
18723typed::map<Domain, Range2> typed::basic_map<Domain, Domain>::preimage_range(const typed::multi_aff<Range2, Domain> &ma) const
18724{
18725  auto res = isl::basic_map::preimage_range(ma);
18726  return typed::map<Domain, Range2>(res);
18727}
18728
18729template <typename Domain>
18730template <typename Range2>
18731typed::map<Domain, Range2> typed::basic_map<Domain, Domain>::preimage_range(const typed::pw_multi_aff<Range2, Domain> &pma) const
18732{
18733  auto res = isl::basic_map::preimage_range(pma);
18734  return typed::map<Domain, Range2>(res);
18735}
18736
18737template <typename Domain>
18738template <typename Range2>
18739typed::union_map<Domain, Range2> typed::basic_map<Domain, Domain>::preimage_range(const typed::union_pw_multi_aff<Range2, Domain> &upma) const
18740{
18741  auto res = isl::basic_map::preimage_range(upma);
18742  return typed::union_map<Domain, Range2>(res);
18743}
18744
18745template <typename Domain>
18746template <typename Domain2, typename Range2>
18747typed::map<pair<Domain, Domain2>, pair<Domain, Range2>> typed::basic_map<Domain, Domain>::product(const typed::map<Domain2, Range2> &map2) const
18748{
18749  auto res = isl::basic_map::product(map2);
18750  return typed::map<pair<Domain, Domain2>, pair<Domain, Range2>>(res);
18751}
18752
18753template <typename Domain>
18754template <typename Domain2, typename Range2>
18755typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> typed::basic_map<Domain, Domain>::product(const typed::union_map<Domain2, Range2> &umap2) const
18756{
18757  auto res = isl::basic_map::product(umap2);
18758  return typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>>(res);
18759}
18760
18761template <typename Domain>
18762typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::project_out_all_params() const
18763{
18764  auto res = isl::basic_map::project_out_all_params();
18765  return typed::map<Domain, Domain>(res);
18766}
18767
18768template <typename Domain>
18769typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::project_out_param(const typed::id<Anonymous> &id) const
18770{
18771  auto res = isl::basic_map::project_out_param(id);
18772  return typed::map<Domain, Domain>(res);
18773}
18774
18775template <typename Domain>
18776typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::project_out_param(const std::string &id) const
18777{
18778  auto res = isl::basic_map::project_out_param(id);
18779  return typed::map<Domain, Domain>(res);
18780}
18781
18782template <typename Domain>
18783typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::project_out_param(const typed::id_list<Anonymous> &list) const
18784{
18785  auto res = isl::basic_map::project_out_param(list);
18786  return typed::map<Domain, Domain>(res);
18787}
18788
18789template <typename Domain>
18790typed::set<Domain> typed::basic_map<Domain, Domain>::range() const
18791{
18792  auto res = isl::basic_map::range();
18793  return typed::set<Domain>(res);
18794}
18795
18796template <typename Domain>
18797typed::fixed_box<Domain, Domain> typed::basic_map<Domain, Domain>::range_lattice_tile() const
18798{
18799  auto res = isl::basic_map::range_lattice_tile();
18800  return typed::fixed_box<Domain, Domain>(res);
18801}
18802
18803template <typename Domain>
18804typed::union_map<pair<Domain, Domain>, Domain> typed::basic_map<Domain, Domain>::range_map() const
18805{
18806  auto res = isl::basic_map::range_map();
18807  return typed::union_map<pair<Domain, Domain>, Domain>(res);
18808}
18809
18810template <typename Domain>
18811template <typename Range2>
18812typed::map<Domain, pair<Domain, Range2>> typed::basic_map<Domain, Domain>::range_product(const typed::map<Domain, Range2> &map2) const
18813{
18814  auto res = isl::basic_map::range_product(map2);
18815  return typed::map<Domain, pair<Domain, Range2>>(res);
18816}
18817
18818template <typename Domain>
18819template <typename Range2>
18820typed::union_map<Domain, pair<Domain, Range2>> typed::basic_map<Domain, Domain>::range_product(const typed::union_map<Domain, Range2> &umap2) const
18821{
18822  auto res = isl::basic_map::range_product(umap2);
18823  return typed::union_map<Domain, pair<Domain, Range2>>(res);
18824}
18825
18826template <typename Domain>
18827typed::fixed_box<Domain, Domain> typed::basic_map<Domain, Domain>::range_simple_fixed_box_hull() const
18828{
18829  auto res = isl::basic_map::range_simple_fixed_box_hull();
18830  return typed::fixed_box<Domain, Domain>(res);
18831}
18832
18833template <typename Domain>
18834typed::basic_map<Domain, Domain> typed::basic_map<Domain, Domain>::reverse() const
18835{
18836  auto res = isl::basic_map::reverse();
18837  return typed::basic_map<Domain, Domain>(res);
18838}
18839
18840template <typename Domain>
18841template <typename Domain2>
18842typed::map<Domain2, Domain> typed::basic_map<Domain, Domain>::set_domain_tuple(const typed::id<Anonymous> &id) const
18843{
18844  auto res = isl::basic_map::set_domain_tuple(id);
18845  return typed::map<Domain2, Domain>(res);
18846}
18847
18848template <typename Domain>
18849template <typename Domain2>
18850typed::map<Domain2, Domain> typed::basic_map<Domain, Domain>::set_domain_tuple(const std::string &id) const
18851{
18852  auto res = isl::basic_map::set_domain_tuple(id);
18853  return typed::map<Domain2, Domain>(res);
18854}
18855
18856template <typename Domain>
18857template <typename Range2>
18858typed::map<Domain, Range2> typed::basic_map<Domain, Domain>::set_range_tuple(const typed::id<Anonymous> &id) const
18859{
18860  auto res = isl::basic_map::set_range_tuple(id);
18861  return typed::map<Domain, Range2>(res);
18862}
18863
18864template <typename Domain>
18865template <typename Range2>
18866typed::map<Domain, Range2> typed::basic_map<Domain, Domain>::set_range_tuple(const std::string &id) const
18867{
18868  auto res = isl::basic_map::set_range_tuple(id);
18869  return typed::map<Domain, Range2>(res);
18870}
18871
18872template <typename Domain>
18873typed::space<Domain, Domain> typed::basic_map<Domain, Domain>::space() const
18874{
18875  auto res = isl::basic_map::space();
18876  return typed::space<Domain, Domain>(res);
18877}
18878
18879template <typename Domain>
18880typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::subtract(const typed::map<Domain, Domain> &map2) const
18881{
18882  auto res = isl::basic_map::subtract(map2);
18883  return typed::map<Domain, Domain>(res);
18884}
18885
18886template <typename Domain>
18887typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::subtract(const typed::union_map<Domain, Domain> &umap2) const
18888{
18889  auto res = isl::basic_map::subtract(umap2);
18890  return typed::union_map<Domain, Domain>(res);
18891}
18892
18893template <typename Domain>
18894typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::subtract_domain(const typed::union_set<Domain> &dom) const
18895{
18896  auto res = isl::basic_map::subtract_domain(dom);
18897  return typed::union_map<Domain, Domain>(res);
18898}
18899
18900template <typename Domain>
18901typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::subtract_range(const typed::union_set<Domain> &dom) const
18902{
18903  auto res = isl::basic_map::subtract_range(dom);
18904  return typed::union_map<Domain, Domain>(res);
18905}
18906
18907template <typename Domain>
18908typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::to_union_map() const
18909{
18910  auto res = isl::basic_map::to_union_map();
18911  return typed::union_map<Domain, Domain>(res);
18912}
18913
18914template <typename Domain>
18915typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::unite(const typed::basic_map<Domain, Domain> &bmap2) const
18916{
18917  auto res = isl::basic_map::unite(bmap2);
18918  return typed::map<Domain, Domain>(res);
18919}
18920
18921template <typename Domain>
18922typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::unite(const typed::map<Domain, Domain> &map2) const
18923{
18924  auto res = isl::basic_map::unite(map2);
18925  return typed::map<Domain, Domain>(res);
18926}
18927
18928template <typename Domain>
18929typed::union_map<Domain, Domain> typed::basic_map<Domain, Domain>::unite(const typed::union_map<Domain, Domain> &umap2) const
18930{
18931  auto res = isl::basic_map::unite(umap2);
18932  return typed::union_map<Domain, Domain>(res);
18933}
18934
18935template <typename Domain>
18936typed::map<Domain, Domain> typed::basic_map<Domain, Domain>::upper_bound(const typed::multi_pw_aff<Domain, Domain> &upper) const
18937{
18938  auto res = isl::basic_map::upper_bound(upper);
18939  return typed::map<Domain, Domain>(res);
18940}
18941
18942template <typename Domain>
18943typed::set<pair<Domain, Domain>> typed::basic_map<Domain, Domain>::wrap() const
18944{
18945  auto res = isl::basic_map::wrap();
18946  return typed::set<pair<Domain, Domain>>(res);
18947}
18948
18949template <typename Domain, typename Range, typename Range2>
18950typed::basic_map<Domain, pair<Range, Range2>>::basic_map(const isl::ctx &ctx, const std::string &str)
18951  : isl::basic_map(ctx, str)
18952{
18953}
18954
18955template <typename Domain, typename Range, typename Range2>
18956template <typename Domain2>
18957typed::basic_map<Domain2, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::apply_domain(const typed::basic_map<Domain, Domain2> &bmap2) const
18958{
18959  auto res = isl::basic_map::apply_domain(bmap2);
18960  return typed::basic_map<Domain2, pair<Range, Range2>>(res);
18961}
18962
18963template <typename Domain, typename Range, typename Range2>
18964template <typename Domain2>
18965typed::map<Domain2, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::apply_domain(const typed::map<Domain, Domain2> &map2) const
18966{
18967  auto res = isl::basic_map::apply_domain(map2);
18968  return typed::map<Domain2, pair<Range, Range2>>(res);
18969}
18970
18971template <typename Domain, typename Range, typename Range2>
18972template <typename Domain2>
18973typed::union_map<Domain2, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::apply_domain(const typed::union_map<Domain, Domain2> &umap2) const
18974{
18975  auto res = isl::basic_map::apply_domain(umap2);
18976  return typed::union_map<Domain2, pair<Range, Range2>>(res);
18977}
18978
18979template <typename Domain, typename Range, typename Range2>
18980template <typename Arg3>
18981typed::basic_map<Domain, Arg3> typed::basic_map<Domain, pair<Range, Range2>>::apply_range(const typed::basic_map<pair<Range, Range2>, Arg3> &bmap2) const
18982{
18983  auto res = isl::basic_map::apply_range(bmap2);
18984  return typed::basic_map<Domain, Arg3>(res);
18985}
18986
18987template <typename Domain, typename Range, typename Range2>
18988template <typename Arg3>
18989typed::map<Domain, Arg3> typed::basic_map<Domain, pair<Range, Range2>>::apply_range(const typed::map<pair<Range, Range2>, Arg3> &map2) const
18990{
18991  auto res = isl::basic_map::apply_range(map2);
18992  return typed::map<Domain, Arg3>(res);
18993}
18994
18995template <typename Domain, typename Range, typename Range2>
18996template <typename Arg3>
18997typed::union_map<Domain, Arg3> typed::basic_map<Domain, pair<Range, Range2>>::apply_range(const typed::union_map<pair<Range, Range2>, Arg3> &umap2) const
18998{
18999  auto res = isl::basic_map::apply_range(umap2);
19000  return typed::union_map<Domain, Arg3>(res);
19001}
19002
19003template <typename Domain, typename Range, typename Range2>
19004typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::as_map() const
19005{
19006  auto res = isl::basic_map::as_map();
19007  return typed::map<Domain, pair<Range, Range2>>(res);
19008}
19009
19010template <typename Domain, typename Range, typename Range2>
19011typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::as_multi_union_pw_aff() const
19012{
19013  auto res = isl::basic_map::as_multi_union_pw_aff();
19014  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
19015}
19016
19017template <typename Domain, typename Range, typename Range2>
19018typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::as_pw_multi_aff() const
19019{
19020  auto res = isl::basic_map::as_pw_multi_aff();
19021  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
19022}
19023
19024template <typename Domain, typename Range, typename Range2>
19025typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::as_union_pw_multi_aff() const
19026{
19027  auto res = isl::basic_map::as_union_pw_multi_aff();
19028  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
19029}
19030
19031template <typename Domain, typename Range, typename Range2>
19032typed::set<pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::bind_domain(const typed::multi_id<Domain> &tuple) const
19033{
19034  auto res = isl::basic_map::bind_domain(tuple);
19035  return typed::set<pair<Range, Range2>>(res);
19036}
19037
19038template <typename Domain, typename Range, typename Range2>
19039typed::set<Domain> typed::basic_map<Domain, pair<Range, Range2>>::bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const
19040{
19041  auto res = isl::basic_map::bind_range(tuple);
19042  return typed::set<Domain>(res);
19043}
19044
19045template <typename Domain, typename Range, typename Range2>
19046typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::coalesce() const
19047{
19048  auto res = isl::basic_map::coalesce();
19049  return typed::map<Domain, pair<Range, Range2>>(res);
19050}
19051
19052template <typename Domain, typename Range, typename Range2>
19053typed::basic_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::detect_equalities() const
19054{
19055  auto res = isl::basic_map::detect_equalities();
19056  return typed::basic_map<Domain, pair<Range, Range2>>(res);
19057}
19058
19059template <typename Domain, typename Range, typename Range2>
19060typed::set<Domain> typed::basic_map<Domain, pair<Range, Range2>>::domain() const
19061{
19062  auto res = isl::basic_map::domain();
19063  return typed::set<Domain>(res);
19064}
19065
19066template <typename Domain, typename Range, typename Range2>
19067typed::union_map<pair<Domain, pair<Range, Range2>>, Domain> typed::basic_map<Domain, pair<Range, Range2>>::domain_map() const
19068{
19069  auto res = isl::basic_map::domain_map();
19070  return typed::union_map<pair<Domain, pair<Range, Range2>>, Domain>(res);
19071}
19072
19073template <typename Domain, typename Range, typename Range2>
19074typed::union_pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain> typed::basic_map<Domain, pair<Range, Range2>>::domain_map_union_pw_multi_aff() const
19075{
19076  auto res = isl::basic_map::domain_map_union_pw_multi_aff();
19077  return typed::union_pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain>(res);
19078}
19079
19080template <typename Domain, typename Range, typename Range2>
19081template <typename Domain2>
19082typed::map<pair<Domain, Domain2>, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::domain_product(const typed::map<Domain2, pair<Range, Range2>> &map2) const
19083{
19084  auto res = isl::basic_map::domain_product(map2);
19085  return typed::map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
19086}
19087
19088template <typename Domain, typename Range, typename Range2>
19089template <typename Domain2>
19090typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const
19091{
19092  auto res = isl::basic_map::domain_product(umap2);
19093  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
19094}
19095
19096template <typename Domain, typename Range, typename Range2>
19097typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::drop_unused_params() const
19098{
19099  auto res = isl::basic_map::drop_unused_params();
19100  return typed::map<Domain, pair<Range, Range2>>(res);
19101}
19102
19103template <typename Domain, typename Range, typename Range2>
19104bool typed::basic_map<Domain, pair<Range, Range2>>::every_map(const std::function<bool(typed::map<Domain, pair<Range, Range2>>)> &test) const
19105{
19106  auto lambda_test = [&] (isl::map arg0) {
19107    return test(typed::map<Domain, pair<Range, Range2>>(arg0));
19108  };
19109  return isl::basic_map::every_map(lambda_test);
19110}
19111
19112template <typename Domain, typename Range, typename Range2>
19113typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::extract_map(const typed::space<Domain, pair<Range, Range2>> &space) const
19114{
19115  auto res = isl::basic_map::extract_map(space);
19116  return typed::map<Domain, pair<Range, Range2>>(res);
19117}
19118
19119template <typename Domain, typename Range, typename Range2>
19120typed::basic_map<Domain, Anonymous> typed::basic_map<Domain, pair<Range, Range2>>::flatten_range() const
19121{
19122  auto res = isl::basic_map::flatten_range();
19123  return typed::basic_map<Domain, Anonymous>(res);
19124}
19125
19126template <typename Domain, typename Range, typename Range2>
19127void typed::basic_map<Domain, pair<Range, Range2>>::foreach_basic_map(const std::function<void(typed::basic_map<Domain, pair<Range, Range2>>)> &fn) const
19128{
19129  auto lambda_fn = [&] (isl::basic_map arg0) {
19130    return fn(typed::basic_map<Domain, pair<Range, Range2>>(arg0));
19131  };
19132  return isl::basic_map::foreach_basic_map(lambda_fn);
19133}
19134
19135template <typename Domain, typename Range, typename Range2>
19136void typed::basic_map<Domain, pair<Range, Range2>>::foreach_map(const std::function<void(typed::map<Domain, pair<Range, Range2>>)> &fn) const
19137{
19138  auto lambda_fn = [&] (isl::map arg0) {
19139    return fn(typed::map<Domain, pair<Range, Range2>>(arg0));
19140  };
19141  return isl::basic_map::foreach_map(lambda_fn);
19142}
19143
19144template <typename Domain, typename Range, typename Range2>
19145typed::basic_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::gist(const typed::basic_map<Domain, pair<Range, Range2>> &context) const
19146{
19147  auto res = isl::basic_map::gist(context);
19148  return typed::basic_map<Domain, pair<Range, Range2>>(res);
19149}
19150
19151template <typename Domain, typename Range, typename Range2>
19152typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::gist(const typed::map<Domain, pair<Range, Range2>> &context) const
19153{
19154  auto res = isl::basic_map::gist(context);
19155  return typed::map<Domain, pair<Range, Range2>>(res);
19156}
19157
19158template <typename Domain, typename Range, typename Range2>
19159typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::gist(const typed::union_map<Domain, pair<Range, Range2>> &context) const
19160{
19161  auto res = isl::basic_map::gist(context);
19162  return typed::union_map<Domain, pair<Range, Range2>>(res);
19163}
19164
19165template <typename Domain, typename Range, typename Range2>
19166typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::gist_domain(const typed::set<Domain> &context) const
19167{
19168  auto res = isl::basic_map::gist_domain(context);
19169  return typed::map<Domain, pair<Range, Range2>>(res);
19170}
19171
19172template <typename Domain, typename Range, typename Range2>
19173typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::gist_domain(const typed::union_set<Domain> &uset) const
19174{
19175  auto res = isl::basic_map::gist_domain(uset);
19176  return typed::union_map<Domain, pair<Range, Range2>>(res);
19177}
19178
19179template <typename Domain, typename Range, typename Range2>
19180typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::gist_params(const typed::set<> &context) const
19181{
19182  auto res = isl::basic_map::gist_params(context);
19183  return typed::map<Domain, pair<Range, Range2>>(res);
19184}
19185
19186template <typename Domain, typename Range, typename Range2>
19187typed::basic_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect(const typed::basic_map<Domain, pair<Range, Range2>> &bmap2) const
19188{
19189  auto res = isl::basic_map::intersect(bmap2);
19190  return typed::basic_map<Domain, pair<Range, Range2>>(res);
19191}
19192
19193template <typename Domain, typename Range, typename Range2>
19194typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect(const typed::map<Domain, pair<Range, Range2>> &map2) const
19195{
19196  auto res = isl::basic_map::intersect(map2);
19197  return typed::map<Domain, pair<Range, Range2>>(res);
19198}
19199
19200template <typename Domain, typename Range, typename Range2>
19201typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const
19202{
19203  auto res = isl::basic_map::intersect(umap2);
19204  return typed::union_map<Domain, pair<Range, Range2>>(res);
19205}
19206
19207template <typename Domain, typename Range, typename Range2>
19208typed::basic_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_domain(const typed::basic_set<Domain> &bset) const
19209{
19210  auto res = isl::basic_map::intersect_domain(bset);
19211  return typed::basic_map<Domain, pair<Range, Range2>>(res);
19212}
19213
19214template <typename Domain, typename Range, typename Range2>
19215typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_domain(const typed::set<Domain> &set) const
19216{
19217  auto res = isl::basic_map::intersect_domain(set);
19218  return typed::map<Domain, pair<Range, Range2>>(res);
19219}
19220
19221template <typename Domain, typename Range, typename Range2>
19222typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_domain(const typed::space<Domain> &space) const
19223{
19224  auto res = isl::basic_map::intersect_domain(space);
19225  return typed::union_map<Domain, pair<Range, Range2>>(res);
19226}
19227
19228template <typename Domain, typename Range, typename Range2>
19229typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_domain(const typed::union_set<Domain> &uset) const
19230{
19231  auto res = isl::basic_map::intersect_domain(uset);
19232  return typed::union_map<Domain, pair<Range, Range2>>(res);
19233}
19234
19235template <typename Domain, typename Range, typename Range2>
19236typed::basic_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_domain(const typed::point<Domain> &bset) const
19237{
19238  auto res = isl::basic_map::intersect_domain(bset);
19239  return typed::basic_map<Domain, pair<Range, Range2>>(res);
19240}
19241
19242template <typename Domain, typename Range, typename Range2>
19243typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_params(const typed::set<> &params) const
19244{
19245  auto res = isl::basic_map::intersect_params(params);
19246  return typed::map<Domain, pair<Range, Range2>>(res);
19247}
19248
19249template <typename Domain, typename Range, typename Range2>
19250typed::basic_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_range(const typed::basic_set<pair<Range, Range2>> &bset) const
19251{
19252  auto res = isl::basic_map::intersect_range(bset);
19253  return typed::basic_map<Domain, pair<Range, Range2>>(res);
19254}
19255
19256template <typename Domain, typename Range, typename Range2>
19257typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_range(const typed::set<pair<Range, Range2>> &set) const
19258{
19259  auto res = isl::basic_map::intersect_range(set);
19260  return typed::map<Domain, pair<Range, Range2>>(res);
19261}
19262
19263template <typename Domain, typename Range, typename Range2>
19264typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_range(const typed::space<pair<Range, Range2>> &space) const
19265{
19266  auto res = isl::basic_map::intersect_range(space);
19267  return typed::union_map<Domain, pair<Range, Range2>>(res);
19268}
19269
19270template <typename Domain, typename Range, typename Range2>
19271typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const
19272{
19273  auto res = isl::basic_map::intersect_range(uset);
19274  return typed::union_map<Domain, pair<Range, Range2>>(res);
19275}
19276
19277template <typename Domain, typename Range, typename Range2>
19278typed::basic_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_range(const typed::point<pair<Range, Range2>> &bset) const
19279{
19280  auto res = isl::basic_map::intersect_range(bset);
19281  return typed::basic_map<Domain, pair<Range, Range2>>(res);
19282}
19283
19284template <typename Domain, typename Range, typename Range2>
19285typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::set<Range> &domain) const
19286{
19287  auto res = isl::basic_map::intersect_range_wrapped_domain(domain);
19288  return typed::map<Domain, pair<Range, Range2>>(res);
19289}
19290
19291template <typename Domain, typename Range, typename Range2>
19292typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const
19293{
19294  auto res = isl::basic_map::intersect_range_wrapped_domain(domain);
19295  return typed::union_map<Domain, pair<Range, Range2>>(res);
19296}
19297
19298template <typename Domain, typename Range, typename Range2>
19299typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::lexmax() const
19300{
19301  auto res = isl::basic_map::lexmax();
19302  return typed::map<Domain, pair<Range, Range2>>(res);
19303}
19304
19305template <typename Domain, typename Range, typename Range2>
19306typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::lexmax_pw_multi_aff() const
19307{
19308  auto res = isl::basic_map::lexmax_pw_multi_aff();
19309  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
19310}
19311
19312template <typename Domain, typename Range, typename Range2>
19313typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::lexmin() const
19314{
19315  auto res = isl::basic_map::lexmin();
19316  return typed::map<Domain, pair<Range, Range2>>(res);
19317}
19318
19319template <typename Domain, typename Range, typename Range2>
19320typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::lexmin_pw_multi_aff() const
19321{
19322  auto res = isl::basic_map::lexmin_pw_multi_aff();
19323  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
19324}
19325
19326template <typename Domain, typename Range, typename Range2>
19327typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::lower_bound(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &lower) const
19328{
19329  auto res = isl::basic_map::lower_bound(lower);
19330  return typed::map<Domain, pair<Range, Range2>>(res);
19331}
19332
19333template <typename Domain, typename Range, typename Range2>
19334typed::map_list<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::map_list() const
19335{
19336  auto res = isl::basic_map::map_list();
19337  return typed::map_list<Domain, pair<Range, Range2>>(res);
19338}
19339
19340template <typename Domain, typename Range, typename Range2>
19341typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::max_multi_pw_aff() const
19342{
19343  auto res = isl::basic_map::max_multi_pw_aff();
19344  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
19345}
19346
19347template <typename Domain, typename Range, typename Range2>
19348typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::min_multi_pw_aff() const
19349{
19350  auto res = isl::basic_map::min_multi_pw_aff();
19351  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
19352}
19353
19354template <typename Domain, typename Range, typename Range2>
19355typed::set<> typed::basic_map<Domain, pair<Range, Range2>>::params() const
19356{
19357  auto res = isl::basic_map::params();
19358  return typed::set<>(res);
19359}
19360
19361template <typename Domain, typename Range, typename Range2>
19362template <typename Domain2>
19363typed::map<Domain2, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const
19364{
19365  auto res = isl::basic_map::preimage_domain(ma);
19366  return typed::map<Domain2, pair<Range, Range2>>(res);
19367}
19368
19369template <typename Domain, typename Range, typename Range2>
19370template <typename Domain2>
19371typed::map<Domain2, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
19372{
19373  auto res = isl::basic_map::preimage_domain(mpa);
19374  return typed::map<Domain2, pair<Range, Range2>>(res);
19375}
19376
19377template <typename Domain, typename Range, typename Range2>
19378template <typename Domain2>
19379typed::map<Domain2, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const
19380{
19381  auto res = isl::basic_map::preimage_domain(pma);
19382  return typed::map<Domain2, pair<Range, Range2>>(res);
19383}
19384
19385template <typename Domain, typename Range, typename Range2>
19386template <typename Domain2>
19387typed::union_map<Domain2, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
19388{
19389  auto res = isl::basic_map::preimage_domain(upma);
19390  return typed::union_map<Domain2, pair<Range, Range2>>(res);
19391}
19392
19393template <typename Domain, typename Range, typename Range2>
19394template <typename Arg3>
19395typed::map<Domain, Arg3> typed::basic_map<Domain, pair<Range, Range2>>::preimage_range(const typed::multi_aff<Arg3, pair<Range, Range2>> &ma) const
19396{
19397  auto res = isl::basic_map::preimage_range(ma);
19398  return typed::map<Domain, Arg3>(res);
19399}
19400
19401template <typename Domain, typename Range, typename Range2>
19402template <typename Arg3>
19403typed::map<Domain, Arg3> typed::basic_map<Domain, pair<Range, Range2>>::preimage_range(const typed::pw_multi_aff<Arg3, pair<Range, Range2>> &pma) const
19404{
19405  auto res = isl::basic_map::preimage_range(pma);
19406  return typed::map<Domain, Arg3>(res);
19407}
19408
19409template <typename Domain, typename Range, typename Range2>
19410template <typename Arg3>
19411typed::union_map<Domain, Arg3> typed::basic_map<Domain, pair<Range, Range2>>::preimage_range(const typed::union_pw_multi_aff<Arg3, pair<Range, Range2>> &upma) const
19412{
19413  auto res = isl::basic_map::preimage_range(upma);
19414  return typed::union_map<Domain, Arg3>(res);
19415}
19416
19417template <typename Domain, typename Range, typename Range2>
19418template <typename Domain2, typename Arg3>
19419typed::map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::basic_map<Domain, pair<Range, Range2>>::product(const typed::map<Domain2, Arg3> &map2) const
19420{
19421  auto res = isl::basic_map::product(map2);
19422  return typed::map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
19423}
19424
19425template <typename Domain, typename Range, typename Range2>
19426template <typename Domain2, typename Arg3>
19427typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::basic_map<Domain, pair<Range, Range2>>::product(const typed::union_map<Domain2, Arg3> &umap2) const
19428{
19429  auto res = isl::basic_map::product(umap2);
19430  return typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
19431}
19432
19433template <typename Domain, typename Range, typename Range2>
19434typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::project_out_all_params() const
19435{
19436  auto res = isl::basic_map::project_out_all_params();
19437  return typed::map<Domain, pair<Range, Range2>>(res);
19438}
19439
19440template <typename Domain, typename Range, typename Range2>
19441typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::project_out_param(const typed::id<Anonymous> &id) const
19442{
19443  auto res = isl::basic_map::project_out_param(id);
19444  return typed::map<Domain, pair<Range, Range2>>(res);
19445}
19446
19447template <typename Domain, typename Range, typename Range2>
19448typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::project_out_param(const std::string &id) const
19449{
19450  auto res = isl::basic_map::project_out_param(id);
19451  return typed::map<Domain, pair<Range, Range2>>(res);
19452}
19453
19454template <typename Domain, typename Range, typename Range2>
19455typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::project_out_param(const typed::id_list<Anonymous> &list) const
19456{
19457  auto res = isl::basic_map::project_out_param(list);
19458  return typed::map<Domain, pair<Range, Range2>>(res);
19459}
19460
19461template <typename Domain, typename Range, typename Range2>
19462typed::set<pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::range() const
19463{
19464  auto res = isl::basic_map::range();
19465  return typed::set<pair<Range, Range2>>(res);
19466}
19467
19468template <typename Domain, typename Range, typename Range2>
19469typed::map<Domain, Range> typed::basic_map<Domain, pair<Range, Range2>>::range_factor_domain() const
19470{
19471  auto res = isl::basic_map::range_factor_domain();
19472  return typed::map<Domain, Range>(res);
19473}
19474
19475template <typename Domain, typename Range, typename Range2>
19476typed::map<Domain, Range2> typed::basic_map<Domain, pair<Range, Range2>>::range_factor_range() const
19477{
19478  auto res = isl::basic_map::range_factor_range();
19479  return typed::map<Domain, Range2>(res);
19480}
19481
19482template <typename Domain, typename Range, typename Range2>
19483typed::fixed_box<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::range_lattice_tile() const
19484{
19485  auto res = isl::basic_map::range_lattice_tile();
19486  return typed::fixed_box<Domain, pair<Range, Range2>>(res);
19487}
19488
19489template <typename Domain, typename Range, typename Range2>
19490typed::union_map<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::range_map() const
19491{
19492  auto res = isl::basic_map::range_map();
19493  return typed::union_map<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>>(res);
19494}
19495
19496template <typename Domain, typename Range, typename Range2>
19497template <typename Arg3>
19498typed::map<Domain, pair<pair<Range, Range2>, Arg3>> typed::basic_map<Domain, pair<Range, Range2>>::range_product(const typed::map<Domain, Arg3> &map2) const
19499{
19500  auto res = isl::basic_map::range_product(map2);
19501  return typed::map<Domain, pair<pair<Range, Range2>, Arg3>>(res);
19502}
19503
19504template <typename Domain, typename Range, typename Range2>
19505template <typename Arg3>
19506typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> typed::basic_map<Domain, pair<Range, Range2>>::range_product(const typed::union_map<Domain, Arg3> &umap2) const
19507{
19508  auto res = isl::basic_map::range_product(umap2);
19509  return typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>>(res);
19510}
19511
19512template <typename Domain, typename Range, typename Range2>
19513typed::map<Domain, pair<Range2, Range>> typed::basic_map<Domain, pair<Range, Range2>>::range_reverse() const
19514{
19515  auto res = isl::basic_map::range_reverse();
19516  return typed::map<Domain, pair<Range2, Range>>(res);
19517}
19518
19519template <typename Domain, typename Range, typename Range2>
19520typed::fixed_box<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::range_simple_fixed_box_hull() const
19521{
19522  auto res = isl::basic_map::range_simple_fixed_box_hull();
19523  return typed::fixed_box<Domain, pair<Range, Range2>>(res);
19524}
19525
19526template <typename Domain, typename Range, typename Range2>
19527typed::basic_map<pair<Range, Range2>, Domain> typed::basic_map<Domain, pair<Range, Range2>>::reverse() const
19528{
19529  auto res = isl::basic_map::reverse();
19530  return typed::basic_map<pair<Range, Range2>, Domain>(res);
19531}
19532
19533template <typename Domain, typename Range, typename Range2>
19534template <typename Domain2>
19535typed::map<Domain2, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::set_domain_tuple(const typed::id<Anonymous> &id) const
19536{
19537  auto res = isl::basic_map::set_domain_tuple(id);
19538  return typed::map<Domain2, pair<Range, Range2>>(res);
19539}
19540
19541template <typename Domain, typename Range, typename Range2>
19542template <typename Domain2>
19543typed::map<Domain2, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::set_domain_tuple(const std::string &id) const
19544{
19545  auto res = isl::basic_map::set_domain_tuple(id);
19546  return typed::map<Domain2, pair<Range, Range2>>(res);
19547}
19548
19549template <typename Domain, typename Range, typename Range2>
19550typed::space<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::space() const
19551{
19552  auto res = isl::basic_map::space();
19553  return typed::space<Domain, pair<Range, Range2>>(res);
19554}
19555
19556template <typename Domain, typename Range, typename Range2>
19557typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::subtract(const typed::map<Domain, pair<Range, Range2>> &map2) const
19558{
19559  auto res = isl::basic_map::subtract(map2);
19560  return typed::map<Domain, pair<Range, Range2>>(res);
19561}
19562
19563template <typename Domain, typename Range, typename Range2>
19564typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::subtract(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const
19565{
19566  auto res = isl::basic_map::subtract(umap2);
19567  return typed::union_map<Domain, pair<Range, Range2>>(res);
19568}
19569
19570template <typename Domain, typename Range, typename Range2>
19571typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::subtract_domain(const typed::union_set<Domain> &dom) const
19572{
19573  auto res = isl::basic_map::subtract_domain(dom);
19574  return typed::union_map<Domain, pair<Range, Range2>>(res);
19575}
19576
19577template <typename Domain, typename Range, typename Range2>
19578typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const
19579{
19580  auto res = isl::basic_map::subtract_range(dom);
19581  return typed::union_map<Domain, pair<Range, Range2>>(res);
19582}
19583
19584template <typename Domain, typename Range, typename Range2>
19585typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::to_union_map() const
19586{
19587  auto res = isl::basic_map::to_union_map();
19588  return typed::union_map<Domain, pair<Range, Range2>>(res);
19589}
19590
19591template <typename Domain, typename Range, typename Range2>
19592typed::map<pair<Domain, Range>, Range2> typed::basic_map<Domain, pair<Range, Range2>>::uncurry() const
19593{
19594  auto res = isl::basic_map::uncurry();
19595  return typed::map<pair<Domain, Range>, Range2>(res);
19596}
19597
19598template <typename Domain, typename Range, typename Range2>
19599typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::unite(const typed::basic_map<Domain, pair<Range, Range2>> &bmap2) const
19600{
19601  auto res = isl::basic_map::unite(bmap2);
19602  return typed::map<Domain, pair<Range, Range2>>(res);
19603}
19604
19605template <typename Domain, typename Range, typename Range2>
19606typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::unite(const typed::map<Domain, pair<Range, Range2>> &map2) const
19607{
19608  auto res = isl::basic_map::unite(map2);
19609  return typed::map<Domain, pair<Range, Range2>>(res);
19610}
19611
19612template <typename Domain, typename Range, typename Range2>
19613typed::union_map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::unite(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const
19614{
19615  auto res = isl::basic_map::unite(umap2);
19616  return typed::union_map<Domain, pair<Range, Range2>>(res);
19617}
19618
19619template <typename Domain, typename Range, typename Range2>
19620typed::map<Domain, pair<Range, Range2>> typed::basic_map<Domain, pair<Range, Range2>>::upper_bound(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &upper) const
19621{
19622  auto res = isl::basic_map::upper_bound(upper);
19623  return typed::map<Domain, pair<Range, Range2>>(res);
19624}
19625
19626template <typename Domain, typename Range, typename Range2>
19627typed::set<pair<Domain, pair<Range, Range2>>> typed::basic_map<Domain, pair<Range, Range2>>::wrap() const
19628{
19629  auto res = isl::basic_map::wrap();
19630  return typed::set<pair<Domain, pair<Range, Range2>>>(res);
19631}
19632
19633template <typename T1, typename T2>
19634typed::basic_map<pair<T1, T2>, pair<T1, T2>>::basic_map(const isl::ctx &ctx, const std::string &str)
19635  : isl::basic_map(ctx, str)
19636{
19637}
19638
19639template <typename T1, typename T2>
19640template <typename Domain2>
19641typed::basic_map<Domain2, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &bmap2) const
19642{
19643  auto res = isl::basic_map::apply_domain(bmap2);
19644  return typed::basic_map<Domain2, pair<T1, T2>>(res);
19645}
19646
19647template <typename T1, typename T2>
19648template <typename Domain2>
19649typed::map<Domain2, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::apply_domain(const typed::map<pair<T1, T2>, Domain2> &map2) const
19650{
19651  auto res = isl::basic_map::apply_domain(map2);
19652  return typed::map<Domain2, pair<T1, T2>>(res);
19653}
19654
19655template <typename T1, typename T2>
19656template <typename Domain2>
19657typed::union_map<Domain2, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const
19658{
19659  auto res = isl::basic_map::apply_domain(umap2);
19660  return typed::union_map<Domain2, pair<T1, T2>>(res);
19661}
19662
19663template <typename T1, typename T2>
19664template <typename Range2>
19665typed::basic_map<pair<T1, T2>, Range2> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::apply_range(const typed::basic_map<pair<T1, T2>, Range2> &bmap2) const
19666{
19667  auto res = isl::basic_map::apply_range(bmap2);
19668  return typed::basic_map<pair<T1, T2>, Range2>(res);
19669}
19670
19671template <typename T1, typename T2>
19672template <typename Range2>
19673typed::map<pair<T1, T2>, Range2> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::apply_range(const typed::map<pair<T1, T2>, Range2> &map2) const
19674{
19675  auto res = isl::basic_map::apply_range(map2);
19676  return typed::map<pair<T1, T2>, Range2>(res);
19677}
19678
19679template <typename T1, typename T2>
19680template <typename Range2>
19681typed::union_map<pair<T1, T2>, Range2> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::apply_range(const typed::union_map<pair<T1, T2>, Range2> &umap2) const
19682{
19683  auto res = isl::basic_map::apply_range(umap2);
19684  return typed::union_map<pair<T1, T2>, Range2>(res);
19685}
19686
19687template <typename T1, typename T2>
19688typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::as_map() const
19689{
19690  auto res = isl::basic_map::as_map();
19691  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19692}
19693
19694template <typename T1, typename T2>
19695typed::multi_union_pw_aff<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::as_multi_union_pw_aff() const
19696{
19697  auto res = isl::basic_map::as_multi_union_pw_aff();
19698  return typed::multi_union_pw_aff<pair<T1, T2>, pair<T1, T2>>(res);
19699}
19700
19701template <typename T1, typename T2>
19702typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::as_pw_multi_aff() const
19703{
19704  auto res = isl::basic_map::as_pw_multi_aff();
19705  return typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>>(res);
19706}
19707
19708template <typename T1, typename T2>
19709typed::union_pw_multi_aff<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::as_union_pw_multi_aff() const
19710{
19711  auto res = isl::basic_map::as_union_pw_multi_aff();
19712  return typed::union_pw_multi_aff<pair<T1, T2>, pair<T1, T2>>(res);
19713}
19714
19715template <typename T1, typename T2>
19716typed::set<pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const
19717{
19718  auto res = isl::basic_map::bind_domain(tuple);
19719  return typed::set<pair<T1, T2>>(res);
19720}
19721
19722template <typename T1, typename T2>
19723typed::set<pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::bind_range(const typed::multi_id<pair<T1, T2>> &tuple) const
19724{
19725  auto res = isl::basic_map::bind_range(tuple);
19726  return typed::set<pair<T1, T2>>(res);
19727}
19728
19729template <typename T1, typename T2>
19730typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::coalesce() const
19731{
19732  auto res = isl::basic_map::coalesce();
19733  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19734}
19735
19736template <typename T1, typename T2>
19737typed::map<T1, pair<T2, pair<T1, T2>>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::curry() const
19738{
19739  auto res = isl::basic_map::curry();
19740  return typed::map<T1, pair<T2, pair<T1, T2>>>(res);
19741}
19742
19743template <typename T1, typename T2>
19744typed::basic_set<pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::deltas() const
19745{
19746  auto res = isl::basic_map::deltas();
19747  return typed::basic_set<pair<T1, T2>>(res);
19748}
19749
19750template <typename T1, typename T2>
19751typed::basic_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::detect_equalities() const
19752{
19753  auto res = isl::basic_map::detect_equalities();
19754  return typed::basic_map<pair<T1, T2>, pair<T1, T2>>(res);
19755}
19756
19757template <typename T1, typename T2>
19758typed::set<pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::domain() const
19759{
19760  auto res = isl::basic_map::domain();
19761  return typed::set<pair<T1, T2>>(res);
19762}
19763
19764template <typename T1, typename T2>
19765typed::map<T1, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::domain_factor_domain() const
19766{
19767  auto res = isl::basic_map::domain_factor_domain();
19768  return typed::map<T1, pair<T1, T2>>(res);
19769}
19770
19771template <typename T1, typename T2>
19772typed::map<T2, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::domain_factor_range() const
19773{
19774  auto res = isl::basic_map::domain_factor_range();
19775  return typed::map<T2, pair<T1, T2>>(res);
19776}
19777
19778template <typename T1, typename T2>
19779typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::domain_map() const
19780{
19781  auto res = isl::basic_map::domain_map();
19782  return typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>>(res);
19783}
19784
19785template <typename T1, typename T2>
19786typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::domain_map_union_pw_multi_aff() const
19787{
19788  auto res = isl::basic_map::domain_map_union_pw_multi_aff();
19789  return typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>>(res);
19790}
19791
19792template <typename T1, typename T2>
19793template <typename Domain2>
19794typed::map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::domain_product(const typed::map<Domain2, pair<T1, T2>> &map2) const
19795{
19796  auto res = isl::basic_map::domain_product(map2);
19797  return typed::map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>>(res);
19798}
19799
19800template <typename T1, typename T2>
19801template <typename Domain2>
19802typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::domain_product(const typed::union_map<Domain2, pair<T1, T2>> &umap2) const
19803{
19804  auto res = isl::basic_map::domain_product(umap2);
19805  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>>(res);
19806}
19807
19808template <typename T1, typename T2>
19809typed::map<pair<T2, T1>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::domain_reverse() const
19810{
19811  auto res = isl::basic_map::domain_reverse();
19812  return typed::map<pair<T2, T1>, pair<T1, T2>>(res);
19813}
19814
19815template <typename T1, typename T2>
19816typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::drop_unused_params() const
19817{
19818  auto res = isl::basic_map::drop_unused_params();
19819  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19820}
19821
19822template <typename T1, typename T2>
19823template <typename Range>
19824typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
19825{
19826  auto res = isl::basic_map::eq_at(mpa);
19827  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19828}
19829
19830template <typename T1, typename T2>
19831template <typename Range>
19832typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::multi_union_pw_aff<pair<T1, T2>, Range> &mupa) const
19833{
19834  auto res = isl::basic_map::eq_at(mupa);
19835  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
19836}
19837
19838template <typename T1, typename T2>
19839bool typed::basic_map<pair<T1, T2>, pair<T1, T2>>::every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<T1, T2>>)> &test) const
19840{
19841  auto lambda_test = [&] (isl::map arg0) {
19842    return test(typed::map<pair<T1, T2>, pair<T1, T2>>(arg0));
19843  };
19844  return isl::basic_map::every_map(lambda_test);
19845}
19846
19847template <typename T1, typename T2>
19848typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::extract_map(const typed::space<pair<T1, T2>, pair<T1, T2>> &space) const
19849{
19850  auto res = isl::basic_map::extract_map(space);
19851  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19852}
19853
19854template <typename T1, typename T2>
19855typed::basic_map<Anonymous, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::flatten_domain() const
19856{
19857  auto res = isl::basic_map::flatten_domain();
19858  return typed::basic_map<Anonymous, pair<T1, T2>>(res);
19859}
19860
19861template <typename T1, typename T2>
19862typed::basic_map<pair<T1, T2>, Anonymous> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::flatten_range() const
19863{
19864  auto res = isl::basic_map::flatten_range();
19865  return typed::basic_map<pair<T1, T2>, Anonymous>(res);
19866}
19867
19868template <typename T1, typename T2>
19869void typed::basic_map<pair<T1, T2>, pair<T1, T2>>::foreach_basic_map(const std::function<void(typed::basic_map<pair<T1, T2>, pair<T1, T2>>)> &fn) const
19870{
19871  auto lambda_fn = [&] (isl::basic_map arg0) {
19872    return fn(typed::basic_map<pair<T1, T2>, pair<T1, T2>>(arg0));
19873  };
19874  return isl::basic_map::foreach_basic_map(lambda_fn);
19875}
19876
19877template <typename T1, typename T2>
19878void typed::basic_map<pair<T1, T2>, pair<T1, T2>>::foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<T1, T2>>)> &fn) const
19879{
19880  auto lambda_fn = [&] (isl::map arg0) {
19881    return fn(typed::map<pair<T1, T2>, pair<T1, T2>>(arg0));
19882  };
19883  return isl::basic_map::foreach_map(lambda_fn);
19884}
19885
19886template <typename T1, typename T2>
19887typed::basic_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::gist(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &context) const
19888{
19889  auto res = isl::basic_map::gist(context);
19890  return typed::basic_map<pair<T1, T2>, pair<T1, T2>>(res);
19891}
19892
19893template <typename T1, typename T2>
19894typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::gist(const typed::map<pair<T1, T2>, pair<T1, T2>> &context) const
19895{
19896  auto res = isl::basic_map::gist(context);
19897  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19898}
19899
19900template <typename T1, typename T2>
19901typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::gist(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &context) const
19902{
19903  auto res = isl::basic_map::gist(context);
19904  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
19905}
19906
19907template <typename T1, typename T2>
19908typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::set<pair<T1, T2>> &context) const
19909{
19910  auto res = isl::basic_map::gist_domain(context);
19911  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19912}
19913
19914template <typename T1, typename T2>
19915typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::union_set<pair<T1, T2>> &uset) const
19916{
19917  auto res = isl::basic_map::gist_domain(uset);
19918  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
19919}
19920
19921template <typename T1, typename T2>
19922typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::gist_params(const typed::set<> &context) const
19923{
19924  auto res = isl::basic_map::gist_params(context);
19925  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19926}
19927
19928template <typename T1, typename T2>
19929typed::basic_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &bmap2) const
19930{
19931  auto res = isl::basic_map::intersect(bmap2);
19932  return typed::basic_map<pair<T1, T2>, pair<T1, T2>>(res);
19933}
19934
19935template <typename T1, typename T2>
19936typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const
19937{
19938  auto res = isl::basic_map::intersect(map2);
19939  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19940}
19941
19942template <typename T1, typename T2>
19943typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
19944{
19945  auto res = isl::basic_map::intersect(umap2);
19946  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
19947}
19948
19949template <typename T1, typename T2>
19950typed::basic_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::basic_set<pair<T1, T2>> &bset) const
19951{
19952  auto res = isl::basic_map::intersect_domain(bset);
19953  return typed::basic_map<pair<T1, T2>, pair<T1, T2>>(res);
19954}
19955
19956template <typename T1, typename T2>
19957typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::set<pair<T1, T2>> &set) const
19958{
19959  auto res = isl::basic_map::intersect_domain(set);
19960  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19961}
19962
19963template <typename T1, typename T2>
19964typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::space<pair<T1, T2>> &space) const
19965{
19966  auto res = isl::basic_map::intersect_domain(space);
19967  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
19968}
19969
19970template <typename T1, typename T2>
19971typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const
19972{
19973  auto res = isl::basic_map::intersect_domain(uset);
19974  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
19975}
19976
19977template <typename T1, typename T2>
19978typed::basic_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::point<pair<T1, T2>> &bset) const
19979{
19980  auto res = isl::basic_map::intersect_domain(bset);
19981  return typed::basic_map<pair<T1, T2>, pair<T1, T2>>(res);
19982}
19983
19984template <typename T1, typename T2>
19985typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::set<T1> &domain) const
19986{
19987  auto res = isl::basic_map::intersect_domain_wrapped_domain(domain);
19988  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
19989}
19990
19991template <typename T1, typename T2>
19992typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const
19993{
19994  auto res = isl::basic_map::intersect_domain_wrapped_domain(domain);
19995  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
19996}
19997
19998template <typename T1, typename T2>
19999typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_params(const typed::set<> &params) const
20000{
20001  auto res = isl::basic_map::intersect_params(params);
20002  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20003}
20004
20005template <typename T1, typename T2>
20006typed::basic_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::basic_set<pair<T1, T2>> &bset) const
20007{
20008  auto res = isl::basic_map::intersect_range(bset);
20009  return typed::basic_map<pair<T1, T2>, pair<T1, T2>>(res);
20010}
20011
20012template <typename T1, typename T2>
20013typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::set<pair<T1, T2>> &set) const
20014{
20015  auto res = isl::basic_map::intersect_range(set);
20016  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20017}
20018
20019template <typename T1, typename T2>
20020typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::space<pair<T1, T2>> &space) const
20021{
20022  auto res = isl::basic_map::intersect_range(space);
20023  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
20024}
20025
20026template <typename T1, typename T2>
20027typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::union_set<pair<T1, T2>> &uset) const
20028{
20029  auto res = isl::basic_map::intersect_range(uset);
20030  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
20031}
20032
20033template <typename T1, typename T2>
20034typed::basic_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::point<pair<T1, T2>> &bset) const
20035{
20036  auto res = isl::basic_map::intersect_range(bset);
20037  return typed::basic_map<pair<T1, T2>, pair<T1, T2>>(res);
20038}
20039
20040template <typename T1, typename T2>
20041typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::set<T1> &domain) const
20042{
20043  auto res = isl::basic_map::intersect_range_wrapped_domain(domain);
20044  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20045}
20046
20047template <typename T1, typename T2>
20048typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::union_set<T1> &domain) const
20049{
20050  auto res = isl::basic_map::intersect_range_wrapped_domain(domain);
20051  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
20052}
20053
20054template <typename T1, typename T2>
20055template <typename Range>
20056typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::lex_ge_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
20057{
20058  auto res = isl::basic_map::lex_ge_at(mpa);
20059  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20060}
20061
20062template <typename T1, typename T2>
20063template <typename Range>
20064typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::lex_gt_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
20065{
20066  auto res = isl::basic_map::lex_gt_at(mpa);
20067  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20068}
20069
20070template <typename T1, typename T2>
20071template <typename Range>
20072typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::lex_le_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
20073{
20074  auto res = isl::basic_map::lex_le_at(mpa);
20075  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20076}
20077
20078template <typename T1, typename T2>
20079template <typename Range>
20080typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::lex_lt_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
20081{
20082  auto res = isl::basic_map::lex_lt_at(mpa);
20083  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20084}
20085
20086template <typename T1, typename T2>
20087typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::lexmax() const
20088{
20089  auto res = isl::basic_map::lexmax();
20090  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20091}
20092
20093template <typename T1, typename T2>
20094typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::lexmax_pw_multi_aff() const
20095{
20096  auto res = isl::basic_map::lexmax_pw_multi_aff();
20097  return typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>>(res);
20098}
20099
20100template <typename T1, typename T2>
20101typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::lexmin() const
20102{
20103  auto res = isl::basic_map::lexmin();
20104  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20105}
20106
20107template <typename T1, typename T2>
20108typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::lexmin_pw_multi_aff() const
20109{
20110  auto res = isl::basic_map::lexmin_pw_multi_aff();
20111  return typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>>(res);
20112}
20113
20114template <typename T1, typename T2>
20115typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::lower_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> &lower) const
20116{
20117  auto res = isl::basic_map::lower_bound(lower);
20118  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20119}
20120
20121template <typename T1, typename T2>
20122typed::map_list<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::map_list() const
20123{
20124  auto res = isl::basic_map::map_list();
20125  return typed::map_list<pair<T1, T2>, pair<T1, T2>>(res);
20126}
20127
20128template <typename T1, typename T2>
20129typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::max_multi_pw_aff() const
20130{
20131  auto res = isl::basic_map::max_multi_pw_aff();
20132  return typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>>(res);
20133}
20134
20135template <typename T1, typename T2>
20136typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::min_multi_pw_aff() const
20137{
20138  auto res = isl::basic_map::min_multi_pw_aff();
20139  return typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>>(res);
20140}
20141
20142template <typename T1, typename T2>
20143typed::set<> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::params() const
20144{
20145  auto res = isl::basic_map::params();
20146  return typed::set<>(res);
20147}
20148
20149template <typename T1, typename T2>
20150template <typename Domain2>
20151typed::map<Domain2, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const
20152{
20153  auto res = isl::basic_map::preimage_domain(ma);
20154  return typed::map<Domain2, pair<T1, T2>>(res);
20155}
20156
20157template <typename T1, typename T2>
20158template <typename Domain2>
20159typed::map<Domain2, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const
20160{
20161  auto res = isl::basic_map::preimage_domain(mpa);
20162  return typed::map<Domain2, pair<T1, T2>>(res);
20163}
20164
20165template <typename T1, typename T2>
20166template <typename Domain2>
20167typed::map<Domain2, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const
20168{
20169  auto res = isl::basic_map::preimage_domain(pma);
20170  return typed::map<Domain2, pair<T1, T2>>(res);
20171}
20172
20173template <typename T1, typename T2>
20174template <typename Domain2>
20175typed::union_map<Domain2, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const
20176{
20177  auto res = isl::basic_map::preimage_domain(upma);
20178  return typed::union_map<Domain2, pair<T1, T2>>(res);
20179}
20180
20181template <typename T1, typename T2>
20182template <typename Range2>
20183typed::map<pair<T1, T2>, Range2> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::preimage_range(const typed::multi_aff<Range2, pair<T1, T2>> &ma) const
20184{
20185  auto res = isl::basic_map::preimage_range(ma);
20186  return typed::map<pair<T1, T2>, Range2>(res);
20187}
20188
20189template <typename T1, typename T2>
20190template <typename Range2>
20191typed::map<pair<T1, T2>, Range2> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::preimage_range(const typed::pw_multi_aff<Range2, pair<T1, T2>> &pma) const
20192{
20193  auto res = isl::basic_map::preimage_range(pma);
20194  return typed::map<pair<T1, T2>, Range2>(res);
20195}
20196
20197template <typename T1, typename T2>
20198template <typename Range2>
20199typed::union_map<pair<T1, T2>, Range2> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::preimage_range(const typed::union_pw_multi_aff<Range2, pair<T1, T2>> &upma) const
20200{
20201  auto res = isl::basic_map::preimage_range(upma);
20202  return typed::union_map<pair<T1, T2>, Range2>(res);
20203}
20204
20205template <typename T1, typename T2>
20206template <typename Domain2, typename Range2>
20207typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::product(const typed::map<Domain2, Range2> &map2) const
20208{
20209  auto res = isl::basic_map::product(map2);
20210  return typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>>(res);
20211}
20212
20213template <typename T1, typename T2>
20214template <typename Domain2, typename Range2>
20215typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::product(const typed::union_map<Domain2, Range2> &umap2) const
20216{
20217  auto res = isl::basic_map::product(umap2);
20218  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>>(res);
20219}
20220
20221template <typename T1, typename T2>
20222typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::project_out_all_params() const
20223{
20224  auto res = isl::basic_map::project_out_all_params();
20225  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20226}
20227
20228template <typename T1, typename T2>
20229typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::project_out_param(const typed::id<Anonymous> &id) const
20230{
20231  auto res = isl::basic_map::project_out_param(id);
20232  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20233}
20234
20235template <typename T1, typename T2>
20236typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::project_out_param(const std::string &id) const
20237{
20238  auto res = isl::basic_map::project_out_param(id);
20239  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20240}
20241
20242template <typename T1, typename T2>
20243typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::project_out_param(const typed::id_list<Anonymous> &list) const
20244{
20245  auto res = isl::basic_map::project_out_param(list);
20246  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20247}
20248
20249template <typename T1, typename T2>
20250typed::set<pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::range() const
20251{
20252  auto res = isl::basic_map::range();
20253  return typed::set<pair<T1, T2>>(res);
20254}
20255
20256template <typename T1, typename T2>
20257typed::map<pair<T1, T2>, T1> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::range_factor_domain() const
20258{
20259  auto res = isl::basic_map::range_factor_domain();
20260  return typed::map<pair<T1, T2>, T1>(res);
20261}
20262
20263template <typename T1, typename T2>
20264typed::map<pair<T1, T2>, T2> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::range_factor_range() const
20265{
20266  auto res = isl::basic_map::range_factor_range();
20267  return typed::map<pair<T1, T2>, T2>(res);
20268}
20269
20270template <typename T1, typename T2>
20271typed::fixed_box<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::range_lattice_tile() const
20272{
20273  auto res = isl::basic_map::range_lattice_tile();
20274  return typed::fixed_box<pair<T1, T2>, pair<T1, T2>>(res);
20275}
20276
20277template <typename T1, typename T2>
20278typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::range_map() const
20279{
20280  auto res = isl::basic_map::range_map();
20281  return typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>>(res);
20282}
20283
20284template <typename T1, typename T2>
20285template <typename Range2>
20286typed::map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::range_product(const typed::map<pair<T1, T2>, Range2> &map2) const
20287{
20288  auto res = isl::basic_map::range_product(map2);
20289  return typed::map<pair<T1, T2>, pair<pair<T1, T2>, Range2>>(res);
20290}
20291
20292template <typename T1, typename T2>
20293template <typename Range2>
20294typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::range_product(const typed::union_map<pair<T1, T2>, Range2> &umap2) const
20295{
20296  auto res = isl::basic_map::range_product(umap2);
20297  return typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>>(res);
20298}
20299
20300template <typename T1, typename T2>
20301typed::map<pair<T1, T2>, pair<T2, T1>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::range_reverse() const
20302{
20303  auto res = isl::basic_map::range_reverse();
20304  return typed::map<pair<T1, T2>, pair<T2, T1>>(res);
20305}
20306
20307template <typename T1, typename T2>
20308typed::fixed_box<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::range_simple_fixed_box_hull() const
20309{
20310  auto res = isl::basic_map::range_simple_fixed_box_hull();
20311  return typed::fixed_box<pair<T1, T2>, pair<T1, T2>>(res);
20312}
20313
20314template <typename T1, typename T2>
20315typed::basic_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::reverse() const
20316{
20317  auto res = isl::basic_map::reverse();
20318  return typed::basic_map<pair<T1, T2>, pair<T1, T2>>(res);
20319}
20320
20321template <typename T1, typename T2>
20322typed::space<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::space() const
20323{
20324  auto res = isl::basic_map::space();
20325  return typed::space<pair<T1, T2>, pair<T1, T2>>(res);
20326}
20327
20328template <typename T1, typename T2>
20329typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::subtract(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const
20330{
20331  auto res = isl::basic_map::subtract(map2);
20332  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20333}
20334
20335template <typename T1, typename T2>
20336typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::subtract(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
20337{
20338  auto res = isl::basic_map::subtract(umap2);
20339  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
20340}
20341
20342template <typename T1, typename T2>
20343typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const
20344{
20345  auto res = isl::basic_map::subtract_domain(dom);
20346  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
20347}
20348
20349template <typename T1, typename T2>
20350typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::subtract_range(const typed::union_set<pair<T1, T2>> &dom) const
20351{
20352  auto res = isl::basic_map::subtract_range(dom);
20353  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
20354}
20355
20356template <typename T1, typename T2>
20357typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::to_union_map() const
20358{
20359  auto res = isl::basic_map::to_union_map();
20360  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
20361}
20362
20363template <typename T1, typename T2>
20364typed::map<pair<pair<T1, T2>, T1>, T2> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::uncurry() const
20365{
20366  auto res = isl::basic_map::uncurry();
20367  return typed::map<pair<pair<T1, T2>, T1>, T2>(res);
20368}
20369
20370template <typename T1, typename T2>
20371typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::unite(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &bmap2) const
20372{
20373  auto res = isl::basic_map::unite(bmap2);
20374  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20375}
20376
20377template <typename T1, typename T2>
20378typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::unite(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const
20379{
20380  auto res = isl::basic_map::unite(map2);
20381  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20382}
20383
20384template <typename T1, typename T2>
20385typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::unite(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
20386{
20387  auto res = isl::basic_map::unite(umap2);
20388  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
20389}
20390
20391template <typename T1, typename T2>
20392typed::map<pair<T1, T2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::upper_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> &upper) const
20393{
20394  auto res = isl::basic_map::upper_bound(upper);
20395  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
20396}
20397
20398template <typename T1, typename T2>
20399typed::set<pair<pair<T1, T2>, pair<T1, T2>>> typed::basic_map<pair<T1, T2>, pair<T1, T2>>::wrap() const
20400{
20401  auto res = isl::basic_map::wrap();
20402  return typed::set<pair<pair<T1, T2>, pair<T1, T2>>>(res);
20403}
20404
20405template <typename T1, typename T2, typename Range, typename Range2>
20406typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::basic_map(const isl::ctx &ctx, const std::string &str)
20407  : isl::basic_map(ctx, str)
20408{
20409}
20410
20411template <typename T1, typename T2, typename Range, typename Range2>
20412template <typename Domain2>
20413typed::basic_map<Domain2, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &bmap2) const
20414{
20415  auto res = isl::basic_map::apply_domain(bmap2);
20416  return typed::basic_map<Domain2, pair<Range, Range2>>(res);
20417}
20418
20419template <typename T1, typename T2, typename Range, typename Range2>
20420template <typename Domain2>
20421typed::map<Domain2, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::apply_domain(const typed::map<pair<T1, T2>, Domain2> &map2) const
20422{
20423  auto res = isl::basic_map::apply_domain(map2);
20424  return typed::map<Domain2, pair<Range, Range2>>(res);
20425}
20426
20427template <typename T1, typename T2, typename Range, typename Range2>
20428template <typename Domain2>
20429typed::union_map<Domain2, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const
20430{
20431  auto res = isl::basic_map::apply_domain(umap2);
20432  return typed::union_map<Domain2, pair<Range, Range2>>(res);
20433}
20434
20435template <typename T1, typename T2, typename Range, typename Range2>
20436template <typename Arg2>
20437typed::basic_map<pair<T1, T2>, Arg2> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::apply_range(const typed::basic_map<pair<Range, Range2>, Arg2> &bmap2) const
20438{
20439  auto res = isl::basic_map::apply_range(bmap2);
20440  return typed::basic_map<pair<T1, T2>, Arg2>(res);
20441}
20442
20443template <typename T1, typename T2, typename Range, typename Range2>
20444template <typename Arg2>
20445typed::map<pair<T1, T2>, Arg2> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::apply_range(const typed::map<pair<Range, Range2>, Arg2> &map2) const
20446{
20447  auto res = isl::basic_map::apply_range(map2);
20448  return typed::map<pair<T1, T2>, Arg2>(res);
20449}
20450
20451template <typename T1, typename T2, typename Range, typename Range2>
20452template <typename Arg2>
20453typed::union_map<pair<T1, T2>, Arg2> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::apply_range(const typed::union_map<pair<Range, Range2>, Arg2> &umap2) const
20454{
20455  auto res = isl::basic_map::apply_range(umap2);
20456  return typed::union_map<pair<T1, T2>, Arg2>(res);
20457}
20458
20459template <typename T1, typename T2, typename Range, typename Range2>
20460typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::as_map() const
20461{
20462  auto res = isl::basic_map::as_map();
20463  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20464}
20465
20466template <typename T1, typename T2, typename Range, typename Range2>
20467typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::as_multi_union_pw_aff() const
20468{
20469  auto res = isl::basic_map::as_multi_union_pw_aff();
20470  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
20471}
20472
20473template <typename T1, typename T2, typename Range, typename Range2>
20474typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::as_pw_multi_aff() const
20475{
20476  auto res = isl::basic_map::as_pw_multi_aff();
20477  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
20478}
20479
20480template <typename T1, typename T2, typename Range, typename Range2>
20481typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::as_union_pw_multi_aff() const
20482{
20483  auto res = isl::basic_map::as_union_pw_multi_aff();
20484  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
20485}
20486
20487template <typename T1, typename T2, typename Range, typename Range2>
20488typed::set<pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const
20489{
20490  auto res = isl::basic_map::bind_domain(tuple);
20491  return typed::set<pair<Range, Range2>>(res);
20492}
20493
20494template <typename T1, typename T2, typename Range, typename Range2>
20495typed::set<pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const
20496{
20497  auto res = isl::basic_map::bind_range(tuple);
20498  return typed::set<pair<T1, T2>>(res);
20499}
20500
20501template <typename T1, typename T2, typename Range, typename Range2>
20502typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::coalesce() const
20503{
20504  auto res = isl::basic_map::coalesce();
20505  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20506}
20507
20508template <typename T1, typename T2, typename Range, typename Range2>
20509typed::map<T1, pair<T2, pair<Range, Range2>>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::curry() const
20510{
20511  auto res = isl::basic_map::curry();
20512  return typed::map<T1, pair<T2, pair<Range, Range2>>>(res);
20513}
20514
20515template <typename T1, typename T2, typename Range, typename Range2>
20516typed::basic_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::detect_equalities() const
20517{
20518  auto res = isl::basic_map::detect_equalities();
20519  return typed::basic_map<pair<T1, T2>, pair<Range, Range2>>(res);
20520}
20521
20522template <typename T1, typename T2, typename Range, typename Range2>
20523typed::set<pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::domain() const
20524{
20525  auto res = isl::basic_map::domain();
20526  return typed::set<pair<T1, T2>>(res);
20527}
20528
20529template <typename T1, typename T2, typename Range, typename Range2>
20530typed::map<T1, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::domain_factor_domain() const
20531{
20532  auto res = isl::basic_map::domain_factor_domain();
20533  return typed::map<T1, pair<Range, Range2>>(res);
20534}
20535
20536template <typename T1, typename T2, typename Range, typename Range2>
20537typed::map<T2, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::domain_factor_range() const
20538{
20539  auto res = isl::basic_map::domain_factor_range();
20540  return typed::map<T2, pair<Range, Range2>>(res);
20541}
20542
20543template <typename T1, typename T2, typename Range, typename Range2>
20544typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::domain_map() const
20545{
20546  auto res = isl::basic_map::domain_map();
20547  return typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>>(res);
20548}
20549
20550template <typename T1, typename T2, typename Range, typename Range2>
20551typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::domain_map_union_pw_multi_aff() const
20552{
20553  auto res = isl::basic_map::domain_map_union_pw_multi_aff();
20554  return typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>>(res);
20555}
20556
20557template <typename T1, typename T2, typename Range, typename Range2>
20558template <typename Domain2>
20559typed::map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::domain_product(const typed::map<Domain2, pair<Range, Range2>> &map2) const
20560{
20561  auto res = isl::basic_map::domain_product(map2);
20562  return typed::map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>>(res);
20563}
20564
20565template <typename T1, typename T2, typename Range, typename Range2>
20566template <typename Domain2>
20567typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const
20568{
20569  auto res = isl::basic_map::domain_product(umap2);
20570  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>>(res);
20571}
20572
20573template <typename T1, typename T2, typename Range, typename Range2>
20574typed::map<pair<T2, T1>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::domain_reverse() const
20575{
20576  auto res = isl::basic_map::domain_reverse();
20577  return typed::map<pair<T2, T1>, pair<Range, Range2>>(res);
20578}
20579
20580template <typename T1, typename T2, typename Range, typename Range2>
20581typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::drop_unused_params() const
20582{
20583  auto res = isl::basic_map::drop_unused_params();
20584  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20585}
20586
20587template <typename T1, typename T2, typename Range, typename Range2>
20588bool typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &test) const
20589{
20590  auto lambda_test = [&] (isl::map arg0) {
20591    return test(typed::map<pair<T1, T2>, pair<Range, Range2>>(arg0));
20592  };
20593  return isl::basic_map::every_map(lambda_test);
20594}
20595
20596template <typename T1, typename T2, typename Range, typename Range2>
20597typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::extract_map(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const
20598{
20599  auto res = isl::basic_map::extract_map(space);
20600  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20601}
20602
20603template <typename T1, typename T2, typename Range, typename Range2>
20604typed::basic_map<Anonymous, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::flatten_domain() const
20605{
20606  auto res = isl::basic_map::flatten_domain();
20607  return typed::basic_map<Anonymous, pair<Range, Range2>>(res);
20608}
20609
20610template <typename T1, typename T2, typename Range, typename Range2>
20611typed::basic_map<pair<T1, T2>, Anonymous> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::flatten_range() const
20612{
20613  auto res = isl::basic_map::flatten_range();
20614  return typed::basic_map<pair<T1, T2>, Anonymous>(res);
20615}
20616
20617template <typename T1, typename T2, typename Range, typename Range2>
20618void typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::foreach_basic_map(const std::function<void(typed::basic_map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const
20619{
20620  auto lambda_fn = [&] (isl::basic_map arg0) {
20621    return fn(typed::basic_map<pair<T1, T2>, pair<Range, Range2>>(arg0));
20622  };
20623  return isl::basic_map::foreach_basic_map(lambda_fn);
20624}
20625
20626template <typename T1, typename T2, typename Range, typename Range2>
20627void typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const
20628{
20629  auto lambda_fn = [&] (isl::map arg0) {
20630    return fn(typed::map<pair<T1, T2>, pair<Range, Range2>>(arg0));
20631  };
20632  return isl::basic_map::foreach_map(lambda_fn);
20633}
20634
20635template <typename T1, typename T2, typename Range, typename Range2>
20636typed::basic_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &context) const
20637{
20638  auto res = isl::basic_map::gist(context);
20639  return typed::basic_map<pair<T1, T2>, pair<Range, Range2>>(res);
20640}
20641
20642template <typename T1, typename T2, typename Range, typename Range2>
20643typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::map<pair<T1, T2>, pair<Range, Range2>> &context) const
20644{
20645  auto res = isl::basic_map::gist(context);
20646  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20647}
20648
20649template <typename T1, typename T2, typename Range, typename Range2>
20650typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &context) const
20651{
20652  auto res = isl::basic_map::gist(context);
20653  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
20654}
20655
20656template <typename T1, typename T2, typename Range, typename Range2>
20657typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::set<pair<T1, T2>> &context) const
20658{
20659  auto res = isl::basic_map::gist_domain(context);
20660  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20661}
20662
20663template <typename T1, typename T2, typename Range, typename Range2>
20664typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::union_set<pair<T1, T2>> &uset) const
20665{
20666  auto res = isl::basic_map::gist_domain(uset);
20667  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
20668}
20669
20670template <typename T1, typename T2, typename Range, typename Range2>
20671typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::set<> &context) const
20672{
20673  auto res = isl::basic_map::gist_params(context);
20674  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20675}
20676
20677template <typename T1, typename T2, typename Range, typename Range2>
20678typed::basic_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &bmap2) const
20679{
20680  auto res = isl::basic_map::intersect(bmap2);
20681  return typed::basic_map<pair<T1, T2>, pair<Range, Range2>>(res);
20682}
20683
20684template <typename T1, typename T2, typename Range, typename Range2>
20685typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const
20686{
20687  auto res = isl::basic_map::intersect(map2);
20688  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20689}
20690
20691template <typename T1, typename T2, typename Range, typename Range2>
20692typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
20693{
20694  auto res = isl::basic_map::intersect(umap2);
20695  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
20696}
20697
20698template <typename T1, typename T2, typename Range, typename Range2>
20699typed::basic_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::basic_set<pair<T1, T2>> &bset) const
20700{
20701  auto res = isl::basic_map::intersect_domain(bset);
20702  return typed::basic_map<pair<T1, T2>, pair<Range, Range2>>(res);
20703}
20704
20705template <typename T1, typename T2, typename Range, typename Range2>
20706typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::set<pair<T1, T2>> &set) const
20707{
20708  auto res = isl::basic_map::intersect_domain(set);
20709  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20710}
20711
20712template <typename T1, typename T2, typename Range, typename Range2>
20713typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::space<pair<T1, T2>> &space) const
20714{
20715  auto res = isl::basic_map::intersect_domain(space);
20716  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
20717}
20718
20719template <typename T1, typename T2, typename Range, typename Range2>
20720typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const
20721{
20722  auto res = isl::basic_map::intersect_domain(uset);
20723  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
20724}
20725
20726template <typename T1, typename T2, typename Range, typename Range2>
20727typed::basic_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::point<pair<T1, T2>> &bset) const
20728{
20729  auto res = isl::basic_map::intersect_domain(bset);
20730  return typed::basic_map<pair<T1, T2>, pair<Range, Range2>>(res);
20731}
20732
20733template <typename T1, typename T2, typename Range, typename Range2>
20734typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::set<T1> &domain) const
20735{
20736  auto res = isl::basic_map::intersect_domain_wrapped_domain(domain);
20737  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20738}
20739
20740template <typename T1, typename T2, typename Range, typename Range2>
20741typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const
20742{
20743  auto res = isl::basic_map::intersect_domain_wrapped_domain(domain);
20744  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
20745}
20746
20747template <typename T1, typename T2, typename Range, typename Range2>
20748typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::set<> &params) const
20749{
20750  auto res = isl::basic_map::intersect_params(params);
20751  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20752}
20753
20754template <typename T1, typename T2, typename Range, typename Range2>
20755typed::basic_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::basic_set<pair<Range, Range2>> &bset) const
20756{
20757  auto res = isl::basic_map::intersect_range(bset);
20758  return typed::basic_map<pair<T1, T2>, pair<Range, Range2>>(res);
20759}
20760
20761template <typename T1, typename T2, typename Range, typename Range2>
20762typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::set<pair<Range, Range2>> &set) const
20763{
20764  auto res = isl::basic_map::intersect_range(set);
20765  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20766}
20767
20768template <typename T1, typename T2, typename Range, typename Range2>
20769typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::space<pair<Range, Range2>> &space) const
20770{
20771  auto res = isl::basic_map::intersect_range(space);
20772  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
20773}
20774
20775template <typename T1, typename T2, typename Range, typename Range2>
20776typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const
20777{
20778  auto res = isl::basic_map::intersect_range(uset);
20779  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
20780}
20781
20782template <typename T1, typename T2, typename Range, typename Range2>
20783typed::basic_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::point<pair<Range, Range2>> &bset) const
20784{
20785  auto res = isl::basic_map::intersect_range(bset);
20786  return typed::basic_map<pair<T1, T2>, pair<Range, Range2>>(res);
20787}
20788
20789template <typename T1, typename T2, typename Range, typename Range2>
20790typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::set<Range> &domain) const
20791{
20792  auto res = isl::basic_map::intersect_range_wrapped_domain(domain);
20793  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20794}
20795
20796template <typename T1, typename T2, typename Range, typename Range2>
20797typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const
20798{
20799  auto res = isl::basic_map::intersect_range_wrapped_domain(domain);
20800  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
20801}
20802
20803template <typename T1, typename T2, typename Range, typename Range2>
20804typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::lexmax() const
20805{
20806  auto res = isl::basic_map::lexmax();
20807  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20808}
20809
20810template <typename T1, typename T2, typename Range, typename Range2>
20811typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::lexmax_pw_multi_aff() const
20812{
20813  auto res = isl::basic_map::lexmax_pw_multi_aff();
20814  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
20815}
20816
20817template <typename T1, typename T2, typename Range, typename Range2>
20818typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::lexmin() const
20819{
20820  auto res = isl::basic_map::lexmin();
20821  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20822}
20823
20824template <typename T1, typename T2, typename Range, typename Range2>
20825typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::lexmin_pw_multi_aff() const
20826{
20827  auto res = isl::basic_map::lexmin_pw_multi_aff();
20828  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
20829}
20830
20831template <typename T1, typename T2, typename Range, typename Range2>
20832typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::lower_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const
20833{
20834  auto res = isl::basic_map::lower_bound(lower);
20835  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20836}
20837
20838template <typename T1, typename T2, typename Range, typename Range2>
20839typed::map_list<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::map_list() const
20840{
20841  auto res = isl::basic_map::map_list();
20842  return typed::map_list<pair<T1, T2>, pair<Range, Range2>>(res);
20843}
20844
20845template <typename T1, typename T2, typename Range, typename Range2>
20846typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::max_multi_pw_aff() const
20847{
20848  auto res = isl::basic_map::max_multi_pw_aff();
20849  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
20850}
20851
20852template <typename T1, typename T2, typename Range, typename Range2>
20853typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::min_multi_pw_aff() const
20854{
20855  auto res = isl::basic_map::min_multi_pw_aff();
20856  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
20857}
20858
20859template <typename T1, typename T2, typename Range, typename Range2>
20860typed::set<> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::params() const
20861{
20862  auto res = isl::basic_map::params();
20863  return typed::set<>(res);
20864}
20865
20866template <typename T1, typename T2, typename Range, typename Range2>
20867template <typename Domain2>
20868typed::map<Domain2, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const
20869{
20870  auto res = isl::basic_map::preimage_domain(ma);
20871  return typed::map<Domain2, pair<Range, Range2>>(res);
20872}
20873
20874template <typename T1, typename T2, typename Range, typename Range2>
20875template <typename Domain2>
20876typed::map<Domain2, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const
20877{
20878  auto res = isl::basic_map::preimage_domain(mpa);
20879  return typed::map<Domain2, pair<Range, Range2>>(res);
20880}
20881
20882template <typename T1, typename T2, typename Range, typename Range2>
20883template <typename Domain2>
20884typed::map<Domain2, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const
20885{
20886  auto res = isl::basic_map::preimage_domain(pma);
20887  return typed::map<Domain2, pair<Range, Range2>>(res);
20888}
20889
20890template <typename T1, typename T2, typename Range, typename Range2>
20891template <typename Domain2>
20892typed::union_map<Domain2, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const
20893{
20894  auto res = isl::basic_map::preimage_domain(upma);
20895  return typed::union_map<Domain2, pair<Range, Range2>>(res);
20896}
20897
20898template <typename T1, typename T2, typename Range, typename Range2>
20899template <typename Arg2>
20900typed::map<pair<T1, T2>, Arg2> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::preimage_range(const typed::multi_aff<Arg2, pair<Range, Range2>> &ma) const
20901{
20902  auto res = isl::basic_map::preimage_range(ma);
20903  return typed::map<pair<T1, T2>, Arg2>(res);
20904}
20905
20906template <typename T1, typename T2, typename Range, typename Range2>
20907template <typename Arg2>
20908typed::map<pair<T1, T2>, Arg2> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::preimage_range(const typed::pw_multi_aff<Arg2, pair<Range, Range2>> &pma) const
20909{
20910  auto res = isl::basic_map::preimage_range(pma);
20911  return typed::map<pair<T1, T2>, Arg2>(res);
20912}
20913
20914template <typename T1, typename T2, typename Range, typename Range2>
20915template <typename Arg2>
20916typed::union_map<pair<T1, T2>, Arg2> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::preimage_range(const typed::union_pw_multi_aff<Arg2, pair<Range, Range2>> &upma) const
20917{
20918  auto res = isl::basic_map::preimage_range(upma);
20919  return typed::union_map<pair<T1, T2>, Arg2>(res);
20920}
20921
20922template <typename T1, typename T2, typename Range, typename Range2>
20923template <typename Domain2, typename Arg2>
20924typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::product(const typed::map<Domain2, Arg2> &map2) const
20925{
20926  auto res = isl::basic_map::product(map2);
20927  return typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
20928}
20929
20930template <typename T1, typename T2, typename Range, typename Range2>
20931template <typename Domain2, typename Arg2>
20932typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::product(const typed::union_map<Domain2, Arg2> &umap2) const
20933{
20934  auto res = isl::basic_map::product(umap2);
20935  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
20936}
20937
20938template <typename T1, typename T2, typename Range, typename Range2>
20939typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::project_out_all_params() const
20940{
20941  auto res = isl::basic_map::project_out_all_params();
20942  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20943}
20944
20945template <typename T1, typename T2, typename Range, typename Range2>
20946typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::project_out_param(const typed::id<Anonymous> &id) const
20947{
20948  auto res = isl::basic_map::project_out_param(id);
20949  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20950}
20951
20952template <typename T1, typename T2, typename Range, typename Range2>
20953typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::project_out_param(const std::string &id) const
20954{
20955  auto res = isl::basic_map::project_out_param(id);
20956  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20957}
20958
20959template <typename T1, typename T2, typename Range, typename Range2>
20960typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::project_out_param(const typed::id_list<Anonymous> &list) const
20961{
20962  auto res = isl::basic_map::project_out_param(list);
20963  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
20964}
20965
20966template <typename T1, typename T2, typename Range, typename Range2>
20967typed::set<pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::range() const
20968{
20969  auto res = isl::basic_map::range();
20970  return typed::set<pair<Range, Range2>>(res);
20971}
20972
20973template <typename T1, typename T2, typename Range, typename Range2>
20974typed::map<pair<T1, T2>, Range> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::range_factor_domain() const
20975{
20976  auto res = isl::basic_map::range_factor_domain();
20977  return typed::map<pair<T1, T2>, Range>(res);
20978}
20979
20980template <typename T1, typename T2, typename Range, typename Range2>
20981typed::map<pair<T1, T2>, Range2> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::range_factor_range() const
20982{
20983  auto res = isl::basic_map::range_factor_range();
20984  return typed::map<pair<T1, T2>, Range2>(res);
20985}
20986
20987template <typename T1, typename T2, typename Range, typename Range2>
20988typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::range_lattice_tile() const
20989{
20990  auto res = isl::basic_map::range_lattice_tile();
20991  return typed::fixed_box<pair<T1, T2>, pair<Range, Range2>>(res);
20992}
20993
20994template <typename T1, typename T2, typename Range, typename Range2>
20995typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::range_map() const
20996{
20997  auto res = isl::basic_map::range_map();
20998  return typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>>(res);
20999}
21000
21001template <typename T1, typename T2, typename Range, typename Range2>
21002template <typename Arg2>
21003typed::map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::map<pair<T1, T2>, Arg2> &map2) const
21004{
21005  auto res = isl::basic_map::range_product(map2);
21006  return typed::map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
21007}
21008
21009template <typename T1, typename T2, typename Range, typename Range2>
21010template <typename Arg2>
21011typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::union_map<pair<T1, T2>, Arg2> &umap2) const
21012{
21013  auto res = isl::basic_map::range_product(umap2);
21014  return typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
21015}
21016
21017template <typename T1, typename T2, typename Range, typename Range2>
21018typed::map<pair<T1, T2>, pair<Range2, Range>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::range_reverse() const
21019{
21020  auto res = isl::basic_map::range_reverse();
21021  return typed::map<pair<T1, T2>, pair<Range2, Range>>(res);
21022}
21023
21024template <typename T1, typename T2, typename Range, typename Range2>
21025typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::range_simple_fixed_box_hull() const
21026{
21027  auto res = isl::basic_map::range_simple_fixed_box_hull();
21028  return typed::fixed_box<pair<T1, T2>, pair<Range, Range2>>(res);
21029}
21030
21031template <typename T1, typename T2, typename Range, typename Range2>
21032typed::basic_map<pair<Range, Range2>, pair<T1, T2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::reverse() const
21033{
21034  auto res = isl::basic_map::reverse();
21035  return typed::basic_map<pair<Range, Range2>, pair<T1, T2>>(res);
21036}
21037
21038template <typename T1, typename T2, typename Range, typename Range2>
21039typed::space<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::space() const
21040{
21041  auto res = isl::basic_map::space();
21042  return typed::space<pair<T1, T2>, pair<Range, Range2>>(res);
21043}
21044
21045template <typename T1, typename T2, typename Range, typename Range2>
21046typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::subtract(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const
21047{
21048  auto res = isl::basic_map::subtract(map2);
21049  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
21050}
21051
21052template <typename T1, typename T2, typename Range, typename Range2>
21053typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::subtract(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
21054{
21055  auto res = isl::basic_map::subtract(umap2);
21056  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
21057}
21058
21059template <typename T1, typename T2, typename Range, typename Range2>
21060typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const
21061{
21062  auto res = isl::basic_map::subtract_domain(dom);
21063  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
21064}
21065
21066template <typename T1, typename T2, typename Range, typename Range2>
21067typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const
21068{
21069  auto res = isl::basic_map::subtract_range(dom);
21070  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
21071}
21072
21073template <typename T1, typename T2, typename Range, typename Range2>
21074typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::to_union_map() const
21075{
21076  auto res = isl::basic_map::to_union_map();
21077  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
21078}
21079
21080template <typename T1, typename T2, typename Range, typename Range2>
21081typed::map<pair<pair<T1, T2>, Range>, Range2> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::uncurry() const
21082{
21083  auto res = isl::basic_map::uncurry();
21084  return typed::map<pair<pair<T1, T2>, Range>, Range2>(res);
21085}
21086
21087template <typename T1, typename T2, typename Range, typename Range2>
21088typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::unite(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &bmap2) const
21089{
21090  auto res = isl::basic_map::unite(bmap2);
21091  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
21092}
21093
21094template <typename T1, typename T2, typename Range, typename Range2>
21095typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::unite(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const
21096{
21097  auto res = isl::basic_map::unite(map2);
21098  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
21099}
21100
21101template <typename T1, typename T2, typename Range, typename Range2>
21102typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::unite(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
21103{
21104  auto res = isl::basic_map::unite(umap2);
21105  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
21106}
21107
21108template <typename T1, typename T2, typename Range, typename Range2>
21109typed::map<pair<T1, T2>, pair<Range, Range2>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::upper_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const
21110{
21111  auto res = isl::basic_map::upper_bound(upper);
21112  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
21113}
21114
21115template <typename T1, typename T2, typename Range, typename Range2>
21116typed::set<pair<pair<T1, T2>, pair<Range, Range2>>> typed::basic_map<pair<T1, T2>, pair<Range, Range2>>::wrap() const
21117{
21118  auto res = isl::basic_map::wrap();
21119  return typed::set<pair<pair<T1, T2>, pair<Range, Range2>>>(res);
21120}
21121
21122typed::basic_set<>::basic_set(const typed::point<> &pnt)
21123  : isl::basic_set(pnt)
21124{
21125}
21126
21127typed::basic_set<>::basic_set(const isl::ctx &ctx, const std::string &str)
21128  : isl::basic_set(ctx, str)
21129{
21130}
21131
21132typed::set<> typed::basic_set<>::coalesce() const
21133{
21134  auto res = isl::basic_set::coalesce();
21135  return typed::set<>(res);
21136}
21137
21138typed::basic_set<> typed::basic_set<>::detect_equalities() const
21139{
21140  auto res = isl::basic_set::detect_equalities();
21141  return typed::basic_set<>(res);
21142}
21143
21144typed::set<> typed::basic_set<>::drop_unused_params() const
21145{
21146  auto res = isl::basic_set::drop_unused_params();
21147  return typed::set<>(res);
21148}
21149
21150bool typed::basic_set<>::every_set(const std::function<bool(typed::set<>)> &test) const
21151{
21152  auto lambda_test = [&] (isl::set arg0) {
21153    return test(typed::set<>(arg0));
21154  };
21155  return isl::basic_set::every_set(lambda_test);
21156}
21157
21158typed::set<> typed::basic_set<>::extract_set(const typed::space<> &space) const
21159{
21160  auto res = isl::basic_set::extract_set(space);
21161  return typed::set<>(res);
21162}
21163
21164void typed::basic_set<>::foreach_basic_set(const std::function<void(typed::basic_set<>)> &fn) const
21165{
21166  auto lambda_fn = [&] (isl::basic_set arg0) {
21167    return fn(typed::basic_set<>(arg0));
21168  };
21169  return isl::basic_set::foreach_basic_set(lambda_fn);
21170}
21171
21172void typed::basic_set<>::foreach_point(const std::function<void(typed::point<>)> &fn) const
21173{
21174  auto lambda_fn = [&] (isl::point arg0) {
21175    return fn(typed::point<>(arg0));
21176  };
21177  return isl::basic_set::foreach_point(lambda_fn);
21178}
21179
21180void typed::basic_set<>::foreach_set(const std::function<void(typed::set<>)> &fn) const
21181{
21182  auto lambda_fn = [&] (isl::set arg0) {
21183    return fn(typed::set<>(arg0));
21184  };
21185  return isl::basic_set::foreach_set(lambda_fn);
21186}
21187
21188typed::basic_set<> typed::basic_set<>::gist(const typed::basic_set<> &context) const
21189{
21190  auto res = isl::basic_set::gist(context);
21191  return typed::basic_set<>(res);
21192}
21193
21194typed::set<> typed::basic_set<>::gist(const typed::set<> &context) const
21195{
21196  auto res = isl::basic_set::gist(context);
21197  return typed::set<>(res);
21198}
21199
21200typed::union_set<> typed::basic_set<>::gist(const typed::union_set<> &context) const
21201{
21202  auto res = isl::basic_set::gist(context);
21203  return typed::union_set<>(res);
21204}
21205
21206typed::basic_set<> typed::basic_set<>::gist(const typed::point<> &context) const
21207{
21208  auto res = isl::basic_set::gist(context);
21209  return typed::basic_set<>(res);
21210}
21211
21212typed::pw_aff<Anonymous> typed::basic_set<>::indicator_function() const
21213{
21214  auto res = isl::basic_set::indicator_function();
21215  return typed::pw_aff<Anonymous>(res);
21216}
21217
21218typed::basic_set<> typed::basic_set<>::intersect(const typed::basic_set<> &bset2) const
21219{
21220  auto res = isl::basic_set::intersect(bset2);
21221  return typed::basic_set<>(res);
21222}
21223
21224typed::set<> typed::basic_set<>::intersect(const typed::set<> &set2) const
21225{
21226  auto res = isl::basic_set::intersect(set2);
21227  return typed::set<>(res);
21228}
21229
21230typed::union_set<> typed::basic_set<>::intersect(const typed::union_set<> &uset2) const
21231{
21232  auto res = isl::basic_set::intersect(uset2);
21233  return typed::union_set<>(res);
21234}
21235
21236typed::basic_set<> typed::basic_set<>::intersect(const typed::point<> &bset2) const
21237{
21238  auto res = isl::basic_set::intersect(bset2);
21239  return typed::basic_set<>(res);
21240}
21241
21242typed::pw_aff<Anonymous> typed::basic_set<>::param_pw_aff_on_domain(const typed::id<Anonymous> &id) const
21243{
21244  auto res = isl::basic_set::param_pw_aff_on_domain(id);
21245  return typed::pw_aff<Anonymous>(res);
21246}
21247
21248typed::pw_aff<Anonymous> typed::basic_set<>::param_pw_aff_on_domain(const std::string &id) const
21249{
21250  auto res = isl::basic_set::param_pw_aff_on_domain(id);
21251  return typed::pw_aff<Anonymous>(res);
21252}
21253
21254typed::set<> typed::basic_set<>::project_out_all_params() const
21255{
21256  auto res = isl::basic_set::project_out_all_params();
21257  return typed::set<>(res);
21258}
21259
21260typed::set<> typed::basic_set<>::project_out_param(const typed::id<Anonymous> &id) const
21261{
21262  auto res = isl::basic_set::project_out_param(id);
21263  return typed::set<>(res);
21264}
21265
21266typed::set<> typed::basic_set<>::project_out_param(const std::string &id) const
21267{
21268  auto res = isl::basic_set::project_out_param(id);
21269  return typed::set<>(res);
21270}
21271
21272typed::set<> typed::basic_set<>::project_out_param(const typed::id_list<Anonymous> &list) const
21273{
21274  auto res = isl::basic_set::project_out_param(list);
21275  return typed::set<>(res);
21276}
21277
21278typed::pw_aff<Anonymous> typed::basic_set<>::pw_aff_on_domain(const typed::val<Anonymous> &v) const
21279{
21280  auto res = isl::basic_set::pw_aff_on_domain(v);
21281  return typed::pw_aff<Anonymous>(res);
21282}
21283
21284typed::pw_aff<Anonymous> typed::basic_set<>::pw_aff_on_domain(long v) const
21285{
21286  auto res = isl::basic_set::pw_aff_on_domain(v);
21287  return typed::pw_aff<Anonymous>(res);
21288}
21289
21290template <typename Domain>
21291typed::pw_multi_aff<Domain> typed::basic_set<>::pw_multi_aff_on_domain(const typed::multi_val<Domain> &mv) const
21292{
21293  auto res = isl::basic_set::pw_multi_aff_on_domain(mv);
21294  return typed::pw_multi_aff<Domain>(res);
21295}
21296
21297typed::set_list<> typed::basic_set<>::set_list() const
21298{
21299  auto res = isl::basic_set::set_list();
21300  return typed::set_list<>(res);
21301}
21302
21303typed::space<> typed::basic_set<>::space() const
21304{
21305  auto res = isl::basic_set::space();
21306  return typed::space<>(res);
21307}
21308
21309typed::set<> typed::basic_set<>::subtract(const typed::set<> &set2) const
21310{
21311  auto res = isl::basic_set::subtract(set2);
21312  return typed::set<>(res);
21313}
21314
21315typed::union_set<> typed::basic_set<>::subtract(const typed::union_set<> &uset2) const
21316{
21317  auto res = isl::basic_set::subtract(uset2);
21318  return typed::union_set<>(res);
21319}
21320
21321typed::set<> typed::basic_set<>::to_set() const
21322{
21323  auto res = isl::basic_set::to_set();
21324  return typed::set<>(res);
21325}
21326
21327typed::union_set<> typed::basic_set<>::to_union_set() const
21328{
21329  auto res = isl::basic_set::to_union_set();
21330  return typed::union_set<>(res);
21331}
21332
21333template <typename Domain>
21334typed::set<Domain> typed::basic_set<>::unbind_params(const typed::multi_id<Domain> &tuple) const
21335{
21336  auto res = isl::basic_set::unbind_params(tuple);
21337  return typed::set<Domain>(res);
21338}
21339
21340typed::set<> typed::basic_set<>::unite(const typed::basic_set<> &bset2) const
21341{
21342  auto res = isl::basic_set::unite(bset2);
21343  return typed::set<>(res);
21344}
21345
21346typed::set<> typed::basic_set<>::unite(const typed::set<> &set2) const
21347{
21348  auto res = isl::basic_set::unite(set2);
21349  return typed::set<>(res);
21350}
21351
21352typed::union_set<> typed::basic_set<>::unite(const typed::union_set<> &uset2) const
21353{
21354  auto res = isl::basic_set::unite(uset2);
21355  return typed::union_set<>(res);
21356}
21357
21358typed::set<> typed::basic_set<>::unite(const typed::point<> &bset2) const
21359{
21360  auto res = isl::basic_set::unite(bset2);
21361  return typed::set<>(res);
21362}
21363
21364template <typename Domain>
21365typed::basic_set<Domain>::basic_set(const typed::point<Domain> &pnt)
21366  : isl::basic_set(pnt)
21367{
21368}
21369
21370template <typename Domain>
21371typed::basic_set<Domain>::basic_set(const isl::ctx &ctx, const std::string &str)
21372  : isl::basic_set(ctx, str)
21373{
21374}
21375
21376template <typename Domain>
21377template <typename Range>
21378typed::basic_set<Range> typed::basic_set<Domain>::apply(const typed::basic_map<Domain, Range> &bmap) const
21379{
21380  auto res = isl::basic_set::apply(bmap);
21381  return typed::basic_set<Range>(res);
21382}
21383
21384template <typename Domain>
21385template <typename Range>
21386typed::set<Range> typed::basic_set<Domain>::apply(const typed::map<Domain, Range> &map) const
21387{
21388  auto res = isl::basic_set::apply(map);
21389  return typed::set<Range>(res);
21390}
21391
21392template <typename Domain>
21393template <typename Range>
21394typed::union_set<Range> typed::basic_set<Domain>::apply(const typed::union_map<Domain, Range> &umap) const
21395{
21396  auto res = isl::basic_set::apply(umap);
21397  return typed::union_set<Range>(res);
21398}
21399
21400template <typename Domain>
21401typed::pw_multi_aff<Domain> typed::basic_set<Domain>::as_pw_multi_aff() const
21402{
21403  auto res = isl::basic_set::as_pw_multi_aff();
21404  return typed::pw_multi_aff<Domain>(res);
21405}
21406
21407template <typename Domain>
21408typed::set<Domain> typed::basic_set<Domain>::as_set() const
21409{
21410  auto res = isl::basic_set::as_set();
21411  return typed::set<Domain>(res);
21412}
21413
21414template <typename Domain>
21415typed::set<> typed::basic_set<Domain>::bind(const typed::multi_id<Domain> &tuple) const
21416{
21417  auto res = isl::basic_set::bind(tuple);
21418  return typed::set<>(res);
21419}
21420
21421template <typename Domain>
21422typed::set<Domain> typed::basic_set<Domain>::coalesce() const
21423{
21424  auto res = isl::basic_set::coalesce();
21425  return typed::set<Domain>(res);
21426}
21427
21428template <typename Domain>
21429typed::basic_set<Domain> typed::basic_set<Domain>::detect_equalities() const
21430{
21431  auto res = isl::basic_set::detect_equalities();
21432  return typed::basic_set<Domain>(res);
21433}
21434
21435template <typename Domain>
21436typed::set<Domain> typed::basic_set<Domain>::drop_unused_params() const
21437{
21438  auto res = isl::basic_set::drop_unused_params();
21439  return typed::set<Domain>(res);
21440}
21441
21442template <typename Domain>
21443bool typed::basic_set<Domain>::every_set(const std::function<bool(typed::set<Domain>)> &test) const
21444{
21445  auto lambda_test = [&] (isl::set arg0) {
21446    return test(typed::set<Domain>(arg0));
21447  };
21448  return isl::basic_set::every_set(lambda_test);
21449}
21450
21451template <typename Domain>
21452typed::set<Domain> typed::basic_set<Domain>::extract_set(const typed::space<Domain> &space) const
21453{
21454  auto res = isl::basic_set::extract_set(space);
21455  return typed::set<Domain>(res);
21456}
21457
21458template <typename Domain>
21459void typed::basic_set<Domain>::foreach_basic_set(const std::function<void(typed::basic_set<Domain>)> &fn) const
21460{
21461  auto lambda_fn = [&] (isl::basic_set arg0) {
21462    return fn(typed::basic_set<Domain>(arg0));
21463  };
21464  return isl::basic_set::foreach_basic_set(lambda_fn);
21465}
21466
21467template <typename Domain>
21468void typed::basic_set<Domain>::foreach_point(const std::function<void(typed::point<Domain>)> &fn) const
21469{
21470  auto lambda_fn = [&] (isl::point arg0) {
21471    return fn(typed::point<Domain>(arg0));
21472  };
21473  return isl::basic_set::foreach_point(lambda_fn);
21474}
21475
21476template <typename Domain>
21477void typed::basic_set<Domain>::foreach_set(const std::function<void(typed::set<Domain>)> &fn) const
21478{
21479  auto lambda_fn = [&] (isl::set arg0) {
21480    return fn(typed::set<Domain>(arg0));
21481  };
21482  return isl::basic_set::foreach_set(lambda_fn);
21483}
21484
21485template <typename Domain>
21486typed::basic_set<Domain> typed::basic_set<Domain>::gist(const typed::basic_set<Domain> &context) const
21487{
21488  auto res = isl::basic_set::gist(context);
21489  return typed::basic_set<Domain>(res);
21490}
21491
21492template <typename Domain>
21493typed::set<Domain> typed::basic_set<Domain>::gist(const typed::set<Domain> &context) const
21494{
21495  auto res = isl::basic_set::gist(context);
21496  return typed::set<Domain>(res);
21497}
21498
21499template <typename Domain>
21500typed::union_set<Domain> typed::basic_set<Domain>::gist(const typed::union_set<Domain> &context) const
21501{
21502  auto res = isl::basic_set::gist(context);
21503  return typed::union_set<Domain>(res);
21504}
21505
21506template <typename Domain>
21507typed::basic_set<Domain> typed::basic_set<Domain>::gist(const typed::point<Domain> &context) const
21508{
21509  auto res = isl::basic_set::gist(context);
21510  return typed::basic_set<Domain>(res);
21511}
21512
21513template <typename Domain>
21514typed::set<Domain> typed::basic_set<Domain>::gist_params(const typed::set<> &context) const
21515{
21516  auto res = isl::basic_set::gist_params(context);
21517  return typed::set<Domain>(res);
21518}
21519
21520template <typename Domain>
21521typed::map<Domain, Domain> typed::basic_set<Domain>::identity() const
21522{
21523  auto res = isl::basic_set::identity();
21524  return typed::map<Domain, Domain>(res);
21525}
21526
21527template <typename Domain>
21528typed::pw_aff<Domain, Anonymous> typed::basic_set<Domain>::indicator_function() const
21529{
21530  auto res = isl::basic_set::indicator_function();
21531  return typed::pw_aff<Domain, Anonymous>(res);
21532}
21533
21534template <typename Domain>
21535template <typename Arg1>
21536typed::map<Arg1, Domain> typed::basic_set<Domain>::insert_domain(const typed::space<Arg1> &domain) const
21537{
21538  auto res = isl::basic_set::insert_domain(domain);
21539  return typed::map<Arg1, Domain>(res);
21540}
21541
21542template <typename Domain>
21543typed::basic_set<Domain> typed::basic_set<Domain>::intersect(const typed::basic_set<Domain> &bset2) const
21544{
21545  auto res = isl::basic_set::intersect(bset2);
21546  return typed::basic_set<Domain>(res);
21547}
21548
21549template <typename Domain>
21550typed::set<Domain> typed::basic_set<Domain>::intersect(const typed::set<Domain> &set2) const
21551{
21552  auto res = isl::basic_set::intersect(set2);
21553  return typed::set<Domain>(res);
21554}
21555
21556template <typename Domain>
21557typed::union_set<Domain> typed::basic_set<Domain>::intersect(const typed::union_set<Domain> &uset2) const
21558{
21559  auto res = isl::basic_set::intersect(uset2);
21560  return typed::union_set<Domain>(res);
21561}
21562
21563template <typename Domain>
21564typed::basic_set<Domain> typed::basic_set<Domain>::intersect(const typed::point<Domain> &bset2) const
21565{
21566  auto res = isl::basic_set::intersect(bset2);
21567  return typed::basic_set<Domain>(res);
21568}
21569
21570template <typename Domain>
21571typed::basic_set<Domain> typed::basic_set<Domain>::intersect_params(const typed::basic_set<> &bset2) const
21572{
21573  auto res = isl::basic_set::intersect_params(bset2);
21574  return typed::basic_set<Domain>(res);
21575}
21576
21577template <typename Domain>
21578typed::set<Domain> typed::basic_set<Domain>::intersect_params(const typed::set<> &params) const
21579{
21580  auto res = isl::basic_set::intersect_params(params);
21581  return typed::set<Domain>(res);
21582}
21583
21584template <typename Domain>
21585typed::basic_set<Domain> typed::basic_set<Domain>::intersect_params(const typed::point<> &bset2) const
21586{
21587  auto res = isl::basic_set::intersect_params(bset2);
21588  return typed::basic_set<Domain>(res);
21589}
21590
21591template <typename Domain>
21592typed::fixed_box<Domain> typed::basic_set<Domain>::lattice_tile() const
21593{
21594  auto res = isl::basic_set::lattice_tile();
21595  return typed::fixed_box<Domain>(res);
21596}
21597
21598template <typename Domain>
21599typed::set<Domain> typed::basic_set<Domain>::lexmax() const
21600{
21601  auto res = isl::basic_set::lexmax();
21602  return typed::set<Domain>(res);
21603}
21604
21605template <typename Domain>
21606typed::pw_multi_aff<Domain> typed::basic_set<Domain>::lexmax_pw_multi_aff() const
21607{
21608  auto res = isl::basic_set::lexmax_pw_multi_aff();
21609  return typed::pw_multi_aff<Domain>(res);
21610}
21611
21612template <typename Domain>
21613typed::set<Domain> typed::basic_set<Domain>::lexmin() const
21614{
21615  auto res = isl::basic_set::lexmin();
21616  return typed::set<Domain>(res);
21617}
21618
21619template <typename Domain>
21620typed::pw_multi_aff<Domain> typed::basic_set<Domain>::lexmin_pw_multi_aff() const
21621{
21622  auto res = isl::basic_set::lexmin_pw_multi_aff();
21623  return typed::pw_multi_aff<Domain>(res);
21624}
21625
21626template <typename Domain>
21627typed::set<Domain> typed::basic_set<Domain>::lower_bound(const typed::multi_pw_aff<Domain> &lower) const
21628{
21629  auto res = isl::basic_set::lower_bound(lower);
21630  return typed::set<Domain>(res);
21631}
21632
21633template <typename Domain>
21634typed::set<Domain> typed::basic_set<Domain>::lower_bound(const typed::multi_val<Domain> &lower) const
21635{
21636  auto res = isl::basic_set::lower_bound(lower);
21637  return typed::set<Domain>(res);
21638}
21639
21640template <typename Domain>
21641typed::multi_pw_aff<Domain> typed::basic_set<Domain>::max_multi_pw_aff() const
21642{
21643  auto res = isl::basic_set::max_multi_pw_aff();
21644  return typed::multi_pw_aff<Domain>(res);
21645}
21646
21647template <typename Domain>
21648typed::multi_pw_aff<Domain> typed::basic_set<Domain>::min_multi_pw_aff() const
21649{
21650  auto res = isl::basic_set::min_multi_pw_aff();
21651  return typed::multi_pw_aff<Domain>(res);
21652}
21653
21654template <typename Domain>
21655typed::pw_aff<Domain, Anonymous> typed::basic_set<Domain>::param_pw_aff_on_domain(const typed::id<Anonymous> &id) const
21656{
21657  auto res = isl::basic_set::param_pw_aff_on_domain(id);
21658  return typed::pw_aff<Domain, Anonymous>(res);
21659}
21660
21661template <typename Domain>
21662typed::pw_aff<Domain, Anonymous> typed::basic_set<Domain>::param_pw_aff_on_domain(const std::string &id) const
21663{
21664  auto res = isl::basic_set::param_pw_aff_on_domain(id);
21665  return typed::pw_aff<Domain, Anonymous>(res);
21666}
21667
21668template <typename Domain>
21669typed::basic_set<> typed::basic_set<Domain>::params() const
21670{
21671  auto res = isl::basic_set::params();
21672  return typed::basic_set<>(res);
21673}
21674
21675template <typename Domain>
21676typed::multi_val<Domain> typed::basic_set<Domain>::plain_multi_val_if_fixed() const
21677{
21678  auto res = isl::basic_set::plain_multi_val_if_fixed();
21679  return typed::multi_val<Domain>(res);
21680}
21681
21682template <typename Domain>
21683template <typename Domain2>
21684typed::set<Domain2> typed::basic_set<Domain>::preimage(const typed::multi_aff<Domain2, Domain> &ma) const
21685{
21686  auto res = isl::basic_set::preimage(ma);
21687  return typed::set<Domain2>(res);
21688}
21689
21690template <typename Domain>
21691template <typename Domain2>
21692typed::set<Domain2> typed::basic_set<Domain>::preimage(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
21693{
21694  auto res = isl::basic_set::preimage(mpa);
21695  return typed::set<Domain2>(res);
21696}
21697
21698template <typename Domain>
21699template <typename Domain2>
21700typed::set<Domain2> typed::basic_set<Domain>::preimage(const typed::pw_multi_aff<Domain2, Domain> &pma) const
21701{
21702  auto res = isl::basic_set::preimage(pma);
21703  return typed::set<Domain2>(res);
21704}
21705
21706template <typename Domain>
21707template <typename Domain2>
21708typed::union_set<Domain2> typed::basic_set<Domain>::preimage(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
21709{
21710  auto res = isl::basic_set::preimage(upma);
21711  return typed::union_set<Domain2>(res);
21712}
21713
21714template <typename Domain>
21715template <typename Range>
21716typed::set<pair<Domain, Range>> typed::basic_set<Domain>::product(const typed::set<Range> &set2) const
21717{
21718  auto res = isl::basic_set::product(set2);
21719  return typed::set<pair<Domain, Range>>(res);
21720}
21721
21722template <typename Domain>
21723typed::set<Domain> typed::basic_set<Domain>::project_out_all_params() const
21724{
21725  auto res = isl::basic_set::project_out_all_params();
21726  return typed::set<Domain>(res);
21727}
21728
21729template <typename Domain>
21730typed::set<Domain> typed::basic_set<Domain>::project_out_param(const typed::id<Anonymous> &id) const
21731{
21732  auto res = isl::basic_set::project_out_param(id);
21733  return typed::set<Domain>(res);
21734}
21735
21736template <typename Domain>
21737typed::set<Domain> typed::basic_set<Domain>::project_out_param(const std::string &id) const
21738{
21739  auto res = isl::basic_set::project_out_param(id);
21740  return typed::set<Domain>(res);
21741}
21742
21743template <typename Domain>
21744typed::set<Domain> typed::basic_set<Domain>::project_out_param(const typed::id_list<Anonymous> &list) const
21745{
21746  auto res = isl::basic_set::project_out_param(list);
21747  return typed::set<Domain>(res);
21748}
21749
21750template <typename Domain>
21751typed::pw_aff<Domain, Anonymous> typed::basic_set<Domain>::pw_aff_on_domain(const typed::val<Anonymous> &v) const
21752{
21753  auto res = isl::basic_set::pw_aff_on_domain(v);
21754  return typed::pw_aff<Domain, Anonymous>(res);
21755}
21756
21757template <typename Domain>
21758typed::pw_aff<Domain, Anonymous> typed::basic_set<Domain>::pw_aff_on_domain(long v) const
21759{
21760  auto res = isl::basic_set::pw_aff_on_domain(v);
21761  return typed::pw_aff<Domain, Anonymous>(res);
21762}
21763
21764template <typename Domain>
21765template <typename Range>
21766typed::pw_multi_aff<Domain, Range> typed::basic_set<Domain>::pw_multi_aff_on_domain(const typed::multi_val<Range> &mv) const
21767{
21768  auto res = isl::basic_set::pw_multi_aff_on_domain(mv);
21769  return typed::pw_multi_aff<Domain, Range>(res);
21770}
21771
21772template <typename Domain>
21773typed::set_list<Domain> typed::basic_set<Domain>::set_list() const
21774{
21775  auto res = isl::basic_set::set_list();
21776  return typed::set_list<Domain>(res);
21777}
21778
21779template <typename Domain>
21780typed::fixed_box<Domain> typed::basic_set<Domain>::simple_fixed_box_hull() const
21781{
21782  auto res = isl::basic_set::simple_fixed_box_hull();
21783  return typed::fixed_box<Domain>(res);
21784}
21785
21786template <typename Domain>
21787typed::space<Domain> typed::basic_set<Domain>::space() const
21788{
21789  auto res = isl::basic_set::space();
21790  return typed::space<Domain>(res);
21791}
21792
21793template <typename Domain>
21794typed::set<Domain> typed::basic_set<Domain>::subtract(const typed::set<Domain> &set2) const
21795{
21796  auto res = isl::basic_set::subtract(set2);
21797  return typed::set<Domain>(res);
21798}
21799
21800template <typename Domain>
21801typed::union_set<Domain> typed::basic_set<Domain>::subtract(const typed::union_set<Domain> &uset2) const
21802{
21803  auto res = isl::basic_set::subtract(uset2);
21804  return typed::union_set<Domain>(res);
21805}
21806
21807template <typename Domain>
21808typed::set<Domain> typed::basic_set<Domain>::to_set() const
21809{
21810  auto res = isl::basic_set::to_set();
21811  return typed::set<Domain>(res);
21812}
21813
21814template <typename Domain>
21815typed::union_set<Domain> typed::basic_set<Domain>::to_union_set() const
21816{
21817  auto res = isl::basic_set::to_union_set();
21818  return typed::union_set<Domain>(res);
21819}
21820
21821template <typename Domain>
21822typed::map<Domain, Domain> typed::basic_set<Domain>::translation() const
21823{
21824  auto res = isl::basic_set::translation();
21825  return typed::map<Domain, Domain>(res);
21826}
21827
21828template <typename Domain>
21829template <typename Arg1>
21830typed::map<Arg1, Domain> typed::basic_set<Domain>::unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const
21831{
21832  auto res = isl::basic_set::unbind_params_insert_domain(domain);
21833  return typed::map<Arg1, Domain>(res);
21834}
21835
21836template <typename Domain>
21837typed::set<Domain> typed::basic_set<Domain>::unite(const typed::basic_set<Domain> &bset2) const
21838{
21839  auto res = isl::basic_set::unite(bset2);
21840  return typed::set<Domain>(res);
21841}
21842
21843template <typename Domain>
21844typed::set<Domain> typed::basic_set<Domain>::unite(const typed::set<Domain> &set2) const
21845{
21846  auto res = isl::basic_set::unite(set2);
21847  return typed::set<Domain>(res);
21848}
21849
21850template <typename Domain>
21851typed::union_set<Domain> typed::basic_set<Domain>::unite(const typed::union_set<Domain> &uset2) const
21852{
21853  auto res = isl::basic_set::unite(uset2);
21854  return typed::union_set<Domain>(res);
21855}
21856
21857template <typename Domain>
21858typed::set<Domain> typed::basic_set<Domain>::unite(const typed::point<Domain> &bset2) const
21859{
21860  auto res = isl::basic_set::unite(bset2);
21861  return typed::set<Domain>(res);
21862}
21863
21864template <typename Domain>
21865typed::set<Domain> typed::basic_set<Domain>::upper_bound(const typed::multi_pw_aff<Domain> &upper) const
21866{
21867  auto res = isl::basic_set::upper_bound(upper);
21868  return typed::set<Domain>(res);
21869}
21870
21871template <typename Domain>
21872typed::set<Domain> typed::basic_set<Domain>::upper_bound(const typed::multi_val<Domain> &upper) const
21873{
21874  auto res = isl::basic_set::upper_bound(upper);
21875  return typed::set<Domain>(res);
21876}
21877
21878template <typename Domain, typename Range>
21879typed::basic_set<pair<Domain, Range>>::basic_set(const typed::point<pair<Domain, Range>> &pnt)
21880  : isl::basic_set(pnt)
21881{
21882}
21883
21884template <typename Domain, typename Range>
21885typed::basic_set<pair<Domain, Range>>::basic_set(const isl::ctx &ctx, const std::string &str)
21886  : isl::basic_set(ctx, str)
21887{
21888}
21889
21890template <typename Domain, typename Range>
21891template <typename Arg2>
21892typed::basic_set<Arg2> typed::basic_set<pair<Domain, Range>>::apply(const typed::basic_map<pair<Domain, Range>, Arg2> &bmap) const
21893{
21894  auto res = isl::basic_set::apply(bmap);
21895  return typed::basic_set<Arg2>(res);
21896}
21897
21898template <typename Domain, typename Range>
21899template <typename Arg2>
21900typed::set<Arg2> typed::basic_set<pair<Domain, Range>>::apply(const typed::map<pair<Domain, Range>, Arg2> &map) const
21901{
21902  auto res = isl::basic_set::apply(map);
21903  return typed::set<Arg2>(res);
21904}
21905
21906template <typename Domain, typename Range>
21907template <typename Arg2>
21908typed::union_set<Arg2> typed::basic_set<pair<Domain, Range>>::apply(const typed::union_map<pair<Domain, Range>, Arg2> &umap) const
21909{
21910  auto res = isl::basic_set::apply(umap);
21911  return typed::union_set<Arg2>(res);
21912}
21913
21914template <typename Domain, typename Range>
21915typed::pw_multi_aff<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::as_pw_multi_aff() const
21916{
21917  auto res = isl::basic_set::as_pw_multi_aff();
21918  return typed::pw_multi_aff<pair<Domain, Range>>(res);
21919}
21920
21921template <typename Domain, typename Range>
21922typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::as_set() const
21923{
21924  auto res = isl::basic_set::as_set();
21925  return typed::set<pair<Domain, Range>>(res);
21926}
21927
21928template <typename Domain, typename Range>
21929typed::set<> typed::basic_set<pair<Domain, Range>>::bind(const typed::multi_id<pair<Domain, Range>> &tuple) const
21930{
21931  auto res = isl::basic_set::bind(tuple);
21932  return typed::set<>(res);
21933}
21934
21935template <typename Domain, typename Range>
21936typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::coalesce() const
21937{
21938  auto res = isl::basic_set::coalesce();
21939  return typed::set<pair<Domain, Range>>(res);
21940}
21941
21942template <typename Domain, typename Range>
21943typed::basic_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::detect_equalities() const
21944{
21945  auto res = isl::basic_set::detect_equalities();
21946  return typed::basic_set<pair<Domain, Range>>(res);
21947}
21948
21949template <typename Domain, typename Range>
21950typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::drop_unused_params() const
21951{
21952  auto res = isl::basic_set::drop_unused_params();
21953  return typed::set<pair<Domain, Range>>(res);
21954}
21955
21956template <typename Domain, typename Range>
21957bool typed::basic_set<pair<Domain, Range>>::every_set(const std::function<bool(typed::set<pair<Domain, Range>>)> &test) const
21958{
21959  auto lambda_test = [&] (isl::set arg0) {
21960    return test(typed::set<pair<Domain, Range>>(arg0));
21961  };
21962  return isl::basic_set::every_set(lambda_test);
21963}
21964
21965template <typename Domain, typename Range>
21966typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::extract_set(const typed::space<pair<Domain, Range>> &space) const
21967{
21968  auto res = isl::basic_set::extract_set(space);
21969  return typed::set<pair<Domain, Range>>(res);
21970}
21971
21972template <typename Domain, typename Range>
21973void typed::basic_set<pair<Domain, Range>>::foreach_basic_set(const std::function<void(typed::basic_set<pair<Domain, Range>>)> &fn) const
21974{
21975  auto lambda_fn = [&] (isl::basic_set arg0) {
21976    return fn(typed::basic_set<pair<Domain, Range>>(arg0));
21977  };
21978  return isl::basic_set::foreach_basic_set(lambda_fn);
21979}
21980
21981template <typename Domain, typename Range>
21982void typed::basic_set<pair<Domain, Range>>::foreach_point(const std::function<void(typed::point<pair<Domain, Range>>)> &fn) const
21983{
21984  auto lambda_fn = [&] (isl::point arg0) {
21985    return fn(typed::point<pair<Domain, Range>>(arg0));
21986  };
21987  return isl::basic_set::foreach_point(lambda_fn);
21988}
21989
21990template <typename Domain, typename Range>
21991void typed::basic_set<pair<Domain, Range>>::foreach_set(const std::function<void(typed::set<pair<Domain, Range>>)> &fn) const
21992{
21993  auto lambda_fn = [&] (isl::set arg0) {
21994    return fn(typed::set<pair<Domain, Range>>(arg0));
21995  };
21996  return isl::basic_set::foreach_set(lambda_fn);
21997}
21998
21999template <typename Domain, typename Range>
22000typed::basic_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::gist(const typed::basic_set<pair<Domain, Range>> &context) const
22001{
22002  auto res = isl::basic_set::gist(context);
22003  return typed::basic_set<pair<Domain, Range>>(res);
22004}
22005
22006template <typename Domain, typename Range>
22007typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::gist(const typed::set<pair<Domain, Range>> &context) const
22008{
22009  auto res = isl::basic_set::gist(context);
22010  return typed::set<pair<Domain, Range>>(res);
22011}
22012
22013template <typename Domain, typename Range>
22014typed::union_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::gist(const typed::union_set<pair<Domain, Range>> &context) const
22015{
22016  auto res = isl::basic_set::gist(context);
22017  return typed::union_set<pair<Domain, Range>>(res);
22018}
22019
22020template <typename Domain, typename Range>
22021typed::basic_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::gist(const typed::point<pair<Domain, Range>> &context) const
22022{
22023  auto res = isl::basic_set::gist(context);
22024  return typed::basic_set<pair<Domain, Range>>(res);
22025}
22026
22027template <typename Domain, typename Range>
22028typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::gist_params(const typed::set<> &context) const
22029{
22030  auto res = isl::basic_set::gist_params(context);
22031  return typed::set<pair<Domain, Range>>(res);
22032}
22033
22034template <typename Domain, typename Range>
22035typed::map<pair<Domain, Range>, pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::identity() const
22036{
22037  auto res = isl::basic_set::identity();
22038  return typed::map<pair<Domain, Range>, pair<Domain, Range>>(res);
22039}
22040
22041template <typename Domain, typename Range>
22042typed::pw_aff<pair<Domain, Range>, Anonymous> typed::basic_set<pair<Domain, Range>>::indicator_function() const
22043{
22044  auto res = isl::basic_set::indicator_function();
22045  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
22046}
22047
22048template <typename Domain, typename Range>
22049template <typename Arg2>
22050typed::map<Arg2, pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::insert_domain(const typed::space<Arg2> &domain) const
22051{
22052  auto res = isl::basic_set::insert_domain(domain);
22053  return typed::map<Arg2, pair<Domain, Range>>(res);
22054}
22055
22056template <typename Domain, typename Range>
22057typed::basic_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::intersect(const typed::basic_set<pair<Domain, Range>> &bset2) const
22058{
22059  auto res = isl::basic_set::intersect(bset2);
22060  return typed::basic_set<pair<Domain, Range>>(res);
22061}
22062
22063template <typename Domain, typename Range>
22064typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::intersect(const typed::set<pair<Domain, Range>> &set2) const
22065{
22066  auto res = isl::basic_set::intersect(set2);
22067  return typed::set<pair<Domain, Range>>(res);
22068}
22069
22070template <typename Domain, typename Range>
22071typed::union_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::intersect(const typed::union_set<pair<Domain, Range>> &uset2) const
22072{
22073  auto res = isl::basic_set::intersect(uset2);
22074  return typed::union_set<pair<Domain, Range>>(res);
22075}
22076
22077template <typename Domain, typename Range>
22078typed::basic_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::intersect(const typed::point<pair<Domain, Range>> &bset2) const
22079{
22080  auto res = isl::basic_set::intersect(bset2);
22081  return typed::basic_set<pair<Domain, Range>>(res);
22082}
22083
22084template <typename Domain, typename Range>
22085typed::basic_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::intersect_params(const typed::basic_set<> &bset2) const
22086{
22087  auto res = isl::basic_set::intersect_params(bset2);
22088  return typed::basic_set<pair<Domain, Range>>(res);
22089}
22090
22091template <typename Domain, typename Range>
22092typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::intersect_params(const typed::set<> &params) const
22093{
22094  auto res = isl::basic_set::intersect_params(params);
22095  return typed::set<pair<Domain, Range>>(res);
22096}
22097
22098template <typename Domain, typename Range>
22099typed::basic_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::intersect_params(const typed::point<> &bset2) const
22100{
22101  auto res = isl::basic_set::intersect_params(bset2);
22102  return typed::basic_set<pair<Domain, Range>>(res);
22103}
22104
22105template <typename Domain, typename Range>
22106typed::fixed_box<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::lattice_tile() const
22107{
22108  auto res = isl::basic_set::lattice_tile();
22109  return typed::fixed_box<pair<Domain, Range>>(res);
22110}
22111
22112template <typename Domain, typename Range>
22113typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::lexmax() const
22114{
22115  auto res = isl::basic_set::lexmax();
22116  return typed::set<pair<Domain, Range>>(res);
22117}
22118
22119template <typename Domain, typename Range>
22120typed::pw_multi_aff<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::lexmax_pw_multi_aff() const
22121{
22122  auto res = isl::basic_set::lexmax_pw_multi_aff();
22123  return typed::pw_multi_aff<pair<Domain, Range>>(res);
22124}
22125
22126template <typename Domain, typename Range>
22127typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::lexmin() const
22128{
22129  auto res = isl::basic_set::lexmin();
22130  return typed::set<pair<Domain, Range>>(res);
22131}
22132
22133template <typename Domain, typename Range>
22134typed::pw_multi_aff<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::lexmin_pw_multi_aff() const
22135{
22136  auto res = isl::basic_set::lexmin_pw_multi_aff();
22137  return typed::pw_multi_aff<pair<Domain, Range>>(res);
22138}
22139
22140template <typename Domain, typename Range>
22141typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::lower_bound(const typed::multi_pw_aff<pair<Domain, Range>> &lower) const
22142{
22143  auto res = isl::basic_set::lower_bound(lower);
22144  return typed::set<pair<Domain, Range>>(res);
22145}
22146
22147template <typename Domain, typename Range>
22148typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::lower_bound(const typed::multi_val<pair<Domain, Range>> &lower) const
22149{
22150  auto res = isl::basic_set::lower_bound(lower);
22151  return typed::set<pair<Domain, Range>>(res);
22152}
22153
22154template <typename Domain, typename Range>
22155typed::multi_pw_aff<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::max_multi_pw_aff() const
22156{
22157  auto res = isl::basic_set::max_multi_pw_aff();
22158  return typed::multi_pw_aff<pair<Domain, Range>>(res);
22159}
22160
22161template <typename Domain, typename Range>
22162typed::multi_pw_aff<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::min_multi_pw_aff() const
22163{
22164  auto res = isl::basic_set::min_multi_pw_aff();
22165  return typed::multi_pw_aff<pair<Domain, Range>>(res);
22166}
22167
22168template <typename Domain, typename Range>
22169typed::pw_aff<pair<Domain, Range>, Anonymous> typed::basic_set<pair<Domain, Range>>::param_pw_aff_on_domain(const typed::id<Anonymous> &id) const
22170{
22171  auto res = isl::basic_set::param_pw_aff_on_domain(id);
22172  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
22173}
22174
22175template <typename Domain, typename Range>
22176typed::pw_aff<pair<Domain, Range>, Anonymous> typed::basic_set<pair<Domain, Range>>::param_pw_aff_on_domain(const std::string &id) const
22177{
22178  auto res = isl::basic_set::param_pw_aff_on_domain(id);
22179  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
22180}
22181
22182template <typename Domain, typename Range>
22183typed::basic_set<> typed::basic_set<pair<Domain, Range>>::params() const
22184{
22185  auto res = isl::basic_set::params();
22186  return typed::basic_set<>(res);
22187}
22188
22189template <typename Domain, typename Range>
22190typed::multi_val<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::plain_multi_val_if_fixed() const
22191{
22192  auto res = isl::basic_set::plain_multi_val_if_fixed();
22193  return typed::multi_val<pair<Domain, Range>>(res);
22194}
22195
22196template <typename Domain, typename Range>
22197template <typename Domain2>
22198typed::set<Domain2> typed::basic_set<pair<Domain, Range>>::preimage(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const
22199{
22200  auto res = isl::basic_set::preimage(ma);
22201  return typed::set<Domain2>(res);
22202}
22203
22204template <typename Domain, typename Range>
22205template <typename Domain2>
22206typed::set<Domain2> typed::basic_set<pair<Domain, Range>>::preimage(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const
22207{
22208  auto res = isl::basic_set::preimage(mpa);
22209  return typed::set<Domain2>(res);
22210}
22211
22212template <typename Domain, typename Range>
22213template <typename Domain2>
22214typed::set<Domain2> typed::basic_set<pair<Domain, Range>>::preimage(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const
22215{
22216  auto res = isl::basic_set::preimage(pma);
22217  return typed::set<Domain2>(res);
22218}
22219
22220template <typename Domain, typename Range>
22221template <typename Domain2>
22222typed::union_set<Domain2> typed::basic_set<pair<Domain, Range>>::preimage(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const
22223{
22224  auto res = isl::basic_set::preimage(upma);
22225  return typed::union_set<Domain2>(res);
22226}
22227
22228template <typename Domain, typename Range>
22229template <typename Arg2>
22230typed::set<pair<pair<Domain, Range>, Arg2>> typed::basic_set<pair<Domain, Range>>::product(const typed::set<Arg2> &set2) const
22231{
22232  auto res = isl::basic_set::product(set2);
22233  return typed::set<pair<pair<Domain, Range>, Arg2>>(res);
22234}
22235
22236template <typename Domain, typename Range>
22237typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::project_out_all_params() const
22238{
22239  auto res = isl::basic_set::project_out_all_params();
22240  return typed::set<pair<Domain, Range>>(res);
22241}
22242
22243template <typename Domain, typename Range>
22244typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::project_out_param(const typed::id<Anonymous> &id) const
22245{
22246  auto res = isl::basic_set::project_out_param(id);
22247  return typed::set<pair<Domain, Range>>(res);
22248}
22249
22250template <typename Domain, typename Range>
22251typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::project_out_param(const std::string &id) const
22252{
22253  auto res = isl::basic_set::project_out_param(id);
22254  return typed::set<pair<Domain, Range>>(res);
22255}
22256
22257template <typename Domain, typename Range>
22258typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::project_out_param(const typed::id_list<Anonymous> &list) const
22259{
22260  auto res = isl::basic_set::project_out_param(list);
22261  return typed::set<pair<Domain, Range>>(res);
22262}
22263
22264template <typename Domain, typename Range>
22265typed::pw_aff<pair<Domain, Range>, Anonymous> typed::basic_set<pair<Domain, Range>>::pw_aff_on_domain(const typed::val<Anonymous> &v) const
22266{
22267  auto res = isl::basic_set::pw_aff_on_domain(v);
22268  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
22269}
22270
22271template <typename Domain, typename Range>
22272typed::pw_aff<pair<Domain, Range>, Anonymous> typed::basic_set<pair<Domain, Range>>::pw_aff_on_domain(long v) const
22273{
22274  auto res = isl::basic_set::pw_aff_on_domain(v);
22275  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
22276}
22277
22278template <typename Domain, typename Range>
22279template <typename Arg2>
22280typed::pw_multi_aff<pair<Domain, Range>, Arg2> typed::basic_set<pair<Domain, Range>>::pw_multi_aff_on_domain(const typed::multi_val<Arg2> &mv) const
22281{
22282  auto res = isl::basic_set::pw_multi_aff_on_domain(mv);
22283  return typed::pw_multi_aff<pair<Domain, Range>, Arg2>(res);
22284}
22285
22286template <typename Domain, typename Range>
22287typed::set_list<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::set_list() const
22288{
22289  auto res = isl::basic_set::set_list();
22290  return typed::set_list<pair<Domain, Range>>(res);
22291}
22292
22293template <typename Domain, typename Range>
22294typed::fixed_box<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::simple_fixed_box_hull() const
22295{
22296  auto res = isl::basic_set::simple_fixed_box_hull();
22297  return typed::fixed_box<pair<Domain, Range>>(res);
22298}
22299
22300template <typename Domain, typename Range>
22301typed::space<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::space() const
22302{
22303  auto res = isl::basic_set::space();
22304  return typed::space<pair<Domain, Range>>(res);
22305}
22306
22307template <typename Domain, typename Range>
22308typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::subtract(const typed::set<pair<Domain, Range>> &set2) const
22309{
22310  auto res = isl::basic_set::subtract(set2);
22311  return typed::set<pair<Domain, Range>>(res);
22312}
22313
22314template <typename Domain, typename Range>
22315typed::union_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::subtract(const typed::union_set<pair<Domain, Range>> &uset2) const
22316{
22317  auto res = isl::basic_set::subtract(uset2);
22318  return typed::union_set<pair<Domain, Range>>(res);
22319}
22320
22321template <typename Domain, typename Range>
22322typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::to_set() const
22323{
22324  auto res = isl::basic_set::to_set();
22325  return typed::set<pair<Domain, Range>>(res);
22326}
22327
22328template <typename Domain, typename Range>
22329typed::union_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::to_union_set() const
22330{
22331  auto res = isl::basic_set::to_union_set();
22332  return typed::union_set<pair<Domain, Range>>(res);
22333}
22334
22335template <typename Domain, typename Range>
22336typed::map<pair<Domain, Range>, pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::translation() const
22337{
22338  auto res = isl::basic_set::translation();
22339  return typed::map<pair<Domain, Range>, pair<Domain, Range>>(res);
22340}
22341
22342template <typename Domain, typename Range>
22343template <typename Arg2>
22344typed::map<Arg2, pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::unbind_params_insert_domain(const typed::multi_id<Arg2> &domain) const
22345{
22346  auto res = isl::basic_set::unbind_params_insert_domain(domain);
22347  return typed::map<Arg2, pair<Domain, Range>>(res);
22348}
22349
22350template <typename Domain, typename Range>
22351typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::unite(const typed::basic_set<pair<Domain, Range>> &bset2) const
22352{
22353  auto res = isl::basic_set::unite(bset2);
22354  return typed::set<pair<Domain, Range>>(res);
22355}
22356
22357template <typename Domain, typename Range>
22358typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::unite(const typed::set<pair<Domain, Range>> &set2) const
22359{
22360  auto res = isl::basic_set::unite(set2);
22361  return typed::set<pair<Domain, Range>>(res);
22362}
22363
22364template <typename Domain, typename Range>
22365typed::union_set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::unite(const typed::union_set<pair<Domain, Range>> &uset2) const
22366{
22367  auto res = isl::basic_set::unite(uset2);
22368  return typed::union_set<pair<Domain, Range>>(res);
22369}
22370
22371template <typename Domain, typename Range>
22372typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::unite(const typed::point<pair<Domain, Range>> &bset2) const
22373{
22374  auto res = isl::basic_set::unite(bset2);
22375  return typed::set<pair<Domain, Range>>(res);
22376}
22377
22378template <typename Domain, typename Range>
22379typed::map<Domain, Range> typed::basic_set<pair<Domain, Range>>::unwrap() const
22380{
22381  auto res = isl::basic_set::unwrap();
22382  return typed::map<Domain, Range>(res);
22383}
22384
22385template <typename Domain, typename Range>
22386typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::upper_bound(const typed::multi_pw_aff<pair<Domain, Range>> &upper) const
22387{
22388  auto res = isl::basic_set::upper_bound(upper);
22389  return typed::set<pair<Domain, Range>>(res);
22390}
22391
22392template <typename Domain, typename Range>
22393typed::set<pair<Domain, Range>> typed::basic_set<pair<Domain, Range>>::upper_bound(const typed::multi_val<pair<Domain, Range>> &upper) const
22394{
22395  auto res = isl::basic_set::upper_bound(upper);
22396  return typed::set<pair<Domain, Range>>(res);
22397}
22398
22399template <typename Domain, typename Range>
22400typed::set<pair<Range, Domain>> typed::basic_set<pair<Domain, Range>>::wrapped_reverse() const
22401{
22402  auto res = isl::basic_set::wrapped_reverse();
22403  return typed::set<pair<Range, Domain>>(res);
22404}
22405
22406template <typename Domain>
22407typed::fixed_box<Domain>::fixed_box(const isl::ctx &ctx, const std::string &str)
22408  : isl::fixed_box(ctx, str)
22409{
22410}
22411
22412template <typename Domain>
22413typed::multi_aff<Domain> typed::fixed_box<Domain>::offset() const
22414{
22415  auto res = isl::fixed_box::offset();
22416  return typed::multi_aff<Domain>(res);
22417}
22418
22419template <typename Domain>
22420typed::multi_val<Domain> typed::fixed_box<Domain>::size() const
22421{
22422  auto res = isl::fixed_box::size();
22423  return typed::multi_val<Domain>(res);
22424}
22425
22426template <typename Domain>
22427typed::space<Domain> typed::fixed_box<Domain>::space() const
22428{
22429  auto res = isl::fixed_box::space();
22430  return typed::space<Domain>(res);
22431}
22432
22433template <typename Domain, typename Range>
22434typed::fixed_box<Domain, Range>::fixed_box(const isl::ctx &ctx, const std::string &str)
22435  : isl::fixed_box(ctx, str)
22436{
22437}
22438
22439template <typename Domain, typename Range>
22440typed::multi_aff<Domain, Range> typed::fixed_box<Domain, Range>::offset() const
22441{
22442  auto res = isl::fixed_box::offset();
22443  return typed::multi_aff<Domain, Range>(res);
22444}
22445
22446template <typename Domain, typename Range>
22447typed::multi_val<Range> typed::fixed_box<Domain, Range>::size() const
22448{
22449  auto res = isl::fixed_box::size();
22450  return typed::multi_val<Range>(res);
22451}
22452
22453template <typename Domain, typename Range>
22454typed::space<Domain, Range> typed::fixed_box<Domain, Range>::space() const
22455{
22456  auto res = isl::fixed_box::space();
22457  return typed::space<Domain, Range>(res);
22458}
22459
22460typed::id<Anonymous>::id(const isl::ctx &ctx, const std::string &str)
22461  : isl::id(ctx, str)
22462{
22463}
22464
22465typed::id_list<Anonymous>::id_list(const isl::ctx &ctx, int n)
22466  : isl::id_list(ctx, n)
22467{
22468}
22469
22470typed::id_list<Anonymous>::id_list(const typed::id<Anonymous> &el)
22471  : isl::id_list(el)
22472{
22473}
22474
22475typed::id_list<Anonymous>::id_list(const isl::ctx &ctx, const std::string &str)
22476  : isl::id_list(ctx, str)
22477{
22478}
22479
22480typed::id_list<Anonymous> typed::id_list<Anonymous>::add(const typed::id<Anonymous> &el) const
22481{
22482  auto res = isl::id_list::add(el);
22483  return typed::id_list<Anonymous>(res);
22484}
22485
22486typed::id_list<Anonymous> typed::id_list<Anonymous>::add(const std::string &el) const
22487{
22488  auto res = isl::id_list::add(el);
22489  return typed::id_list<Anonymous>(res);
22490}
22491
22492typed::id<Anonymous> typed::id_list<Anonymous>::at(int index) const
22493{
22494  auto res = isl::id_list::at(index);
22495  return typed::id<Anonymous>(res);
22496}
22497
22498typed::id_list<Anonymous> typed::id_list<Anonymous>::drop(unsigned int first, unsigned int n) const
22499{
22500  auto res = isl::id_list::drop(first, n);
22501  return typed::id_list<Anonymous>(res);
22502}
22503
22504void typed::id_list<Anonymous>::foreach(const std::function<void(typed::id<Anonymous>)> &fn) const
22505{
22506  auto lambda_fn = [&] (isl::id arg0) {
22507    return fn(typed::id<Anonymous>(arg0));
22508  };
22509  return isl::id_list::foreach(lambda_fn);
22510}
22511
22512void typed::id_list<Anonymous>::foreach_scc(const std::function<bool(typed::id<Anonymous>, typed::id<Anonymous>)> &follows, const std::function<void(typed::id_list<Anonymous>)> &fn) const
22513{
22514  auto lambda_follows = [&] (isl::id arg0, isl::id arg1) {
22515    return follows(typed::id<Anonymous>(arg0), typed::id<Anonymous>(arg1));
22516  };
22517  auto lambda_fn = [&] (isl::id_list arg0) {
22518    return fn(typed::id_list<Anonymous>(arg0));
22519  };
22520  return isl::id_list::foreach_scc(lambda_follows, lambda_fn);
22521}
22522
22523typed::id_list<Anonymous> typed::id_list<Anonymous>::set_at(int index, const typed::id<Anonymous> &el) const
22524{
22525  auto res = isl::id_list::set_at(index, el);
22526  return typed::id_list<Anonymous>(res);
22527}
22528
22529typed::id_list<Anonymous> typed::id_list<Anonymous>::set_at(int index, const std::string &el) const
22530{
22531  auto res = isl::id_list::set_at(index, el);
22532  return typed::id_list<Anonymous>(res);
22533}
22534
22535template <typename Domain, typename Range>
22536typed::map<Domain, Range>::map(const typed::basic_map<Domain, Range> &bmap)
22537  : isl::map(bmap)
22538{
22539}
22540
22541template <typename Domain, typename Range>
22542typed::map<Domain, Range>::map(const isl::ctx &ctx, const std::string &str)
22543  : isl::map(ctx, str)
22544{
22545}
22546
22547template <typename Domain, typename Range>
22548template <typename Domain2>
22549typed::map<Domain2, Range> typed::map<Domain, Range>::apply_domain(const typed::map<Domain, Domain2> &map2) const
22550{
22551  auto res = isl::map::apply_domain(map2);
22552  return typed::map<Domain2, Range>(res);
22553}
22554
22555template <typename Domain, typename Range>
22556template <typename Domain2>
22557typed::union_map<Domain2, Range> typed::map<Domain, Range>::apply_domain(const typed::union_map<Domain, Domain2> &umap2) const
22558{
22559  auto res = isl::map::apply_domain(umap2);
22560  return typed::union_map<Domain2, Range>(res);
22561}
22562
22563template <typename Domain, typename Range>
22564template <typename Domain2>
22565typed::map<Domain2, Range> typed::map<Domain, Range>::apply_domain(const typed::basic_map<Domain, Domain2> &map2) const
22566{
22567  auto res = isl::map::apply_domain(map2);
22568  return typed::map<Domain2, Range>(res);
22569}
22570
22571template <typename Domain, typename Range>
22572template <typename Range2>
22573typed::map<Domain, Range2> typed::map<Domain, Range>::apply_range(const typed::map<Range, Range2> &map2) const
22574{
22575  auto res = isl::map::apply_range(map2);
22576  return typed::map<Domain, Range2>(res);
22577}
22578
22579template <typename Domain, typename Range>
22580template <typename Range2>
22581typed::union_map<Domain, Range2> typed::map<Domain, Range>::apply_range(const typed::union_map<Range, Range2> &umap2) const
22582{
22583  auto res = isl::map::apply_range(umap2);
22584  return typed::union_map<Domain, Range2>(res);
22585}
22586
22587template <typename Domain, typename Range>
22588template <typename Range2>
22589typed::map<Domain, Range2> typed::map<Domain, Range>::apply_range(const typed::basic_map<Range, Range2> &map2) const
22590{
22591  auto res = isl::map::apply_range(map2);
22592  return typed::map<Domain, Range2>(res);
22593}
22594
22595template <typename Domain, typename Range>
22596typed::map<Domain, Range> typed::map<Domain, Range>::as_map() const
22597{
22598  auto res = isl::map::as_map();
22599  return typed::map<Domain, Range>(res);
22600}
22601
22602template <typename Domain, typename Range>
22603typed::multi_union_pw_aff<Domain, Range> typed::map<Domain, Range>::as_multi_union_pw_aff() const
22604{
22605  auto res = isl::map::as_multi_union_pw_aff();
22606  return typed::multi_union_pw_aff<Domain, Range>(res);
22607}
22608
22609template <typename Domain, typename Range>
22610typed::pw_multi_aff<Domain, Range> typed::map<Domain, Range>::as_pw_multi_aff() const
22611{
22612  auto res = isl::map::as_pw_multi_aff();
22613  return typed::pw_multi_aff<Domain, Range>(res);
22614}
22615
22616template <typename Domain, typename Range>
22617typed::union_pw_multi_aff<Domain, Range> typed::map<Domain, Range>::as_union_pw_multi_aff() const
22618{
22619  auto res = isl::map::as_union_pw_multi_aff();
22620  return typed::union_pw_multi_aff<Domain, Range>(res);
22621}
22622
22623template <typename Domain, typename Range>
22624typed::set<Range> typed::map<Domain, Range>::bind_domain(const typed::multi_id<Domain> &tuple) const
22625{
22626  auto res = isl::map::bind_domain(tuple);
22627  return typed::set<Range>(res);
22628}
22629
22630template <typename Domain, typename Range>
22631typed::set<Domain> typed::map<Domain, Range>::bind_range(const typed::multi_id<Range> &tuple) const
22632{
22633  auto res = isl::map::bind_range(tuple);
22634  return typed::set<Domain>(res);
22635}
22636
22637template <typename Domain, typename Range>
22638typed::map<Domain, Range> typed::map<Domain, Range>::coalesce() const
22639{
22640  auto res = isl::map::coalesce();
22641  return typed::map<Domain, Range>(res);
22642}
22643
22644template <typename Domain, typename Range>
22645typed::map<Domain, Range> typed::map<Domain, Range>::detect_equalities() const
22646{
22647  auto res = isl::map::detect_equalities();
22648  return typed::map<Domain, Range>(res);
22649}
22650
22651template <typename Domain, typename Range>
22652typed::set<Domain> typed::map<Domain, Range>::domain() const
22653{
22654  auto res = isl::map::domain();
22655  return typed::set<Domain>(res);
22656}
22657
22658template <typename Domain, typename Range>
22659typed::union_map<pair<Domain, Range>, Domain> typed::map<Domain, Range>::domain_map() const
22660{
22661  auto res = isl::map::domain_map();
22662  return typed::union_map<pair<Domain, Range>, Domain>(res);
22663}
22664
22665template <typename Domain, typename Range>
22666typed::union_pw_multi_aff<pair<Domain, Range>, Domain> typed::map<Domain, Range>::domain_map_union_pw_multi_aff() const
22667{
22668  auto res = isl::map::domain_map_union_pw_multi_aff();
22669  return typed::union_pw_multi_aff<pair<Domain, Range>, Domain>(res);
22670}
22671
22672template <typename Domain, typename Range>
22673template <typename Domain2>
22674typed::map<pair<Domain, Domain2>, Range> typed::map<Domain, Range>::domain_product(const typed::map<Domain2, Range> &map2) const
22675{
22676  auto res = isl::map::domain_product(map2);
22677  return typed::map<pair<Domain, Domain2>, Range>(res);
22678}
22679
22680template <typename Domain, typename Range>
22681template <typename Domain2>
22682typed::union_map<pair<Domain, Domain2>, Range> typed::map<Domain, Range>::domain_product(const typed::union_map<Domain2, Range> &umap2) const
22683{
22684  auto res = isl::map::domain_product(umap2);
22685  return typed::union_map<pair<Domain, Domain2>, Range>(res);
22686}
22687
22688template <typename Domain, typename Range>
22689template <typename Domain2>
22690typed::map<pair<Domain, Domain2>, Range> typed::map<Domain, Range>::domain_product(const typed::basic_map<Domain2, Range> &map2) const
22691{
22692  auto res = isl::map::domain_product(map2);
22693  return typed::map<pair<Domain, Domain2>, Range>(res);
22694}
22695
22696template <typename Domain, typename Range>
22697typed::map<Domain, Range> typed::map<Domain, Range>::drop_unused_params() const
22698{
22699  auto res = isl::map::drop_unused_params();
22700  return typed::map<Domain, Range>(res);
22701}
22702
22703template <typename Domain, typename Range>
22704bool typed::map<Domain, Range>::every_map(const std::function<bool(typed::map<Domain, Range>)> &test) const
22705{
22706  auto lambda_test = [&] (isl::map arg0) {
22707    return test(typed::map<Domain, Range>(arg0));
22708  };
22709  return isl::map::every_map(lambda_test);
22710}
22711
22712template <typename Domain, typename Range>
22713typed::map<Domain, Range> typed::map<Domain, Range>::extract_map(const typed::space<Domain, Range> &space) const
22714{
22715  auto res = isl::map::extract_map(space);
22716  return typed::map<Domain, Range>(res);
22717}
22718
22719template <typename Domain, typename Range>
22720void typed::map<Domain, Range>::foreach_basic_map(const std::function<void(typed::basic_map<Domain, Range>)> &fn) const
22721{
22722  auto lambda_fn = [&] (isl::basic_map arg0) {
22723    return fn(typed::basic_map<Domain, Range>(arg0));
22724  };
22725  return isl::map::foreach_basic_map(lambda_fn);
22726}
22727
22728template <typename Domain, typename Range>
22729void typed::map<Domain, Range>::foreach_map(const std::function<void(typed::map<Domain, Range>)> &fn) const
22730{
22731  auto lambda_fn = [&] (isl::map arg0) {
22732    return fn(typed::map<Domain, Range>(arg0));
22733  };
22734  return isl::map::foreach_map(lambda_fn);
22735}
22736
22737template <typename Domain, typename Range>
22738typed::map<Domain, Range> typed::map<Domain, Range>::gist(const typed::map<Domain, Range> &context) const
22739{
22740  auto res = isl::map::gist(context);
22741  return typed::map<Domain, Range>(res);
22742}
22743
22744template <typename Domain, typename Range>
22745typed::union_map<Domain, Range> typed::map<Domain, Range>::gist(const typed::union_map<Domain, Range> &context) const
22746{
22747  auto res = isl::map::gist(context);
22748  return typed::union_map<Domain, Range>(res);
22749}
22750
22751template <typename Domain, typename Range>
22752typed::map<Domain, Range> typed::map<Domain, Range>::gist(const typed::basic_map<Domain, Range> &context) const
22753{
22754  auto res = isl::map::gist(context);
22755  return typed::map<Domain, Range>(res);
22756}
22757
22758template <typename Domain, typename Range>
22759typed::map<Domain, Range> typed::map<Domain, Range>::gist_domain(const typed::set<Domain> &context) const
22760{
22761  auto res = isl::map::gist_domain(context);
22762  return typed::map<Domain, Range>(res);
22763}
22764
22765template <typename Domain, typename Range>
22766typed::union_map<Domain, Range> typed::map<Domain, Range>::gist_domain(const typed::union_set<Domain> &uset) const
22767{
22768  auto res = isl::map::gist_domain(uset);
22769  return typed::union_map<Domain, Range>(res);
22770}
22771
22772template <typename Domain, typename Range>
22773typed::map<Domain, Range> typed::map<Domain, Range>::gist_domain(const typed::basic_set<Domain> &context) const
22774{
22775  auto res = isl::map::gist_domain(context);
22776  return typed::map<Domain, Range>(res);
22777}
22778
22779template <typename Domain, typename Range>
22780typed::map<Domain, Range> typed::map<Domain, Range>::gist_domain(const typed::point<Domain> &context) const
22781{
22782  auto res = isl::map::gist_domain(context);
22783  return typed::map<Domain, Range>(res);
22784}
22785
22786template <typename Domain, typename Range>
22787typed::map<Domain, Range> typed::map<Domain, Range>::gist_params(const typed::set<> &context) const
22788{
22789  auto res = isl::map::gist_params(context);
22790  return typed::map<Domain, Range>(res);
22791}
22792
22793template <typename Domain, typename Range>
22794typed::map<Domain, Range> typed::map<Domain, Range>::gist_params(const typed::basic_set<> &context) const
22795{
22796  auto res = isl::map::gist_params(context);
22797  return typed::map<Domain, Range>(res);
22798}
22799
22800template <typename Domain, typename Range>
22801typed::map<Domain, Range> typed::map<Domain, Range>::gist_params(const typed::point<> &context) const
22802{
22803  auto res = isl::map::gist_params(context);
22804  return typed::map<Domain, Range>(res);
22805}
22806
22807template <typename Domain, typename Range>
22808typed::map<Domain, Range> typed::map<Domain, Range>::intersect(const typed::map<Domain, Range> &map2) const
22809{
22810  auto res = isl::map::intersect(map2);
22811  return typed::map<Domain, Range>(res);
22812}
22813
22814template <typename Domain, typename Range>
22815typed::union_map<Domain, Range> typed::map<Domain, Range>::intersect(const typed::union_map<Domain, Range> &umap2) const
22816{
22817  auto res = isl::map::intersect(umap2);
22818  return typed::union_map<Domain, Range>(res);
22819}
22820
22821template <typename Domain, typename Range>
22822typed::map<Domain, Range> typed::map<Domain, Range>::intersect(const typed::basic_map<Domain, Range> &map2) const
22823{
22824  auto res = isl::map::intersect(map2);
22825  return typed::map<Domain, Range>(res);
22826}
22827
22828template <typename Domain, typename Range>
22829typed::map<Domain, Range> typed::map<Domain, Range>::intersect_domain(const typed::set<Domain> &set) const
22830{
22831  auto res = isl::map::intersect_domain(set);
22832  return typed::map<Domain, Range>(res);
22833}
22834
22835template <typename Domain, typename Range>
22836typed::union_map<Domain, Range> typed::map<Domain, Range>::intersect_domain(const typed::space<Domain> &space) const
22837{
22838  auto res = isl::map::intersect_domain(space);
22839  return typed::union_map<Domain, Range>(res);
22840}
22841
22842template <typename Domain, typename Range>
22843typed::union_map<Domain, Range> typed::map<Domain, Range>::intersect_domain(const typed::union_set<Domain> &uset) const
22844{
22845  auto res = isl::map::intersect_domain(uset);
22846  return typed::union_map<Domain, Range>(res);
22847}
22848
22849template <typename Domain, typename Range>
22850typed::map<Domain, Range> typed::map<Domain, Range>::intersect_domain(const typed::basic_set<Domain> &set) const
22851{
22852  auto res = isl::map::intersect_domain(set);
22853  return typed::map<Domain, Range>(res);
22854}
22855
22856template <typename Domain, typename Range>
22857typed::map<Domain, Range> typed::map<Domain, Range>::intersect_domain(const typed::point<Domain> &set) const
22858{
22859  auto res = isl::map::intersect_domain(set);
22860  return typed::map<Domain, Range>(res);
22861}
22862
22863template <typename Domain, typename Range>
22864typed::map<Domain, Range> typed::map<Domain, Range>::intersect_params(const typed::set<> &params) const
22865{
22866  auto res = isl::map::intersect_params(params);
22867  return typed::map<Domain, Range>(res);
22868}
22869
22870template <typename Domain, typename Range>
22871typed::map<Domain, Range> typed::map<Domain, Range>::intersect_params(const typed::basic_set<> &params) const
22872{
22873  auto res = isl::map::intersect_params(params);
22874  return typed::map<Domain, Range>(res);
22875}
22876
22877template <typename Domain, typename Range>
22878typed::map<Domain, Range> typed::map<Domain, Range>::intersect_params(const typed::point<> &params) const
22879{
22880  auto res = isl::map::intersect_params(params);
22881  return typed::map<Domain, Range>(res);
22882}
22883
22884template <typename Domain, typename Range>
22885typed::map<Domain, Range> typed::map<Domain, Range>::intersect_range(const typed::set<Range> &set) const
22886{
22887  auto res = isl::map::intersect_range(set);
22888  return typed::map<Domain, Range>(res);
22889}
22890
22891template <typename Domain, typename Range>
22892typed::union_map<Domain, Range> typed::map<Domain, Range>::intersect_range(const typed::space<Range> &space) const
22893{
22894  auto res = isl::map::intersect_range(space);
22895  return typed::union_map<Domain, Range>(res);
22896}
22897
22898template <typename Domain, typename Range>
22899typed::union_map<Domain, Range> typed::map<Domain, Range>::intersect_range(const typed::union_set<Range> &uset) const
22900{
22901  auto res = isl::map::intersect_range(uset);
22902  return typed::union_map<Domain, Range>(res);
22903}
22904
22905template <typename Domain, typename Range>
22906typed::map<Domain, Range> typed::map<Domain, Range>::intersect_range(const typed::basic_set<Range> &set) const
22907{
22908  auto res = isl::map::intersect_range(set);
22909  return typed::map<Domain, Range>(res);
22910}
22911
22912template <typename Domain, typename Range>
22913typed::map<Domain, Range> typed::map<Domain, Range>::intersect_range(const typed::point<Range> &set) const
22914{
22915  auto res = isl::map::intersect_range(set);
22916  return typed::map<Domain, Range>(res);
22917}
22918
22919template <typename Domain, typename Range>
22920typed::map<Domain, Range> typed::map<Domain, Range>::lexmax() const
22921{
22922  auto res = isl::map::lexmax();
22923  return typed::map<Domain, Range>(res);
22924}
22925
22926template <typename Domain, typename Range>
22927typed::pw_multi_aff<Domain, Range> typed::map<Domain, Range>::lexmax_pw_multi_aff() const
22928{
22929  auto res = isl::map::lexmax_pw_multi_aff();
22930  return typed::pw_multi_aff<Domain, Range>(res);
22931}
22932
22933template <typename Domain, typename Range>
22934typed::map<Domain, Range> typed::map<Domain, Range>::lexmin() const
22935{
22936  auto res = isl::map::lexmin();
22937  return typed::map<Domain, Range>(res);
22938}
22939
22940template <typename Domain, typename Range>
22941typed::pw_multi_aff<Domain, Range> typed::map<Domain, Range>::lexmin_pw_multi_aff() const
22942{
22943  auto res = isl::map::lexmin_pw_multi_aff();
22944  return typed::pw_multi_aff<Domain, Range>(res);
22945}
22946
22947template <typename Domain, typename Range>
22948typed::map<Domain, Range> typed::map<Domain, Range>::lower_bound(const typed::multi_pw_aff<Domain, Range> &lower) const
22949{
22950  auto res = isl::map::lower_bound(lower);
22951  return typed::map<Domain, Range>(res);
22952}
22953
22954template <typename Domain, typename Range>
22955typed::map<Domain, Range> typed::map<Domain, Range>::lower_bound(const typed::aff<Domain, Range> &lower) const
22956{
22957  auto res = isl::map::lower_bound(lower);
22958  return typed::map<Domain, Range>(res);
22959}
22960
22961template <typename Domain, typename Range>
22962typed::map<Domain, Range> typed::map<Domain, Range>::lower_bound(const typed::multi_aff<Domain, Range> &lower) const
22963{
22964  auto res = isl::map::lower_bound(lower);
22965  return typed::map<Domain, Range>(res);
22966}
22967
22968template <typename Domain, typename Range>
22969typed::map<Domain, Range> typed::map<Domain, Range>::lower_bound(const typed::pw_aff<Domain, Range> &lower) const
22970{
22971  auto res = isl::map::lower_bound(lower);
22972  return typed::map<Domain, Range>(res);
22973}
22974
22975template <typename Domain, typename Range>
22976typed::map<Domain, Range> typed::map<Domain, Range>::lower_bound(const typed::pw_multi_aff<Domain, Range> &lower) const
22977{
22978  auto res = isl::map::lower_bound(lower);
22979  return typed::map<Domain, Range>(res);
22980}
22981
22982template <typename Domain, typename Range>
22983typed::map_list<Domain, Range> typed::map<Domain, Range>::map_list() const
22984{
22985  auto res = isl::map::map_list();
22986  return typed::map_list<Domain, Range>(res);
22987}
22988
22989template <typename Domain, typename Range>
22990typed::multi_pw_aff<Domain, Range> typed::map<Domain, Range>::max_multi_pw_aff() const
22991{
22992  auto res = isl::map::max_multi_pw_aff();
22993  return typed::multi_pw_aff<Domain, Range>(res);
22994}
22995
22996template <typename Domain, typename Range>
22997typed::multi_pw_aff<Domain, Range> typed::map<Domain, Range>::min_multi_pw_aff() const
22998{
22999  auto res = isl::map::min_multi_pw_aff();
23000  return typed::multi_pw_aff<Domain, Range>(res);
23001}
23002
23003template <typename Domain, typename Range>
23004typed::set<> typed::map<Domain, Range>::params() const
23005{
23006  auto res = isl::map::params();
23007  return typed::set<>(res);
23008}
23009
23010template <typename Domain, typename Range>
23011template <typename Domain2>
23012typed::map<Domain2, Range> typed::map<Domain, Range>::preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const
23013{
23014  auto res = isl::map::preimage_domain(ma);
23015  return typed::map<Domain2, Range>(res);
23016}
23017
23018template <typename Domain, typename Range>
23019template <typename Domain2>
23020typed::map<Domain2, Range> typed::map<Domain, Range>::preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
23021{
23022  auto res = isl::map::preimage_domain(mpa);
23023  return typed::map<Domain2, Range>(res);
23024}
23025
23026template <typename Domain, typename Range>
23027template <typename Domain2>
23028typed::map<Domain2, Range> typed::map<Domain, Range>::preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const
23029{
23030  auto res = isl::map::preimage_domain(pma);
23031  return typed::map<Domain2, Range>(res);
23032}
23033
23034template <typename Domain, typename Range>
23035template <typename Domain2>
23036typed::union_map<Domain2, Range> typed::map<Domain, Range>::preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
23037{
23038  auto res = isl::map::preimage_domain(upma);
23039  return typed::union_map<Domain2, Range>(res);
23040}
23041
23042template <typename Domain, typename Range>
23043template <typename Range2>
23044typed::map<Domain, Range2> typed::map<Domain, Range>::preimage_range(const typed::multi_aff<Range2, Range> &ma) const
23045{
23046  auto res = isl::map::preimage_range(ma);
23047  return typed::map<Domain, Range2>(res);
23048}
23049
23050template <typename Domain, typename Range>
23051template <typename Range2>
23052typed::map<Domain, Range2> typed::map<Domain, Range>::preimage_range(const typed::pw_multi_aff<Range2, Range> &pma) const
23053{
23054  auto res = isl::map::preimage_range(pma);
23055  return typed::map<Domain, Range2>(res);
23056}
23057
23058template <typename Domain, typename Range>
23059template <typename Range2>
23060typed::union_map<Domain, Range2> typed::map<Domain, Range>::preimage_range(const typed::union_pw_multi_aff<Range2, Range> &upma) const
23061{
23062  auto res = isl::map::preimage_range(upma);
23063  return typed::union_map<Domain, Range2>(res);
23064}
23065
23066template <typename Domain, typename Range>
23067template <typename Domain2, typename Range2>
23068typed::map<pair<Domain, Domain2>, pair<Range, Range2>> typed::map<Domain, Range>::product(const typed::map<Domain2, Range2> &map2) const
23069{
23070  auto res = isl::map::product(map2);
23071  return typed::map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
23072}
23073
23074template <typename Domain, typename Range>
23075template <typename Domain2, typename Range2>
23076typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::map<Domain, Range>::product(const typed::union_map<Domain2, Range2> &umap2) const
23077{
23078  auto res = isl::map::product(umap2);
23079  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
23080}
23081
23082template <typename Domain, typename Range>
23083template <typename Domain2, typename Range2>
23084typed::map<pair<Domain, Domain2>, pair<Range, Range2>> typed::map<Domain, Range>::product(const typed::basic_map<Domain2, Range2> &map2) const
23085{
23086  auto res = isl::map::product(map2);
23087  return typed::map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
23088}
23089
23090template <typename Domain, typename Range>
23091typed::map<Domain, Range> typed::map<Domain, Range>::project_out_all_params() const
23092{
23093  auto res = isl::map::project_out_all_params();
23094  return typed::map<Domain, Range>(res);
23095}
23096
23097template <typename Domain, typename Range>
23098typed::map<Domain, Range> typed::map<Domain, Range>::project_out_param(const typed::id<Anonymous> &id) const
23099{
23100  auto res = isl::map::project_out_param(id);
23101  return typed::map<Domain, Range>(res);
23102}
23103
23104template <typename Domain, typename Range>
23105typed::map<Domain, Range> typed::map<Domain, Range>::project_out_param(const std::string &id) const
23106{
23107  auto res = isl::map::project_out_param(id);
23108  return typed::map<Domain, Range>(res);
23109}
23110
23111template <typename Domain, typename Range>
23112typed::map<Domain, Range> typed::map<Domain, Range>::project_out_param(const typed::id_list<Anonymous> &list) const
23113{
23114  auto res = isl::map::project_out_param(list);
23115  return typed::map<Domain, Range>(res);
23116}
23117
23118template <typename Domain, typename Range>
23119typed::set<Range> typed::map<Domain, Range>::range() const
23120{
23121  auto res = isl::map::range();
23122  return typed::set<Range>(res);
23123}
23124
23125template <typename Domain, typename Range>
23126typed::fixed_box<Domain, Range> typed::map<Domain, Range>::range_lattice_tile() const
23127{
23128  auto res = isl::map::range_lattice_tile();
23129  return typed::fixed_box<Domain, Range>(res);
23130}
23131
23132template <typename Domain, typename Range>
23133typed::union_map<pair<Domain, Range>, Range> typed::map<Domain, Range>::range_map() const
23134{
23135  auto res = isl::map::range_map();
23136  return typed::union_map<pair<Domain, Range>, Range>(res);
23137}
23138
23139template <typename Domain, typename Range>
23140template <typename Range2>
23141typed::map<Domain, pair<Range, Range2>> typed::map<Domain, Range>::range_product(const typed::map<Domain, Range2> &map2) const
23142{
23143  auto res = isl::map::range_product(map2);
23144  return typed::map<Domain, pair<Range, Range2>>(res);
23145}
23146
23147template <typename Domain, typename Range>
23148template <typename Range2>
23149typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, Range>::range_product(const typed::union_map<Domain, Range2> &umap2) const
23150{
23151  auto res = isl::map::range_product(umap2);
23152  return typed::union_map<Domain, pair<Range, Range2>>(res);
23153}
23154
23155template <typename Domain, typename Range>
23156template <typename Range2>
23157typed::map<Domain, pair<Range, Range2>> typed::map<Domain, Range>::range_product(const typed::basic_map<Domain, Range2> &map2) const
23158{
23159  auto res = isl::map::range_product(map2);
23160  return typed::map<Domain, pair<Range, Range2>>(res);
23161}
23162
23163template <typename Domain, typename Range>
23164typed::fixed_box<Domain, Range> typed::map<Domain, Range>::range_simple_fixed_box_hull() const
23165{
23166  auto res = isl::map::range_simple_fixed_box_hull();
23167  return typed::fixed_box<Domain, Range>(res);
23168}
23169
23170template <typename Domain, typename Range>
23171typed::map<Range, Domain> typed::map<Domain, Range>::reverse() const
23172{
23173  auto res = isl::map::reverse();
23174  return typed::map<Range, Domain>(res);
23175}
23176
23177template <typename Domain, typename Range>
23178template <typename Domain2>
23179typed::map<Domain2, Range> typed::map<Domain, Range>::set_domain_tuple(const typed::id<Anonymous> &id) const
23180{
23181  auto res = isl::map::set_domain_tuple(id);
23182  return typed::map<Domain2, Range>(res);
23183}
23184
23185template <typename Domain, typename Range>
23186template <typename Domain2>
23187typed::map<Domain2, Range> typed::map<Domain, Range>::set_domain_tuple(const std::string &id) const
23188{
23189  auto res = isl::map::set_domain_tuple(id);
23190  return typed::map<Domain2, Range>(res);
23191}
23192
23193template <typename Domain, typename Range>
23194template <typename Range2>
23195typed::map<Domain, Range2> typed::map<Domain, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
23196{
23197  auto res = isl::map::set_range_tuple(id);
23198  return typed::map<Domain, Range2>(res);
23199}
23200
23201template <typename Domain, typename Range>
23202template <typename Range2>
23203typed::map<Domain, Range2> typed::map<Domain, Range>::set_range_tuple(const std::string &id) const
23204{
23205  auto res = isl::map::set_range_tuple(id);
23206  return typed::map<Domain, Range2>(res);
23207}
23208
23209template <typename Domain, typename Range>
23210typed::space<Domain, Range> typed::map<Domain, Range>::space() const
23211{
23212  auto res = isl::map::space();
23213  return typed::space<Domain, Range>(res);
23214}
23215
23216template <typename Domain, typename Range>
23217typed::map<Domain, Range> typed::map<Domain, Range>::subtract(const typed::map<Domain, Range> &map2) const
23218{
23219  auto res = isl::map::subtract(map2);
23220  return typed::map<Domain, Range>(res);
23221}
23222
23223template <typename Domain, typename Range>
23224typed::union_map<Domain, Range> typed::map<Domain, Range>::subtract(const typed::union_map<Domain, Range> &umap2) const
23225{
23226  auto res = isl::map::subtract(umap2);
23227  return typed::union_map<Domain, Range>(res);
23228}
23229
23230template <typename Domain, typename Range>
23231typed::map<Domain, Range> typed::map<Domain, Range>::subtract(const typed::basic_map<Domain, Range> &map2) const
23232{
23233  auto res = isl::map::subtract(map2);
23234  return typed::map<Domain, Range>(res);
23235}
23236
23237template <typename Domain, typename Range>
23238typed::union_map<Domain, Range> typed::map<Domain, Range>::subtract_domain(const typed::union_set<Domain> &dom) const
23239{
23240  auto res = isl::map::subtract_domain(dom);
23241  return typed::union_map<Domain, Range>(res);
23242}
23243
23244template <typename Domain, typename Range>
23245typed::union_map<Domain, Range> typed::map<Domain, Range>::subtract_range(const typed::union_set<Range> &dom) const
23246{
23247  auto res = isl::map::subtract_range(dom);
23248  return typed::union_map<Domain, Range>(res);
23249}
23250
23251template <typename Domain, typename Range>
23252typed::union_map<Domain, Range> typed::map<Domain, Range>::to_union_map() const
23253{
23254  auto res = isl::map::to_union_map();
23255  return typed::union_map<Domain, Range>(res);
23256}
23257
23258template <typename Domain, typename Range>
23259typed::map<Domain, Range> typed::map<Domain, Range>::unite(const typed::map<Domain, Range> &map2) const
23260{
23261  auto res = isl::map::unite(map2);
23262  return typed::map<Domain, Range>(res);
23263}
23264
23265template <typename Domain, typename Range>
23266typed::union_map<Domain, Range> typed::map<Domain, Range>::unite(const typed::union_map<Domain, Range> &umap2) const
23267{
23268  auto res = isl::map::unite(umap2);
23269  return typed::union_map<Domain, Range>(res);
23270}
23271
23272template <typename Domain, typename Range>
23273typed::map<Domain, Range> typed::map<Domain, Range>::unite(const typed::basic_map<Domain, Range> &map2) const
23274{
23275  auto res = isl::map::unite(map2);
23276  return typed::map<Domain, Range>(res);
23277}
23278
23279template <typename Domain, typename Range>
23280typed::map<Domain, Range> typed::map<Domain, Range>::universe(const typed::space<Domain, Range> &space)
23281{
23282  auto res = isl::map::universe(space);
23283  return typed::map<Domain, Range>(res);
23284}
23285
23286template <typename Domain, typename Range>
23287typed::map<Domain, Range> typed::map<Domain, Range>::upper_bound(const typed::multi_pw_aff<Domain, Range> &upper) const
23288{
23289  auto res = isl::map::upper_bound(upper);
23290  return typed::map<Domain, Range>(res);
23291}
23292
23293template <typename Domain, typename Range>
23294typed::map<Domain, Range> typed::map<Domain, Range>::upper_bound(const typed::aff<Domain, Range> &upper) const
23295{
23296  auto res = isl::map::upper_bound(upper);
23297  return typed::map<Domain, Range>(res);
23298}
23299
23300template <typename Domain, typename Range>
23301typed::map<Domain, Range> typed::map<Domain, Range>::upper_bound(const typed::multi_aff<Domain, Range> &upper) const
23302{
23303  auto res = isl::map::upper_bound(upper);
23304  return typed::map<Domain, Range>(res);
23305}
23306
23307template <typename Domain, typename Range>
23308typed::map<Domain, Range> typed::map<Domain, Range>::upper_bound(const typed::pw_aff<Domain, Range> &upper) const
23309{
23310  auto res = isl::map::upper_bound(upper);
23311  return typed::map<Domain, Range>(res);
23312}
23313
23314template <typename Domain, typename Range>
23315typed::map<Domain, Range> typed::map<Domain, Range>::upper_bound(const typed::pw_multi_aff<Domain, Range> &upper) const
23316{
23317  auto res = isl::map::upper_bound(upper);
23318  return typed::map<Domain, Range>(res);
23319}
23320
23321template <typename Domain, typename Range>
23322typed::set<pair<Domain, Range>> typed::map<Domain, Range>::wrap() const
23323{
23324  auto res = isl::map::wrap();
23325  return typed::set<pair<Domain, Range>>(res);
23326}
23327
23328template <typename Domain, typename Range, typename Range2>
23329typed::map<pair<Domain, Range>, Range2>::map(const typed::basic_map<pair<Domain, Range>, Range2> &bmap)
23330  : isl::map(bmap)
23331{
23332}
23333
23334template <typename Domain, typename Range, typename Range2>
23335typed::map<pair<Domain, Range>, Range2>::map(const isl::ctx &ctx, const std::string &str)
23336  : isl::map(ctx, str)
23337{
23338}
23339
23340template <typename Domain, typename Range, typename Range2>
23341template <typename Domain2>
23342typed::map<Domain2, Range2> typed::map<pair<Domain, Range>, Range2>::apply_domain(const typed::map<pair<Domain, Range>, Domain2> &map2) const
23343{
23344  auto res = isl::map::apply_domain(map2);
23345  return typed::map<Domain2, Range2>(res);
23346}
23347
23348template <typename Domain, typename Range, typename Range2>
23349template <typename Domain2>
23350typed::union_map<Domain2, Range2> typed::map<pair<Domain, Range>, Range2>::apply_domain(const typed::union_map<pair<Domain, Range>, Domain2> &umap2) const
23351{
23352  auto res = isl::map::apply_domain(umap2);
23353  return typed::union_map<Domain2, Range2>(res);
23354}
23355
23356template <typename Domain, typename Range, typename Range2>
23357template <typename Domain2>
23358typed::map<Domain2, Range2> typed::map<pair<Domain, Range>, Range2>::apply_domain(const typed::basic_map<pair<Domain, Range>, Domain2> &map2) const
23359{
23360  auto res = isl::map::apply_domain(map2);
23361  return typed::map<Domain2, Range2>(res);
23362}
23363
23364template <typename Domain, typename Range, typename Range2>
23365template <typename Arg3>
23366typed::map<pair<Domain, Range>, Arg3> typed::map<pair<Domain, Range>, Range2>::apply_range(const typed::map<Range2, Arg3> &map2) const
23367{
23368  auto res = isl::map::apply_range(map2);
23369  return typed::map<pair<Domain, Range>, Arg3>(res);
23370}
23371
23372template <typename Domain, typename Range, typename Range2>
23373template <typename Arg3>
23374typed::union_map<pair<Domain, Range>, Arg3> typed::map<pair<Domain, Range>, Range2>::apply_range(const typed::union_map<Range2, Arg3> &umap2) const
23375{
23376  auto res = isl::map::apply_range(umap2);
23377  return typed::union_map<pair<Domain, Range>, Arg3>(res);
23378}
23379
23380template <typename Domain, typename Range, typename Range2>
23381template <typename Arg3>
23382typed::map<pair<Domain, Range>, Arg3> typed::map<pair<Domain, Range>, Range2>::apply_range(const typed::basic_map<Range2, Arg3> &map2) const
23383{
23384  auto res = isl::map::apply_range(map2);
23385  return typed::map<pair<Domain, Range>, Arg3>(res);
23386}
23387
23388template <typename Domain, typename Range, typename Range2>
23389typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::as_map() const
23390{
23391  auto res = isl::map::as_map();
23392  return typed::map<pair<Domain, Range>, Range2>(res);
23393}
23394
23395template <typename Domain, typename Range, typename Range2>
23396typed::multi_union_pw_aff<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::as_multi_union_pw_aff() const
23397{
23398  auto res = isl::map::as_multi_union_pw_aff();
23399  return typed::multi_union_pw_aff<pair<Domain, Range>, Range2>(res);
23400}
23401
23402template <typename Domain, typename Range, typename Range2>
23403typed::pw_multi_aff<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::as_pw_multi_aff() const
23404{
23405  auto res = isl::map::as_pw_multi_aff();
23406  return typed::pw_multi_aff<pair<Domain, Range>, Range2>(res);
23407}
23408
23409template <typename Domain, typename Range, typename Range2>
23410typed::union_pw_multi_aff<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::as_union_pw_multi_aff() const
23411{
23412  auto res = isl::map::as_union_pw_multi_aff();
23413  return typed::union_pw_multi_aff<pair<Domain, Range>, Range2>(res);
23414}
23415
23416template <typename Domain, typename Range, typename Range2>
23417typed::set<Range2> typed::map<pair<Domain, Range>, Range2>::bind_domain(const typed::multi_id<pair<Domain, Range>> &tuple) const
23418{
23419  auto res = isl::map::bind_domain(tuple);
23420  return typed::set<Range2>(res);
23421}
23422
23423template <typename Domain, typename Range, typename Range2>
23424typed::set<pair<Domain, Range>> typed::map<pair<Domain, Range>, Range2>::bind_range(const typed::multi_id<Range2> &tuple) const
23425{
23426  auto res = isl::map::bind_range(tuple);
23427  return typed::set<pair<Domain, Range>>(res);
23428}
23429
23430template <typename Domain, typename Range, typename Range2>
23431typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::coalesce() const
23432{
23433  auto res = isl::map::coalesce();
23434  return typed::map<pair<Domain, Range>, Range2>(res);
23435}
23436
23437template <typename Domain, typename Range, typename Range2>
23438typed::map<Domain, pair<Range, Range2>> typed::map<pair<Domain, Range>, Range2>::curry() const
23439{
23440  auto res = isl::map::curry();
23441  return typed::map<Domain, pair<Range, Range2>>(res);
23442}
23443
23444template <typename Domain, typename Range, typename Range2>
23445typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::detect_equalities() const
23446{
23447  auto res = isl::map::detect_equalities();
23448  return typed::map<pair<Domain, Range>, Range2>(res);
23449}
23450
23451template <typename Domain, typename Range, typename Range2>
23452typed::set<pair<Domain, Range>> typed::map<pair<Domain, Range>, Range2>::domain() const
23453{
23454  auto res = isl::map::domain();
23455  return typed::set<pair<Domain, Range>>(res);
23456}
23457
23458template <typename Domain, typename Range, typename Range2>
23459typed::map<Domain, Range2> typed::map<pair<Domain, Range>, Range2>::domain_factor_domain() const
23460{
23461  auto res = isl::map::domain_factor_domain();
23462  return typed::map<Domain, Range2>(res);
23463}
23464
23465template <typename Domain, typename Range, typename Range2>
23466typed::map<Range, Range2> typed::map<pair<Domain, Range>, Range2>::domain_factor_range() const
23467{
23468  auto res = isl::map::domain_factor_range();
23469  return typed::map<Range, Range2>(res);
23470}
23471
23472template <typename Domain, typename Range, typename Range2>
23473typed::union_map<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> typed::map<pair<Domain, Range>, Range2>::domain_map() const
23474{
23475  auto res = isl::map::domain_map();
23476  return typed::union_map<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>>(res);
23477}
23478
23479template <typename Domain, typename Range, typename Range2>
23480typed::union_pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> typed::map<pair<Domain, Range>, Range2>::domain_map_union_pw_multi_aff() const
23481{
23482  auto res = isl::map::domain_map_union_pw_multi_aff();
23483  return typed::union_pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>>(res);
23484}
23485
23486template <typename Domain, typename Range, typename Range2>
23487template <typename Domain2>
23488typed::map<pair<pair<Domain, Range>, Domain2>, Range2> typed::map<pair<Domain, Range>, Range2>::domain_product(const typed::map<Domain2, Range2> &map2) const
23489{
23490  auto res = isl::map::domain_product(map2);
23491  return typed::map<pair<pair<Domain, Range>, Domain2>, Range2>(res);
23492}
23493
23494template <typename Domain, typename Range, typename Range2>
23495template <typename Domain2>
23496typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> typed::map<pair<Domain, Range>, Range2>::domain_product(const typed::union_map<Domain2, Range2> &umap2) const
23497{
23498  auto res = isl::map::domain_product(umap2);
23499  return typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2>(res);
23500}
23501
23502template <typename Domain, typename Range, typename Range2>
23503template <typename Domain2>
23504typed::map<pair<pair<Domain, Range>, Domain2>, Range2> typed::map<pair<Domain, Range>, Range2>::domain_product(const typed::basic_map<Domain2, Range2> &map2) const
23505{
23506  auto res = isl::map::domain_product(map2);
23507  return typed::map<pair<pair<Domain, Range>, Domain2>, Range2>(res);
23508}
23509
23510template <typename Domain, typename Range, typename Range2>
23511typed::map<pair<Range, Domain>, Range2> typed::map<pair<Domain, Range>, Range2>::domain_reverse() const
23512{
23513  auto res = isl::map::domain_reverse();
23514  return typed::map<pair<Range, Domain>, Range2>(res);
23515}
23516
23517template <typename Domain, typename Range, typename Range2>
23518typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::drop_unused_params() const
23519{
23520  auto res = isl::map::drop_unused_params();
23521  return typed::map<pair<Domain, Range>, Range2>(res);
23522}
23523
23524template <typename Domain, typename Range, typename Range2>
23525bool typed::map<pair<Domain, Range>, Range2>::every_map(const std::function<bool(typed::map<pair<Domain, Range>, Range2>)> &test) const
23526{
23527  auto lambda_test = [&] (isl::map arg0) {
23528    return test(typed::map<pair<Domain, Range>, Range2>(arg0));
23529  };
23530  return isl::map::every_map(lambda_test);
23531}
23532
23533template <typename Domain, typename Range, typename Range2>
23534typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::extract_map(const typed::space<pair<Domain, Range>, Range2> &space) const
23535{
23536  auto res = isl::map::extract_map(space);
23537  return typed::map<pair<Domain, Range>, Range2>(res);
23538}
23539
23540template <typename Domain, typename Range, typename Range2>
23541typed::map<Anonymous, Range2> typed::map<pair<Domain, Range>, Range2>::flatten_domain() const
23542{
23543  auto res = isl::map::flatten_domain();
23544  return typed::map<Anonymous, Range2>(res);
23545}
23546
23547template <typename Domain, typename Range, typename Range2>
23548void typed::map<pair<Domain, Range>, Range2>::foreach_basic_map(const std::function<void(typed::basic_map<pair<Domain, Range>, Range2>)> &fn) const
23549{
23550  auto lambda_fn = [&] (isl::basic_map arg0) {
23551    return fn(typed::basic_map<pair<Domain, Range>, Range2>(arg0));
23552  };
23553  return isl::map::foreach_basic_map(lambda_fn);
23554}
23555
23556template <typename Domain, typename Range, typename Range2>
23557void typed::map<pair<Domain, Range>, Range2>::foreach_map(const std::function<void(typed::map<pair<Domain, Range>, Range2>)> &fn) const
23558{
23559  auto lambda_fn = [&] (isl::map arg0) {
23560    return fn(typed::map<pair<Domain, Range>, Range2>(arg0));
23561  };
23562  return isl::map::foreach_map(lambda_fn);
23563}
23564
23565template <typename Domain, typename Range, typename Range2>
23566typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist(const typed::map<pair<Domain, Range>, Range2> &context) const
23567{
23568  auto res = isl::map::gist(context);
23569  return typed::map<pair<Domain, Range>, Range2>(res);
23570}
23571
23572template <typename Domain, typename Range, typename Range2>
23573typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist(const typed::union_map<pair<Domain, Range>, Range2> &context) const
23574{
23575  auto res = isl::map::gist(context);
23576  return typed::union_map<pair<Domain, Range>, Range2>(res);
23577}
23578
23579template <typename Domain, typename Range, typename Range2>
23580typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist(const typed::basic_map<pair<Domain, Range>, Range2> &context) const
23581{
23582  auto res = isl::map::gist(context);
23583  return typed::map<pair<Domain, Range>, Range2>(res);
23584}
23585
23586template <typename Domain, typename Range, typename Range2>
23587typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist_domain(const typed::set<pair<Domain, Range>> &context) const
23588{
23589  auto res = isl::map::gist_domain(context);
23590  return typed::map<pair<Domain, Range>, Range2>(res);
23591}
23592
23593template <typename Domain, typename Range, typename Range2>
23594typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist_domain(const typed::union_set<pair<Domain, Range>> &uset) const
23595{
23596  auto res = isl::map::gist_domain(uset);
23597  return typed::union_map<pair<Domain, Range>, Range2>(res);
23598}
23599
23600template <typename Domain, typename Range, typename Range2>
23601typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist_domain(const typed::basic_set<pair<Domain, Range>> &context) const
23602{
23603  auto res = isl::map::gist_domain(context);
23604  return typed::map<pair<Domain, Range>, Range2>(res);
23605}
23606
23607template <typename Domain, typename Range, typename Range2>
23608typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist_domain(const typed::point<pair<Domain, Range>> &context) const
23609{
23610  auto res = isl::map::gist_domain(context);
23611  return typed::map<pair<Domain, Range>, Range2>(res);
23612}
23613
23614template <typename Domain, typename Range, typename Range2>
23615typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist_params(const typed::set<> &context) const
23616{
23617  auto res = isl::map::gist_params(context);
23618  return typed::map<pair<Domain, Range>, Range2>(res);
23619}
23620
23621template <typename Domain, typename Range, typename Range2>
23622typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist_params(const typed::basic_set<> &context) const
23623{
23624  auto res = isl::map::gist_params(context);
23625  return typed::map<pair<Domain, Range>, Range2>(res);
23626}
23627
23628template <typename Domain, typename Range, typename Range2>
23629typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::gist_params(const typed::point<> &context) const
23630{
23631  auto res = isl::map::gist_params(context);
23632  return typed::map<pair<Domain, Range>, Range2>(res);
23633}
23634
23635template <typename Domain, typename Range, typename Range2>
23636typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect(const typed::map<pair<Domain, Range>, Range2> &map2) const
23637{
23638  auto res = isl::map::intersect(map2);
23639  return typed::map<pair<Domain, Range>, Range2>(res);
23640}
23641
23642template <typename Domain, typename Range, typename Range2>
23643typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const
23644{
23645  auto res = isl::map::intersect(umap2);
23646  return typed::union_map<pair<Domain, Range>, Range2>(res);
23647}
23648
23649template <typename Domain, typename Range, typename Range2>
23650typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect(const typed::basic_map<pair<Domain, Range>, Range2> &map2) const
23651{
23652  auto res = isl::map::intersect(map2);
23653  return typed::map<pair<Domain, Range>, Range2>(res);
23654}
23655
23656template <typename Domain, typename Range, typename Range2>
23657typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_domain(const typed::set<pair<Domain, Range>> &set) const
23658{
23659  auto res = isl::map::intersect_domain(set);
23660  return typed::map<pair<Domain, Range>, Range2>(res);
23661}
23662
23663template <typename Domain, typename Range, typename Range2>
23664typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_domain(const typed::space<pair<Domain, Range>> &space) const
23665{
23666  auto res = isl::map::intersect_domain(space);
23667  return typed::union_map<pair<Domain, Range>, Range2>(res);
23668}
23669
23670template <typename Domain, typename Range, typename Range2>
23671typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_domain(const typed::union_set<pair<Domain, Range>> &uset) const
23672{
23673  auto res = isl::map::intersect_domain(uset);
23674  return typed::union_map<pair<Domain, Range>, Range2>(res);
23675}
23676
23677template <typename Domain, typename Range, typename Range2>
23678typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_domain(const typed::basic_set<pair<Domain, Range>> &set) const
23679{
23680  auto res = isl::map::intersect_domain(set);
23681  return typed::map<pair<Domain, Range>, Range2>(res);
23682}
23683
23684template <typename Domain, typename Range, typename Range2>
23685typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_domain(const typed::point<pair<Domain, Range>> &set) const
23686{
23687  auto res = isl::map::intersect_domain(set);
23688  return typed::map<pair<Domain, Range>, Range2>(res);
23689}
23690
23691template <typename Domain, typename Range, typename Range2>
23692typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::set<Domain> &domain) const
23693{
23694  auto res = isl::map::intersect_domain_wrapped_domain(domain);
23695  return typed::map<pair<Domain, Range>, Range2>(res);
23696}
23697
23698template <typename Domain, typename Range, typename Range2>
23699typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::union_set<Domain> &domain) const
23700{
23701  auto res = isl::map::intersect_domain_wrapped_domain(domain);
23702  return typed::union_map<pair<Domain, Range>, Range2>(res);
23703}
23704
23705template <typename Domain, typename Range, typename Range2>
23706typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::basic_set<Domain> &domain) const
23707{
23708  auto res = isl::map::intersect_domain_wrapped_domain(domain);
23709  return typed::map<pair<Domain, Range>, Range2>(res);
23710}
23711
23712template <typename Domain, typename Range, typename Range2>
23713typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::point<Domain> &domain) const
23714{
23715  auto res = isl::map::intersect_domain_wrapped_domain(domain);
23716  return typed::map<pair<Domain, Range>, Range2>(res);
23717}
23718
23719template <typename Domain, typename Range, typename Range2>
23720typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_params(const typed::set<> &params) const
23721{
23722  auto res = isl::map::intersect_params(params);
23723  return typed::map<pair<Domain, Range>, Range2>(res);
23724}
23725
23726template <typename Domain, typename Range, typename Range2>
23727typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_params(const typed::basic_set<> &params) const
23728{
23729  auto res = isl::map::intersect_params(params);
23730  return typed::map<pair<Domain, Range>, Range2>(res);
23731}
23732
23733template <typename Domain, typename Range, typename Range2>
23734typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_params(const typed::point<> &params) const
23735{
23736  auto res = isl::map::intersect_params(params);
23737  return typed::map<pair<Domain, Range>, Range2>(res);
23738}
23739
23740template <typename Domain, typename Range, typename Range2>
23741typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_range(const typed::set<Range2> &set) const
23742{
23743  auto res = isl::map::intersect_range(set);
23744  return typed::map<pair<Domain, Range>, Range2>(res);
23745}
23746
23747template <typename Domain, typename Range, typename Range2>
23748typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_range(const typed::space<Range2> &space) const
23749{
23750  auto res = isl::map::intersect_range(space);
23751  return typed::union_map<pair<Domain, Range>, Range2>(res);
23752}
23753
23754template <typename Domain, typename Range, typename Range2>
23755typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_range(const typed::union_set<Range2> &uset) const
23756{
23757  auto res = isl::map::intersect_range(uset);
23758  return typed::union_map<pair<Domain, Range>, Range2>(res);
23759}
23760
23761template <typename Domain, typename Range, typename Range2>
23762typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_range(const typed::basic_set<Range2> &set) const
23763{
23764  auto res = isl::map::intersect_range(set);
23765  return typed::map<pair<Domain, Range>, Range2>(res);
23766}
23767
23768template <typename Domain, typename Range, typename Range2>
23769typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::intersect_range(const typed::point<Range2> &set) const
23770{
23771  auto res = isl::map::intersect_range(set);
23772  return typed::map<pair<Domain, Range>, Range2>(res);
23773}
23774
23775template <typename Domain, typename Range, typename Range2>
23776typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::lexmax() const
23777{
23778  auto res = isl::map::lexmax();
23779  return typed::map<pair<Domain, Range>, Range2>(res);
23780}
23781
23782template <typename Domain, typename Range, typename Range2>
23783typed::pw_multi_aff<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::lexmax_pw_multi_aff() const
23784{
23785  auto res = isl::map::lexmax_pw_multi_aff();
23786  return typed::pw_multi_aff<pair<Domain, Range>, Range2>(res);
23787}
23788
23789template <typename Domain, typename Range, typename Range2>
23790typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::lexmin() const
23791{
23792  auto res = isl::map::lexmin();
23793  return typed::map<pair<Domain, Range>, Range2>(res);
23794}
23795
23796template <typename Domain, typename Range, typename Range2>
23797typed::pw_multi_aff<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::lexmin_pw_multi_aff() const
23798{
23799  auto res = isl::map::lexmin_pw_multi_aff();
23800  return typed::pw_multi_aff<pair<Domain, Range>, Range2>(res);
23801}
23802
23803template <typename Domain, typename Range, typename Range2>
23804typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::lower_bound(const typed::multi_pw_aff<pair<Domain, Range>, Range2> &lower) const
23805{
23806  auto res = isl::map::lower_bound(lower);
23807  return typed::map<pair<Domain, Range>, Range2>(res);
23808}
23809
23810template <typename Domain, typename Range, typename Range2>
23811typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::lower_bound(const typed::aff<pair<Domain, Range>, Range2> &lower) const
23812{
23813  auto res = isl::map::lower_bound(lower);
23814  return typed::map<pair<Domain, Range>, Range2>(res);
23815}
23816
23817template <typename Domain, typename Range, typename Range2>
23818typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::lower_bound(const typed::multi_aff<pair<Domain, Range>, Range2> &lower) const
23819{
23820  auto res = isl::map::lower_bound(lower);
23821  return typed::map<pair<Domain, Range>, Range2>(res);
23822}
23823
23824template <typename Domain, typename Range, typename Range2>
23825typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::lower_bound(const typed::pw_aff<pair<Domain, Range>, Range2> &lower) const
23826{
23827  auto res = isl::map::lower_bound(lower);
23828  return typed::map<pair<Domain, Range>, Range2>(res);
23829}
23830
23831template <typename Domain, typename Range, typename Range2>
23832typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::lower_bound(const typed::pw_multi_aff<pair<Domain, Range>, Range2> &lower) const
23833{
23834  auto res = isl::map::lower_bound(lower);
23835  return typed::map<pair<Domain, Range>, Range2>(res);
23836}
23837
23838template <typename Domain, typename Range, typename Range2>
23839typed::map_list<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::map_list() const
23840{
23841  auto res = isl::map::map_list();
23842  return typed::map_list<pair<Domain, Range>, Range2>(res);
23843}
23844
23845template <typename Domain, typename Range, typename Range2>
23846typed::multi_pw_aff<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::max_multi_pw_aff() const
23847{
23848  auto res = isl::map::max_multi_pw_aff();
23849  return typed::multi_pw_aff<pair<Domain, Range>, Range2>(res);
23850}
23851
23852template <typename Domain, typename Range, typename Range2>
23853typed::multi_pw_aff<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::min_multi_pw_aff() const
23854{
23855  auto res = isl::map::min_multi_pw_aff();
23856  return typed::multi_pw_aff<pair<Domain, Range>, Range2>(res);
23857}
23858
23859template <typename Domain, typename Range, typename Range2>
23860typed::set<> typed::map<pair<Domain, Range>, Range2>::params() const
23861{
23862  auto res = isl::map::params();
23863  return typed::set<>(res);
23864}
23865
23866template <typename Domain, typename Range, typename Range2>
23867template <typename Domain2>
23868typed::map<Domain2, Range2> typed::map<pair<Domain, Range>, Range2>::preimage_domain(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const
23869{
23870  auto res = isl::map::preimage_domain(ma);
23871  return typed::map<Domain2, Range2>(res);
23872}
23873
23874template <typename Domain, typename Range, typename Range2>
23875template <typename Domain2>
23876typed::map<Domain2, Range2> typed::map<pair<Domain, Range>, Range2>::preimage_domain(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const
23877{
23878  auto res = isl::map::preimage_domain(mpa);
23879  return typed::map<Domain2, Range2>(res);
23880}
23881
23882template <typename Domain, typename Range, typename Range2>
23883template <typename Domain2>
23884typed::map<Domain2, Range2> typed::map<pair<Domain, Range>, Range2>::preimage_domain(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const
23885{
23886  auto res = isl::map::preimage_domain(pma);
23887  return typed::map<Domain2, Range2>(res);
23888}
23889
23890template <typename Domain, typename Range, typename Range2>
23891template <typename Domain2>
23892typed::union_map<Domain2, Range2> typed::map<pair<Domain, Range>, Range2>::preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const
23893{
23894  auto res = isl::map::preimage_domain(upma);
23895  return typed::union_map<Domain2, Range2>(res);
23896}
23897
23898template <typename Domain, typename Range, typename Range2>
23899template <typename Arg3>
23900typed::map<pair<Domain, Range>, Arg3> typed::map<pair<Domain, Range>, Range2>::preimage_range(const typed::multi_aff<Arg3, Range2> &ma) const
23901{
23902  auto res = isl::map::preimage_range(ma);
23903  return typed::map<pair<Domain, Range>, Arg3>(res);
23904}
23905
23906template <typename Domain, typename Range, typename Range2>
23907template <typename Arg3>
23908typed::map<pair<Domain, Range>, Arg3> typed::map<pair<Domain, Range>, Range2>::preimage_range(const typed::pw_multi_aff<Arg3, Range2> &pma) const
23909{
23910  auto res = isl::map::preimage_range(pma);
23911  return typed::map<pair<Domain, Range>, Arg3>(res);
23912}
23913
23914template <typename Domain, typename Range, typename Range2>
23915template <typename Arg3>
23916typed::union_map<pair<Domain, Range>, Arg3> typed::map<pair<Domain, Range>, Range2>::preimage_range(const typed::union_pw_multi_aff<Arg3, Range2> &upma) const
23917{
23918  auto res = isl::map::preimage_range(upma);
23919  return typed::union_map<pair<Domain, Range>, Arg3>(res);
23920}
23921
23922template <typename Domain, typename Range, typename Range2>
23923template <typename Domain2, typename Arg3>
23924typed::map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> typed::map<pair<Domain, Range>, Range2>::product(const typed::map<Domain2, Arg3> &map2) const
23925{
23926  auto res = isl::map::product(map2);
23927  return typed::map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>>(res);
23928}
23929
23930template <typename Domain, typename Range, typename Range2>
23931template <typename Domain2, typename Arg3>
23932typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> typed::map<pair<Domain, Range>, Range2>::product(const typed::union_map<Domain2, Arg3> &umap2) const
23933{
23934  auto res = isl::map::product(umap2);
23935  return typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>>(res);
23936}
23937
23938template <typename Domain, typename Range, typename Range2>
23939template <typename Domain2, typename Arg3>
23940typed::map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> typed::map<pair<Domain, Range>, Range2>::product(const typed::basic_map<Domain2, Arg3> &map2) const
23941{
23942  auto res = isl::map::product(map2);
23943  return typed::map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>>(res);
23944}
23945
23946template <typename Domain, typename Range, typename Range2>
23947typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::project_out_all_params() const
23948{
23949  auto res = isl::map::project_out_all_params();
23950  return typed::map<pair<Domain, Range>, Range2>(res);
23951}
23952
23953template <typename Domain, typename Range, typename Range2>
23954typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::project_out_param(const typed::id<Anonymous> &id) const
23955{
23956  auto res = isl::map::project_out_param(id);
23957  return typed::map<pair<Domain, Range>, Range2>(res);
23958}
23959
23960template <typename Domain, typename Range, typename Range2>
23961typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::project_out_param(const std::string &id) const
23962{
23963  auto res = isl::map::project_out_param(id);
23964  return typed::map<pair<Domain, Range>, Range2>(res);
23965}
23966
23967template <typename Domain, typename Range, typename Range2>
23968typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::project_out_param(const typed::id_list<Anonymous> &list) const
23969{
23970  auto res = isl::map::project_out_param(list);
23971  return typed::map<pair<Domain, Range>, Range2>(res);
23972}
23973
23974template <typename Domain, typename Range, typename Range2>
23975typed::set<Range2> typed::map<pair<Domain, Range>, Range2>::range() const
23976{
23977  auto res = isl::map::range();
23978  return typed::set<Range2>(res);
23979}
23980
23981template <typename Domain, typename Range, typename Range2>
23982typed::fixed_box<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::range_lattice_tile() const
23983{
23984  auto res = isl::map::range_lattice_tile();
23985  return typed::fixed_box<pair<Domain, Range>, Range2>(res);
23986}
23987
23988template <typename Domain, typename Range, typename Range2>
23989typed::union_map<pair<pair<Domain, Range>, Range2>, Range2> typed::map<pair<Domain, Range>, Range2>::range_map() const
23990{
23991  auto res = isl::map::range_map();
23992  return typed::union_map<pair<pair<Domain, Range>, Range2>, Range2>(res);
23993}
23994
23995template <typename Domain, typename Range, typename Range2>
23996template <typename Arg3>
23997typed::map<pair<Domain, Range>, pair<Range2, Arg3>> typed::map<pair<Domain, Range>, Range2>::range_product(const typed::map<pair<Domain, Range>, Arg3> &map2) const
23998{
23999  auto res = isl::map::range_product(map2);
24000  return typed::map<pair<Domain, Range>, pair<Range2, Arg3>>(res);
24001}
24002
24003template <typename Domain, typename Range, typename Range2>
24004template <typename Arg3>
24005typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> typed::map<pair<Domain, Range>, Range2>::range_product(const typed::union_map<pair<Domain, Range>, Arg3> &umap2) const
24006{
24007  auto res = isl::map::range_product(umap2);
24008  return typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>>(res);
24009}
24010
24011template <typename Domain, typename Range, typename Range2>
24012template <typename Arg3>
24013typed::map<pair<Domain, Range>, pair<Range2, Arg3>> typed::map<pair<Domain, Range>, Range2>::range_product(const typed::basic_map<pair<Domain, Range>, Arg3> &map2) const
24014{
24015  auto res = isl::map::range_product(map2);
24016  return typed::map<pair<Domain, Range>, pair<Range2, Arg3>>(res);
24017}
24018
24019template <typename Domain, typename Range, typename Range2>
24020typed::fixed_box<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::range_simple_fixed_box_hull() const
24021{
24022  auto res = isl::map::range_simple_fixed_box_hull();
24023  return typed::fixed_box<pair<Domain, Range>, Range2>(res);
24024}
24025
24026template <typename Domain, typename Range, typename Range2>
24027typed::map<Range2, pair<Domain, Range>> typed::map<pair<Domain, Range>, Range2>::reverse() const
24028{
24029  auto res = isl::map::reverse();
24030  return typed::map<Range2, pair<Domain, Range>>(res);
24031}
24032
24033template <typename Domain, typename Range, typename Range2>
24034template <typename Arg2>
24035typed::map<pair<Domain, Range>, Arg2> typed::map<pair<Domain, Range>, Range2>::set_range_tuple(const typed::id<Anonymous> &id) const
24036{
24037  auto res = isl::map::set_range_tuple(id);
24038  return typed::map<pair<Domain, Range>, Arg2>(res);
24039}
24040
24041template <typename Domain, typename Range, typename Range2>
24042template <typename Arg2>
24043typed::map<pair<Domain, Range>, Arg2> typed::map<pair<Domain, Range>, Range2>::set_range_tuple(const std::string &id) const
24044{
24045  auto res = isl::map::set_range_tuple(id);
24046  return typed::map<pair<Domain, Range>, Arg2>(res);
24047}
24048
24049template <typename Domain, typename Range, typename Range2>
24050typed::space<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::space() const
24051{
24052  auto res = isl::map::space();
24053  return typed::space<pair<Domain, Range>, Range2>(res);
24054}
24055
24056template <typename Domain, typename Range, typename Range2>
24057typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::subtract(const typed::map<pair<Domain, Range>, Range2> &map2) const
24058{
24059  auto res = isl::map::subtract(map2);
24060  return typed::map<pair<Domain, Range>, Range2>(res);
24061}
24062
24063template <typename Domain, typename Range, typename Range2>
24064typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::subtract(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const
24065{
24066  auto res = isl::map::subtract(umap2);
24067  return typed::union_map<pair<Domain, Range>, Range2>(res);
24068}
24069
24070template <typename Domain, typename Range, typename Range2>
24071typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::subtract(const typed::basic_map<pair<Domain, Range>, Range2> &map2) const
24072{
24073  auto res = isl::map::subtract(map2);
24074  return typed::map<pair<Domain, Range>, Range2>(res);
24075}
24076
24077template <typename Domain, typename Range, typename Range2>
24078typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::subtract_domain(const typed::union_set<pair<Domain, Range>> &dom) const
24079{
24080  auto res = isl::map::subtract_domain(dom);
24081  return typed::union_map<pair<Domain, Range>, Range2>(res);
24082}
24083
24084template <typename Domain, typename Range, typename Range2>
24085typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::subtract_range(const typed::union_set<Range2> &dom) const
24086{
24087  auto res = isl::map::subtract_range(dom);
24088  return typed::union_map<pair<Domain, Range>, Range2>(res);
24089}
24090
24091template <typename Domain, typename Range, typename Range2>
24092typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::to_union_map() const
24093{
24094  auto res = isl::map::to_union_map();
24095  return typed::union_map<pair<Domain, Range>, Range2>(res);
24096}
24097
24098template <typename Domain, typename Range, typename Range2>
24099typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::unite(const typed::map<pair<Domain, Range>, Range2> &map2) const
24100{
24101  auto res = isl::map::unite(map2);
24102  return typed::map<pair<Domain, Range>, Range2>(res);
24103}
24104
24105template <typename Domain, typename Range, typename Range2>
24106typed::union_map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::unite(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const
24107{
24108  auto res = isl::map::unite(umap2);
24109  return typed::union_map<pair<Domain, Range>, Range2>(res);
24110}
24111
24112template <typename Domain, typename Range, typename Range2>
24113typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::unite(const typed::basic_map<pair<Domain, Range>, Range2> &map2) const
24114{
24115  auto res = isl::map::unite(map2);
24116  return typed::map<pair<Domain, Range>, Range2>(res);
24117}
24118
24119template <typename Domain, typename Range, typename Range2>
24120typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::universe(const typed::space<pair<Domain, Range>, Range2> &space)
24121{
24122  auto res = isl::map::universe(space);
24123  return typed::map<pair<Domain, Range>, Range2>(res);
24124}
24125
24126template <typename Domain, typename Range, typename Range2>
24127typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::upper_bound(const typed::multi_pw_aff<pair<Domain, Range>, Range2> &upper) const
24128{
24129  auto res = isl::map::upper_bound(upper);
24130  return typed::map<pair<Domain, Range>, Range2>(res);
24131}
24132
24133template <typename Domain, typename Range, typename Range2>
24134typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::upper_bound(const typed::aff<pair<Domain, Range>, Range2> &upper) const
24135{
24136  auto res = isl::map::upper_bound(upper);
24137  return typed::map<pair<Domain, Range>, Range2>(res);
24138}
24139
24140template <typename Domain, typename Range, typename Range2>
24141typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::upper_bound(const typed::multi_aff<pair<Domain, Range>, Range2> &upper) const
24142{
24143  auto res = isl::map::upper_bound(upper);
24144  return typed::map<pair<Domain, Range>, Range2>(res);
24145}
24146
24147template <typename Domain, typename Range, typename Range2>
24148typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::upper_bound(const typed::pw_aff<pair<Domain, Range>, Range2> &upper) const
24149{
24150  auto res = isl::map::upper_bound(upper);
24151  return typed::map<pair<Domain, Range>, Range2>(res);
24152}
24153
24154template <typename Domain, typename Range, typename Range2>
24155typed::map<pair<Domain, Range>, Range2> typed::map<pair<Domain, Range>, Range2>::upper_bound(const typed::pw_multi_aff<pair<Domain, Range>, Range2> &upper) const
24156{
24157  auto res = isl::map::upper_bound(upper);
24158  return typed::map<pair<Domain, Range>, Range2>(res);
24159}
24160
24161template <typename Domain, typename Range, typename Range2>
24162typed::set<pair<pair<Domain, Range>, Range2>> typed::map<pair<Domain, Range>, Range2>::wrap() const
24163{
24164  auto res = isl::map::wrap();
24165  return typed::set<pair<pair<Domain, Range>, Range2>>(res);
24166}
24167
24168template <typename Domain>
24169typed::map<Domain, Domain>::map(const typed::basic_map<Domain, Domain> &bmap)
24170  : isl::map(bmap)
24171{
24172}
24173
24174template <typename Domain>
24175typed::map<Domain, Domain>::map(const isl::ctx &ctx, const std::string &str)
24176  : isl::map(ctx, str)
24177{
24178}
24179
24180template <typename Domain>
24181template <typename Domain2>
24182typed::map<Domain2, Domain> typed::map<Domain, Domain>::apply_domain(const typed::map<Domain, Domain2> &map2) const
24183{
24184  auto res = isl::map::apply_domain(map2);
24185  return typed::map<Domain2, Domain>(res);
24186}
24187
24188template <typename Domain>
24189template <typename Domain2>
24190typed::union_map<Domain2, Domain> typed::map<Domain, Domain>::apply_domain(const typed::union_map<Domain, Domain2> &umap2) const
24191{
24192  auto res = isl::map::apply_domain(umap2);
24193  return typed::union_map<Domain2, Domain>(res);
24194}
24195
24196template <typename Domain>
24197template <typename Domain2>
24198typed::map<Domain2, Domain> typed::map<Domain, Domain>::apply_domain(const typed::basic_map<Domain, Domain2> &map2) const
24199{
24200  auto res = isl::map::apply_domain(map2);
24201  return typed::map<Domain2, Domain>(res);
24202}
24203
24204template <typename Domain>
24205template <typename Range2>
24206typed::map<Domain, Range2> typed::map<Domain, Domain>::apply_range(const typed::map<Domain, Range2> &map2) const
24207{
24208  auto res = isl::map::apply_range(map2);
24209  return typed::map<Domain, Range2>(res);
24210}
24211
24212template <typename Domain>
24213template <typename Range2>
24214typed::union_map<Domain, Range2> typed::map<Domain, Domain>::apply_range(const typed::union_map<Domain, Range2> &umap2) const
24215{
24216  auto res = isl::map::apply_range(umap2);
24217  return typed::union_map<Domain, Range2>(res);
24218}
24219
24220template <typename Domain>
24221template <typename Range2>
24222typed::map<Domain, Range2> typed::map<Domain, Domain>::apply_range(const typed::basic_map<Domain, Range2> &map2) const
24223{
24224  auto res = isl::map::apply_range(map2);
24225  return typed::map<Domain, Range2>(res);
24226}
24227
24228template <typename Domain>
24229typed::map<Domain, Domain> typed::map<Domain, Domain>::as_map() const
24230{
24231  auto res = isl::map::as_map();
24232  return typed::map<Domain, Domain>(res);
24233}
24234
24235template <typename Domain>
24236typed::multi_union_pw_aff<Domain, Domain> typed::map<Domain, Domain>::as_multi_union_pw_aff() const
24237{
24238  auto res = isl::map::as_multi_union_pw_aff();
24239  return typed::multi_union_pw_aff<Domain, Domain>(res);
24240}
24241
24242template <typename Domain>
24243typed::pw_multi_aff<Domain, Domain> typed::map<Domain, Domain>::as_pw_multi_aff() const
24244{
24245  auto res = isl::map::as_pw_multi_aff();
24246  return typed::pw_multi_aff<Domain, Domain>(res);
24247}
24248
24249template <typename Domain>
24250typed::union_pw_multi_aff<Domain, Domain> typed::map<Domain, Domain>::as_union_pw_multi_aff() const
24251{
24252  auto res = isl::map::as_union_pw_multi_aff();
24253  return typed::union_pw_multi_aff<Domain, Domain>(res);
24254}
24255
24256template <typename Domain>
24257typed::set<Domain> typed::map<Domain, Domain>::bind_domain(const typed::multi_id<Domain> &tuple) const
24258{
24259  auto res = isl::map::bind_domain(tuple);
24260  return typed::set<Domain>(res);
24261}
24262
24263template <typename Domain>
24264typed::set<Domain> typed::map<Domain, Domain>::bind_range(const typed::multi_id<Domain> &tuple) const
24265{
24266  auto res = isl::map::bind_range(tuple);
24267  return typed::set<Domain>(res);
24268}
24269
24270template <typename Domain>
24271typed::map<Domain, Domain> typed::map<Domain, Domain>::coalesce() const
24272{
24273  auto res = isl::map::coalesce();
24274  return typed::map<Domain, Domain>(res);
24275}
24276
24277template <typename Domain>
24278typed::set<Domain> typed::map<Domain, Domain>::deltas() const
24279{
24280  auto res = isl::map::deltas();
24281  return typed::set<Domain>(res);
24282}
24283
24284template <typename Domain>
24285typed::map<Domain, Domain> typed::map<Domain, Domain>::detect_equalities() const
24286{
24287  auto res = isl::map::detect_equalities();
24288  return typed::map<Domain, Domain>(res);
24289}
24290
24291template <typename Domain>
24292typed::set<Domain> typed::map<Domain, Domain>::domain() const
24293{
24294  auto res = isl::map::domain();
24295  return typed::set<Domain>(res);
24296}
24297
24298template <typename Domain>
24299typed::union_map<pair<Domain, Domain>, Domain> typed::map<Domain, Domain>::domain_map() const
24300{
24301  auto res = isl::map::domain_map();
24302  return typed::union_map<pair<Domain, Domain>, Domain>(res);
24303}
24304
24305template <typename Domain>
24306typed::union_pw_multi_aff<pair<Domain, Domain>, Domain> typed::map<Domain, Domain>::domain_map_union_pw_multi_aff() const
24307{
24308  auto res = isl::map::domain_map_union_pw_multi_aff();
24309  return typed::union_pw_multi_aff<pair<Domain, Domain>, Domain>(res);
24310}
24311
24312template <typename Domain>
24313template <typename Domain2>
24314typed::map<pair<Domain, Domain2>, Domain> typed::map<Domain, Domain>::domain_product(const typed::map<Domain2, Domain> &map2) const
24315{
24316  auto res = isl::map::domain_product(map2);
24317  return typed::map<pair<Domain, Domain2>, Domain>(res);
24318}
24319
24320template <typename Domain>
24321template <typename Domain2>
24322typed::union_map<pair<Domain, Domain2>, Domain> typed::map<Domain, Domain>::domain_product(const typed::union_map<Domain2, Domain> &umap2) const
24323{
24324  auto res = isl::map::domain_product(umap2);
24325  return typed::union_map<pair<Domain, Domain2>, Domain>(res);
24326}
24327
24328template <typename Domain>
24329template <typename Domain2>
24330typed::map<pair<Domain, Domain2>, Domain> typed::map<Domain, Domain>::domain_product(const typed::basic_map<Domain2, Domain> &map2) const
24331{
24332  auto res = isl::map::domain_product(map2);
24333  return typed::map<pair<Domain, Domain2>, Domain>(res);
24334}
24335
24336template <typename Domain>
24337typed::map<Domain, Domain> typed::map<Domain, Domain>::drop_unused_params() const
24338{
24339  auto res = isl::map::drop_unused_params();
24340  return typed::map<Domain, Domain>(res);
24341}
24342
24343template <typename Domain>
24344template <typename Range>
24345typed::map<Domain, Domain> typed::map<Domain, Domain>::eq_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
24346{
24347  auto res = isl::map::eq_at(mpa);
24348  return typed::map<Domain, Domain>(res);
24349}
24350
24351template <typename Domain>
24352template <typename Range>
24353typed::union_map<Domain, Domain> typed::map<Domain, Domain>::eq_at(const typed::multi_union_pw_aff<Domain, Range> &mupa) const
24354{
24355  auto res = isl::map::eq_at(mupa);
24356  return typed::union_map<Domain, Domain>(res);
24357}
24358
24359template <typename Domain>
24360typed::map<Domain, Domain> typed::map<Domain, Domain>::eq_at(const typed::aff<Domain, Anonymous> &mpa) const
24361{
24362  auto res = isl::map::eq_at(mpa);
24363  return typed::map<Domain, Domain>(res);
24364}
24365
24366template <typename Domain>
24367template <typename Range>
24368typed::map<Domain, Domain> typed::map<Domain, Domain>::eq_at(const typed::multi_aff<Domain, Range> &mpa) const
24369{
24370  auto res = isl::map::eq_at(mpa);
24371  return typed::map<Domain, Domain>(res);
24372}
24373
24374template <typename Domain>
24375typed::map<Domain, Domain> typed::map<Domain, Domain>::eq_at(const typed::pw_aff<Domain, Anonymous> &mpa) const
24376{
24377  auto res = isl::map::eq_at(mpa);
24378  return typed::map<Domain, Domain>(res);
24379}
24380
24381template <typename Domain>
24382template <typename Range>
24383typed::map<Domain, Domain> typed::map<Domain, Domain>::eq_at(const typed::pw_multi_aff<Domain, Range> &mpa) const
24384{
24385  auto res = isl::map::eq_at(mpa);
24386  return typed::map<Domain, Domain>(res);
24387}
24388
24389template <typename Domain>
24390bool typed::map<Domain, Domain>::every_map(const std::function<bool(typed::map<Domain, Domain>)> &test) const
24391{
24392  auto lambda_test = [&] (isl::map arg0) {
24393    return test(typed::map<Domain, Domain>(arg0));
24394  };
24395  return isl::map::every_map(lambda_test);
24396}
24397
24398template <typename Domain>
24399typed::map<Domain, Domain> typed::map<Domain, Domain>::extract_map(const typed::space<Domain, Domain> &space) const
24400{
24401  auto res = isl::map::extract_map(space);
24402  return typed::map<Domain, Domain>(res);
24403}
24404
24405template <typename Domain>
24406void typed::map<Domain, Domain>::foreach_basic_map(const std::function<void(typed::basic_map<Domain, Domain>)> &fn) const
24407{
24408  auto lambda_fn = [&] (isl::basic_map arg0) {
24409    return fn(typed::basic_map<Domain, Domain>(arg0));
24410  };
24411  return isl::map::foreach_basic_map(lambda_fn);
24412}
24413
24414template <typename Domain>
24415void typed::map<Domain, Domain>::foreach_map(const std::function<void(typed::map<Domain, Domain>)> &fn) const
24416{
24417  auto lambda_fn = [&] (isl::map arg0) {
24418    return fn(typed::map<Domain, Domain>(arg0));
24419  };
24420  return isl::map::foreach_map(lambda_fn);
24421}
24422
24423template <typename Domain>
24424typed::map<Domain, Domain> typed::map<Domain, Domain>::gist(const typed::map<Domain, Domain> &context) const
24425{
24426  auto res = isl::map::gist(context);
24427  return typed::map<Domain, Domain>(res);
24428}
24429
24430template <typename Domain>
24431typed::union_map<Domain, Domain> typed::map<Domain, Domain>::gist(const typed::union_map<Domain, Domain> &context) const
24432{
24433  auto res = isl::map::gist(context);
24434  return typed::union_map<Domain, Domain>(res);
24435}
24436
24437template <typename Domain>
24438typed::map<Domain, Domain> typed::map<Domain, Domain>::gist(const typed::basic_map<Domain, Domain> &context) const
24439{
24440  auto res = isl::map::gist(context);
24441  return typed::map<Domain, Domain>(res);
24442}
24443
24444template <typename Domain>
24445typed::map<Domain, Domain> typed::map<Domain, Domain>::gist_domain(const typed::set<Domain> &context) const
24446{
24447  auto res = isl::map::gist_domain(context);
24448  return typed::map<Domain, Domain>(res);
24449}
24450
24451template <typename Domain>
24452typed::union_map<Domain, Domain> typed::map<Domain, Domain>::gist_domain(const typed::union_set<Domain> &uset) const
24453{
24454  auto res = isl::map::gist_domain(uset);
24455  return typed::union_map<Domain, Domain>(res);
24456}
24457
24458template <typename Domain>
24459typed::map<Domain, Domain> typed::map<Domain, Domain>::gist_domain(const typed::basic_set<Domain> &context) const
24460{
24461  auto res = isl::map::gist_domain(context);
24462  return typed::map<Domain, Domain>(res);
24463}
24464
24465template <typename Domain>
24466typed::map<Domain, Domain> typed::map<Domain, Domain>::gist_domain(const typed::point<Domain> &context) const
24467{
24468  auto res = isl::map::gist_domain(context);
24469  return typed::map<Domain, Domain>(res);
24470}
24471
24472template <typename Domain>
24473typed::map<Domain, Domain> typed::map<Domain, Domain>::gist_params(const typed::set<> &context) const
24474{
24475  auto res = isl::map::gist_params(context);
24476  return typed::map<Domain, Domain>(res);
24477}
24478
24479template <typename Domain>
24480typed::map<Domain, Domain> typed::map<Domain, Domain>::gist_params(const typed::basic_set<> &context) const
24481{
24482  auto res = isl::map::gist_params(context);
24483  return typed::map<Domain, Domain>(res);
24484}
24485
24486template <typename Domain>
24487typed::map<Domain, Domain> typed::map<Domain, Domain>::gist_params(const typed::point<> &context) const
24488{
24489  auto res = isl::map::gist_params(context);
24490  return typed::map<Domain, Domain>(res);
24491}
24492
24493template <typename Domain>
24494typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect(const typed::map<Domain, Domain> &map2) const
24495{
24496  auto res = isl::map::intersect(map2);
24497  return typed::map<Domain, Domain>(res);
24498}
24499
24500template <typename Domain>
24501typed::union_map<Domain, Domain> typed::map<Domain, Domain>::intersect(const typed::union_map<Domain, Domain> &umap2) const
24502{
24503  auto res = isl::map::intersect(umap2);
24504  return typed::union_map<Domain, Domain>(res);
24505}
24506
24507template <typename Domain>
24508typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect(const typed::basic_map<Domain, Domain> &map2) const
24509{
24510  auto res = isl::map::intersect(map2);
24511  return typed::map<Domain, Domain>(res);
24512}
24513
24514template <typename Domain>
24515typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect_domain(const typed::set<Domain> &set) const
24516{
24517  auto res = isl::map::intersect_domain(set);
24518  return typed::map<Domain, Domain>(res);
24519}
24520
24521template <typename Domain>
24522typed::union_map<Domain, Domain> typed::map<Domain, Domain>::intersect_domain(const typed::space<Domain> &space) const
24523{
24524  auto res = isl::map::intersect_domain(space);
24525  return typed::union_map<Domain, Domain>(res);
24526}
24527
24528template <typename Domain>
24529typed::union_map<Domain, Domain> typed::map<Domain, Domain>::intersect_domain(const typed::union_set<Domain> &uset) const
24530{
24531  auto res = isl::map::intersect_domain(uset);
24532  return typed::union_map<Domain, Domain>(res);
24533}
24534
24535template <typename Domain>
24536typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect_domain(const typed::basic_set<Domain> &set) const
24537{
24538  auto res = isl::map::intersect_domain(set);
24539  return typed::map<Domain, Domain>(res);
24540}
24541
24542template <typename Domain>
24543typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect_domain(const typed::point<Domain> &set) const
24544{
24545  auto res = isl::map::intersect_domain(set);
24546  return typed::map<Domain, Domain>(res);
24547}
24548
24549template <typename Domain>
24550typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect_params(const typed::set<> &params) const
24551{
24552  auto res = isl::map::intersect_params(params);
24553  return typed::map<Domain, Domain>(res);
24554}
24555
24556template <typename Domain>
24557typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect_params(const typed::basic_set<> &params) const
24558{
24559  auto res = isl::map::intersect_params(params);
24560  return typed::map<Domain, Domain>(res);
24561}
24562
24563template <typename Domain>
24564typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect_params(const typed::point<> &params) const
24565{
24566  auto res = isl::map::intersect_params(params);
24567  return typed::map<Domain, Domain>(res);
24568}
24569
24570template <typename Domain>
24571typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect_range(const typed::set<Domain> &set) const
24572{
24573  auto res = isl::map::intersect_range(set);
24574  return typed::map<Domain, Domain>(res);
24575}
24576
24577template <typename Domain>
24578typed::union_map<Domain, Domain> typed::map<Domain, Domain>::intersect_range(const typed::space<Domain> &space) const
24579{
24580  auto res = isl::map::intersect_range(space);
24581  return typed::union_map<Domain, Domain>(res);
24582}
24583
24584template <typename Domain>
24585typed::union_map<Domain, Domain> typed::map<Domain, Domain>::intersect_range(const typed::union_set<Domain> &uset) const
24586{
24587  auto res = isl::map::intersect_range(uset);
24588  return typed::union_map<Domain, Domain>(res);
24589}
24590
24591template <typename Domain>
24592typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect_range(const typed::basic_set<Domain> &set) const
24593{
24594  auto res = isl::map::intersect_range(set);
24595  return typed::map<Domain, Domain>(res);
24596}
24597
24598template <typename Domain>
24599typed::map<Domain, Domain> typed::map<Domain, Domain>::intersect_range(const typed::point<Domain> &set) const
24600{
24601  auto res = isl::map::intersect_range(set);
24602  return typed::map<Domain, Domain>(res);
24603}
24604
24605template <typename Domain>
24606template <typename Range>
24607typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_ge_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
24608{
24609  auto res = isl::map::lex_ge_at(mpa);
24610  return typed::map<Domain, Domain>(res);
24611}
24612
24613template <typename Domain>
24614typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_ge_at(const typed::aff<Domain, Anonymous> &mpa) const
24615{
24616  auto res = isl::map::lex_ge_at(mpa);
24617  return typed::map<Domain, Domain>(res);
24618}
24619
24620template <typename Domain>
24621template <typename Range>
24622typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_ge_at(const typed::multi_aff<Domain, Range> &mpa) const
24623{
24624  auto res = isl::map::lex_ge_at(mpa);
24625  return typed::map<Domain, Domain>(res);
24626}
24627
24628template <typename Domain>
24629typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_ge_at(const typed::pw_aff<Domain, Anonymous> &mpa) const
24630{
24631  auto res = isl::map::lex_ge_at(mpa);
24632  return typed::map<Domain, Domain>(res);
24633}
24634
24635template <typename Domain>
24636template <typename Range>
24637typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_ge_at(const typed::pw_multi_aff<Domain, Range> &mpa) const
24638{
24639  auto res = isl::map::lex_ge_at(mpa);
24640  return typed::map<Domain, Domain>(res);
24641}
24642
24643template <typename Domain>
24644template <typename Range>
24645typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_gt_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
24646{
24647  auto res = isl::map::lex_gt_at(mpa);
24648  return typed::map<Domain, Domain>(res);
24649}
24650
24651template <typename Domain>
24652typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_gt_at(const typed::aff<Domain, Anonymous> &mpa) const
24653{
24654  auto res = isl::map::lex_gt_at(mpa);
24655  return typed::map<Domain, Domain>(res);
24656}
24657
24658template <typename Domain>
24659template <typename Range>
24660typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_gt_at(const typed::multi_aff<Domain, Range> &mpa) const
24661{
24662  auto res = isl::map::lex_gt_at(mpa);
24663  return typed::map<Domain, Domain>(res);
24664}
24665
24666template <typename Domain>
24667typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_gt_at(const typed::pw_aff<Domain, Anonymous> &mpa) const
24668{
24669  auto res = isl::map::lex_gt_at(mpa);
24670  return typed::map<Domain, Domain>(res);
24671}
24672
24673template <typename Domain>
24674template <typename Range>
24675typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_gt_at(const typed::pw_multi_aff<Domain, Range> &mpa) const
24676{
24677  auto res = isl::map::lex_gt_at(mpa);
24678  return typed::map<Domain, Domain>(res);
24679}
24680
24681template <typename Domain>
24682template <typename Range>
24683typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_le_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
24684{
24685  auto res = isl::map::lex_le_at(mpa);
24686  return typed::map<Domain, Domain>(res);
24687}
24688
24689template <typename Domain>
24690typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_le_at(const typed::aff<Domain, Anonymous> &mpa) const
24691{
24692  auto res = isl::map::lex_le_at(mpa);
24693  return typed::map<Domain, Domain>(res);
24694}
24695
24696template <typename Domain>
24697template <typename Range>
24698typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_le_at(const typed::multi_aff<Domain, Range> &mpa) const
24699{
24700  auto res = isl::map::lex_le_at(mpa);
24701  return typed::map<Domain, Domain>(res);
24702}
24703
24704template <typename Domain>
24705typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_le_at(const typed::pw_aff<Domain, Anonymous> &mpa) const
24706{
24707  auto res = isl::map::lex_le_at(mpa);
24708  return typed::map<Domain, Domain>(res);
24709}
24710
24711template <typename Domain>
24712template <typename Range>
24713typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_le_at(const typed::pw_multi_aff<Domain, Range> &mpa) const
24714{
24715  auto res = isl::map::lex_le_at(mpa);
24716  return typed::map<Domain, Domain>(res);
24717}
24718
24719template <typename Domain>
24720template <typename Range>
24721typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_lt_at(const typed::multi_pw_aff<Domain, Range> &mpa) const
24722{
24723  auto res = isl::map::lex_lt_at(mpa);
24724  return typed::map<Domain, Domain>(res);
24725}
24726
24727template <typename Domain>
24728typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_lt_at(const typed::aff<Domain, Anonymous> &mpa) const
24729{
24730  auto res = isl::map::lex_lt_at(mpa);
24731  return typed::map<Domain, Domain>(res);
24732}
24733
24734template <typename Domain>
24735template <typename Range>
24736typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_lt_at(const typed::multi_aff<Domain, Range> &mpa) const
24737{
24738  auto res = isl::map::lex_lt_at(mpa);
24739  return typed::map<Domain, Domain>(res);
24740}
24741
24742template <typename Domain>
24743typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_lt_at(const typed::pw_aff<Domain, Anonymous> &mpa) const
24744{
24745  auto res = isl::map::lex_lt_at(mpa);
24746  return typed::map<Domain, Domain>(res);
24747}
24748
24749template <typename Domain>
24750template <typename Range>
24751typed::map<Domain, Domain> typed::map<Domain, Domain>::lex_lt_at(const typed::pw_multi_aff<Domain, Range> &mpa) const
24752{
24753  auto res = isl::map::lex_lt_at(mpa);
24754  return typed::map<Domain, Domain>(res);
24755}
24756
24757template <typename Domain>
24758typed::map<Domain, Domain> typed::map<Domain, Domain>::lexmax() const
24759{
24760  auto res = isl::map::lexmax();
24761  return typed::map<Domain, Domain>(res);
24762}
24763
24764template <typename Domain>
24765typed::pw_multi_aff<Domain, Domain> typed::map<Domain, Domain>::lexmax_pw_multi_aff() const
24766{
24767  auto res = isl::map::lexmax_pw_multi_aff();
24768  return typed::pw_multi_aff<Domain, Domain>(res);
24769}
24770
24771template <typename Domain>
24772typed::map<Domain, Domain> typed::map<Domain, Domain>::lexmin() const
24773{
24774  auto res = isl::map::lexmin();
24775  return typed::map<Domain, Domain>(res);
24776}
24777
24778template <typename Domain>
24779typed::pw_multi_aff<Domain, Domain> typed::map<Domain, Domain>::lexmin_pw_multi_aff() const
24780{
24781  auto res = isl::map::lexmin_pw_multi_aff();
24782  return typed::pw_multi_aff<Domain, Domain>(res);
24783}
24784
24785template <typename Domain>
24786typed::map<Domain, Domain> typed::map<Domain, Domain>::lower_bound(const typed::multi_pw_aff<Domain, Domain> &lower) const
24787{
24788  auto res = isl::map::lower_bound(lower);
24789  return typed::map<Domain, Domain>(res);
24790}
24791
24792template <typename Domain>
24793typed::map<Domain, Domain> typed::map<Domain, Domain>::lower_bound(const typed::aff<Domain, Domain> &lower) const
24794{
24795  auto res = isl::map::lower_bound(lower);
24796  return typed::map<Domain, Domain>(res);
24797}
24798
24799template <typename Domain>
24800typed::map<Domain, Domain> typed::map<Domain, Domain>::lower_bound(const typed::multi_aff<Domain, Domain> &lower) const
24801{
24802  auto res = isl::map::lower_bound(lower);
24803  return typed::map<Domain, Domain>(res);
24804}
24805
24806template <typename Domain>
24807typed::map<Domain, Domain> typed::map<Domain, Domain>::lower_bound(const typed::pw_aff<Domain, Domain> &lower) const
24808{
24809  auto res = isl::map::lower_bound(lower);
24810  return typed::map<Domain, Domain>(res);
24811}
24812
24813template <typename Domain>
24814typed::map<Domain, Domain> typed::map<Domain, Domain>::lower_bound(const typed::pw_multi_aff<Domain, Domain> &lower) const
24815{
24816  auto res = isl::map::lower_bound(lower);
24817  return typed::map<Domain, Domain>(res);
24818}
24819
24820template <typename Domain>
24821typed::map_list<Domain, Domain> typed::map<Domain, Domain>::map_list() const
24822{
24823  auto res = isl::map::map_list();
24824  return typed::map_list<Domain, Domain>(res);
24825}
24826
24827template <typename Domain>
24828typed::multi_pw_aff<Domain, Domain> typed::map<Domain, Domain>::max_multi_pw_aff() const
24829{
24830  auto res = isl::map::max_multi_pw_aff();
24831  return typed::multi_pw_aff<Domain, Domain>(res);
24832}
24833
24834template <typename Domain>
24835typed::multi_pw_aff<Domain, Domain> typed::map<Domain, Domain>::min_multi_pw_aff() const
24836{
24837  auto res = isl::map::min_multi_pw_aff();
24838  return typed::multi_pw_aff<Domain, Domain>(res);
24839}
24840
24841template <typename Domain>
24842typed::set<> typed::map<Domain, Domain>::params() const
24843{
24844  auto res = isl::map::params();
24845  return typed::set<>(res);
24846}
24847
24848template <typename Domain>
24849template <typename Domain2>
24850typed::map<Domain2, Domain> typed::map<Domain, Domain>::preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const
24851{
24852  auto res = isl::map::preimage_domain(ma);
24853  return typed::map<Domain2, Domain>(res);
24854}
24855
24856template <typename Domain>
24857template <typename Domain2>
24858typed::map<Domain2, Domain> typed::map<Domain, Domain>::preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
24859{
24860  auto res = isl::map::preimage_domain(mpa);
24861  return typed::map<Domain2, Domain>(res);
24862}
24863
24864template <typename Domain>
24865template <typename Domain2>
24866typed::map<Domain2, Domain> typed::map<Domain, Domain>::preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const
24867{
24868  auto res = isl::map::preimage_domain(pma);
24869  return typed::map<Domain2, Domain>(res);
24870}
24871
24872template <typename Domain>
24873template <typename Domain2>
24874typed::union_map<Domain2, Domain> typed::map<Domain, Domain>::preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
24875{
24876  auto res = isl::map::preimage_domain(upma);
24877  return typed::union_map<Domain2, Domain>(res);
24878}
24879
24880template <typename Domain>
24881template <typename Range2>
24882typed::map<Domain, Range2> typed::map<Domain, Domain>::preimage_range(const typed::multi_aff<Range2, Domain> &ma) const
24883{
24884  auto res = isl::map::preimage_range(ma);
24885  return typed::map<Domain, Range2>(res);
24886}
24887
24888template <typename Domain>
24889template <typename Range2>
24890typed::map<Domain, Range2> typed::map<Domain, Domain>::preimage_range(const typed::pw_multi_aff<Range2, Domain> &pma) const
24891{
24892  auto res = isl::map::preimage_range(pma);
24893  return typed::map<Domain, Range2>(res);
24894}
24895
24896template <typename Domain>
24897template <typename Range2>
24898typed::union_map<Domain, Range2> typed::map<Domain, Domain>::preimage_range(const typed::union_pw_multi_aff<Range2, Domain> &upma) const
24899{
24900  auto res = isl::map::preimage_range(upma);
24901  return typed::union_map<Domain, Range2>(res);
24902}
24903
24904template <typename Domain>
24905template <typename Domain2, typename Range2>
24906typed::map<pair<Domain, Domain2>, pair<Domain, Range2>> typed::map<Domain, Domain>::product(const typed::map<Domain2, Range2> &map2) const
24907{
24908  auto res = isl::map::product(map2);
24909  return typed::map<pair<Domain, Domain2>, pair<Domain, Range2>>(res);
24910}
24911
24912template <typename Domain>
24913template <typename Domain2, typename Range2>
24914typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> typed::map<Domain, Domain>::product(const typed::union_map<Domain2, Range2> &umap2) const
24915{
24916  auto res = isl::map::product(umap2);
24917  return typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>>(res);
24918}
24919
24920template <typename Domain>
24921template <typename Domain2, typename Range2>
24922typed::map<pair<Domain, Domain2>, pair<Domain, Range2>> typed::map<Domain, Domain>::product(const typed::basic_map<Domain2, Range2> &map2) const
24923{
24924  auto res = isl::map::product(map2);
24925  return typed::map<pair<Domain, Domain2>, pair<Domain, Range2>>(res);
24926}
24927
24928template <typename Domain>
24929typed::map<Domain, Domain> typed::map<Domain, Domain>::project_out_all_params() const
24930{
24931  auto res = isl::map::project_out_all_params();
24932  return typed::map<Domain, Domain>(res);
24933}
24934
24935template <typename Domain>
24936typed::map<Domain, Domain> typed::map<Domain, Domain>::project_out_param(const typed::id<Anonymous> &id) const
24937{
24938  auto res = isl::map::project_out_param(id);
24939  return typed::map<Domain, Domain>(res);
24940}
24941
24942template <typename Domain>
24943typed::map<Domain, Domain> typed::map<Domain, Domain>::project_out_param(const std::string &id) const
24944{
24945  auto res = isl::map::project_out_param(id);
24946  return typed::map<Domain, Domain>(res);
24947}
24948
24949template <typename Domain>
24950typed::map<Domain, Domain> typed::map<Domain, Domain>::project_out_param(const typed::id_list<Anonymous> &list) const
24951{
24952  auto res = isl::map::project_out_param(list);
24953  return typed::map<Domain, Domain>(res);
24954}
24955
24956template <typename Domain>
24957typed::set<Domain> typed::map<Domain, Domain>::range() const
24958{
24959  auto res = isl::map::range();
24960  return typed::set<Domain>(res);
24961}
24962
24963template <typename Domain>
24964typed::fixed_box<Domain, Domain> typed::map<Domain, Domain>::range_lattice_tile() const
24965{
24966  auto res = isl::map::range_lattice_tile();
24967  return typed::fixed_box<Domain, Domain>(res);
24968}
24969
24970template <typename Domain>
24971typed::union_map<pair<Domain, Domain>, Domain> typed::map<Domain, Domain>::range_map() const
24972{
24973  auto res = isl::map::range_map();
24974  return typed::union_map<pair<Domain, Domain>, Domain>(res);
24975}
24976
24977template <typename Domain>
24978template <typename Range2>
24979typed::map<Domain, pair<Domain, Range2>> typed::map<Domain, Domain>::range_product(const typed::map<Domain, Range2> &map2) const
24980{
24981  auto res = isl::map::range_product(map2);
24982  return typed::map<Domain, pair<Domain, Range2>>(res);
24983}
24984
24985template <typename Domain>
24986template <typename Range2>
24987typed::union_map<Domain, pair<Domain, Range2>> typed::map<Domain, Domain>::range_product(const typed::union_map<Domain, Range2> &umap2) const
24988{
24989  auto res = isl::map::range_product(umap2);
24990  return typed::union_map<Domain, pair<Domain, Range2>>(res);
24991}
24992
24993template <typename Domain>
24994template <typename Range2>
24995typed::map<Domain, pair<Domain, Range2>> typed::map<Domain, Domain>::range_product(const typed::basic_map<Domain, Range2> &map2) const
24996{
24997  auto res = isl::map::range_product(map2);
24998  return typed::map<Domain, pair<Domain, Range2>>(res);
24999}
25000
25001template <typename Domain>
25002typed::fixed_box<Domain, Domain> typed::map<Domain, Domain>::range_simple_fixed_box_hull() const
25003{
25004  auto res = isl::map::range_simple_fixed_box_hull();
25005  return typed::fixed_box<Domain, Domain>(res);
25006}
25007
25008template <typename Domain>
25009typed::map<Domain, Domain> typed::map<Domain, Domain>::reverse() const
25010{
25011  auto res = isl::map::reverse();
25012  return typed::map<Domain, Domain>(res);
25013}
25014
25015template <typename Domain>
25016template <typename Domain2>
25017typed::map<Domain2, Domain> typed::map<Domain, Domain>::set_domain_tuple(const typed::id<Anonymous> &id) const
25018{
25019  auto res = isl::map::set_domain_tuple(id);
25020  return typed::map<Domain2, Domain>(res);
25021}
25022
25023template <typename Domain>
25024template <typename Domain2>
25025typed::map<Domain2, Domain> typed::map<Domain, Domain>::set_domain_tuple(const std::string &id) const
25026{
25027  auto res = isl::map::set_domain_tuple(id);
25028  return typed::map<Domain2, Domain>(res);
25029}
25030
25031template <typename Domain>
25032template <typename Range2>
25033typed::map<Domain, Range2> typed::map<Domain, Domain>::set_range_tuple(const typed::id<Anonymous> &id) const
25034{
25035  auto res = isl::map::set_range_tuple(id);
25036  return typed::map<Domain, Range2>(res);
25037}
25038
25039template <typename Domain>
25040template <typename Range2>
25041typed::map<Domain, Range2> typed::map<Domain, Domain>::set_range_tuple(const std::string &id) const
25042{
25043  auto res = isl::map::set_range_tuple(id);
25044  return typed::map<Domain, Range2>(res);
25045}
25046
25047template <typename Domain>
25048typed::space<Domain, Domain> typed::map<Domain, Domain>::space() const
25049{
25050  auto res = isl::map::space();
25051  return typed::space<Domain, Domain>(res);
25052}
25053
25054template <typename Domain>
25055typed::map<Domain, Domain> typed::map<Domain, Domain>::subtract(const typed::map<Domain, Domain> &map2) const
25056{
25057  auto res = isl::map::subtract(map2);
25058  return typed::map<Domain, Domain>(res);
25059}
25060
25061template <typename Domain>
25062typed::union_map<Domain, Domain> typed::map<Domain, Domain>::subtract(const typed::union_map<Domain, Domain> &umap2) const
25063{
25064  auto res = isl::map::subtract(umap2);
25065  return typed::union_map<Domain, Domain>(res);
25066}
25067
25068template <typename Domain>
25069typed::map<Domain, Domain> typed::map<Domain, Domain>::subtract(const typed::basic_map<Domain, Domain> &map2) const
25070{
25071  auto res = isl::map::subtract(map2);
25072  return typed::map<Domain, Domain>(res);
25073}
25074
25075template <typename Domain>
25076typed::union_map<Domain, Domain> typed::map<Domain, Domain>::subtract_domain(const typed::union_set<Domain> &dom) const
25077{
25078  auto res = isl::map::subtract_domain(dom);
25079  return typed::union_map<Domain, Domain>(res);
25080}
25081
25082template <typename Domain>
25083typed::union_map<Domain, Domain> typed::map<Domain, Domain>::subtract_range(const typed::union_set<Domain> &dom) const
25084{
25085  auto res = isl::map::subtract_range(dom);
25086  return typed::union_map<Domain, Domain>(res);
25087}
25088
25089template <typename Domain>
25090typed::union_map<Domain, Domain> typed::map<Domain, Domain>::to_union_map() const
25091{
25092  auto res = isl::map::to_union_map();
25093  return typed::union_map<Domain, Domain>(res);
25094}
25095
25096template <typename Domain>
25097typed::map<Domain, Domain> typed::map<Domain, Domain>::unite(const typed::map<Domain, Domain> &map2) const
25098{
25099  auto res = isl::map::unite(map2);
25100  return typed::map<Domain, Domain>(res);
25101}
25102
25103template <typename Domain>
25104typed::union_map<Domain, Domain> typed::map<Domain, Domain>::unite(const typed::union_map<Domain, Domain> &umap2) const
25105{
25106  auto res = isl::map::unite(umap2);
25107  return typed::union_map<Domain, Domain>(res);
25108}
25109
25110template <typename Domain>
25111typed::map<Domain, Domain> typed::map<Domain, Domain>::unite(const typed::basic_map<Domain, Domain> &map2) const
25112{
25113  auto res = isl::map::unite(map2);
25114  return typed::map<Domain, Domain>(res);
25115}
25116
25117template <typename Domain>
25118typed::map<Domain, Domain> typed::map<Domain, Domain>::universe(const typed::space<Domain, Domain> &space)
25119{
25120  auto res = isl::map::universe(space);
25121  return typed::map<Domain, Domain>(res);
25122}
25123
25124template <typename Domain>
25125typed::map<Domain, Domain> typed::map<Domain, Domain>::upper_bound(const typed::multi_pw_aff<Domain, Domain> &upper) const
25126{
25127  auto res = isl::map::upper_bound(upper);
25128  return typed::map<Domain, Domain>(res);
25129}
25130
25131template <typename Domain>
25132typed::map<Domain, Domain> typed::map<Domain, Domain>::upper_bound(const typed::aff<Domain, Domain> &upper) const
25133{
25134  auto res = isl::map::upper_bound(upper);
25135  return typed::map<Domain, Domain>(res);
25136}
25137
25138template <typename Domain>
25139typed::map<Domain, Domain> typed::map<Domain, Domain>::upper_bound(const typed::multi_aff<Domain, Domain> &upper) const
25140{
25141  auto res = isl::map::upper_bound(upper);
25142  return typed::map<Domain, Domain>(res);
25143}
25144
25145template <typename Domain>
25146typed::map<Domain, Domain> typed::map<Domain, Domain>::upper_bound(const typed::pw_aff<Domain, Domain> &upper) const
25147{
25148  auto res = isl::map::upper_bound(upper);
25149  return typed::map<Domain, Domain>(res);
25150}
25151
25152template <typename Domain>
25153typed::map<Domain, Domain> typed::map<Domain, Domain>::upper_bound(const typed::pw_multi_aff<Domain, Domain> &upper) const
25154{
25155  auto res = isl::map::upper_bound(upper);
25156  return typed::map<Domain, Domain>(res);
25157}
25158
25159template <typename Domain>
25160typed::set<pair<Domain, Domain>> typed::map<Domain, Domain>::wrap() const
25161{
25162  auto res = isl::map::wrap();
25163  return typed::set<pair<Domain, Domain>>(res);
25164}
25165
25166template <typename Domain, typename Range, typename Range2>
25167typed::map<Domain, pair<Range, Range2>>::map(const typed::basic_map<Domain, pair<Range, Range2>> &bmap)
25168  : isl::map(bmap)
25169{
25170}
25171
25172template <typename Domain, typename Range, typename Range2>
25173typed::map<Domain, pair<Range, Range2>>::map(const isl::ctx &ctx, const std::string &str)
25174  : isl::map(ctx, str)
25175{
25176}
25177
25178template <typename Domain, typename Range, typename Range2>
25179template <typename Domain2>
25180typed::map<Domain2, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::apply_domain(const typed::map<Domain, Domain2> &map2) const
25181{
25182  auto res = isl::map::apply_domain(map2);
25183  return typed::map<Domain2, pair<Range, Range2>>(res);
25184}
25185
25186template <typename Domain, typename Range, typename Range2>
25187template <typename Domain2>
25188typed::union_map<Domain2, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::apply_domain(const typed::union_map<Domain, Domain2> &umap2) const
25189{
25190  auto res = isl::map::apply_domain(umap2);
25191  return typed::union_map<Domain2, pair<Range, Range2>>(res);
25192}
25193
25194template <typename Domain, typename Range, typename Range2>
25195template <typename Domain2>
25196typed::map<Domain2, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::apply_domain(const typed::basic_map<Domain, Domain2> &map2) const
25197{
25198  auto res = isl::map::apply_domain(map2);
25199  return typed::map<Domain2, pair<Range, Range2>>(res);
25200}
25201
25202template <typename Domain, typename Range, typename Range2>
25203template <typename Arg3>
25204typed::map<Domain, Arg3> typed::map<Domain, pair<Range, Range2>>::apply_range(const typed::map<pair<Range, Range2>, Arg3> &map2) const
25205{
25206  auto res = isl::map::apply_range(map2);
25207  return typed::map<Domain, Arg3>(res);
25208}
25209
25210template <typename Domain, typename Range, typename Range2>
25211template <typename Arg3>
25212typed::union_map<Domain, Arg3> typed::map<Domain, pair<Range, Range2>>::apply_range(const typed::union_map<pair<Range, Range2>, Arg3> &umap2) const
25213{
25214  auto res = isl::map::apply_range(umap2);
25215  return typed::union_map<Domain, Arg3>(res);
25216}
25217
25218template <typename Domain, typename Range, typename Range2>
25219template <typename Arg3>
25220typed::map<Domain, Arg3> typed::map<Domain, pair<Range, Range2>>::apply_range(const typed::basic_map<pair<Range, Range2>, Arg3> &map2) const
25221{
25222  auto res = isl::map::apply_range(map2);
25223  return typed::map<Domain, Arg3>(res);
25224}
25225
25226template <typename Domain, typename Range, typename Range2>
25227typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::as_map() const
25228{
25229  auto res = isl::map::as_map();
25230  return typed::map<Domain, pair<Range, Range2>>(res);
25231}
25232
25233template <typename Domain, typename Range, typename Range2>
25234typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::as_multi_union_pw_aff() const
25235{
25236  auto res = isl::map::as_multi_union_pw_aff();
25237  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
25238}
25239
25240template <typename Domain, typename Range, typename Range2>
25241typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::as_pw_multi_aff() const
25242{
25243  auto res = isl::map::as_pw_multi_aff();
25244  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
25245}
25246
25247template <typename Domain, typename Range, typename Range2>
25248typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::as_union_pw_multi_aff() const
25249{
25250  auto res = isl::map::as_union_pw_multi_aff();
25251  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
25252}
25253
25254template <typename Domain, typename Range, typename Range2>
25255typed::set<pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::bind_domain(const typed::multi_id<Domain> &tuple) const
25256{
25257  auto res = isl::map::bind_domain(tuple);
25258  return typed::set<pair<Range, Range2>>(res);
25259}
25260
25261template <typename Domain, typename Range, typename Range2>
25262typed::set<Domain> typed::map<Domain, pair<Range, Range2>>::bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const
25263{
25264  auto res = isl::map::bind_range(tuple);
25265  return typed::set<Domain>(res);
25266}
25267
25268template <typename Domain, typename Range, typename Range2>
25269typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::coalesce() const
25270{
25271  auto res = isl::map::coalesce();
25272  return typed::map<Domain, pair<Range, Range2>>(res);
25273}
25274
25275template <typename Domain, typename Range, typename Range2>
25276typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::detect_equalities() const
25277{
25278  auto res = isl::map::detect_equalities();
25279  return typed::map<Domain, pair<Range, Range2>>(res);
25280}
25281
25282template <typename Domain, typename Range, typename Range2>
25283typed::set<Domain> typed::map<Domain, pair<Range, Range2>>::domain() const
25284{
25285  auto res = isl::map::domain();
25286  return typed::set<Domain>(res);
25287}
25288
25289template <typename Domain, typename Range, typename Range2>
25290typed::union_map<pair<Domain, pair<Range, Range2>>, Domain> typed::map<Domain, pair<Range, Range2>>::domain_map() const
25291{
25292  auto res = isl::map::domain_map();
25293  return typed::union_map<pair<Domain, pair<Range, Range2>>, Domain>(res);
25294}
25295
25296template <typename Domain, typename Range, typename Range2>
25297typed::union_pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain> typed::map<Domain, pair<Range, Range2>>::domain_map_union_pw_multi_aff() const
25298{
25299  auto res = isl::map::domain_map_union_pw_multi_aff();
25300  return typed::union_pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain>(res);
25301}
25302
25303template <typename Domain, typename Range, typename Range2>
25304template <typename Domain2>
25305typed::map<pair<Domain, Domain2>, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::domain_product(const typed::map<Domain2, pair<Range, Range2>> &map2) const
25306{
25307  auto res = isl::map::domain_product(map2);
25308  return typed::map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
25309}
25310
25311template <typename Domain, typename Range, typename Range2>
25312template <typename Domain2>
25313typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const
25314{
25315  auto res = isl::map::domain_product(umap2);
25316  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
25317}
25318
25319template <typename Domain, typename Range, typename Range2>
25320template <typename Domain2>
25321typed::map<pair<Domain, Domain2>, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::domain_product(const typed::basic_map<Domain2, pair<Range, Range2>> &map2) const
25322{
25323  auto res = isl::map::domain_product(map2);
25324  return typed::map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
25325}
25326
25327template <typename Domain, typename Range, typename Range2>
25328typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::drop_unused_params() const
25329{
25330  auto res = isl::map::drop_unused_params();
25331  return typed::map<Domain, pair<Range, Range2>>(res);
25332}
25333
25334template <typename Domain, typename Range, typename Range2>
25335bool typed::map<Domain, pair<Range, Range2>>::every_map(const std::function<bool(typed::map<Domain, pair<Range, Range2>>)> &test) const
25336{
25337  auto lambda_test = [&] (isl::map arg0) {
25338    return test(typed::map<Domain, pair<Range, Range2>>(arg0));
25339  };
25340  return isl::map::every_map(lambda_test);
25341}
25342
25343template <typename Domain, typename Range, typename Range2>
25344typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::extract_map(const typed::space<Domain, pair<Range, Range2>> &space) const
25345{
25346  auto res = isl::map::extract_map(space);
25347  return typed::map<Domain, pair<Range, Range2>>(res);
25348}
25349
25350template <typename Domain, typename Range, typename Range2>
25351typed::map<Domain, Anonymous> typed::map<Domain, pair<Range, Range2>>::flatten_range() const
25352{
25353  auto res = isl::map::flatten_range();
25354  return typed::map<Domain, Anonymous>(res);
25355}
25356
25357template <typename Domain, typename Range, typename Range2>
25358void typed::map<Domain, pair<Range, Range2>>::foreach_basic_map(const std::function<void(typed::basic_map<Domain, pair<Range, Range2>>)> &fn) const
25359{
25360  auto lambda_fn = [&] (isl::basic_map arg0) {
25361    return fn(typed::basic_map<Domain, pair<Range, Range2>>(arg0));
25362  };
25363  return isl::map::foreach_basic_map(lambda_fn);
25364}
25365
25366template <typename Domain, typename Range, typename Range2>
25367void typed::map<Domain, pair<Range, Range2>>::foreach_map(const std::function<void(typed::map<Domain, pair<Range, Range2>>)> &fn) const
25368{
25369  auto lambda_fn = [&] (isl::map arg0) {
25370    return fn(typed::map<Domain, pair<Range, Range2>>(arg0));
25371  };
25372  return isl::map::foreach_map(lambda_fn);
25373}
25374
25375template <typename Domain, typename Range, typename Range2>
25376typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist(const typed::map<Domain, pair<Range, Range2>> &context) const
25377{
25378  auto res = isl::map::gist(context);
25379  return typed::map<Domain, pair<Range, Range2>>(res);
25380}
25381
25382template <typename Domain, typename Range, typename Range2>
25383typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist(const typed::union_map<Domain, pair<Range, Range2>> &context) const
25384{
25385  auto res = isl::map::gist(context);
25386  return typed::union_map<Domain, pair<Range, Range2>>(res);
25387}
25388
25389template <typename Domain, typename Range, typename Range2>
25390typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist(const typed::basic_map<Domain, pair<Range, Range2>> &context) const
25391{
25392  auto res = isl::map::gist(context);
25393  return typed::map<Domain, pair<Range, Range2>>(res);
25394}
25395
25396template <typename Domain, typename Range, typename Range2>
25397typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist_domain(const typed::set<Domain> &context) const
25398{
25399  auto res = isl::map::gist_domain(context);
25400  return typed::map<Domain, pair<Range, Range2>>(res);
25401}
25402
25403template <typename Domain, typename Range, typename Range2>
25404typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist_domain(const typed::union_set<Domain> &uset) const
25405{
25406  auto res = isl::map::gist_domain(uset);
25407  return typed::union_map<Domain, pair<Range, Range2>>(res);
25408}
25409
25410template <typename Domain, typename Range, typename Range2>
25411typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist_domain(const typed::basic_set<Domain> &context) const
25412{
25413  auto res = isl::map::gist_domain(context);
25414  return typed::map<Domain, pair<Range, Range2>>(res);
25415}
25416
25417template <typename Domain, typename Range, typename Range2>
25418typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist_domain(const typed::point<Domain> &context) const
25419{
25420  auto res = isl::map::gist_domain(context);
25421  return typed::map<Domain, pair<Range, Range2>>(res);
25422}
25423
25424template <typename Domain, typename Range, typename Range2>
25425typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist_params(const typed::set<> &context) const
25426{
25427  auto res = isl::map::gist_params(context);
25428  return typed::map<Domain, pair<Range, Range2>>(res);
25429}
25430
25431template <typename Domain, typename Range, typename Range2>
25432typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist_params(const typed::basic_set<> &context) const
25433{
25434  auto res = isl::map::gist_params(context);
25435  return typed::map<Domain, pair<Range, Range2>>(res);
25436}
25437
25438template <typename Domain, typename Range, typename Range2>
25439typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::gist_params(const typed::point<> &context) const
25440{
25441  auto res = isl::map::gist_params(context);
25442  return typed::map<Domain, pair<Range, Range2>>(res);
25443}
25444
25445template <typename Domain, typename Range, typename Range2>
25446typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect(const typed::map<Domain, pair<Range, Range2>> &map2) const
25447{
25448  auto res = isl::map::intersect(map2);
25449  return typed::map<Domain, pair<Range, Range2>>(res);
25450}
25451
25452template <typename Domain, typename Range, typename Range2>
25453typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const
25454{
25455  auto res = isl::map::intersect(umap2);
25456  return typed::union_map<Domain, pair<Range, Range2>>(res);
25457}
25458
25459template <typename Domain, typename Range, typename Range2>
25460typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect(const typed::basic_map<Domain, pair<Range, Range2>> &map2) const
25461{
25462  auto res = isl::map::intersect(map2);
25463  return typed::map<Domain, pair<Range, Range2>>(res);
25464}
25465
25466template <typename Domain, typename Range, typename Range2>
25467typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_domain(const typed::set<Domain> &set) const
25468{
25469  auto res = isl::map::intersect_domain(set);
25470  return typed::map<Domain, pair<Range, Range2>>(res);
25471}
25472
25473template <typename Domain, typename Range, typename Range2>
25474typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_domain(const typed::space<Domain> &space) const
25475{
25476  auto res = isl::map::intersect_domain(space);
25477  return typed::union_map<Domain, pair<Range, Range2>>(res);
25478}
25479
25480template <typename Domain, typename Range, typename Range2>
25481typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_domain(const typed::union_set<Domain> &uset) const
25482{
25483  auto res = isl::map::intersect_domain(uset);
25484  return typed::union_map<Domain, pair<Range, Range2>>(res);
25485}
25486
25487template <typename Domain, typename Range, typename Range2>
25488typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_domain(const typed::basic_set<Domain> &set) const
25489{
25490  auto res = isl::map::intersect_domain(set);
25491  return typed::map<Domain, pair<Range, Range2>>(res);
25492}
25493
25494template <typename Domain, typename Range, typename Range2>
25495typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_domain(const typed::point<Domain> &set) const
25496{
25497  auto res = isl::map::intersect_domain(set);
25498  return typed::map<Domain, pair<Range, Range2>>(res);
25499}
25500
25501template <typename Domain, typename Range, typename Range2>
25502typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_params(const typed::set<> &params) const
25503{
25504  auto res = isl::map::intersect_params(params);
25505  return typed::map<Domain, pair<Range, Range2>>(res);
25506}
25507
25508template <typename Domain, typename Range, typename Range2>
25509typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_params(const typed::basic_set<> &params) const
25510{
25511  auto res = isl::map::intersect_params(params);
25512  return typed::map<Domain, pair<Range, Range2>>(res);
25513}
25514
25515template <typename Domain, typename Range, typename Range2>
25516typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_params(const typed::point<> &params) const
25517{
25518  auto res = isl::map::intersect_params(params);
25519  return typed::map<Domain, pair<Range, Range2>>(res);
25520}
25521
25522template <typename Domain, typename Range, typename Range2>
25523typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_range(const typed::set<pair<Range, Range2>> &set) const
25524{
25525  auto res = isl::map::intersect_range(set);
25526  return typed::map<Domain, pair<Range, Range2>>(res);
25527}
25528
25529template <typename Domain, typename Range, typename Range2>
25530typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_range(const typed::space<pair<Range, Range2>> &space) const
25531{
25532  auto res = isl::map::intersect_range(space);
25533  return typed::union_map<Domain, pair<Range, Range2>>(res);
25534}
25535
25536template <typename Domain, typename Range, typename Range2>
25537typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const
25538{
25539  auto res = isl::map::intersect_range(uset);
25540  return typed::union_map<Domain, pair<Range, Range2>>(res);
25541}
25542
25543template <typename Domain, typename Range, typename Range2>
25544typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_range(const typed::basic_set<pair<Range, Range2>> &set) const
25545{
25546  auto res = isl::map::intersect_range(set);
25547  return typed::map<Domain, pair<Range, Range2>>(res);
25548}
25549
25550template <typename Domain, typename Range, typename Range2>
25551typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_range(const typed::point<pair<Range, Range2>> &set) const
25552{
25553  auto res = isl::map::intersect_range(set);
25554  return typed::map<Domain, pair<Range, Range2>>(res);
25555}
25556
25557template <typename Domain, typename Range, typename Range2>
25558typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::set<Range> &domain) const
25559{
25560  auto res = isl::map::intersect_range_wrapped_domain(domain);
25561  return typed::map<Domain, pair<Range, Range2>>(res);
25562}
25563
25564template <typename Domain, typename Range, typename Range2>
25565typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const
25566{
25567  auto res = isl::map::intersect_range_wrapped_domain(domain);
25568  return typed::union_map<Domain, pair<Range, Range2>>(res);
25569}
25570
25571template <typename Domain, typename Range, typename Range2>
25572typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::basic_set<Range> &domain) const
25573{
25574  auto res = isl::map::intersect_range_wrapped_domain(domain);
25575  return typed::map<Domain, pair<Range, Range2>>(res);
25576}
25577
25578template <typename Domain, typename Range, typename Range2>
25579typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::point<Range> &domain) const
25580{
25581  auto res = isl::map::intersect_range_wrapped_domain(domain);
25582  return typed::map<Domain, pair<Range, Range2>>(res);
25583}
25584
25585template <typename Domain, typename Range, typename Range2>
25586typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::lexmax() const
25587{
25588  auto res = isl::map::lexmax();
25589  return typed::map<Domain, pair<Range, Range2>>(res);
25590}
25591
25592template <typename Domain, typename Range, typename Range2>
25593typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::lexmax_pw_multi_aff() const
25594{
25595  auto res = isl::map::lexmax_pw_multi_aff();
25596  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
25597}
25598
25599template <typename Domain, typename Range, typename Range2>
25600typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::lexmin() const
25601{
25602  auto res = isl::map::lexmin();
25603  return typed::map<Domain, pair<Range, Range2>>(res);
25604}
25605
25606template <typename Domain, typename Range, typename Range2>
25607typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::lexmin_pw_multi_aff() const
25608{
25609  auto res = isl::map::lexmin_pw_multi_aff();
25610  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
25611}
25612
25613template <typename Domain, typename Range, typename Range2>
25614typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::lower_bound(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &lower) const
25615{
25616  auto res = isl::map::lower_bound(lower);
25617  return typed::map<Domain, pair<Range, Range2>>(res);
25618}
25619
25620template <typename Domain, typename Range, typename Range2>
25621typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::lower_bound(const typed::aff<Domain, pair<Range, Range2>> &lower) const
25622{
25623  auto res = isl::map::lower_bound(lower);
25624  return typed::map<Domain, pair<Range, Range2>>(res);
25625}
25626
25627template <typename Domain, typename Range, typename Range2>
25628typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::lower_bound(const typed::multi_aff<Domain, pair<Range, Range2>> &lower) const
25629{
25630  auto res = isl::map::lower_bound(lower);
25631  return typed::map<Domain, pair<Range, Range2>>(res);
25632}
25633
25634template <typename Domain, typename Range, typename Range2>
25635typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::lower_bound(const typed::pw_aff<Domain, pair<Range, Range2>> &lower) const
25636{
25637  auto res = isl::map::lower_bound(lower);
25638  return typed::map<Domain, pair<Range, Range2>>(res);
25639}
25640
25641template <typename Domain, typename Range, typename Range2>
25642typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::lower_bound(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &lower) const
25643{
25644  auto res = isl::map::lower_bound(lower);
25645  return typed::map<Domain, pair<Range, Range2>>(res);
25646}
25647
25648template <typename Domain, typename Range, typename Range2>
25649typed::map_list<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::map_list() const
25650{
25651  auto res = isl::map::map_list();
25652  return typed::map_list<Domain, pair<Range, Range2>>(res);
25653}
25654
25655template <typename Domain, typename Range, typename Range2>
25656typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::max_multi_pw_aff() const
25657{
25658  auto res = isl::map::max_multi_pw_aff();
25659  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
25660}
25661
25662template <typename Domain, typename Range, typename Range2>
25663typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::min_multi_pw_aff() const
25664{
25665  auto res = isl::map::min_multi_pw_aff();
25666  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
25667}
25668
25669template <typename Domain, typename Range, typename Range2>
25670typed::set<> typed::map<Domain, pair<Range, Range2>>::params() const
25671{
25672  auto res = isl::map::params();
25673  return typed::set<>(res);
25674}
25675
25676template <typename Domain, typename Range, typename Range2>
25677template <typename Domain2>
25678typed::map<Domain2, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const
25679{
25680  auto res = isl::map::preimage_domain(ma);
25681  return typed::map<Domain2, pair<Range, Range2>>(res);
25682}
25683
25684template <typename Domain, typename Range, typename Range2>
25685template <typename Domain2>
25686typed::map<Domain2, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
25687{
25688  auto res = isl::map::preimage_domain(mpa);
25689  return typed::map<Domain2, pair<Range, Range2>>(res);
25690}
25691
25692template <typename Domain, typename Range, typename Range2>
25693template <typename Domain2>
25694typed::map<Domain2, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const
25695{
25696  auto res = isl::map::preimage_domain(pma);
25697  return typed::map<Domain2, pair<Range, Range2>>(res);
25698}
25699
25700template <typename Domain, typename Range, typename Range2>
25701template <typename Domain2>
25702typed::union_map<Domain2, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
25703{
25704  auto res = isl::map::preimage_domain(upma);
25705  return typed::union_map<Domain2, pair<Range, Range2>>(res);
25706}
25707
25708template <typename Domain, typename Range, typename Range2>
25709template <typename Arg3>
25710typed::map<Domain, Arg3> typed::map<Domain, pair<Range, Range2>>::preimage_range(const typed::multi_aff<Arg3, pair<Range, Range2>> &ma) const
25711{
25712  auto res = isl::map::preimage_range(ma);
25713  return typed::map<Domain, Arg3>(res);
25714}
25715
25716template <typename Domain, typename Range, typename Range2>
25717template <typename Arg3>
25718typed::map<Domain, Arg3> typed::map<Domain, pair<Range, Range2>>::preimage_range(const typed::pw_multi_aff<Arg3, pair<Range, Range2>> &pma) const
25719{
25720  auto res = isl::map::preimage_range(pma);
25721  return typed::map<Domain, Arg3>(res);
25722}
25723
25724template <typename Domain, typename Range, typename Range2>
25725template <typename Arg3>
25726typed::union_map<Domain, Arg3> typed::map<Domain, pair<Range, Range2>>::preimage_range(const typed::union_pw_multi_aff<Arg3, pair<Range, Range2>> &upma) const
25727{
25728  auto res = isl::map::preimage_range(upma);
25729  return typed::union_map<Domain, Arg3>(res);
25730}
25731
25732template <typename Domain, typename Range, typename Range2>
25733template <typename Domain2, typename Arg3>
25734typed::map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::map<Domain, pair<Range, Range2>>::product(const typed::map<Domain2, Arg3> &map2) const
25735{
25736  auto res = isl::map::product(map2);
25737  return typed::map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
25738}
25739
25740template <typename Domain, typename Range, typename Range2>
25741template <typename Domain2, typename Arg3>
25742typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::map<Domain, pair<Range, Range2>>::product(const typed::union_map<Domain2, Arg3> &umap2) const
25743{
25744  auto res = isl::map::product(umap2);
25745  return typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
25746}
25747
25748template <typename Domain, typename Range, typename Range2>
25749template <typename Domain2, typename Arg3>
25750typed::map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::map<Domain, pair<Range, Range2>>::product(const typed::basic_map<Domain2, Arg3> &map2) const
25751{
25752  auto res = isl::map::product(map2);
25753  return typed::map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
25754}
25755
25756template <typename Domain, typename Range, typename Range2>
25757typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::project_out_all_params() const
25758{
25759  auto res = isl::map::project_out_all_params();
25760  return typed::map<Domain, pair<Range, Range2>>(res);
25761}
25762
25763template <typename Domain, typename Range, typename Range2>
25764typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::project_out_param(const typed::id<Anonymous> &id) const
25765{
25766  auto res = isl::map::project_out_param(id);
25767  return typed::map<Domain, pair<Range, Range2>>(res);
25768}
25769
25770template <typename Domain, typename Range, typename Range2>
25771typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::project_out_param(const std::string &id) const
25772{
25773  auto res = isl::map::project_out_param(id);
25774  return typed::map<Domain, pair<Range, Range2>>(res);
25775}
25776
25777template <typename Domain, typename Range, typename Range2>
25778typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::project_out_param(const typed::id_list<Anonymous> &list) const
25779{
25780  auto res = isl::map::project_out_param(list);
25781  return typed::map<Domain, pair<Range, Range2>>(res);
25782}
25783
25784template <typename Domain, typename Range, typename Range2>
25785typed::set<pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::range() const
25786{
25787  auto res = isl::map::range();
25788  return typed::set<pair<Range, Range2>>(res);
25789}
25790
25791template <typename Domain, typename Range, typename Range2>
25792typed::map<Domain, Range> typed::map<Domain, pair<Range, Range2>>::range_factor_domain() const
25793{
25794  auto res = isl::map::range_factor_domain();
25795  return typed::map<Domain, Range>(res);
25796}
25797
25798template <typename Domain, typename Range, typename Range2>
25799typed::map<Domain, Range2> typed::map<Domain, pair<Range, Range2>>::range_factor_range() const
25800{
25801  auto res = isl::map::range_factor_range();
25802  return typed::map<Domain, Range2>(res);
25803}
25804
25805template <typename Domain, typename Range, typename Range2>
25806typed::fixed_box<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::range_lattice_tile() const
25807{
25808  auto res = isl::map::range_lattice_tile();
25809  return typed::fixed_box<Domain, pair<Range, Range2>>(res);
25810}
25811
25812template <typename Domain, typename Range, typename Range2>
25813typed::union_map<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::range_map() const
25814{
25815  auto res = isl::map::range_map();
25816  return typed::union_map<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>>(res);
25817}
25818
25819template <typename Domain, typename Range, typename Range2>
25820template <typename Arg3>
25821typed::map<Domain, pair<pair<Range, Range2>, Arg3>> typed::map<Domain, pair<Range, Range2>>::range_product(const typed::map<Domain, Arg3> &map2) const
25822{
25823  auto res = isl::map::range_product(map2);
25824  return typed::map<Domain, pair<pair<Range, Range2>, Arg3>>(res);
25825}
25826
25827template <typename Domain, typename Range, typename Range2>
25828template <typename Arg3>
25829typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> typed::map<Domain, pair<Range, Range2>>::range_product(const typed::union_map<Domain, Arg3> &umap2) const
25830{
25831  auto res = isl::map::range_product(umap2);
25832  return typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>>(res);
25833}
25834
25835template <typename Domain, typename Range, typename Range2>
25836template <typename Arg3>
25837typed::map<Domain, pair<pair<Range, Range2>, Arg3>> typed::map<Domain, pair<Range, Range2>>::range_product(const typed::basic_map<Domain, Arg3> &map2) const
25838{
25839  auto res = isl::map::range_product(map2);
25840  return typed::map<Domain, pair<pair<Range, Range2>, Arg3>>(res);
25841}
25842
25843template <typename Domain, typename Range, typename Range2>
25844typed::map<Domain, pair<Range2, Range>> typed::map<Domain, pair<Range, Range2>>::range_reverse() const
25845{
25846  auto res = isl::map::range_reverse();
25847  return typed::map<Domain, pair<Range2, Range>>(res);
25848}
25849
25850template <typename Domain, typename Range, typename Range2>
25851typed::fixed_box<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::range_simple_fixed_box_hull() const
25852{
25853  auto res = isl::map::range_simple_fixed_box_hull();
25854  return typed::fixed_box<Domain, pair<Range, Range2>>(res);
25855}
25856
25857template <typename Domain, typename Range, typename Range2>
25858typed::map<pair<Range, Range2>, Domain> typed::map<Domain, pair<Range, Range2>>::reverse() const
25859{
25860  auto res = isl::map::reverse();
25861  return typed::map<pair<Range, Range2>, Domain>(res);
25862}
25863
25864template <typename Domain, typename Range, typename Range2>
25865template <typename Domain2>
25866typed::map<Domain2, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::set_domain_tuple(const typed::id<Anonymous> &id) const
25867{
25868  auto res = isl::map::set_domain_tuple(id);
25869  return typed::map<Domain2, pair<Range, Range2>>(res);
25870}
25871
25872template <typename Domain, typename Range, typename Range2>
25873template <typename Domain2>
25874typed::map<Domain2, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::set_domain_tuple(const std::string &id) const
25875{
25876  auto res = isl::map::set_domain_tuple(id);
25877  return typed::map<Domain2, pair<Range, Range2>>(res);
25878}
25879
25880template <typename Domain, typename Range, typename Range2>
25881typed::space<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::space() const
25882{
25883  auto res = isl::map::space();
25884  return typed::space<Domain, pair<Range, Range2>>(res);
25885}
25886
25887template <typename Domain, typename Range, typename Range2>
25888typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::subtract(const typed::map<Domain, pair<Range, Range2>> &map2) const
25889{
25890  auto res = isl::map::subtract(map2);
25891  return typed::map<Domain, pair<Range, Range2>>(res);
25892}
25893
25894template <typename Domain, typename Range, typename Range2>
25895typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::subtract(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const
25896{
25897  auto res = isl::map::subtract(umap2);
25898  return typed::union_map<Domain, pair<Range, Range2>>(res);
25899}
25900
25901template <typename Domain, typename Range, typename Range2>
25902typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::subtract(const typed::basic_map<Domain, pair<Range, Range2>> &map2) const
25903{
25904  auto res = isl::map::subtract(map2);
25905  return typed::map<Domain, pair<Range, Range2>>(res);
25906}
25907
25908template <typename Domain, typename Range, typename Range2>
25909typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::subtract_domain(const typed::union_set<Domain> &dom) const
25910{
25911  auto res = isl::map::subtract_domain(dom);
25912  return typed::union_map<Domain, pair<Range, Range2>>(res);
25913}
25914
25915template <typename Domain, typename Range, typename Range2>
25916typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const
25917{
25918  auto res = isl::map::subtract_range(dom);
25919  return typed::union_map<Domain, pair<Range, Range2>>(res);
25920}
25921
25922template <typename Domain, typename Range, typename Range2>
25923typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::to_union_map() const
25924{
25925  auto res = isl::map::to_union_map();
25926  return typed::union_map<Domain, pair<Range, Range2>>(res);
25927}
25928
25929template <typename Domain, typename Range, typename Range2>
25930typed::map<pair<Domain, Range>, Range2> typed::map<Domain, pair<Range, Range2>>::uncurry() const
25931{
25932  auto res = isl::map::uncurry();
25933  return typed::map<pair<Domain, Range>, Range2>(res);
25934}
25935
25936template <typename Domain, typename Range, typename Range2>
25937typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::unite(const typed::map<Domain, pair<Range, Range2>> &map2) const
25938{
25939  auto res = isl::map::unite(map2);
25940  return typed::map<Domain, pair<Range, Range2>>(res);
25941}
25942
25943template <typename Domain, typename Range, typename Range2>
25944typed::union_map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::unite(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const
25945{
25946  auto res = isl::map::unite(umap2);
25947  return typed::union_map<Domain, pair<Range, Range2>>(res);
25948}
25949
25950template <typename Domain, typename Range, typename Range2>
25951typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::unite(const typed::basic_map<Domain, pair<Range, Range2>> &map2) const
25952{
25953  auto res = isl::map::unite(map2);
25954  return typed::map<Domain, pair<Range, Range2>>(res);
25955}
25956
25957template <typename Domain, typename Range, typename Range2>
25958typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::universe(const typed::space<Domain, pair<Range, Range2>> &space)
25959{
25960  auto res = isl::map::universe(space);
25961  return typed::map<Domain, pair<Range, Range2>>(res);
25962}
25963
25964template <typename Domain, typename Range, typename Range2>
25965typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::upper_bound(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &upper) const
25966{
25967  auto res = isl::map::upper_bound(upper);
25968  return typed::map<Domain, pair<Range, Range2>>(res);
25969}
25970
25971template <typename Domain, typename Range, typename Range2>
25972typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::upper_bound(const typed::aff<Domain, pair<Range, Range2>> &upper) const
25973{
25974  auto res = isl::map::upper_bound(upper);
25975  return typed::map<Domain, pair<Range, Range2>>(res);
25976}
25977
25978template <typename Domain, typename Range, typename Range2>
25979typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::upper_bound(const typed::multi_aff<Domain, pair<Range, Range2>> &upper) const
25980{
25981  auto res = isl::map::upper_bound(upper);
25982  return typed::map<Domain, pair<Range, Range2>>(res);
25983}
25984
25985template <typename Domain, typename Range, typename Range2>
25986typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::upper_bound(const typed::pw_aff<Domain, pair<Range, Range2>> &upper) const
25987{
25988  auto res = isl::map::upper_bound(upper);
25989  return typed::map<Domain, pair<Range, Range2>>(res);
25990}
25991
25992template <typename Domain, typename Range, typename Range2>
25993typed::map<Domain, pair<Range, Range2>> typed::map<Domain, pair<Range, Range2>>::upper_bound(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &upper) const
25994{
25995  auto res = isl::map::upper_bound(upper);
25996  return typed::map<Domain, pair<Range, Range2>>(res);
25997}
25998
25999template <typename Domain, typename Range, typename Range2>
26000typed::set<pair<Domain, pair<Range, Range2>>> typed::map<Domain, pair<Range, Range2>>::wrap() const
26001{
26002  auto res = isl::map::wrap();
26003  return typed::set<pair<Domain, pair<Range, Range2>>>(res);
26004}
26005
26006template <typename T1, typename T2>
26007typed::map<pair<T1, T2>, pair<T1, T2>>::map(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &bmap)
26008  : isl::map(bmap)
26009{
26010}
26011
26012template <typename T1, typename T2>
26013typed::map<pair<T1, T2>, pair<T1, T2>>::map(const isl::ctx &ctx, const std::string &str)
26014  : isl::map(ctx, str)
26015{
26016}
26017
26018template <typename T1, typename T2>
26019template <typename Domain2>
26020typed::map<Domain2, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::apply_domain(const typed::map<pair<T1, T2>, Domain2> &map2) const
26021{
26022  auto res = isl::map::apply_domain(map2);
26023  return typed::map<Domain2, pair<T1, T2>>(res);
26024}
26025
26026template <typename T1, typename T2>
26027template <typename Domain2>
26028typed::union_map<Domain2, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const
26029{
26030  auto res = isl::map::apply_domain(umap2);
26031  return typed::union_map<Domain2, pair<T1, T2>>(res);
26032}
26033
26034template <typename T1, typename T2>
26035template <typename Domain2>
26036typed::map<Domain2, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &map2) const
26037{
26038  auto res = isl::map::apply_domain(map2);
26039  return typed::map<Domain2, pair<T1, T2>>(res);
26040}
26041
26042template <typename T1, typename T2>
26043template <typename Range2>
26044typed::map<pair<T1, T2>, Range2> typed::map<pair<T1, T2>, pair<T1, T2>>::apply_range(const typed::map<pair<T1, T2>, Range2> &map2) const
26045{
26046  auto res = isl::map::apply_range(map2);
26047  return typed::map<pair<T1, T2>, Range2>(res);
26048}
26049
26050template <typename T1, typename T2>
26051template <typename Range2>
26052typed::union_map<pair<T1, T2>, Range2> typed::map<pair<T1, T2>, pair<T1, T2>>::apply_range(const typed::union_map<pair<T1, T2>, Range2> &umap2) const
26053{
26054  auto res = isl::map::apply_range(umap2);
26055  return typed::union_map<pair<T1, T2>, Range2>(res);
26056}
26057
26058template <typename T1, typename T2>
26059template <typename Range2>
26060typed::map<pair<T1, T2>, Range2> typed::map<pair<T1, T2>, pair<T1, T2>>::apply_range(const typed::basic_map<pair<T1, T2>, Range2> &map2) const
26061{
26062  auto res = isl::map::apply_range(map2);
26063  return typed::map<pair<T1, T2>, Range2>(res);
26064}
26065
26066template <typename T1, typename T2>
26067typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::as_map() const
26068{
26069  auto res = isl::map::as_map();
26070  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26071}
26072
26073template <typename T1, typename T2>
26074typed::multi_union_pw_aff<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::as_multi_union_pw_aff() const
26075{
26076  auto res = isl::map::as_multi_union_pw_aff();
26077  return typed::multi_union_pw_aff<pair<T1, T2>, pair<T1, T2>>(res);
26078}
26079
26080template <typename T1, typename T2>
26081typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::as_pw_multi_aff() const
26082{
26083  auto res = isl::map::as_pw_multi_aff();
26084  return typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>>(res);
26085}
26086
26087template <typename T1, typename T2>
26088typed::union_pw_multi_aff<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::as_union_pw_multi_aff() const
26089{
26090  auto res = isl::map::as_union_pw_multi_aff();
26091  return typed::union_pw_multi_aff<pair<T1, T2>, pair<T1, T2>>(res);
26092}
26093
26094template <typename T1, typename T2>
26095typed::set<pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const
26096{
26097  auto res = isl::map::bind_domain(tuple);
26098  return typed::set<pair<T1, T2>>(res);
26099}
26100
26101template <typename T1, typename T2>
26102typed::set<pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::bind_range(const typed::multi_id<pair<T1, T2>> &tuple) const
26103{
26104  auto res = isl::map::bind_range(tuple);
26105  return typed::set<pair<T1, T2>>(res);
26106}
26107
26108template <typename T1, typename T2>
26109typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::coalesce() const
26110{
26111  auto res = isl::map::coalesce();
26112  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26113}
26114
26115template <typename T1, typename T2>
26116typed::map<T1, pair<T2, pair<T1, T2>>> typed::map<pair<T1, T2>, pair<T1, T2>>::curry() const
26117{
26118  auto res = isl::map::curry();
26119  return typed::map<T1, pair<T2, pair<T1, T2>>>(res);
26120}
26121
26122template <typename T1, typename T2>
26123typed::set<pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::deltas() const
26124{
26125  auto res = isl::map::deltas();
26126  return typed::set<pair<T1, T2>>(res);
26127}
26128
26129template <typename T1, typename T2>
26130typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::detect_equalities() const
26131{
26132  auto res = isl::map::detect_equalities();
26133  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26134}
26135
26136template <typename T1, typename T2>
26137typed::set<pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::domain() const
26138{
26139  auto res = isl::map::domain();
26140  return typed::set<pair<T1, T2>>(res);
26141}
26142
26143template <typename T1, typename T2>
26144typed::map<T1, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::domain_factor_domain() const
26145{
26146  auto res = isl::map::domain_factor_domain();
26147  return typed::map<T1, pair<T1, T2>>(res);
26148}
26149
26150template <typename T1, typename T2>
26151typed::map<T2, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::domain_factor_range() const
26152{
26153  auto res = isl::map::domain_factor_range();
26154  return typed::map<T2, pair<T1, T2>>(res);
26155}
26156
26157template <typename T1, typename T2>
26158typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::domain_map() const
26159{
26160  auto res = isl::map::domain_map();
26161  return typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>>(res);
26162}
26163
26164template <typename T1, typename T2>
26165typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::domain_map_union_pw_multi_aff() const
26166{
26167  auto res = isl::map::domain_map_union_pw_multi_aff();
26168  return typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>>(res);
26169}
26170
26171template <typename T1, typename T2>
26172template <typename Domain2>
26173typed::map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::domain_product(const typed::map<Domain2, pair<T1, T2>> &map2) const
26174{
26175  auto res = isl::map::domain_product(map2);
26176  return typed::map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>>(res);
26177}
26178
26179template <typename T1, typename T2>
26180template <typename Domain2>
26181typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::domain_product(const typed::union_map<Domain2, pair<T1, T2>> &umap2) const
26182{
26183  auto res = isl::map::domain_product(umap2);
26184  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>>(res);
26185}
26186
26187template <typename T1, typename T2>
26188template <typename Domain2>
26189typed::map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::domain_product(const typed::basic_map<Domain2, pair<T1, T2>> &map2) const
26190{
26191  auto res = isl::map::domain_product(map2);
26192  return typed::map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>>(res);
26193}
26194
26195template <typename T1, typename T2>
26196typed::map<pair<T2, T1>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::domain_reverse() const
26197{
26198  auto res = isl::map::domain_reverse();
26199  return typed::map<pair<T2, T1>, pair<T1, T2>>(res);
26200}
26201
26202template <typename T1, typename T2>
26203typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::drop_unused_params() const
26204{
26205  auto res = isl::map::drop_unused_params();
26206  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26207}
26208
26209template <typename T1, typename T2>
26210template <typename Range>
26211typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
26212{
26213  auto res = isl::map::eq_at(mpa);
26214  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26215}
26216
26217template <typename T1, typename T2>
26218template <typename Range>
26219typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::multi_union_pw_aff<pair<T1, T2>, Range> &mupa) const
26220{
26221  auto res = isl::map::eq_at(mupa);
26222  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26223}
26224
26225template <typename T1, typename T2>
26226typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const
26227{
26228  auto res = isl::map::eq_at(mpa);
26229  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26230}
26231
26232template <typename T1, typename T2>
26233template <typename Range>
26234typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const
26235{
26236  auto res = isl::map::eq_at(mpa);
26237  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26238}
26239
26240template <typename T1, typename T2>
26241typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const
26242{
26243  auto res = isl::map::eq_at(mpa);
26244  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26245}
26246
26247template <typename T1, typename T2>
26248template <typename Range>
26249typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const
26250{
26251  auto res = isl::map::eq_at(mpa);
26252  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26253}
26254
26255template <typename T1, typename T2>
26256bool typed::map<pair<T1, T2>, pair<T1, T2>>::every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<T1, T2>>)> &test) const
26257{
26258  auto lambda_test = [&] (isl::map arg0) {
26259    return test(typed::map<pair<T1, T2>, pair<T1, T2>>(arg0));
26260  };
26261  return isl::map::every_map(lambda_test);
26262}
26263
26264template <typename T1, typename T2>
26265typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::extract_map(const typed::space<pair<T1, T2>, pair<T1, T2>> &space) const
26266{
26267  auto res = isl::map::extract_map(space);
26268  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26269}
26270
26271template <typename T1, typename T2>
26272typed::map<Anonymous, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::flatten_domain() const
26273{
26274  auto res = isl::map::flatten_domain();
26275  return typed::map<Anonymous, pair<T1, T2>>(res);
26276}
26277
26278template <typename T1, typename T2>
26279typed::map<pair<T1, T2>, Anonymous> typed::map<pair<T1, T2>, pair<T1, T2>>::flatten_range() const
26280{
26281  auto res = isl::map::flatten_range();
26282  return typed::map<pair<T1, T2>, Anonymous>(res);
26283}
26284
26285template <typename T1, typename T2>
26286void typed::map<pair<T1, T2>, pair<T1, T2>>::foreach_basic_map(const std::function<void(typed::basic_map<pair<T1, T2>, pair<T1, T2>>)> &fn) const
26287{
26288  auto lambda_fn = [&] (isl::basic_map arg0) {
26289    return fn(typed::basic_map<pair<T1, T2>, pair<T1, T2>>(arg0));
26290  };
26291  return isl::map::foreach_basic_map(lambda_fn);
26292}
26293
26294template <typename T1, typename T2>
26295void typed::map<pair<T1, T2>, pair<T1, T2>>::foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<T1, T2>>)> &fn) const
26296{
26297  auto lambda_fn = [&] (isl::map arg0) {
26298    return fn(typed::map<pair<T1, T2>, pair<T1, T2>>(arg0));
26299  };
26300  return isl::map::foreach_map(lambda_fn);
26301}
26302
26303template <typename T1, typename T2>
26304typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist(const typed::map<pair<T1, T2>, pair<T1, T2>> &context) const
26305{
26306  auto res = isl::map::gist(context);
26307  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26308}
26309
26310template <typename T1, typename T2>
26311typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &context) const
26312{
26313  auto res = isl::map::gist(context);
26314  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26315}
26316
26317template <typename T1, typename T2>
26318typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &context) const
26319{
26320  auto res = isl::map::gist(context);
26321  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26322}
26323
26324template <typename T1, typename T2>
26325typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::set<pair<T1, T2>> &context) const
26326{
26327  auto res = isl::map::gist_domain(context);
26328  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26329}
26330
26331template <typename T1, typename T2>
26332typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::union_set<pair<T1, T2>> &uset) const
26333{
26334  auto res = isl::map::gist_domain(uset);
26335  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26336}
26337
26338template <typename T1, typename T2>
26339typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::basic_set<pair<T1, T2>> &context) const
26340{
26341  auto res = isl::map::gist_domain(context);
26342  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26343}
26344
26345template <typename T1, typename T2>
26346typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::point<pair<T1, T2>> &context) const
26347{
26348  auto res = isl::map::gist_domain(context);
26349  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26350}
26351
26352template <typename T1, typename T2>
26353typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist_params(const typed::set<> &context) const
26354{
26355  auto res = isl::map::gist_params(context);
26356  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26357}
26358
26359template <typename T1, typename T2>
26360typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist_params(const typed::basic_set<> &context) const
26361{
26362  auto res = isl::map::gist_params(context);
26363  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26364}
26365
26366template <typename T1, typename T2>
26367typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::gist_params(const typed::point<> &context) const
26368{
26369  auto res = isl::map::gist_params(context);
26370  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26371}
26372
26373template <typename T1, typename T2>
26374typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const
26375{
26376  auto res = isl::map::intersect(map2);
26377  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26378}
26379
26380template <typename T1, typename T2>
26381typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
26382{
26383  auto res = isl::map::intersect(umap2);
26384  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26385}
26386
26387template <typename T1, typename T2>
26388typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &map2) const
26389{
26390  auto res = isl::map::intersect(map2);
26391  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26392}
26393
26394template <typename T1, typename T2>
26395typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::set<pair<T1, T2>> &set) const
26396{
26397  auto res = isl::map::intersect_domain(set);
26398  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26399}
26400
26401template <typename T1, typename T2>
26402typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::space<pair<T1, T2>> &space) const
26403{
26404  auto res = isl::map::intersect_domain(space);
26405  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26406}
26407
26408template <typename T1, typename T2>
26409typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const
26410{
26411  auto res = isl::map::intersect_domain(uset);
26412  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26413}
26414
26415template <typename T1, typename T2>
26416typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::basic_set<pair<T1, T2>> &set) const
26417{
26418  auto res = isl::map::intersect_domain(set);
26419  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26420}
26421
26422template <typename T1, typename T2>
26423typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::point<pair<T1, T2>> &set) const
26424{
26425  auto res = isl::map::intersect_domain(set);
26426  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26427}
26428
26429template <typename T1, typename T2>
26430typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::set<T1> &domain) const
26431{
26432  auto res = isl::map::intersect_domain_wrapped_domain(domain);
26433  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26434}
26435
26436template <typename T1, typename T2>
26437typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const
26438{
26439  auto res = isl::map::intersect_domain_wrapped_domain(domain);
26440  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26441}
26442
26443template <typename T1, typename T2>
26444typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::basic_set<T1> &domain) const
26445{
26446  auto res = isl::map::intersect_domain_wrapped_domain(domain);
26447  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26448}
26449
26450template <typename T1, typename T2>
26451typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::point<T1> &domain) const
26452{
26453  auto res = isl::map::intersect_domain_wrapped_domain(domain);
26454  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26455}
26456
26457template <typename T1, typename T2>
26458typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_params(const typed::set<> &params) const
26459{
26460  auto res = isl::map::intersect_params(params);
26461  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26462}
26463
26464template <typename T1, typename T2>
26465typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_params(const typed::basic_set<> &params) const
26466{
26467  auto res = isl::map::intersect_params(params);
26468  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26469}
26470
26471template <typename T1, typename T2>
26472typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_params(const typed::point<> &params) const
26473{
26474  auto res = isl::map::intersect_params(params);
26475  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26476}
26477
26478template <typename T1, typename T2>
26479typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::set<pair<T1, T2>> &set) const
26480{
26481  auto res = isl::map::intersect_range(set);
26482  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26483}
26484
26485template <typename T1, typename T2>
26486typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::space<pair<T1, T2>> &space) const
26487{
26488  auto res = isl::map::intersect_range(space);
26489  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26490}
26491
26492template <typename T1, typename T2>
26493typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::union_set<pair<T1, T2>> &uset) const
26494{
26495  auto res = isl::map::intersect_range(uset);
26496  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26497}
26498
26499template <typename T1, typename T2>
26500typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::basic_set<pair<T1, T2>> &set) const
26501{
26502  auto res = isl::map::intersect_range(set);
26503  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26504}
26505
26506template <typename T1, typename T2>
26507typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::point<pair<T1, T2>> &set) const
26508{
26509  auto res = isl::map::intersect_range(set);
26510  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26511}
26512
26513template <typename T1, typename T2>
26514typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::set<T1> &domain) const
26515{
26516  auto res = isl::map::intersect_range_wrapped_domain(domain);
26517  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26518}
26519
26520template <typename T1, typename T2>
26521typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::union_set<T1> &domain) const
26522{
26523  auto res = isl::map::intersect_range_wrapped_domain(domain);
26524  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26525}
26526
26527template <typename T1, typename T2>
26528typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::basic_set<T1> &domain) const
26529{
26530  auto res = isl::map::intersect_range_wrapped_domain(domain);
26531  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26532}
26533
26534template <typename T1, typename T2>
26535typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::point<T1> &domain) const
26536{
26537  auto res = isl::map::intersect_range_wrapped_domain(domain);
26538  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26539}
26540
26541template <typename T1, typename T2>
26542template <typename Range>
26543typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_ge_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
26544{
26545  auto res = isl::map::lex_ge_at(mpa);
26546  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26547}
26548
26549template <typename T1, typename T2>
26550typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_ge_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const
26551{
26552  auto res = isl::map::lex_ge_at(mpa);
26553  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26554}
26555
26556template <typename T1, typename T2>
26557template <typename Range>
26558typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_ge_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const
26559{
26560  auto res = isl::map::lex_ge_at(mpa);
26561  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26562}
26563
26564template <typename T1, typename T2>
26565typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_ge_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const
26566{
26567  auto res = isl::map::lex_ge_at(mpa);
26568  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26569}
26570
26571template <typename T1, typename T2>
26572template <typename Range>
26573typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_ge_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const
26574{
26575  auto res = isl::map::lex_ge_at(mpa);
26576  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26577}
26578
26579template <typename T1, typename T2>
26580template <typename Range>
26581typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_gt_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
26582{
26583  auto res = isl::map::lex_gt_at(mpa);
26584  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26585}
26586
26587template <typename T1, typename T2>
26588typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_gt_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const
26589{
26590  auto res = isl::map::lex_gt_at(mpa);
26591  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26592}
26593
26594template <typename T1, typename T2>
26595template <typename Range>
26596typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_gt_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const
26597{
26598  auto res = isl::map::lex_gt_at(mpa);
26599  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26600}
26601
26602template <typename T1, typename T2>
26603typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_gt_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const
26604{
26605  auto res = isl::map::lex_gt_at(mpa);
26606  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26607}
26608
26609template <typename T1, typename T2>
26610template <typename Range>
26611typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_gt_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const
26612{
26613  auto res = isl::map::lex_gt_at(mpa);
26614  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26615}
26616
26617template <typename T1, typename T2>
26618template <typename Range>
26619typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_le_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
26620{
26621  auto res = isl::map::lex_le_at(mpa);
26622  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26623}
26624
26625template <typename T1, typename T2>
26626typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_le_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const
26627{
26628  auto res = isl::map::lex_le_at(mpa);
26629  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26630}
26631
26632template <typename T1, typename T2>
26633template <typename Range>
26634typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_le_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const
26635{
26636  auto res = isl::map::lex_le_at(mpa);
26637  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26638}
26639
26640template <typename T1, typename T2>
26641typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_le_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const
26642{
26643  auto res = isl::map::lex_le_at(mpa);
26644  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26645}
26646
26647template <typename T1, typename T2>
26648template <typename Range>
26649typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_le_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const
26650{
26651  auto res = isl::map::lex_le_at(mpa);
26652  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26653}
26654
26655template <typename T1, typename T2>
26656template <typename Range>
26657typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_lt_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mpa) const
26658{
26659  auto res = isl::map::lex_lt_at(mpa);
26660  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26661}
26662
26663template <typename T1, typename T2>
26664typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_lt_at(const typed::aff<pair<T1, T2>, Anonymous> &mpa) const
26665{
26666  auto res = isl::map::lex_lt_at(mpa);
26667  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26668}
26669
26670template <typename T1, typename T2>
26671template <typename Range>
26672typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_lt_at(const typed::multi_aff<pair<T1, T2>, Range> &mpa) const
26673{
26674  auto res = isl::map::lex_lt_at(mpa);
26675  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26676}
26677
26678template <typename T1, typename T2>
26679typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_lt_at(const typed::pw_aff<pair<T1, T2>, Anonymous> &mpa) const
26680{
26681  auto res = isl::map::lex_lt_at(mpa);
26682  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26683}
26684
26685template <typename T1, typename T2>
26686template <typename Range>
26687typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lex_lt_at(const typed::pw_multi_aff<pair<T1, T2>, Range> &mpa) const
26688{
26689  auto res = isl::map::lex_lt_at(mpa);
26690  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26691}
26692
26693template <typename T1, typename T2>
26694typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lexmax() const
26695{
26696  auto res = isl::map::lexmax();
26697  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26698}
26699
26700template <typename T1, typename T2>
26701typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lexmax_pw_multi_aff() const
26702{
26703  auto res = isl::map::lexmax_pw_multi_aff();
26704  return typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>>(res);
26705}
26706
26707template <typename T1, typename T2>
26708typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lexmin() const
26709{
26710  auto res = isl::map::lexmin();
26711  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26712}
26713
26714template <typename T1, typename T2>
26715typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lexmin_pw_multi_aff() const
26716{
26717  auto res = isl::map::lexmin_pw_multi_aff();
26718  return typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>>(res);
26719}
26720
26721template <typename T1, typename T2>
26722typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lower_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> &lower) const
26723{
26724  auto res = isl::map::lower_bound(lower);
26725  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26726}
26727
26728template <typename T1, typename T2>
26729typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lower_bound(const typed::aff<pair<T1, T2>, pair<T1, T2>> &lower) const
26730{
26731  auto res = isl::map::lower_bound(lower);
26732  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26733}
26734
26735template <typename T1, typename T2>
26736typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lower_bound(const typed::multi_aff<pair<T1, T2>, pair<T1, T2>> &lower) const
26737{
26738  auto res = isl::map::lower_bound(lower);
26739  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26740}
26741
26742template <typename T1, typename T2>
26743typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lower_bound(const typed::pw_aff<pair<T1, T2>, pair<T1, T2>> &lower) const
26744{
26745  auto res = isl::map::lower_bound(lower);
26746  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26747}
26748
26749template <typename T1, typename T2>
26750typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::lower_bound(const typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> &lower) const
26751{
26752  auto res = isl::map::lower_bound(lower);
26753  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26754}
26755
26756template <typename T1, typename T2>
26757typed::map_list<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::map_list() const
26758{
26759  auto res = isl::map::map_list();
26760  return typed::map_list<pair<T1, T2>, pair<T1, T2>>(res);
26761}
26762
26763template <typename T1, typename T2>
26764typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::max_multi_pw_aff() const
26765{
26766  auto res = isl::map::max_multi_pw_aff();
26767  return typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>>(res);
26768}
26769
26770template <typename T1, typename T2>
26771typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::min_multi_pw_aff() const
26772{
26773  auto res = isl::map::min_multi_pw_aff();
26774  return typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>>(res);
26775}
26776
26777template <typename T1, typename T2>
26778typed::set<> typed::map<pair<T1, T2>, pair<T1, T2>>::params() const
26779{
26780  auto res = isl::map::params();
26781  return typed::set<>(res);
26782}
26783
26784template <typename T1, typename T2>
26785template <typename Domain2>
26786typed::map<Domain2, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const
26787{
26788  auto res = isl::map::preimage_domain(ma);
26789  return typed::map<Domain2, pair<T1, T2>>(res);
26790}
26791
26792template <typename T1, typename T2>
26793template <typename Domain2>
26794typed::map<Domain2, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const
26795{
26796  auto res = isl::map::preimage_domain(mpa);
26797  return typed::map<Domain2, pair<T1, T2>>(res);
26798}
26799
26800template <typename T1, typename T2>
26801template <typename Domain2>
26802typed::map<Domain2, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const
26803{
26804  auto res = isl::map::preimage_domain(pma);
26805  return typed::map<Domain2, pair<T1, T2>>(res);
26806}
26807
26808template <typename T1, typename T2>
26809template <typename Domain2>
26810typed::union_map<Domain2, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const
26811{
26812  auto res = isl::map::preimage_domain(upma);
26813  return typed::union_map<Domain2, pair<T1, T2>>(res);
26814}
26815
26816template <typename T1, typename T2>
26817template <typename Range2>
26818typed::map<pair<T1, T2>, Range2> typed::map<pair<T1, T2>, pair<T1, T2>>::preimage_range(const typed::multi_aff<Range2, pair<T1, T2>> &ma) const
26819{
26820  auto res = isl::map::preimage_range(ma);
26821  return typed::map<pair<T1, T2>, Range2>(res);
26822}
26823
26824template <typename T1, typename T2>
26825template <typename Range2>
26826typed::map<pair<T1, T2>, Range2> typed::map<pair<T1, T2>, pair<T1, T2>>::preimage_range(const typed::pw_multi_aff<Range2, pair<T1, T2>> &pma) const
26827{
26828  auto res = isl::map::preimage_range(pma);
26829  return typed::map<pair<T1, T2>, Range2>(res);
26830}
26831
26832template <typename T1, typename T2>
26833template <typename Range2>
26834typed::union_map<pair<T1, T2>, Range2> typed::map<pair<T1, T2>, pair<T1, T2>>::preimage_range(const typed::union_pw_multi_aff<Range2, pair<T1, T2>> &upma) const
26835{
26836  auto res = isl::map::preimage_range(upma);
26837  return typed::union_map<pair<T1, T2>, Range2>(res);
26838}
26839
26840template <typename T1, typename T2>
26841template <typename Domain2, typename Range2>
26842typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> typed::map<pair<T1, T2>, pair<T1, T2>>::product(const typed::map<Domain2, Range2> &map2) const
26843{
26844  auto res = isl::map::product(map2);
26845  return typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>>(res);
26846}
26847
26848template <typename T1, typename T2>
26849template <typename Domain2, typename Range2>
26850typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> typed::map<pair<T1, T2>, pair<T1, T2>>::product(const typed::union_map<Domain2, Range2> &umap2) const
26851{
26852  auto res = isl::map::product(umap2);
26853  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>>(res);
26854}
26855
26856template <typename T1, typename T2>
26857template <typename Domain2, typename Range2>
26858typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> typed::map<pair<T1, T2>, pair<T1, T2>>::product(const typed::basic_map<Domain2, Range2> &map2) const
26859{
26860  auto res = isl::map::product(map2);
26861  return typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>>(res);
26862}
26863
26864template <typename T1, typename T2>
26865typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::project_out_all_params() const
26866{
26867  auto res = isl::map::project_out_all_params();
26868  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26869}
26870
26871template <typename T1, typename T2>
26872typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::project_out_param(const typed::id<Anonymous> &id) const
26873{
26874  auto res = isl::map::project_out_param(id);
26875  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26876}
26877
26878template <typename T1, typename T2>
26879typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::project_out_param(const std::string &id) const
26880{
26881  auto res = isl::map::project_out_param(id);
26882  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26883}
26884
26885template <typename T1, typename T2>
26886typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::project_out_param(const typed::id_list<Anonymous> &list) const
26887{
26888  auto res = isl::map::project_out_param(list);
26889  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26890}
26891
26892template <typename T1, typename T2>
26893typed::set<pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::range() const
26894{
26895  auto res = isl::map::range();
26896  return typed::set<pair<T1, T2>>(res);
26897}
26898
26899template <typename T1, typename T2>
26900typed::map<pair<T1, T2>, T1> typed::map<pair<T1, T2>, pair<T1, T2>>::range_factor_domain() const
26901{
26902  auto res = isl::map::range_factor_domain();
26903  return typed::map<pair<T1, T2>, T1>(res);
26904}
26905
26906template <typename T1, typename T2>
26907typed::map<pair<T1, T2>, T2> typed::map<pair<T1, T2>, pair<T1, T2>>::range_factor_range() const
26908{
26909  auto res = isl::map::range_factor_range();
26910  return typed::map<pair<T1, T2>, T2>(res);
26911}
26912
26913template <typename T1, typename T2>
26914typed::fixed_box<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::range_lattice_tile() const
26915{
26916  auto res = isl::map::range_lattice_tile();
26917  return typed::fixed_box<pair<T1, T2>, pair<T1, T2>>(res);
26918}
26919
26920template <typename T1, typename T2>
26921typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::range_map() const
26922{
26923  auto res = isl::map::range_map();
26924  return typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>>(res);
26925}
26926
26927template <typename T1, typename T2>
26928template <typename Range2>
26929typed::map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> typed::map<pair<T1, T2>, pair<T1, T2>>::range_product(const typed::map<pair<T1, T2>, Range2> &map2) const
26930{
26931  auto res = isl::map::range_product(map2);
26932  return typed::map<pair<T1, T2>, pair<pair<T1, T2>, Range2>>(res);
26933}
26934
26935template <typename T1, typename T2>
26936template <typename Range2>
26937typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> typed::map<pair<T1, T2>, pair<T1, T2>>::range_product(const typed::union_map<pair<T1, T2>, Range2> &umap2) const
26938{
26939  auto res = isl::map::range_product(umap2);
26940  return typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>>(res);
26941}
26942
26943template <typename T1, typename T2>
26944template <typename Range2>
26945typed::map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> typed::map<pair<T1, T2>, pair<T1, T2>>::range_product(const typed::basic_map<pair<T1, T2>, Range2> &map2) const
26946{
26947  auto res = isl::map::range_product(map2);
26948  return typed::map<pair<T1, T2>, pair<pair<T1, T2>, Range2>>(res);
26949}
26950
26951template <typename T1, typename T2>
26952typed::map<pair<T1, T2>, pair<T2, T1>> typed::map<pair<T1, T2>, pair<T1, T2>>::range_reverse() const
26953{
26954  auto res = isl::map::range_reverse();
26955  return typed::map<pair<T1, T2>, pair<T2, T1>>(res);
26956}
26957
26958template <typename T1, typename T2>
26959typed::fixed_box<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::range_simple_fixed_box_hull() const
26960{
26961  auto res = isl::map::range_simple_fixed_box_hull();
26962  return typed::fixed_box<pair<T1, T2>, pair<T1, T2>>(res);
26963}
26964
26965template <typename T1, typename T2>
26966typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::reverse() const
26967{
26968  auto res = isl::map::reverse();
26969  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26970}
26971
26972template <typename T1, typename T2>
26973typed::space<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::space() const
26974{
26975  auto res = isl::map::space();
26976  return typed::space<pair<T1, T2>, pair<T1, T2>>(res);
26977}
26978
26979template <typename T1, typename T2>
26980typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::subtract(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const
26981{
26982  auto res = isl::map::subtract(map2);
26983  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26984}
26985
26986template <typename T1, typename T2>
26987typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::subtract(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
26988{
26989  auto res = isl::map::subtract(umap2);
26990  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
26991}
26992
26993template <typename T1, typename T2>
26994typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::subtract(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &map2) const
26995{
26996  auto res = isl::map::subtract(map2);
26997  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
26998}
26999
27000template <typename T1, typename T2>
27001typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const
27002{
27003  auto res = isl::map::subtract_domain(dom);
27004  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
27005}
27006
27007template <typename T1, typename T2>
27008typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::subtract_range(const typed::union_set<pair<T1, T2>> &dom) const
27009{
27010  auto res = isl::map::subtract_range(dom);
27011  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
27012}
27013
27014template <typename T1, typename T2>
27015typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::to_union_map() const
27016{
27017  auto res = isl::map::to_union_map();
27018  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
27019}
27020
27021template <typename T1, typename T2>
27022typed::map<pair<pair<T1, T2>, T1>, T2> typed::map<pair<T1, T2>, pair<T1, T2>>::uncurry() const
27023{
27024  auto res = isl::map::uncurry();
27025  return typed::map<pair<pair<T1, T2>, T1>, T2>(res);
27026}
27027
27028template <typename T1, typename T2>
27029typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::unite(const typed::map<pair<T1, T2>, pair<T1, T2>> &map2) const
27030{
27031  auto res = isl::map::unite(map2);
27032  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
27033}
27034
27035template <typename T1, typename T2>
27036typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::unite(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
27037{
27038  auto res = isl::map::unite(umap2);
27039  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
27040}
27041
27042template <typename T1, typename T2>
27043typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::unite(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &map2) const
27044{
27045  auto res = isl::map::unite(map2);
27046  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
27047}
27048
27049template <typename T1, typename T2>
27050typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::universe(const typed::space<pair<T1, T2>, pair<T1, T2>> &space)
27051{
27052  auto res = isl::map::universe(space);
27053  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
27054}
27055
27056template <typename T1, typename T2>
27057typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::upper_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<T1, T2>> &upper) const
27058{
27059  auto res = isl::map::upper_bound(upper);
27060  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
27061}
27062
27063template <typename T1, typename T2>
27064typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::upper_bound(const typed::aff<pair<T1, T2>, pair<T1, T2>> &upper) const
27065{
27066  auto res = isl::map::upper_bound(upper);
27067  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
27068}
27069
27070template <typename T1, typename T2>
27071typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::upper_bound(const typed::multi_aff<pair<T1, T2>, pair<T1, T2>> &upper) const
27072{
27073  auto res = isl::map::upper_bound(upper);
27074  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
27075}
27076
27077template <typename T1, typename T2>
27078typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::upper_bound(const typed::pw_aff<pair<T1, T2>, pair<T1, T2>> &upper) const
27079{
27080  auto res = isl::map::upper_bound(upper);
27081  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
27082}
27083
27084template <typename T1, typename T2>
27085typed::map<pair<T1, T2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<T1, T2>>::upper_bound(const typed::pw_multi_aff<pair<T1, T2>, pair<T1, T2>> &upper) const
27086{
27087  auto res = isl::map::upper_bound(upper);
27088  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
27089}
27090
27091template <typename T1, typename T2>
27092typed::set<pair<pair<T1, T2>, pair<T1, T2>>> typed::map<pair<T1, T2>, pair<T1, T2>>::wrap() const
27093{
27094  auto res = isl::map::wrap();
27095  return typed::set<pair<pair<T1, T2>, pair<T1, T2>>>(res);
27096}
27097
27098template <typename T1, typename T2, typename Range, typename Range2>
27099typed::map<pair<T1, T2>, pair<Range, Range2>>::map(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &bmap)
27100  : isl::map(bmap)
27101{
27102}
27103
27104template <typename T1, typename T2, typename Range, typename Range2>
27105typed::map<pair<T1, T2>, pair<Range, Range2>>::map(const isl::ctx &ctx, const std::string &str)
27106  : isl::map(ctx, str)
27107{
27108}
27109
27110template <typename T1, typename T2, typename Range, typename Range2>
27111template <typename Domain2>
27112typed::map<Domain2, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::apply_domain(const typed::map<pair<T1, T2>, Domain2> &map2) const
27113{
27114  auto res = isl::map::apply_domain(map2);
27115  return typed::map<Domain2, pair<Range, Range2>>(res);
27116}
27117
27118template <typename T1, typename T2, typename Range, typename Range2>
27119template <typename Domain2>
27120typed::union_map<Domain2, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const
27121{
27122  auto res = isl::map::apply_domain(umap2);
27123  return typed::union_map<Domain2, pair<Range, Range2>>(res);
27124}
27125
27126template <typename T1, typename T2, typename Range, typename Range2>
27127template <typename Domain2>
27128typed::map<Domain2, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &map2) const
27129{
27130  auto res = isl::map::apply_domain(map2);
27131  return typed::map<Domain2, pair<Range, Range2>>(res);
27132}
27133
27134template <typename T1, typename T2, typename Range, typename Range2>
27135template <typename Arg2>
27136typed::map<pair<T1, T2>, Arg2> typed::map<pair<T1, T2>, pair<Range, Range2>>::apply_range(const typed::map<pair<Range, Range2>, Arg2> &map2) const
27137{
27138  auto res = isl::map::apply_range(map2);
27139  return typed::map<pair<T1, T2>, Arg2>(res);
27140}
27141
27142template <typename T1, typename T2, typename Range, typename Range2>
27143template <typename Arg2>
27144typed::union_map<pair<T1, T2>, Arg2> typed::map<pair<T1, T2>, pair<Range, Range2>>::apply_range(const typed::union_map<pair<Range, Range2>, Arg2> &umap2) const
27145{
27146  auto res = isl::map::apply_range(umap2);
27147  return typed::union_map<pair<T1, T2>, Arg2>(res);
27148}
27149
27150template <typename T1, typename T2, typename Range, typename Range2>
27151template <typename Arg2>
27152typed::map<pair<T1, T2>, Arg2> typed::map<pair<T1, T2>, pair<Range, Range2>>::apply_range(const typed::basic_map<pair<Range, Range2>, Arg2> &map2) const
27153{
27154  auto res = isl::map::apply_range(map2);
27155  return typed::map<pair<T1, T2>, Arg2>(res);
27156}
27157
27158template <typename T1, typename T2, typename Range, typename Range2>
27159typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::as_map() const
27160{
27161  auto res = isl::map::as_map();
27162  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27163}
27164
27165template <typename T1, typename T2, typename Range, typename Range2>
27166typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::as_multi_union_pw_aff() const
27167{
27168  auto res = isl::map::as_multi_union_pw_aff();
27169  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
27170}
27171
27172template <typename T1, typename T2, typename Range, typename Range2>
27173typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::as_pw_multi_aff() const
27174{
27175  auto res = isl::map::as_pw_multi_aff();
27176  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
27177}
27178
27179template <typename T1, typename T2, typename Range, typename Range2>
27180typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::as_union_pw_multi_aff() const
27181{
27182  auto res = isl::map::as_union_pw_multi_aff();
27183  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
27184}
27185
27186template <typename T1, typename T2, typename Range, typename Range2>
27187typed::set<pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const
27188{
27189  auto res = isl::map::bind_domain(tuple);
27190  return typed::set<pair<Range, Range2>>(res);
27191}
27192
27193template <typename T1, typename T2, typename Range, typename Range2>
27194typed::set<pair<T1, T2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const
27195{
27196  auto res = isl::map::bind_range(tuple);
27197  return typed::set<pair<T1, T2>>(res);
27198}
27199
27200template <typename T1, typename T2, typename Range, typename Range2>
27201typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::coalesce() const
27202{
27203  auto res = isl::map::coalesce();
27204  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27205}
27206
27207template <typename T1, typename T2, typename Range, typename Range2>
27208typed::map<T1, pair<T2, pair<Range, Range2>>> typed::map<pair<T1, T2>, pair<Range, Range2>>::curry() const
27209{
27210  auto res = isl::map::curry();
27211  return typed::map<T1, pair<T2, pair<Range, Range2>>>(res);
27212}
27213
27214template <typename T1, typename T2, typename Range, typename Range2>
27215typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::detect_equalities() const
27216{
27217  auto res = isl::map::detect_equalities();
27218  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27219}
27220
27221template <typename T1, typename T2, typename Range, typename Range2>
27222typed::set<pair<T1, T2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::domain() const
27223{
27224  auto res = isl::map::domain();
27225  return typed::set<pair<T1, T2>>(res);
27226}
27227
27228template <typename T1, typename T2, typename Range, typename Range2>
27229typed::map<T1, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::domain_factor_domain() const
27230{
27231  auto res = isl::map::domain_factor_domain();
27232  return typed::map<T1, pair<Range, Range2>>(res);
27233}
27234
27235template <typename T1, typename T2, typename Range, typename Range2>
27236typed::map<T2, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::domain_factor_range() const
27237{
27238  auto res = isl::map::domain_factor_range();
27239  return typed::map<T2, pair<Range, Range2>>(res);
27240}
27241
27242template <typename T1, typename T2, typename Range, typename Range2>
27243typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::domain_map() const
27244{
27245  auto res = isl::map::domain_map();
27246  return typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>>(res);
27247}
27248
27249template <typename T1, typename T2, typename Range, typename Range2>
27250typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::domain_map_union_pw_multi_aff() const
27251{
27252  auto res = isl::map::domain_map_union_pw_multi_aff();
27253  return typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>>(res);
27254}
27255
27256template <typename T1, typename T2, typename Range, typename Range2>
27257template <typename Domain2>
27258typed::map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::domain_product(const typed::map<Domain2, pair<Range, Range2>> &map2) const
27259{
27260  auto res = isl::map::domain_product(map2);
27261  return typed::map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>>(res);
27262}
27263
27264template <typename T1, typename T2, typename Range, typename Range2>
27265template <typename Domain2>
27266typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const
27267{
27268  auto res = isl::map::domain_product(umap2);
27269  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>>(res);
27270}
27271
27272template <typename T1, typename T2, typename Range, typename Range2>
27273template <typename Domain2>
27274typed::map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::domain_product(const typed::basic_map<Domain2, pair<Range, Range2>> &map2) const
27275{
27276  auto res = isl::map::domain_product(map2);
27277  return typed::map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>>(res);
27278}
27279
27280template <typename T1, typename T2, typename Range, typename Range2>
27281typed::map<pair<T2, T1>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::domain_reverse() const
27282{
27283  auto res = isl::map::domain_reverse();
27284  return typed::map<pair<T2, T1>, pair<Range, Range2>>(res);
27285}
27286
27287template <typename T1, typename T2, typename Range, typename Range2>
27288typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::drop_unused_params() const
27289{
27290  auto res = isl::map::drop_unused_params();
27291  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27292}
27293
27294template <typename T1, typename T2, typename Range, typename Range2>
27295bool typed::map<pair<T1, T2>, pair<Range, Range2>>::every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &test) const
27296{
27297  auto lambda_test = [&] (isl::map arg0) {
27298    return test(typed::map<pair<T1, T2>, pair<Range, Range2>>(arg0));
27299  };
27300  return isl::map::every_map(lambda_test);
27301}
27302
27303template <typename T1, typename T2, typename Range, typename Range2>
27304typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::extract_map(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const
27305{
27306  auto res = isl::map::extract_map(space);
27307  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27308}
27309
27310template <typename T1, typename T2, typename Range, typename Range2>
27311typed::map<Anonymous, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::flatten_domain() const
27312{
27313  auto res = isl::map::flatten_domain();
27314  return typed::map<Anonymous, pair<Range, Range2>>(res);
27315}
27316
27317template <typename T1, typename T2, typename Range, typename Range2>
27318typed::map<pair<T1, T2>, Anonymous> typed::map<pair<T1, T2>, pair<Range, Range2>>::flatten_range() const
27319{
27320  auto res = isl::map::flatten_range();
27321  return typed::map<pair<T1, T2>, Anonymous>(res);
27322}
27323
27324template <typename T1, typename T2, typename Range, typename Range2>
27325void typed::map<pair<T1, T2>, pair<Range, Range2>>::foreach_basic_map(const std::function<void(typed::basic_map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const
27326{
27327  auto lambda_fn = [&] (isl::basic_map arg0) {
27328    return fn(typed::basic_map<pair<T1, T2>, pair<Range, Range2>>(arg0));
27329  };
27330  return isl::map::foreach_basic_map(lambda_fn);
27331}
27332
27333template <typename T1, typename T2, typename Range, typename Range2>
27334void typed::map<pair<T1, T2>, pair<Range, Range2>>::foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const
27335{
27336  auto lambda_fn = [&] (isl::map arg0) {
27337    return fn(typed::map<pair<T1, T2>, pair<Range, Range2>>(arg0));
27338  };
27339  return isl::map::foreach_map(lambda_fn);
27340}
27341
27342template <typename T1, typename T2, typename Range, typename Range2>
27343typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::map<pair<T1, T2>, pair<Range, Range2>> &context) const
27344{
27345  auto res = isl::map::gist(context);
27346  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27347}
27348
27349template <typename T1, typename T2, typename Range, typename Range2>
27350typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &context) const
27351{
27352  auto res = isl::map::gist(context);
27353  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27354}
27355
27356template <typename T1, typename T2, typename Range, typename Range2>
27357typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &context) const
27358{
27359  auto res = isl::map::gist(context);
27360  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27361}
27362
27363template <typename T1, typename T2, typename Range, typename Range2>
27364typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::set<pair<T1, T2>> &context) const
27365{
27366  auto res = isl::map::gist_domain(context);
27367  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27368}
27369
27370template <typename T1, typename T2, typename Range, typename Range2>
27371typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::union_set<pair<T1, T2>> &uset) const
27372{
27373  auto res = isl::map::gist_domain(uset);
27374  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27375}
27376
27377template <typename T1, typename T2, typename Range, typename Range2>
27378typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::basic_set<pair<T1, T2>> &context) const
27379{
27380  auto res = isl::map::gist_domain(context);
27381  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27382}
27383
27384template <typename T1, typename T2, typename Range, typename Range2>
27385typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::point<pair<T1, T2>> &context) const
27386{
27387  auto res = isl::map::gist_domain(context);
27388  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27389}
27390
27391template <typename T1, typename T2, typename Range, typename Range2>
27392typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::set<> &context) const
27393{
27394  auto res = isl::map::gist_params(context);
27395  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27396}
27397
27398template <typename T1, typename T2, typename Range, typename Range2>
27399typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::basic_set<> &context) const
27400{
27401  auto res = isl::map::gist_params(context);
27402  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27403}
27404
27405template <typename T1, typename T2, typename Range, typename Range2>
27406typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::point<> &context) const
27407{
27408  auto res = isl::map::gist_params(context);
27409  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27410}
27411
27412template <typename T1, typename T2, typename Range, typename Range2>
27413typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const
27414{
27415  auto res = isl::map::intersect(map2);
27416  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27417}
27418
27419template <typename T1, typename T2, typename Range, typename Range2>
27420typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
27421{
27422  auto res = isl::map::intersect(umap2);
27423  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27424}
27425
27426template <typename T1, typename T2, typename Range, typename Range2>
27427typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &map2) const
27428{
27429  auto res = isl::map::intersect(map2);
27430  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27431}
27432
27433template <typename T1, typename T2, typename Range, typename Range2>
27434typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::set<pair<T1, T2>> &set) const
27435{
27436  auto res = isl::map::intersect_domain(set);
27437  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27438}
27439
27440template <typename T1, typename T2, typename Range, typename Range2>
27441typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::space<pair<T1, T2>> &space) const
27442{
27443  auto res = isl::map::intersect_domain(space);
27444  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27445}
27446
27447template <typename T1, typename T2, typename Range, typename Range2>
27448typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const
27449{
27450  auto res = isl::map::intersect_domain(uset);
27451  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27452}
27453
27454template <typename T1, typename T2, typename Range, typename Range2>
27455typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::basic_set<pair<T1, T2>> &set) const
27456{
27457  auto res = isl::map::intersect_domain(set);
27458  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27459}
27460
27461template <typename T1, typename T2, typename Range, typename Range2>
27462typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::point<pair<T1, T2>> &set) const
27463{
27464  auto res = isl::map::intersect_domain(set);
27465  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27466}
27467
27468template <typename T1, typename T2, typename Range, typename Range2>
27469typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::set<T1> &domain) const
27470{
27471  auto res = isl::map::intersect_domain_wrapped_domain(domain);
27472  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27473}
27474
27475template <typename T1, typename T2, typename Range, typename Range2>
27476typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const
27477{
27478  auto res = isl::map::intersect_domain_wrapped_domain(domain);
27479  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27480}
27481
27482template <typename T1, typename T2, typename Range, typename Range2>
27483typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::basic_set<T1> &domain) const
27484{
27485  auto res = isl::map::intersect_domain_wrapped_domain(domain);
27486  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27487}
27488
27489template <typename T1, typename T2, typename Range, typename Range2>
27490typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::point<T1> &domain) const
27491{
27492  auto res = isl::map::intersect_domain_wrapped_domain(domain);
27493  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27494}
27495
27496template <typename T1, typename T2, typename Range, typename Range2>
27497typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::set<> &params) const
27498{
27499  auto res = isl::map::intersect_params(params);
27500  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27501}
27502
27503template <typename T1, typename T2, typename Range, typename Range2>
27504typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::basic_set<> &params) const
27505{
27506  auto res = isl::map::intersect_params(params);
27507  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27508}
27509
27510template <typename T1, typename T2, typename Range, typename Range2>
27511typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::point<> &params) const
27512{
27513  auto res = isl::map::intersect_params(params);
27514  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27515}
27516
27517template <typename T1, typename T2, typename Range, typename Range2>
27518typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::set<pair<Range, Range2>> &set) const
27519{
27520  auto res = isl::map::intersect_range(set);
27521  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27522}
27523
27524template <typename T1, typename T2, typename Range, typename Range2>
27525typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::space<pair<Range, Range2>> &space) const
27526{
27527  auto res = isl::map::intersect_range(space);
27528  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27529}
27530
27531template <typename T1, typename T2, typename Range, typename Range2>
27532typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const
27533{
27534  auto res = isl::map::intersect_range(uset);
27535  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27536}
27537
27538template <typename T1, typename T2, typename Range, typename Range2>
27539typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::basic_set<pair<Range, Range2>> &set) const
27540{
27541  auto res = isl::map::intersect_range(set);
27542  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27543}
27544
27545template <typename T1, typename T2, typename Range, typename Range2>
27546typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::point<pair<Range, Range2>> &set) const
27547{
27548  auto res = isl::map::intersect_range(set);
27549  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27550}
27551
27552template <typename T1, typename T2, typename Range, typename Range2>
27553typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::set<Range> &domain) const
27554{
27555  auto res = isl::map::intersect_range_wrapped_domain(domain);
27556  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27557}
27558
27559template <typename T1, typename T2, typename Range, typename Range2>
27560typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const
27561{
27562  auto res = isl::map::intersect_range_wrapped_domain(domain);
27563  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27564}
27565
27566template <typename T1, typename T2, typename Range, typename Range2>
27567typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::basic_set<Range> &domain) const
27568{
27569  auto res = isl::map::intersect_range_wrapped_domain(domain);
27570  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27571}
27572
27573template <typename T1, typename T2, typename Range, typename Range2>
27574typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::point<Range> &domain) const
27575{
27576  auto res = isl::map::intersect_range_wrapped_domain(domain);
27577  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27578}
27579
27580template <typename T1, typename T2, typename Range, typename Range2>
27581typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::lexmax() const
27582{
27583  auto res = isl::map::lexmax();
27584  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27585}
27586
27587template <typename T1, typename T2, typename Range, typename Range2>
27588typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::lexmax_pw_multi_aff() const
27589{
27590  auto res = isl::map::lexmax_pw_multi_aff();
27591  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
27592}
27593
27594template <typename T1, typename T2, typename Range, typename Range2>
27595typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::lexmin() const
27596{
27597  auto res = isl::map::lexmin();
27598  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27599}
27600
27601template <typename T1, typename T2, typename Range, typename Range2>
27602typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::lexmin_pw_multi_aff() const
27603{
27604  auto res = isl::map::lexmin_pw_multi_aff();
27605  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
27606}
27607
27608template <typename T1, typename T2, typename Range, typename Range2>
27609typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::lower_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const
27610{
27611  auto res = isl::map::lower_bound(lower);
27612  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27613}
27614
27615template <typename T1, typename T2, typename Range, typename Range2>
27616typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::lower_bound(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &lower) const
27617{
27618  auto res = isl::map::lower_bound(lower);
27619  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27620}
27621
27622template <typename T1, typename T2, typename Range, typename Range2>
27623typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::lower_bound(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const
27624{
27625  auto res = isl::map::lower_bound(lower);
27626  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27627}
27628
27629template <typename T1, typename T2, typename Range, typename Range2>
27630typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::lower_bound(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const
27631{
27632  auto res = isl::map::lower_bound(lower);
27633  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27634}
27635
27636template <typename T1, typename T2, typename Range, typename Range2>
27637typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::lower_bound(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &lower) const
27638{
27639  auto res = isl::map::lower_bound(lower);
27640  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27641}
27642
27643template <typename T1, typename T2, typename Range, typename Range2>
27644typed::map_list<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::map_list() const
27645{
27646  auto res = isl::map::map_list();
27647  return typed::map_list<pair<T1, T2>, pair<Range, Range2>>(res);
27648}
27649
27650template <typename T1, typename T2, typename Range, typename Range2>
27651typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::max_multi_pw_aff() const
27652{
27653  auto res = isl::map::max_multi_pw_aff();
27654  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
27655}
27656
27657template <typename T1, typename T2, typename Range, typename Range2>
27658typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::min_multi_pw_aff() const
27659{
27660  auto res = isl::map::min_multi_pw_aff();
27661  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
27662}
27663
27664template <typename T1, typename T2, typename Range, typename Range2>
27665typed::set<> typed::map<pair<T1, T2>, pair<Range, Range2>>::params() const
27666{
27667  auto res = isl::map::params();
27668  return typed::set<>(res);
27669}
27670
27671template <typename T1, typename T2, typename Range, typename Range2>
27672template <typename Domain2>
27673typed::map<Domain2, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const
27674{
27675  auto res = isl::map::preimage_domain(ma);
27676  return typed::map<Domain2, pair<Range, Range2>>(res);
27677}
27678
27679template <typename T1, typename T2, typename Range, typename Range2>
27680template <typename Domain2>
27681typed::map<Domain2, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const
27682{
27683  auto res = isl::map::preimage_domain(mpa);
27684  return typed::map<Domain2, pair<Range, Range2>>(res);
27685}
27686
27687template <typename T1, typename T2, typename Range, typename Range2>
27688template <typename Domain2>
27689typed::map<Domain2, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const
27690{
27691  auto res = isl::map::preimage_domain(pma);
27692  return typed::map<Domain2, pair<Range, Range2>>(res);
27693}
27694
27695template <typename T1, typename T2, typename Range, typename Range2>
27696template <typename Domain2>
27697typed::union_map<Domain2, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const
27698{
27699  auto res = isl::map::preimage_domain(upma);
27700  return typed::union_map<Domain2, pair<Range, Range2>>(res);
27701}
27702
27703template <typename T1, typename T2, typename Range, typename Range2>
27704template <typename Arg2>
27705typed::map<pair<T1, T2>, Arg2> typed::map<pair<T1, T2>, pair<Range, Range2>>::preimage_range(const typed::multi_aff<Arg2, pair<Range, Range2>> &ma) const
27706{
27707  auto res = isl::map::preimage_range(ma);
27708  return typed::map<pair<T1, T2>, Arg2>(res);
27709}
27710
27711template <typename T1, typename T2, typename Range, typename Range2>
27712template <typename Arg2>
27713typed::map<pair<T1, T2>, Arg2> typed::map<pair<T1, T2>, pair<Range, Range2>>::preimage_range(const typed::pw_multi_aff<Arg2, pair<Range, Range2>> &pma) const
27714{
27715  auto res = isl::map::preimage_range(pma);
27716  return typed::map<pair<T1, T2>, Arg2>(res);
27717}
27718
27719template <typename T1, typename T2, typename Range, typename Range2>
27720template <typename Arg2>
27721typed::union_map<pair<T1, T2>, Arg2> typed::map<pair<T1, T2>, pair<Range, Range2>>::preimage_range(const typed::union_pw_multi_aff<Arg2, pair<Range, Range2>> &upma) const
27722{
27723  auto res = isl::map::preimage_range(upma);
27724  return typed::union_map<pair<T1, T2>, Arg2>(res);
27725}
27726
27727template <typename T1, typename T2, typename Range, typename Range2>
27728template <typename Domain2, typename Arg2>
27729typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::product(const typed::map<Domain2, Arg2> &map2) const
27730{
27731  auto res = isl::map::product(map2);
27732  return typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
27733}
27734
27735template <typename T1, typename T2, typename Range, typename Range2>
27736template <typename Domain2, typename Arg2>
27737typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::product(const typed::union_map<Domain2, Arg2> &umap2) const
27738{
27739  auto res = isl::map::product(umap2);
27740  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
27741}
27742
27743template <typename T1, typename T2, typename Range, typename Range2>
27744template <typename Domain2, typename Arg2>
27745typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::product(const typed::basic_map<Domain2, Arg2> &map2) const
27746{
27747  auto res = isl::map::product(map2);
27748  return typed::map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
27749}
27750
27751template <typename T1, typename T2, typename Range, typename Range2>
27752typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::project_out_all_params() const
27753{
27754  auto res = isl::map::project_out_all_params();
27755  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27756}
27757
27758template <typename T1, typename T2, typename Range, typename Range2>
27759typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::project_out_param(const typed::id<Anonymous> &id) const
27760{
27761  auto res = isl::map::project_out_param(id);
27762  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27763}
27764
27765template <typename T1, typename T2, typename Range, typename Range2>
27766typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::project_out_param(const std::string &id) const
27767{
27768  auto res = isl::map::project_out_param(id);
27769  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27770}
27771
27772template <typename T1, typename T2, typename Range, typename Range2>
27773typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::project_out_param(const typed::id_list<Anonymous> &list) const
27774{
27775  auto res = isl::map::project_out_param(list);
27776  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27777}
27778
27779template <typename T1, typename T2, typename Range, typename Range2>
27780typed::set<pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::range() const
27781{
27782  auto res = isl::map::range();
27783  return typed::set<pair<Range, Range2>>(res);
27784}
27785
27786template <typename T1, typename T2, typename Range, typename Range2>
27787typed::map<pair<T1, T2>, Range> typed::map<pair<T1, T2>, pair<Range, Range2>>::range_factor_domain() const
27788{
27789  auto res = isl::map::range_factor_domain();
27790  return typed::map<pair<T1, T2>, Range>(res);
27791}
27792
27793template <typename T1, typename T2, typename Range, typename Range2>
27794typed::map<pair<T1, T2>, Range2> typed::map<pair<T1, T2>, pair<Range, Range2>>::range_factor_range() const
27795{
27796  auto res = isl::map::range_factor_range();
27797  return typed::map<pair<T1, T2>, Range2>(res);
27798}
27799
27800template <typename T1, typename T2, typename Range, typename Range2>
27801typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::range_lattice_tile() const
27802{
27803  auto res = isl::map::range_lattice_tile();
27804  return typed::fixed_box<pair<T1, T2>, pair<Range, Range2>>(res);
27805}
27806
27807template <typename T1, typename T2, typename Range, typename Range2>
27808typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::range_map() const
27809{
27810  auto res = isl::map::range_map();
27811  return typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>>(res);
27812}
27813
27814template <typename T1, typename T2, typename Range, typename Range2>
27815template <typename Arg2>
27816typed::map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::map<pair<T1, T2>, Arg2> &map2) const
27817{
27818  auto res = isl::map::range_product(map2);
27819  return typed::map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
27820}
27821
27822template <typename T1, typename T2, typename Range, typename Range2>
27823template <typename Arg2>
27824typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::union_map<pair<T1, T2>, Arg2> &umap2) const
27825{
27826  auto res = isl::map::range_product(umap2);
27827  return typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
27828}
27829
27830template <typename T1, typename T2, typename Range, typename Range2>
27831template <typename Arg2>
27832typed::map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::basic_map<pair<T1, T2>, Arg2> &map2) const
27833{
27834  auto res = isl::map::range_product(map2);
27835  return typed::map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
27836}
27837
27838template <typename T1, typename T2, typename Range, typename Range2>
27839typed::map<pair<T1, T2>, pair<Range2, Range>> typed::map<pair<T1, T2>, pair<Range, Range2>>::range_reverse() const
27840{
27841  auto res = isl::map::range_reverse();
27842  return typed::map<pair<T1, T2>, pair<Range2, Range>>(res);
27843}
27844
27845template <typename T1, typename T2, typename Range, typename Range2>
27846typed::fixed_box<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::range_simple_fixed_box_hull() const
27847{
27848  auto res = isl::map::range_simple_fixed_box_hull();
27849  return typed::fixed_box<pair<T1, T2>, pair<Range, Range2>>(res);
27850}
27851
27852template <typename T1, typename T2, typename Range, typename Range2>
27853typed::map<pair<Range, Range2>, pair<T1, T2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::reverse() const
27854{
27855  auto res = isl::map::reverse();
27856  return typed::map<pair<Range, Range2>, pair<T1, T2>>(res);
27857}
27858
27859template <typename T1, typename T2, typename Range, typename Range2>
27860typed::space<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::space() const
27861{
27862  auto res = isl::map::space();
27863  return typed::space<pair<T1, T2>, pair<Range, Range2>>(res);
27864}
27865
27866template <typename T1, typename T2, typename Range, typename Range2>
27867typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::subtract(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const
27868{
27869  auto res = isl::map::subtract(map2);
27870  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27871}
27872
27873template <typename T1, typename T2, typename Range, typename Range2>
27874typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::subtract(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
27875{
27876  auto res = isl::map::subtract(umap2);
27877  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27878}
27879
27880template <typename T1, typename T2, typename Range, typename Range2>
27881typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::subtract(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &map2) const
27882{
27883  auto res = isl::map::subtract(map2);
27884  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27885}
27886
27887template <typename T1, typename T2, typename Range, typename Range2>
27888typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const
27889{
27890  auto res = isl::map::subtract_domain(dom);
27891  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27892}
27893
27894template <typename T1, typename T2, typename Range, typename Range2>
27895typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const
27896{
27897  auto res = isl::map::subtract_range(dom);
27898  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27899}
27900
27901template <typename T1, typename T2, typename Range, typename Range2>
27902typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::to_union_map() const
27903{
27904  auto res = isl::map::to_union_map();
27905  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27906}
27907
27908template <typename T1, typename T2, typename Range, typename Range2>
27909typed::map<pair<pair<T1, T2>, Range>, Range2> typed::map<pair<T1, T2>, pair<Range, Range2>>::uncurry() const
27910{
27911  auto res = isl::map::uncurry();
27912  return typed::map<pair<pair<T1, T2>, Range>, Range2>(res);
27913}
27914
27915template <typename T1, typename T2, typename Range, typename Range2>
27916typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::unite(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map2) const
27917{
27918  auto res = isl::map::unite(map2);
27919  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27920}
27921
27922template <typename T1, typename T2, typename Range, typename Range2>
27923typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::unite(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
27924{
27925  auto res = isl::map::unite(umap2);
27926  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
27927}
27928
27929template <typename T1, typename T2, typename Range, typename Range2>
27930typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::unite(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &map2) const
27931{
27932  auto res = isl::map::unite(map2);
27933  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27934}
27935
27936template <typename T1, typename T2, typename Range, typename Range2>
27937typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::universe(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space)
27938{
27939  auto res = isl::map::universe(space);
27940  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27941}
27942
27943template <typename T1, typename T2, typename Range, typename Range2>
27944typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::upper_bound(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const
27945{
27946  auto res = isl::map::upper_bound(upper);
27947  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27948}
27949
27950template <typename T1, typename T2, typename Range, typename Range2>
27951typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::upper_bound(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &upper) const
27952{
27953  auto res = isl::map::upper_bound(upper);
27954  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27955}
27956
27957template <typename T1, typename T2, typename Range, typename Range2>
27958typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::upper_bound(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const
27959{
27960  auto res = isl::map::upper_bound(upper);
27961  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27962}
27963
27964template <typename T1, typename T2, typename Range, typename Range2>
27965typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::upper_bound(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const
27966{
27967  auto res = isl::map::upper_bound(upper);
27968  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27969}
27970
27971template <typename T1, typename T2, typename Range, typename Range2>
27972typed::map<pair<T1, T2>, pair<Range, Range2>> typed::map<pair<T1, T2>, pair<Range, Range2>>::upper_bound(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upper) const
27973{
27974  auto res = isl::map::upper_bound(upper);
27975  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
27976}
27977
27978template <typename T1, typename T2, typename Range, typename Range2>
27979typed::set<pair<pair<T1, T2>, pair<Range, Range2>>> typed::map<pair<T1, T2>, pair<Range, Range2>>::wrap() const
27980{
27981  auto res = isl::map::wrap();
27982  return typed::set<pair<pair<T1, T2>, pair<Range, Range2>>>(res);
27983}
27984
27985template <typename Domain, typename Range>
27986typed::map_list<Domain, Range>::map_list(const isl::ctx &ctx, int n)
27987  : isl::map_list(ctx, n)
27988{
27989}
27990
27991template <typename Domain, typename Range>
27992typed::map_list<Domain, Range>::map_list(const typed::map<Domain, Range> &el)
27993  : isl::map_list(el)
27994{
27995}
27996
27997template <typename Domain, typename Range>
27998typed::map_list<Domain, Range>::map_list(const isl::ctx &ctx, const std::string &str)
27999  : isl::map_list(ctx, str)
28000{
28001}
28002
28003template <typename Domain, typename Range>
28004typed::map_list<Domain, Range> typed::map_list<Domain, Range>::add(const typed::map<Domain, Range> &el) const
28005{
28006  auto res = isl::map_list::add(el);
28007  return typed::map_list<Domain, Range>(res);
28008}
28009
28010template <typename Domain, typename Range>
28011typed::map_list<Domain, Range> typed::map_list<Domain, Range>::add(const typed::basic_map<Domain, Range> &el) const
28012{
28013  auto res = isl::map_list::add(el);
28014  return typed::map_list<Domain, Range>(res);
28015}
28016
28017template <typename Domain, typename Range>
28018typed::map<Domain, Range> typed::map_list<Domain, Range>::at(int index) const
28019{
28020  auto res = isl::map_list::at(index);
28021  return typed::map<Domain, Range>(res);
28022}
28023
28024template <typename Domain, typename Range>
28025typed::map_list<Domain, Range> typed::map_list<Domain, Range>::drop(unsigned int first, unsigned int n) const
28026{
28027  auto res = isl::map_list::drop(first, n);
28028  return typed::map_list<Domain, Range>(res);
28029}
28030
28031template <typename Domain, typename Range>
28032void typed::map_list<Domain, Range>::foreach(const std::function<void(typed::map<Domain, Range>)> &fn) const
28033{
28034  auto lambda_fn = [&] (isl::map arg0) {
28035    return fn(typed::map<Domain, Range>(arg0));
28036  };
28037  return isl::map_list::foreach(lambda_fn);
28038}
28039
28040template <typename Domain, typename Range>
28041void typed::map_list<Domain, Range>::foreach_scc(const std::function<bool(typed::map<Domain, Range>, typed::map<Domain, Range>)> &follows, const std::function<void(typed::map_list<Domain, Range>)> &fn) const
28042{
28043  auto lambda_follows = [&] (isl::map arg0, isl::map arg1) {
28044    return follows(typed::map<Domain, Range>(arg0), typed::map<Domain, Range>(arg1));
28045  };
28046  auto lambda_fn = [&] (isl::map_list arg0) {
28047    return fn(typed::map_list<Domain, Range>(arg0));
28048  };
28049  return isl::map_list::foreach_scc(lambda_follows, lambda_fn);
28050}
28051
28052template <typename Domain, typename Range>
28053typed::map_list<Domain, Range> typed::map_list<Domain, Range>::set_at(int index, const typed::map<Domain, Anonymous> &el) const
28054{
28055  auto res = isl::map_list::set_at(index, el);
28056  return typed::map_list<Domain, Range>(res);
28057}
28058
28059template <typename Domain>
28060typed::multi_aff<Domain>::multi_aff(const typed::aff<Domain> &aff)
28061  : isl::multi_aff(aff)
28062{
28063}
28064
28065template <typename Domain>
28066typed::multi_aff<Domain>::multi_aff(const typed::space<Domain> &space, const typed::aff_list<Anonymous> &list)
28067  : isl::multi_aff(space, list)
28068{
28069}
28070
28071template <typename Domain>
28072typed::multi_aff<Domain>::multi_aff(const isl::ctx &ctx, const std::string &str)
28073  : isl::multi_aff(ctx, str)
28074{
28075}
28076
28077template <typename Domain>
28078typed::multi_aff<Domain> typed::multi_aff<Domain>::add(const typed::multi_aff<Domain> &multi2) const
28079{
28080  auto res = isl::multi_aff::add(multi2);
28081  return typed::multi_aff<Domain>(res);
28082}
28083
28084template <typename Domain>
28085typed::multi_pw_aff<Domain> typed::multi_aff<Domain>::add(const typed::multi_pw_aff<Domain> &multi2) const
28086{
28087  auto res = isl::multi_aff::add(multi2);
28088  return typed::multi_pw_aff<Domain>(res);
28089}
28090
28091template <typename Domain>
28092typed::multi_union_pw_aff<Domain> typed::multi_aff<Domain>::add(const typed::multi_union_pw_aff<Domain> &multi2) const
28093{
28094  auto res = isl::multi_aff::add(multi2);
28095  return typed::multi_union_pw_aff<Domain>(res);
28096}
28097
28098template <typename Domain>
28099typed::pw_multi_aff<Domain> typed::multi_aff<Domain>::add(const typed::pw_multi_aff<Domain> &pma2) const
28100{
28101  auto res = isl::multi_aff::add(pma2);
28102  return typed::pw_multi_aff<Domain>(res);
28103}
28104
28105template <typename Domain>
28106typed::union_pw_multi_aff<Domain> typed::multi_aff<Domain>::add(const typed::union_pw_multi_aff<Domain> &upma2) const
28107{
28108  auto res = isl::multi_aff::add(upma2);
28109  return typed::union_pw_multi_aff<Domain>(res);
28110}
28111
28112template <typename Domain>
28113typed::multi_aff<Domain> typed::multi_aff<Domain>::add(const typed::aff<Domain> &multi2) const
28114{
28115  auto res = isl::multi_aff::add(multi2);
28116  return typed::multi_aff<Domain>(res);
28117}
28118
28119template <typename Domain>
28120typed::multi_aff<Domain> typed::multi_aff<Domain>::add_constant(const typed::multi_val<Domain> &mv) const
28121{
28122  auto res = isl::multi_aff::add_constant(mv);
28123  return typed::multi_aff<Domain>(res);
28124}
28125
28126template <typename Domain>
28127typed::multi_aff<Domain> typed::multi_aff<Domain>::add_constant(const typed::val<Domain> &v) const
28128{
28129  auto res = isl::multi_aff::add_constant(v);
28130  return typed::multi_aff<Domain>(res);
28131}
28132
28133template <typename Domain>
28134typed::multi_aff<Domain> typed::multi_aff<Domain>::add_constant(long v) const
28135{
28136  auto res = isl::multi_aff::add_constant(v);
28137  return typed::multi_aff<Domain>(res);
28138}
28139
28140template <typename Domain>
28141template <typename Range>
28142typed::union_pw_multi_aff<Range> typed::multi_aff<Domain>::apply(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
28143{
28144  auto res = isl::multi_aff::apply(upma2);
28145  return typed::union_pw_multi_aff<Range>(res);
28146}
28147
28148template <typename Domain>
28149typed::multi_aff<Domain> typed::multi_aff<Domain>::as_multi_aff() const
28150{
28151  auto res = isl::multi_aff::as_multi_aff();
28152  return typed::multi_aff<Domain>(res);
28153}
28154
28155template <typename Domain>
28156typed::multi_union_pw_aff<Domain> typed::multi_aff<Domain>::as_multi_union_pw_aff() const
28157{
28158  auto res = isl::multi_aff::as_multi_union_pw_aff();
28159  return typed::multi_union_pw_aff<Domain>(res);
28160}
28161
28162template <typename Domain>
28163typed::pw_multi_aff<Domain> typed::multi_aff<Domain>::as_pw_multi_aff() const
28164{
28165  auto res = isl::multi_aff::as_pw_multi_aff();
28166  return typed::pw_multi_aff<Domain>(res);
28167}
28168
28169template <typename Domain>
28170typed::set<Domain> typed::multi_aff<Domain>::as_set() const
28171{
28172  auto res = isl::multi_aff::as_set();
28173  return typed::set<Domain>(res);
28174}
28175
28176template <typename Domain>
28177typed::aff<Anonymous> typed::multi_aff<Domain>::at(int pos) const
28178{
28179  auto res = isl::multi_aff::at(pos);
28180  return typed::aff<Anonymous>(res);
28181}
28182
28183template <typename Domain>
28184typed::basic_set<> typed::multi_aff<Domain>::bind(const typed::multi_id<Domain> &tuple) const
28185{
28186  auto res = isl::multi_aff::bind(tuple);
28187  return typed::basic_set<>(res);
28188}
28189
28190template <typename Domain>
28191typed::pw_multi_aff<Domain> typed::multi_aff<Domain>::coalesce() const
28192{
28193  auto res = isl::multi_aff::coalesce();
28194  return typed::pw_multi_aff<Domain>(res);
28195}
28196
28197template <typename Domain>
28198typed::multi_val<Domain> typed::multi_aff<Domain>::constant_multi_val() const
28199{
28200  auto res = isl::multi_aff::constant_multi_val();
28201  return typed::multi_val<Domain>(res);
28202}
28203
28204template <typename Domain>
28205typed::set<> typed::multi_aff<Domain>::domain() const
28206{
28207  auto res = isl::multi_aff::domain();
28208  return typed::set<>(res);
28209}
28210
28211template <typename Domain>
28212typed::pw_multi_aff<Domain> typed::multi_aff<Domain>::drop_unused_params() const
28213{
28214  auto res = isl::multi_aff::drop_unused_params();
28215  return typed::pw_multi_aff<Domain>(res);
28216}
28217
28218template <typename Domain>
28219typed::pw_multi_aff<Domain> typed::multi_aff<Domain>::extract_pw_multi_aff(const typed::space<Domain> &space) const
28220{
28221  auto res = isl::multi_aff::extract_pw_multi_aff(space);
28222  return typed::pw_multi_aff<Domain>(res);
28223}
28224
28225template <typename Domain>
28226typed::multi_aff<Domain> typed::multi_aff<Domain>::floor() const
28227{
28228  auto res = isl::multi_aff::floor();
28229  return typed::multi_aff<Domain>(res);
28230}
28231
28232template <typename Domain>
28233typed::multi_aff<Domain> typed::multi_aff<Domain>::gist(const typed::set<> &context) const
28234{
28235  auto res = isl::multi_aff::gist(context);
28236  return typed::multi_aff<Domain>(res);
28237}
28238
28239template <typename Domain>
28240typed::union_pw_multi_aff<Domain> typed::multi_aff<Domain>::gist(const typed::union_set<> &context) const
28241{
28242  auto res = isl::multi_aff::gist(context);
28243  return typed::union_pw_multi_aff<Domain>(res);
28244}
28245
28246template <typename Domain>
28247typed::multi_aff<Domain> typed::multi_aff<Domain>::gist(const typed::basic_set<> &context) const
28248{
28249  auto res = isl::multi_aff::gist(context);
28250  return typed::multi_aff<Domain>(res);
28251}
28252
28253template <typename Domain>
28254typed::multi_aff<Domain> typed::multi_aff<Domain>::gist(const typed::point<> &context) const
28255{
28256  auto res = isl::multi_aff::gist(context);
28257  return typed::multi_aff<Domain>(res);
28258}
28259
28260template <typename Domain>
28261typed::multi_aff<Domain> typed::multi_aff<Domain>::gist_params(const typed::set<> &context) const
28262{
28263  auto res = isl::multi_aff::gist_params(context);
28264  return typed::multi_aff<Domain>(res);
28265}
28266
28267template <typename Domain>
28268typed::multi_aff<Domain> typed::multi_aff<Domain>::gist_params(const typed::basic_set<> &context) const
28269{
28270  auto res = isl::multi_aff::gist_params(context);
28271  return typed::multi_aff<Domain>(res);
28272}
28273
28274template <typename Domain>
28275typed::multi_aff<Domain> typed::multi_aff<Domain>::gist_params(const typed::point<> &context) const
28276{
28277  auto res = isl::multi_aff::gist_params(context);
28278  return typed::multi_aff<Domain>(res);
28279}
28280
28281template <typename Domain>
28282typed::multi_aff<Domain, Domain> typed::multi_aff<Domain>::identity() const
28283{
28284  auto res = isl::multi_aff::identity();
28285  return typed::multi_aff<Domain, Domain>(res);
28286}
28287
28288template <typename Domain>
28289template <typename Arg1>
28290typed::multi_aff<Arg1, Domain> typed::multi_aff<Domain>::insert_domain(const typed::space<Arg1> &domain) const
28291{
28292  auto res = isl::multi_aff::insert_domain(domain);
28293  return typed::multi_aff<Arg1, Domain>(res);
28294}
28295
28296template <typename Domain>
28297typed::pw_multi_aff<Domain> typed::multi_aff<Domain>::intersect_params(const typed::set<> &set) const
28298{
28299  auto res = isl::multi_aff::intersect_params(set);
28300  return typed::pw_multi_aff<Domain>(res);
28301}
28302
28303template <typename Domain>
28304typed::aff_list<Anonymous> typed::multi_aff<Domain>::list() const
28305{
28306  auto res = isl::multi_aff::list();
28307  return typed::aff_list<Anonymous>(res);
28308}
28309
28310template <typename Domain>
28311typed::multi_pw_aff<Domain> typed::multi_aff<Domain>::max(const typed::multi_pw_aff<Domain> &multi2) const
28312{
28313  auto res = isl::multi_aff::max(multi2);
28314  return typed::multi_pw_aff<Domain>(res);
28315}
28316
28317template <typename Domain>
28318typed::multi_val<Domain> typed::multi_aff<Domain>::max_multi_val() const
28319{
28320  auto res = isl::multi_aff::max_multi_val();
28321  return typed::multi_val<Domain>(res);
28322}
28323
28324template <typename Domain>
28325typed::multi_pw_aff<Domain> typed::multi_aff<Domain>::min(const typed::multi_pw_aff<Domain> &multi2) const
28326{
28327  auto res = isl::multi_aff::min(multi2);
28328  return typed::multi_pw_aff<Domain>(res);
28329}
28330
28331template <typename Domain>
28332typed::multi_val<Domain> typed::multi_aff<Domain>::min_multi_val() const
28333{
28334  auto res = isl::multi_aff::min_multi_val();
28335  return typed::multi_val<Domain>(res);
28336}
28337
28338template <typename Domain>
28339typed::multi_aff<Domain> typed::multi_aff<Domain>::neg() const
28340{
28341  auto res = isl::multi_aff::neg();
28342  return typed::multi_aff<Domain>(res);
28343}
28344
28345template <typename Domain>
28346template <typename Range>
28347typed::multi_aff<pair<Domain, Range>> typed::multi_aff<Domain>::product(const typed::multi_aff<Range> &multi2) const
28348{
28349  auto res = isl::multi_aff::product(multi2);
28350  return typed::multi_aff<pair<Domain, Range>>(res);
28351}
28352
28353template <typename Domain>
28354template <typename Range>
28355typed::multi_pw_aff<pair<Domain, Range>> typed::multi_aff<Domain>::product(const typed::multi_pw_aff<Range> &multi2) const
28356{
28357  auto res = isl::multi_aff::product(multi2);
28358  return typed::multi_pw_aff<pair<Domain, Range>>(res);
28359}
28360
28361template <typename Domain>
28362template <typename Range>
28363typed::pw_multi_aff<pair<Domain, Range>> typed::multi_aff<Domain>::product(const typed::pw_multi_aff<Range> &pma2) const
28364{
28365  auto res = isl::multi_aff::product(pma2);
28366  return typed::pw_multi_aff<pair<Domain, Range>>(res);
28367}
28368
28369template <typename Domain>
28370typed::multi_aff<pair<Domain, Anonymous>> typed::multi_aff<Domain>::product(const typed::aff<Anonymous> &multi2) const
28371{
28372  auto res = isl::multi_aff::product(multi2);
28373  return typed::multi_aff<pair<Domain, Anonymous>>(res);
28374}
28375
28376template <typename Domain>
28377typed::pw_multi_aff_list<Domain> typed::multi_aff<Domain>::pw_multi_aff_list() const
28378{
28379  auto res = isl::multi_aff::pw_multi_aff_list();
28380  return typed::pw_multi_aff_list<Domain>(res);
28381}
28382
28383template <typename Domain>
28384typed::multi_aff<Domain> typed::multi_aff<Domain>::scale(const typed::multi_val<Domain> &mv) const
28385{
28386  auto res = isl::multi_aff::scale(mv);
28387  return typed::multi_aff<Domain>(res);
28388}
28389
28390template <typename Domain>
28391typed::multi_aff<Domain> typed::multi_aff<Domain>::scale(const typed::val<Domain> &v) const
28392{
28393  auto res = isl::multi_aff::scale(v);
28394  return typed::multi_aff<Domain>(res);
28395}
28396
28397template <typename Domain>
28398typed::multi_aff<Domain> typed::multi_aff<Domain>::scale(long v) const
28399{
28400  auto res = isl::multi_aff::scale(v);
28401  return typed::multi_aff<Domain>(res);
28402}
28403
28404template <typename Domain>
28405typed::multi_aff<Domain> typed::multi_aff<Domain>::scale_down(const typed::multi_val<Domain> &mv) const
28406{
28407  auto res = isl::multi_aff::scale_down(mv);
28408  return typed::multi_aff<Domain>(res);
28409}
28410
28411template <typename Domain>
28412typed::multi_aff<Domain> typed::multi_aff<Domain>::scale_down(const typed::val<Domain> &v) const
28413{
28414  auto res = isl::multi_aff::scale_down(v);
28415  return typed::multi_aff<Domain>(res);
28416}
28417
28418template <typename Domain>
28419typed::multi_aff<Domain> typed::multi_aff<Domain>::scale_down(long v) const
28420{
28421  auto res = isl::multi_aff::scale_down(v);
28422  return typed::multi_aff<Domain>(res);
28423}
28424
28425template <typename Domain>
28426typed::multi_aff<Domain> typed::multi_aff<Domain>::set_at(int pos, const typed::aff<Anonymous> &el) const
28427{
28428  auto res = isl::multi_aff::set_at(pos, el);
28429  return typed::multi_aff<Domain>(res);
28430}
28431
28432template <typename Domain>
28433typed::multi_pw_aff<Domain> typed::multi_aff<Domain>::set_at(int pos, const typed::pw_aff<Anonymous> &el) const
28434{
28435  auto res = isl::multi_aff::set_at(pos, el);
28436  return typed::multi_pw_aff<Domain>(res);
28437}
28438
28439template <typename Domain>
28440typed::multi_union_pw_aff<Domain> typed::multi_aff<Domain>::set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const
28441{
28442  auto res = isl::multi_aff::set_at(pos, el);
28443  return typed::multi_union_pw_aff<Domain>(res);
28444}
28445
28446template <typename Domain>
28447template <typename Domain2>
28448typed::multi_aff<Domain2> typed::multi_aff<Domain>::set_range_tuple(const typed::id<Anonymous> &id) const
28449{
28450  auto res = isl::multi_aff::set_range_tuple(id);
28451  return typed::multi_aff<Domain2>(res);
28452}
28453
28454template <typename Domain>
28455template <typename Domain2>
28456typed::multi_aff<Domain2> typed::multi_aff<Domain>::set_range_tuple(const std::string &id) const
28457{
28458  auto res = isl::multi_aff::set_range_tuple(id);
28459  return typed::multi_aff<Domain2>(res);
28460}
28461
28462template <typename Domain>
28463typed::space<Domain> typed::multi_aff<Domain>::space() const
28464{
28465  auto res = isl::multi_aff::space();
28466  return typed::space<Domain>(res);
28467}
28468
28469template <typename Domain>
28470typed::multi_aff<Domain> typed::multi_aff<Domain>::sub(const typed::multi_aff<Domain> &multi2) const
28471{
28472  auto res = isl::multi_aff::sub(multi2);
28473  return typed::multi_aff<Domain>(res);
28474}
28475
28476template <typename Domain>
28477typed::multi_pw_aff<Domain> typed::multi_aff<Domain>::sub(const typed::multi_pw_aff<Domain> &multi2) const
28478{
28479  auto res = isl::multi_aff::sub(multi2);
28480  return typed::multi_pw_aff<Domain>(res);
28481}
28482
28483template <typename Domain>
28484typed::multi_union_pw_aff<Domain> typed::multi_aff<Domain>::sub(const typed::multi_union_pw_aff<Domain> &multi2) const
28485{
28486  auto res = isl::multi_aff::sub(multi2);
28487  return typed::multi_union_pw_aff<Domain>(res);
28488}
28489
28490template <typename Domain>
28491typed::pw_multi_aff<Domain> typed::multi_aff<Domain>::sub(const typed::pw_multi_aff<Domain> &pma2) const
28492{
28493  auto res = isl::multi_aff::sub(pma2);
28494  return typed::pw_multi_aff<Domain>(res);
28495}
28496
28497template <typename Domain>
28498typed::union_pw_multi_aff<Domain> typed::multi_aff<Domain>::sub(const typed::union_pw_multi_aff<Domain> &upma2) const
28499{
28500  auto res = isl::multi_aff::sub(upma2);
28501  return typed::union_pw_multi_aff<Domain>(res);
28502}
28503
28504template <typename Domain>
28505typed::multi_aff<Domain> typed::multi_aff<Domain>::sub(const typed::aff<Domain> &multi2) const
28506{
28507  auto res = isl::multi_aff::sub(multi2);
28508  return typed::multi_aff<Domain>(res);
28509}
28510
28511template <typename Domain>
28512typed::multi_pw_aff<Domain> typed::multi_aff<Domain>::to_multi_pw_aff() const
28513{
28514  auto res = isl::multi_aff::to_multi_pw_aff();
28515  return typed::multi_pw_aff<Domain>(res);
28516}
28517
28518template <typename Domain>
28519typed::multi_union_pw_aff<Domain> typed::multi_aff<Domain>::to_multi_union_pw_aff() const
28520{
28521  auto res = isl::multi_aff::to_multi_union_pw_aff();
28522  return typed::multi_union_pw_aff<Domain>(res);
28523}
28524
28525template <typename Domain>
28526typed::pw_multi_aff<Domain> typed::multi_aff<Domain>::to_pw_multi_aff() const
28527{
28528  auto res = isl::multi_aff::to_pw_multi_aff();
28529  return typed::pw_multi_aff<Domain>(res);
28530}
28531
28532template <typename Domain>
28533typed::union_pw_multi_aff<Domain> typed::multi_aff<Domain>::to_union_pw_multi_aff() const
28534{
28535  auto res = isl::multi_aff::to_union_pw_multi_aff();
28536  return typed::union_pw_multi_aff<Domain>(res);
28537}
28538
28539template <typename Domain>
28540template <typename Arg1>
28541typed::multi_aff<Arg1, Domain> typed::multi_aff<Domain>::unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const
28542{
28543  auto res = isl::multi_aff::unbind_params_insert_domain(domain);
28544  return typed::multi_aff<Arg1, Domain>(res);
28545}
28546
28547template <typename Domain>
28548typed::multi_pw_aff<Domain> typed::multi_aff<Domain>::union_add(const typed::multi_pw_aff<Domain> &mpa2) const
28549{
28550  auto res = isl::multi_aff::union_add(mpa2);
28551  return typed::multi_pw_aff<Domain>(res);
28552}
28553
28554template <typename Domain>
28555typed::multi_union_pw_aff<Domain> typed::multi_aff<Domain>::union_add(const typed::multi_union_pw_aff<Domain> &mupa2) const
28556{
28557  auto res = isl::multi_aff::union_add(mupa2);
28558  return typed::multi_union_pw_aff<Domain>(res);
28559}
28560
28561template <typename Domain>
28562typed::pw_multi_aff<Domain> typed::multi_aff<Domain>::union_add(const typed::pw_multi_aff<Domain> &pma2) const
28563{
28564  auto res = isl::multi_aff::union_add(pma2);
28565  return typed::pw_multi_aff<Domain>(res);
28566}
28567
28568template <typename Domain>
28569typed::union_pw_multi_aff<Domain> typed::multi_aff<Domain>::union_add(const typed::union_pw_multi_aff<Domain> &upma2) const
28570{
28571  auto res = isl::multi_aff::union_add(upma2);
28572  return typed::union_pw_multi_aff<Domain>(res);
28573}
28574
28575template <typename Domain, typename Range>
28576typed::multi_aff<Domain, Range>::multi_aff(const typed::aff<Domain, Range> &aff)
28577  : isl::multi_aff(aff)
28578{
28579}
28580
28581template <typename Domain, typename Range>
28582typed::multi_aff<Domain, Range>::multi_aff(const typed::space<Domain, Range> &space, const typed::aff_list<Domain, Anonymous> &list)
28583  : isl::multi_aff(space, list)
28584{
28585}
28586
28587template <typename Domain, typename Range>
28588typed::multi_aff<Domain, Range>::multi_aff(const isl::ctx &ctx, const std::string &str)
28589  : isl::multi_aff(ctx, str)
28590{
28591}
28592
28593template <typename Domain, typename Range>
28594typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::add(const typed::multi_aff<Domain, Range> &multi2) const
28595{
28596  auto res = isl::multi_aff::add(multi2);
28597  return typed::multi_aff<Domain, Range>(res);
28598}
28599
28600template <typename Domain, typename Range>
28601typed::multi_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::add(const typed::multi_pw_aff<Domain, Range> &multi2) const
28602{
28603  auto res = isl::multi_aff::add(multi2);
28604  return typed::multi_pw_aff<Domain, Range>(res);
28605}
28606
28607template <typename Domain, typename Range>
28608typed::multi_union_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::add(const typed::multi_union_pw_aff<Domain, Range> &multi2) const
28609{
28610  auto res = isl::multi_aff::add(multi2);
28611  return typed::multi_union_pw_aff<Domain, Range>(res);
28612}
28613
28614template <typename Domain, typename Range>
28615typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::add(const typed::pw_multi_aff<Domain, Range> &pma2) const
28616{
28617  auto res = isl::multi_aff::add(pma2);
28618  return typed::pw_multi_aff<Domain, Range>(res);
28619}
28620
28621template <typename Domain, typename Range>
28622typed::union_pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
28623{
28624  auto res = isl::multi_aff::add(upma2);
28625  return typed::union_pw_multi_aff<Domain, Range>(res);
28626}
28627
28628template <typename Domain, typename Range>
28629typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::add(const typed::aff<Domain, Range> &multi2) const
28630{
28631  auto res = isl::multi_aff::add(multi2);
28632  return typed::multi_aff<Domain, Range>(res);
28633}
28634
28635template <typename Domain, typename Range>
28636typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::add_constant(const typed::multi_val<Range> &mv) const
28637{
28638  auto res = isl::multi_aff::add_constant(mv);
28639  return typed::multi_aff<Domain, Range>(res);
28640}
28641
28642template <typename Domain, typename Range>
28643typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::add_constant(const typed::val<Range> &v) const
28644{
28645  auto res = isl::multi_aff::add_constant(v);
28646  return typed::multi_aff<Domain, Range>(res);
28647}
28648
28649template <typename Domain, typename Range>
28650typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::add_constant(long v) const
28651{
28652  auto res = isl::multi_aff::add_constant(v);
28653  return typed::multi_aff<Domain, Range>(res);
28654}
28655
28656template <typename Domain, typename Range>
28657template <typename Range2>
28658typed::union_pw_multi_aff<Domain, Range2> typed::multi_aff<Domain, Range>::apply(const typed::union_pw_multi_aff<Range, Range2> &upma2) const
28659{
28660  auto res = isl::multi_aff::apply(upma2);
28661  return typed::union_pw_multi_aff<Domain, Range2>(res);
28662}
28663
28664template <typename Domain, typename Range>
28665typed::map<Domain, Range> typed::multi_aff<Domain, Range>::as_map() const
28666{
28667  auto res = isl::multi_aff::as_map();
28668  return typed::map<Domain, Range>(res);
28669}
28670
28671template <typename Domain, typename Range>
28672typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::as_multi_aff() const
28673{
28674  auto res = isl::multi_aff::as_multi_aff();
28675  return typed::multi_aff<Domain, Range>(res);
28676}
28677
28678template <typename Domain, typename Range>
28679typed::multi_union_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::as_multi_union_pw_aff() const
28680{
28681  auto res = isl::multi_aff::as_multi_union_pw_aff();
28682  return typed::multi_union_pw_aff<Domain, Range>(res);
28683}
28684
28685template <typename Domain, typename Range>
28686typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::as_pw_multi_aff() const
28687{
28688  auto res = isl::multi_aff::as_pw_multi_aff();
28689  return typed::pw_multi_aff<Domain, Range>(res);
28690}
28691
28692template <typename Domain, typename Range>
28693typed::union_map<Domain, Range> typed::multi_aff<Domain, Range>::as_union_map() const
28694{
28695  auto res = isl::multi_aff::as_union_map();
28696  return typed::union_map<Domain, Range>(res);
28697}
28698
28699template <typename Domain, typename Range>
28700typed::aff<Domain, Anonymous> typed::multi_aff<Domain, Range>::at(int pos) const
28701{
28702  auto res = isl::multi_aff::at(pos);
28703  return typed::aff<Domain, Anonymous>(res);
28704}
28705
28706template <typename Domain, typename Range>
28707typed::basic_set<Domain> typed::multi_aff<Domain, Range>::bind(const typed::multi_id<Range> &tuple) const
28708{
28709  auto res = isl::multi_aff::bind(tuple);
28710  return typed::basic_set<Domain>(res);
28711}
28712
28713template <typename Domain, typename Range>
28714typed::multi_aff<Range> typed::multi_aff<Domain, Range>::bind_domain(const typed::multi_id<Domain> &tuple) const
28715{
28716  auto res = isl::multi_aff::bind_domain(tuple);
28717  return typed::multi_aff<Range>(res);
28718}
28719
28720template <typename Domain, typename Range>
28721typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::coalesce() const
28722{
28723  auto res = isl::multi_aff::coalesce();
28724  return typed::pw_multi_aff<Domain, Range>(res);
28725}
28726
28727template <typename Domain, typename Range>
28728typed::multi_val<Range> typed::multi_aff<Domain, Range>::constant_multi_val() const
28729{
28730  auto res = isl::multi_aff::constant_multi_val();
28731  return typed::multi_val<Range>(res);
28732}
28733
28734template <typename Domain, typename Range>
28735typed::set<Domain> typed::multi_aff<Domain, Range>::domain() const
28736{
28737  auto res = isl::multi_aff::domain();
28738  return typed::set<Domain>(res);
28739}
28740
28741template <typename Domain, typename Range>
28742typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::drop_unused_params() const
28743{
28744  auto res = isl::multi_aff::drop_unused_params();
28745  return typed::pw_multi_aff<Domain, Range>(res);
28746}
28747
28748template <typename Domain, typename Range>
28749typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::extract_pw_multi_aff(const typed::space<Domain, Range> &space) const
28750{
28751  auto res = isl::multi_aff::extract_pw_multi_aff(space);
28752  return typed::pw_multi_aff<Domain, Range>(res);
28753}
28754
28755template <typename Domain, typename Range>
28756typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::floor() const
28757{
28758  auto res = isl::multi_aff::floor();
28759  return typed::multi_aff<Domain, Range>(res);
28760}
28761
28762template <typename Domain, typename Range>
28763typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::gist(const typed::set<Domain> &context) const
28764{
28765  auto res = isl::multi_aff::gist(context);
28766  return typed::multi_aff<Domain, Range>(res);
28767}
28768
28769template <typename Domain, typename Range>
28770typed::union_pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::gist(const typed::union_set<Domain> &context) const
28771{
28772  auto res = isl::multi_aff::gist(context);
28773  return typed::union_pw_multi_aff<Domain, Range>(res);
28774}
28775
28776template <typename Domain, typename Range>
28777typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::gist(const typed::basic_set<Domain> &context) const
28778{
28779  auto res = isl::multi_aff::gist(context);
28780  return typed::multi_aff<Domain, Range>(res);
28781}
28782
28783template <typename Domain, typename Range>
28784typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::gist(const typed::point<Domain> &context) const
28785{
28786  auto res = isl::multi_aff::gist(context);
28787  return typed::multi_aff<Domain, Range>(res);
28788}
28789
28790template <typename Domain, typename Range>
28791typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::gist_params(const typed::set<> &context) const
28792{
28793  auto res = isl::multi_aff::gist_params(context);
28794  return typed::multi_aff<Domain, Range>(res);
28795}
28796
28797template <typename Domain, typename Range>
28798typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::gist_params(const typed::basic_set<> &context) const
28799{
28800  auto res = isl::multi_aff::gist_params(context);
28801  return typed::multi_aff<Domain, Range>(res);
28802}
28803
28804template <typename Domain, typename Range>
28805typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::gist_params(const typed::point<> &context) const
28806{
28807  auto res = isl::multi_aff::gist_params(context);
28808  return typed::multi_aff<Domain, Range>(res);
28809}
28810
28811template <typename Domain, typename Range>
28812typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::identity() const
28813{
28814  auto res = isl::multi_aff::identity();
28815  return typed::multi_aff<Domain, Range>(res);
28816}
28817
28818template <typename Domain, typename Range>
28819typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::intersect_domain(const typed::set<Domain> &set) const
28820{
28821  auto res = isl::multi_aff::intersect_domain(set);
28822  return typed::pw_multi_aff<Domain, Range>(res);
28823}
28824
28825template <typename Domain, typename Range>
28826typed::union_pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::intersect_domain(const typed::space<Domain> &space) const
28827{
28828  auto res = isl::multi_aff::intersect_domain(space);
28829  return typed::union_pw_multi_aff<Domain, Range>(res);
28830}
28831
28832template <typename Domain, typename Range>
28833typed::union_pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::intersect_domain(const typed::union_set<Domain> &uset) const
28834{
28835  auto res = isl::multi_aff::intersect_domain(uset);
28836  return typed::union_pw_multi_aff<Domain, Range>(res);
28837}
28838
28839template <typename Domain, typename Range>
28840typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::intersect_params(const typed::set<> &set) const
28841{
28842  auto res = isl::multi_aff::intersect_params(set);
28843  return typed::pw_multi_aff<Domain, Range>(res);
28844}
28845
28846template <typename Domain, typename Range>
28847typed::aff_list<Domain, Anonymous> typed::multi_aff<Domain, Range>::list() const
28848{
28849  auto res = isl::multi_aff::list();
28850  return typed::aff_list<Domain, Anonymous>(res);
28851}
28852
28853template <typename Domain, typename Range>
28854typed::multi_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::max(const typed::multi_pw_aff<Domain, Range> &multi2) const
28855{
28856  auto res = isl::multi_aff::max(multi2);
28857  return typed::multi_pw_aff<Domain, Range>(res);
28858}
28859
28860template <typename Domain, typename Range>
28861typed::multi_val<Range> typed::multi_aff<Domain, Range>::max_multi_val() const
28862{
28863  auto res = isl::multi_aff::max_multi_val();
28864  return typed::multi_val<Range>(res);
28865}
28866
28867template <typename Domain, typename Range>
28868typed::multi_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::min(const typed::multi_pw_aff<Domain, Range> &multi2) const
28869{
28870  auto res = isl::multi_aff::min(multi2);
28871  return typed::multi_pw_aff<Domain, Range>(res);
28872}
28873
28874template <typename Domain, typename Range>
28875typed::multi_val<Range> typed::multi_aff<Domain, Range>::min_multi_val() const
28876{
28877  auto res = isl::multi_aff::min_multi_val();
28878  return typed::multi_val<Range>(res);
28879}
28880
28881template <typename Domain, typename Range>
28882typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::neg() const
28883{
28884  auto res = isl::multi_aff::neg();
28885  return typed::multi_aff<Domain, Range>(res);
28886}
28887
28888template <typename Domain, typename Range>
28889template <typename Domain2, typename Range2>
28890typed::multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::multi_aff<Domain, Range>::product(const typed::multi_aff<Domain2, Range2> &multi2) const
28891{
28892  auto res = isl::multi_aff::product(multi2);
28893  return typed::multi_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
28894}
28895
28896template <typename Domain, typename Range>
28897template <typename Domain2, typename Range2>
28898typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::multi_aff<Domain, Range>::product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const
28899{
28900  auto res = isl::multi_aff::product(multi2);
28901  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
28902}
28903
28904template <typename Domain, typename Range>
28905template <typename Domain2, typename Range2>
28906typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::multi_aff<Domain, Range>::product(const typed::pw_multi_aff<Domain2, Range2> &pma2) const
28907{
28908  auto res = isl::multi_aff::product(pma2);
28909  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
28910}
28911
28912template <typename Domain, typename Range>
28913template <typename Domain2>
28914typed::multi_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> typed::multi_aff<Domain, Range>::product(const typed::aff<Domain2, Anonymous> &multi2) const
28915{
28916  auto res = isl::multi_aff::product(multi2);
28917  return typed::multi_aff<pair<Domain, Domain2>, pair<Range, Anonymous>>(res);
28918}
28919
28920template <typename Domain, typename Range>
28921template <typename Domain2>
28922typed::multi_aff<Domain2, Range> typed::multi_aff<Domain, Range>::pullback(const typed::multi_aff<Domain2, Domain> &ma2) const
28923{
28924  auto res = isl::multi_aff::pullback(ma2);
28925  return typed::multi_aff<Domain2, Range>(res);
28926}
28927
28928template <typename Domain, typename Range>
28929typed::multi_aff<Range> typed::multi_aff<Domain, Range>::pullback(const typed::multi_aff<Domain> &ma2) const
28930{
28931  auto res = isl::multi_aff::pullback(ma2);
28932  return typed::multi_aff<Range>(res);
28933}
28934
28935template <typename Domain, typename Range>
28936template <typename Domain2>
28937typed::multi_pw_aff<Domain2, Range> typed::multi_aff<Domain, Range>::pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const
28938{
28939  auto res = isl::multi_aff::pullback(mpa2);
28940  return typed::multi_pw_aff<Domain2, Range>(res);
28941}
28942
28943template <typename Domain, typename Range>
28944typed::multi_pw_aff<Range> typed::multi_aff<Domain, Range>::pullback(const typed::multi_pw_aff<Domain> &mpa2) const
28945{
28946  auto res = isl::multi_aff::pullback(mpa2);
28947  return typed::multi_pw_aff<Range>(res);
28948}
28949
28950template <typename Domain, typename Range>
28951template <typename Domain2>
28952typed::pw_multi_aff<Domain2, Range> typed::multi_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain2, Domain> &pma2) const
28953{
28954  auto res = isl::multi_aff::pullback(pma2);
28955  return typed::pw_multi_aff<Domain2, Range>(res);
28956}
28957
28958template <typename Domain, typename Range>
28959typed::pw_multi_aff<Range> typed::multi_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain> &pma2) const
28960{
28961  auto res = isl::multi_aff::pullback(pma2);
28962  return typed::pw_multi_aff<Range>(res);
28963}
28964
28965template <typename Domain, typename Range>
28966template <typename Domain2>
28967typed::union_pw_multi_aff<Domain2, Range> typed::multi_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const
28968{
28969  auto res = isl::multi_aff::pullback(upma2);
28970  return typed::union_pw_multi_aff<Domain2, Range>(res);
28971}
28972
28973template <typename Domain, typename Range>
28974typed::union_pw_multi_aff<Range> typed::multi_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain> &upma2) const
28975{
28976  auto res = isl::multi_aff::pullback(upma2);
28977  return typed::union_pw_multi_aff<Range>(res);
28978}
28979
28980template <typename Domain, typename Range>
28981template <typename Domain2>
28982typed::multi_aff<Domain2, Range> typed::multi_aff<Domain, Range>::pullback(const typed::aff<Domain2, Domain> &ma2) const
28983{
28984  auto res = isl::multi_aff::pullback(ma2);
28985  return typed::multi_aff<Domain2, Range>(res);
28986}
28987
28988template <typename Domain, typename Range>
28989typed::multi_aff<Range> typed::multi_aff<Domain, Range>::pullback(const typed::aff<Domain> &ma2) const
28990{
28991  auto res = isl::multi_aff::pullback(ma2);
28992  return typed::multi_aff<Range>(res);
28993}
28994
28995template <typename Domain, typename Range>
28996typed::pw_multi_aff_list<Domain, Range> typed::multi_aff<Domain, Range>::pw_multi_aff_list() const
28997{
28998  auto res = isl::multi_aff::pw_multi_aff_list();
28999  return typed::pw_multi_aff_list<Domain, Range>(res);
29000}
29001
29002template <typename Domain, typename Range>
29003template <typename Range2>
29004typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, Range>::range_product(const typed::multi_aff<Domain, Range2> &multi2) const
29005{
29006  auto res = isl::multi_aff::range_product(multi2);
29007  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
29008}
29009
29010template <typename Domain, typename Range>
29011template <typename Range2>
29012typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, Range>::range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const
29013{
29014  auto res = isl::multi_aff::range_product(multi2);
29015  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
29016}
29017
29018template <typename Domain, typename Range>
29019template <typename Range2>
29020typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, Range>::range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const
29021{
29022  auto res = isl::multi_aff::range_product(multi2);
29023  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
29024}
29025
29026template <typename Domain, typename Range>
29027template <typename Range2>
29028typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, Range>::range_product(const typed::pw_multi_aff<Domain, Range2> &pma2) const
29029{
29030  auto res = isl::multi_aff::range_product(pma2);
29031  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
29032}
29033
29034template <typename Domain, typename Range>
29035template <typename Range2>
29036typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, Range>::range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const
29037{
29038  auto res = isl::multi_aff::range_product(upma2);
29039  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
29040}
29041
29042template <typename Domain, typename Range>
29043typed::multi_aff<Domain, pair<Range, Anonymous>> typed::multi_aff<Domain, Range>::range_product(const typed::aff<Domain, Anonymous> &multi2) const
29044{
29045  auto res = isl::multi_aff::range_product(multi2);
29046  return typed::multi_aff<Domain, pair<Range, Anonymous>>(res);
29047}
29048
29049template <typename Domain, typename Range>
29050typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::scale(const typed::multi_val<Range> &mv) const
29051{
29052  auto res = isl::multi_aff::scale(mv);
29053  return typed::multi_aff<Domain, Range>(res);
29054}
29055
29056template <typename Domain, typename Range>
29057typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::scale(const typed::val<Range> &v) const
29058{
29059  auto res = isl::multi_aff::scale(v);
29060  return typed::multi_aff<Domain, Range>(res);
29061}
29062
29063template <typename Domain, typename Range>
29064typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::scale(long v) const
29065{
29066  auto res = isl::multi_aff::scale(v);
29067  return typed::multi_aff<Domain, Range>(res);
29068}
29069
29070template <typename Domain, typename Range>
29071typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::scale_down(const typed::multi_val<Range> &mv) const
29072{
29073  auto res = isl::multi_aff::scale_down(mv);
29074  return typed::multi_aff<Domain, Range>(res);
29075}
29076
29077template <typename Domain, typename Range>
29078typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::scale_down(const typed::val<Range> &v) const
29079{
29080  auto res = isl::multi_aff::scale_down(v);
29081  return typed::multi_aff<Domain, Range>(res);
29082}
29083
29084template <typename Domain, typename Range>
29085typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::scale_down(long v) const
29086{
29087  auto res = isl::multi_aff::scale_down(v);
29088  return typed::multi_aff<Domain, Range>(res);
29089}
29090
29091template <typename Domain, typename Range>
29092typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::set_at(int pos, const typed::aff<Domain, Anonymous> &el) const
29093{
29094  auto res = isl::multi_aff::set_at(pos, el);
29095  return typed::multi_aff<Domain, Range>(res);
29096}
29097
29098template <typename Domain, typename Range>
29099typed::multi_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const
29100{
29101  auto res = isl::multi_aff::set_at(pos, el);
29102  return typed::multi_pw_aff<Domain, Range>(res);
29103}
29104
29105template <typename Domain, typename Range>
29106typed::multi_union_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const
29107{
29108  auto res = isl::multi_aff::set_at(pos, el);
29109  return typed::multi_union_pw_aff<Domain, Range>(res);
29110}
29111
29112template <typename Domain, typename Range>
29113template <typename Range2>
29114typed::multi_aff<Domain, Range2> typed::multi_aff<Domain, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
29115{
29116  auto res = isl::multi_aff::set_range_tuple(id);
29117  return typed::multi_aff<Domain, Range2>(res);
29118}
29119
29120template <typename Domain, typename Range>
29121template <typename Range2>
29122typed::multi_aff<Domain, Range2> typed::multi_aff<Domain, Range>::set_range_tuple(const std::string &id) const
29123{
29124  auto res = isl::multi_aff::set_range_tuple(id);
29125  return typed::multi_aff<Domain, Range2>(res);
29126}
29127
29128template <typename Domain, typename Range>
29129typed::space<Domain, Range> typed::multi_aff<Domain, Range>::space() const
29130{
29131  auto res = isl::multi_aff::space();
29132  return typed::space<Domain, Range>(res);
29133}
29134
29135template <typename Domain, typename Range>
29136typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::sub(const typed::multi_aff<Domain, Range> &multi2) const
29137{
29138  auto res = isl::multi_aff::sub(multi2);
29139  return typed::multi_aff<Domain, Range>(res);
29140}
29141
29142template <typename Domain, typename Range>
29143typed::multi_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::sub(const typed::multi_pw_aff<Domain, Range> &multi2) const
29144{
29145  auto res = isl::multi_aff::sub(multi2);
29146  return typed::multi_pw_aff<Domain, Range>(res);
29147}
29148
29149template <typename Domain, typename Range>
29150typed::multi_union_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::sub(const typed::multi_union_pw_aff<Domain, Range> &multi2) const
29151{
29152  auto res = isl::multi_aff::sub(multi2);
29153  return typed::multi_union_pw_aff<Domain, Range>(res);
29154}
29155
29156template <typename Domain, typename Range>
29157typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::sub(const typed::pw_multi_aff<Domain, Range> &pma2) const
29158{
29159  auto res = isl::multi_aff::sub(pma2);
29160  return typed::pw_multi_aff<Domain, Range>(res);
29161}
29162
29163template <typename Domain, typename Range>
29164typed::union_pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::sub(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
29165{
29166  auto res = isl::multi_aff::sub(upma2);
29167  return typed::union_pw_multi_aff<Domain, Range>(res);
29168}
29169
29170template <typename Domain, typename Range>
29171typed::multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::sub(const typed::aff<Domain, Range> &multi2) const
29172{
29173  auto res = isl::multi_aff::sub(multi2);
29174  return typed::multi_aff<Domain, Range>(res);
29175}
29176
29177template <typename Domain, typename Range>
29178typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::subtract_domain(const typed::set<Domain> &set) const
29179{
29180  auto res = isl::multi_aff::subtract_domain(set);
29181  return typed::pw_multi_aff<Domain, Range>(res);
29182}
29183
29184template <typename Domain, typename Range>
29185typed::union_pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::subtract_domain(const typed::space<Domain> &space) const
29186{
29187  auto res = isl::multi_aff::subtract_domain(space);
29188  return typed::union_pw_multi_aff<Domain, Range>(res);
29189}
29190
29191template <typename Domain, typename Range>
29192typed::union_pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::subtract_domain(const typed::union_set<Domain> &uset) const
29193{
29194  auto res = isl::multi_aff::subtract_domain(uset);
29195  return typed::union_pw_multi_aff<Domain, Range>(res);
29196}
29197
29198template <typename Domain, typename Range>
29199typed::multi_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::to_multi_pw_aff() const
29200{
29201  auto res = isl::multi_aff::to_multi_pw_aff();
29202  return typed::multi_pw_aff<Domain, Range>(res);
29203}
29204
29205template <typename Domain, typename Range>
29206typed::multi_union_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::to_multi_union_pw_aff() const
29207{
29208  auto res = isl::multi_aff::to_multi_union_pw_aff();
29209  return typed::multi_union_pw_aff<Domain, Range>(res);
29210}
29211
29212template <typename Domain, typename Range>
29213typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::to_pw_multi_aff() const
29214{
29215  auto res = isl::multi_aff::to_pw_multi_aff();
29216  return typed::pw_multi_aff<Domain, Range>(res);
29217}
29218
29219template <typename Domain, typename Range>
29220typed::union_pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::to_union_pw_multi_aff() const
29221{
29222  auto res = isl::multi_aff::to_union_pw_multi_aff();
29223  return typed::union_pw_multi_aff<Domain, Range>(res);
29224}
29225
29226template <typename Domain, typename Range>
29227typed::multi_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::union_add(const typed::multi_pw_aff<Domain, Range> &mpa2) const
29228{
29229  auto res = isl::multi_aff::union_add(mpa2);
29230  return typed::multi_pw_aff<Domain, Range>(res);
29231}
29232
29233template <typename Domain, typename Range>
29234typed::multi_union_pw_aff<Domain, Range> typed::multi_aff<Domain, Range>::union_add(const typed::multi_union_pw_aff<Domain, Range> &mupa2) const
29235{
29236  auto res = isl::multi_aff::union_add(mupa2);
29237  return typed::multi_union_pw_aff<Domain, Range>(res);
29238}
29239
29240template <typename Domain, typename Range>
29241typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::union_add(const typed::pw_multi_aff<Domain, Range> &pma2) const
29242{
29243  auto res = isl::multi_aff::union_add(pma2);
29244  return typed::pw_multi_aff<Domain, Range>(res);
29245}
29246
29247template <typename Domain, typename Range>
29248typed::union_pw_multi_aff<Domain, Range> typed::multi_aff<Domain, Range>::union_add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
29249{
29250  auto res = isl::multi_aff::union_add(upma2);
29251  return typed::union_pw_multi_aff<Domain, Range>(res);
29252}
29253
29254template <typename Domain2, typename Range2, typename Range>
29255typed::multi_aff<pair<Domain2, Range2>, Range>::multi_aff(const typed::aff<pair<Domain2, Range2>, Range> &aff)
29256  : isl::multi_aff(aff)
29257{
29258}
29259
29260template <typename Domain2, typename Range2, typename Range>
29261typed::multi_aff<pair<Domain2, Range2>, Range>::multi_aff(const typed::space<pair<Domain2, Range2>, Range> &space, const typed::aff_list<pair<Domain2, Range2>, Anonymous> &list)
29262  : isl::multi_aff(space, list)
29263{
29264}
29265
29266template <typename Domain2, typename Range2, typename Range>
29267typed::multi_aff<pair<Domain2, Range2>, Range>::multi_aff(const isl::ctx &ctx, const std::string &str)
29268  : isl::multi_aff(ctx, str)
29269{
29270}
29271
29272template <typename Domain2, typename Range2, typename Range>
29273typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::add(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const
29274{
29275  auto res = isl::multi_aff::add(multi2);
29276  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29277}
29278
29279template <typename Domain2, typename Range2, typename Range>
29280typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
29281{
29282  auto res = isl::multi_aff::add(multi2);
29283  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
29284}
29285
29286template <typename Domain2, typename Range2, typename Range>
29287typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
29288{
29289  auto res = isl::multi_aff::add(multi2);
29290  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
29291}
29292
29293template <typename Domain2, typename Range2, typename Range>
29294typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const
29295{
29296  auto res = isl::multi_aff::add(pma2);
29297  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29298}
29299
29300template <typename Domain2, typename Range2, typename Range>
29301typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const
29302{
29303  auto res = isl::multi_aff::add(upma2);
29304  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29305}
29306
29307template <typename Domain2, typename Range2, typename Range>
29308typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::add(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const
29309{
29310  auto res = isl::multi_aff::add(multi2);
29311  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29312}
29313
29314template <typename Domain2, typename Range2, typename Range>
29315typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::add_constant(const typed::multi_val<Range> &mv) const
29316{
29317  auto res = isl::multi_aff::add_constant(mv);
29318  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29319}
29320
29321template <typename Domain2, typename Range2, typename Range>
29322typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::add_constant(const typed::val<Range> &v) const
29323{
29324  auto res = isl::multi_aff::add_constant(v);
29325  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29326}
29327
29328template <typename Domain2, typename Range2, typename Range>
29329typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::add_constant(long v) const
29330{
29331  auto res = isl::multi_aff::add_constant(v);
29332  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29333}
29334
29335template <typename Domain2, typename Range2, typename Range>
29336template <typename Arg2>
29337typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2> typed::multi_aff<pair<Domain2, Range2>, Range>::apply(const typed::union_pw_multi_aff<Range, Arg2> &upma2) const
29338{
29339  auto res = isl::multi_aff::apply(upma2);
29340  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2>(res);
29341}
29342
29343template <typename Domain2, typename Range2, typename Range>
29344typed::map<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::as_map() const
29345{
29346  auto res = isl::multi_aff::as_map();
29347  return typed::map<pair<Domain2, Range2>, Range>(res);
29348}
29349
29350template <typename Domain2, typename Range2, typename Range>
29351typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::as_multi_aff() const
29352{
29353  auto res = isl::multi_aff::as_multi_aff();
29354  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29355}
29356
29357template <typename Domain2, typename Range2, typename Range>
29358typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::as_multi_union_pw_aff() const
29359{
29360  auto res = isl::multi_aff::as_multi_union_pw_aff();
29361  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
29362}
29363
29364template <typename Domain2, typename Range2, typename Range>
29365typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::as_pw_multi_aff() const
29366{
29367  auto res = isl::multi_aff::as_pw_multi_aff();
29368  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29369}
29370
29371template <typename Domain2, typename Range2, typename Range>
29372typed::union_map<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::as_union_map() const
29373{
29374  auto res = isl::multi_aff::as_union_map();
29375  return typed::union_map<pair<Domain2, Range2>, Range>(res);
29376}
29377
29378template <typename Domain2, typename Range2, typename Range>
29379typed::aff<pair<Domain2, Range2>, Anonymous> typed::multi_aff<pair<Domain2, Range2>, Range>::at(int pos) const
29380{
29381  auto res = isl::multi_aff::at(pos);
29382  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
29383}
29384
29385template <typename Domain2, typename Range2, typename Range>
29386typed::basic_set<pair<Domain2, Range2>> typed::multi_aff<pair<Domain2, Range2>, Range>::bind(const typed::multi_id<Range> &tuple) const
29387{
29388  auto res = isl::multi_aff::bind(tuple);
29389  return typed::basic_set<pair<Domain2, Range2>>(res);
29390}
29391
29392template <typename Domain2, typename Range2, typename Range>
29393typed::multi_aff<Range> typed::multi_aff<pair<Domain2, Range2>, Range>::bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const
29394{
29395  auto res = isl::multi_aff::bind_domain(tuple);
29396  return typed::multi_aff<Range>(res);
29397}
29398
29399template <typename Domain2, typename Range2, typename Range>
29400typed::multi_aff<Range2, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const
29401{
29402  auto res = isl::multi_aff::bind_domain_wrapped_domain(tuple);
29403  return typed::multi_aff<Range2, Range>(res);
29404}
29405
29406template <typename Domain2, typename Range2, typename Range>
29407typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::coalesce() const
29408{
29409  auto res = isl::multi_aff::coalesce();
29410  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29411}
29412
29413template <typename Domain2, typename Range2, typename Range>
29414typed::multi_val<Range> typed::multi_aff<pair<Domain2, Range2>, Range>::constant_multi_val() const
29415{
29416  auto res = isl::multi_aff::constant_multi_val();
29417  return typed::multi_val<Range>(res);
29418}
29419
29420template <typename Domain2, typename Range2, typename Range>
29421typed::set<pair<Domain2, Range2>> typed::multi_aff<pair<Domain2, Range2>, Range>::domain() const
29422{
29423  auto res = isl::multi_aff::domain();
29424  return typed::set<pair<Domain2, Range2>>(res);
29425}
29426
29427template <typename Domain2, typename Range2, typename Range>
29428typed::multi_aff<pair<Range2, Domain2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::domain_reverse() const
29429{
29430  auto res = isl::multi_aff::domain_reverse();
29431  return typed::multi_aff<pair<Range2, Domain2>, Range>(res);
29432}
29433
29434template <typename Domain2, typename Range2, typename Range>
29435typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::drop_unused_params() const
29436{
29437  auto res = isl::multi_aff::drop_unused_params();
29438  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29439}
29440
29441template <typename Domain2, typename Range2, typename Range>
29442typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::extract_pw_multi_aff(const typed::space<pair<Domain2, Range2>, Range> &space) const
29443{
29444  auto res = isl::multi_aff::extract_pw_multi_aff(space);
29445  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29446}
29447
29448template <typename Domain2, typename Range2, typename Range>
29449typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::floor() const
29450{
29451  auto res = isl::multi_aff::floor();
29452  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29453}
29454
29455template <typename Domain2, typename Range2, typename Range>
29456typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::gist(const typed::set<pair<Domain2, Range2>> &context) const
29457{
29458  auto res = isl::multi_aff::gist(context);
29459  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29460}
29461
29462template <typename Domain2, typename Range2, typename Range>
29463typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::gist(const typed::union_set<pair<Domain2, Range2>> &context) const
29464{
29465  auto res = isl::multi_aff::gist(context);
29466  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29467}
29468
29469template <typename Domain2, typename Range2, typename Range>
29470typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::gist(const typed::basic_set<pair<Domain2, Range2>> &context) const
29471{
29472  auto res = isl::multi_aff::gist(context);
29473  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29474}
29475
29476template <typename Domain2, typename Range2, typename Range>
29477typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::gist(const typed::point<pair<Domain2, Range2>> &context) const
29478{
29479  auto res = isl::multi_aff::gist(context);
29480  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29481}
29482
29483template <typename Domain2, typename Range2, typename Range>
29484typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::gist_params(const typed::set<> &context) const
29485{
29486  auto res = isl::multi_aff::gist_params(context);
29487  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29488}
29489
29490template <typename Domain2, typename Range2, typename Range>
29491typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::gist_params(const typed::basic_set<> &context) const
29492{
29493  auto res = isl::multi_aff::gist_params(context);
29494  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29495}
29496
29497template <typename Domain2, typename Range2, typename Range>
29498typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::gist_params(const typed::point<> &context) const
29499{
29500  auto res = isl::multi_aff::gist_params(context);
29501  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29502}
29503
29504template <typename Domain2, typename Range2, typename Range>
29505typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::identity() const
29506{
29507  auto res = isl::multi_aff::identity();
29508  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29509}
29510
29511template <typename Domain2, typename Range2, typename Range>
29512typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::set<pair<Domain2, Range2>> &set) const
29513{
29514  auto res = isl::multi_aff::intersect_domain(set);
29515  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29516}
29517
29518template <typename Domain2, typename Range2, typename Range>
29519typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::space<pair<Domain2, Range2>> &space) const
29520{
29521  auto res = isl::multi_aff::intersect_domain(space);
29522  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29523}
29524
29525template <typename Domain2, typename Range2, typename Range>
29526typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const
29527{
29528  auto res = isl::multi_aff::intersect_domain(uset);
29529  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29530}
29531
29532template <typename Domain2, typename Range2, typename Range>
29533typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::intersect_domain_wrapped_domain(const typed::union_set<Domain2> &uset) const
29534{
29535  auto res = isl::multi_aff::intersect_domain_wrapped_domain(uset);
29536  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29537}
29538
29539template <typename Domain2, typename Range2, typename Range>
29540typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::intersect_params(const typed::set<> &set) const
29541{
29542  auto res = isl::multi_aff::intersect_params(set);
29543  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29544}
29545
29546template <typename Domain2, typename Range2, typename Range>
29547typed::aff_list<pair<Domain2, Range2>, Anonymous> typed::multi_aff<pair<Domain2, Range2>, Range>::list() const
29548{
29549  auto res = isl::multi_aff::list();
29550  return typed::aff_list<pair<Domain2, Range2>, Anonymous>(res);
29551}
29552
29553template <typename Domain2, typename Range2, typename Range>
29554typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::max(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
29555{
29556  auto res = isl::multi_aff::max(multi2);
29557  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
29558}
29559
29560template <typename Domain2, typename Range2, typename Range>
29561typed::multi_val<Range> typed::multi_aff<pair<Domain2, Range2>, Range>::max_multi_val() const
29562{
29563  auto res = isl::multi_aff::max_multi_val();
29564  return typed::multi_val<Range>(res);
29565}
29566
29567template <typename Domain2, typename Range2, typename Range>
29568typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::min(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
29569{
29570  auto res = isl::multi_aff::min(multi2);
29571  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
29572}
29573
29574template <typename Domain2, typename Range2, typename Range>
29575typed::multi_val<Range> typed::multi_aff<pair<Domain2, Range2>, Range>::min_multi_val() const
29576{
29577  auto res = isl::multi_aff::min_multi_val();
29578  return typed::multi_val<Range>(res);
29579}
29580
29581template <typename Domain2, typename Range2, typename Range>
29582typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::neg() const
29583{
29584  auto res = isl::multi_aff::neg();
29585  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29586}
29587
29588template <typename Domain2, typename Range2, typename Range>
29589template <typename Domain3>
29590typed::pw_multi_aff<pair<Domain3, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain2> &pma2) const
29591{
29592  auto res = isl::multi_aff::preimage_domain_wrapped_domain(pma2);
29593  return typed::pw_multi_aff<pair<Domain3, Range2>, Range>(res);
29594}
29595
29596template <typename Domain2, typename Range2, typename Range>
29597template <typename Domain3>
29598typed::union_pw_multi_aff<pair<Domain3, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain2> &upma2) const
29599{
29600  auto res = isl::multi_aff::preimage_domain_wrapped_domain(upma2);
29601  return typed::union_pw_multi_aff<pair<Domain3, Range2>, Range>(res);
29602}
29603
29604template <typename Domain2, typename Range2, typename Range>
29605template <typename Arg2, typename Arg3>
29606typed::multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> typed::multi_aff<pair<Domain2, Range2>, Range>::product(const typed::multi_aff<Arg2, Arg3> &multi2) const
29607{
29608  auto res = isl::multi_aff::product(multi2);
29609  return typed::multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>>(res);
29610}
29611
29612template <typename Domain2, typename Range2, typename Range>
29613template <typename Arg2, typename Arg3>
29614typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> typed::multi_aff<pair<Domain2, Range2>, Range>::product(const typed::multi_pw_aff<Arg2, Arg3> &multi2) const
29615{
29616  auto res = isl::multi_aff::product(multi2);
29617  return typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>>(res);
29618}
29619
29620template <typename Domain2, typename Range2, typename Range>
29621template <typename Arg2, typename Arg3>
29622typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> typed::multi_aff<pair<Domain2, Range2>, Range>::product(const typed::pw_multi_aff<Arg2, Arg3> &pma2) const
29623{
29624  auto res = isl::multi_aff::product(pma2);
29625  return typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>>(res);
29626}
29627
29628template <typename Domain2, typename Range2, typename Range>
29629template <typename Arg2>
29630typed::multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>> typed::multi_aff<pair<Domain2, Range2>, Range>::product(const typed::aff<Arg2, Anonymous> &multi2) const
29631{
29632  auto res = isl::multi_aff::product(multi2);
29633  return typed::multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>>(res);
29634}
29635
29636template <typename Domain2, typename Range2, typename Range>
29637template <typename Arg2>
29638typed::multi_aff<Arg2, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_aff<Arg2, pair<Domain2, Range2>> &ma2) const
29639{
29640  auto res = isl::multi_aff::pullback(ma2);
29641  return typed::multi_aff<Arg2, Range>(res);
29642}
29643
29644template <typename Domain2, typename Range2, typename Range>
29645typed::multi_aff<Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma2) const
29646{
29647  auto res = isl::multi_aff::pullback(ma2);
29648  return typed::multi_aff<Range>(res);
29649}
29650
29651template <typename Domain2, typename Range2, typename Range>
29652template <typename Arg2>
29653typed::multi_pw_aff<Arg2, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_pw_aff<Arg2, pair<Domain2, Range2>> &mpa2) const
29654{
29655  auto res = isl::multi_aff::pullback(mpa2);
29656  return typed::multi_pw_aff<Arg2, Range>(res);
29657}
29658
29659template <typename Domain2, typename Range2, typename Range>
29660typed::multi_pw_aff<Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa2) const
29661{
29662  auto res = isl::multi_aff::pullback(mpa2);
29663  return typed::multi_pw_aff<Range>(res);
29664}
29665
29666template <typename Domain2, typename Range2, typename Range>
29667template <typename Arg2>
29668typed::pw_multi_aff<Arg2, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::pw_multi_aff<Arg2, pair<Domain2, Range2>> &pma2) const
29669{
29670  auto res = isl::multi_aff::pullback(pma2);
29671  return typed::pw_multi_aff<Arg2, Range>(res);
29672}
29673
29674template <typename Domain2, typename Range2, typename Range>
29675typed::pw_multi_aff<Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma2) const
29676{
29677  auto res = isl::multi_aff::pullback(pma2);
29678  return typed::pw_multi_aff<Range>(res);
29679}
29680
29681template <typename Domain2, typename Range2, typename Range>
29682template <typename Arg2>
29683typed::union_pw_multi_aff<Arg2, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::union_pw_multi_aff<Arg2, pair<Domain2, Range2>> &upma2) const
29684{
29685  auto res = isl::multi_aff::pullback(upma2);
29686  return typed::union_pw_multi_aff<Arg2, Range>(res);
29687}
29688
29689template <typename Domain2, typename Range2, typename Range>
29690typed::union_pw_multi_aff<Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma2) const
29691{
29692  auto res = isl::multi_aff::pullback(upma2);
29693  return typed::union_pw_multi_aff<Range>(res);
29694}
29695
29696template <typename Domain2, typename Range2, typename Range>
29697template <typename Arg2>
29698typed::multi_aff<Arg2, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::aff<Arg2, pair<Domain2, Range2>> &ma2) const
29699{
29700  auto res = isl::multi_aff::pullback(ma2);
29701  return typed::multi_aff<Arg2, Range>(res);
29702}
29703
29704template <typename Domain2, typename Range2, typename Range>
29705typed::multi_aff<Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::aff<pair<Domain2, Range2>> &ma2) const
29706{
29707  auto res = isl::multi_aff::pullback(ma2);
29708  return typed::multi_aff<Range>(res);
29709}
29710
29711template <typename Domain2, typename Range2, typename Range>
29712typed::pw_multi_aff_list<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::pw_multi_aff_list() const
29713{
29714  auto res = isl::multi_aff::pw_multi_aff_list();
29715  return typed::pw_multi_aff_list<pair<Domain2, Range2>, Range>(res);
29716}
29717
29718template <typename Domain2, typename Range2, typename Range>
29719template <typename Arg2>
29720typed::multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::multi_aff<pair<Domain2, Range2>, Arg2> &multi2) const
29721{
29722  auto res = isl::multi_aff::range_product(multi2);
29723  return typed::multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
29724}
29725
29726template <typename Domain2, typename Range2, typename Range>
29727template <typename Arg2>
29728typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const
29729{
29730  auto res = isl::multi_aff::range_product(multi2);
29731  return typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
29732}
29733
29734template <typename Domain2, typename Range2, typename Range>
29735template <typename Arg2>
29736typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const
29737{
29738  auto res = isl::multi_aff::range_product(multi2);
29739  return typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
29740}
29741
29742template <typename Domain2, typename Range2, typename Range>
29743template <typename Arg2>
29744typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg2> &pma2) const
29745{
29746  auto res = isl::multi_aff::range_product(pma2);
29747  return typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
29748}
29749
29750template <typename Domain2, typename Range2, typename Range>
29751template <typename Arg2>
29752typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2> &upma2) const
29753{
29754  auto res = isl::multi_aff::range_product(upma2);
29755  return typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
29756}
29757
29758template <typename Domain2, typename Range2, typename Range>
29759typed::multi_aff<pair<Domain2, Range2>, pair<Range, Anonymous>> typed::multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::aff<pair<Domain2, Range2>, Anonymous> &multi2) const
29760{
29761  auto res = isl::multi_aff::range_product(multi2);
29762  return typed::multi_aff<pair<Domain2, Range2>, pair<Range, Anonymous>>(res);
29763}
29764
29765template <typename Domain2, typename Range2, typename Range>
29766typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::scale(const typed::multi_val<Range> &mv) const
29767{
29768  auto res = isl::multi_aff::scale(mv);
29769  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29770}
29771
29772template <typename Domain2, typename Range2, typename Range>
29773typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::scale(const typed::val<Range> &v) const
29774{
29775  auto res = isl::multi_aff::scale(v);
29776  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29777}
29778
29779template <typename Domain2, typename Range2, typename Range>
29780typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::scale(long v) const
29781{
29782  auto res = isl::multi_aff::scale(v);
29783  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29784}
29785
29786template <typename Domain2, typename Range2, typename Range>
29787typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::scale_down(const typed::multi_val<Range> &mv) const
29788{
29789  auto res = isl::multi_aff::scale_down(mv);
29790  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29791}
29792
29793template <typename Domain2, typename Range2, typename Range>
29794typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::scale_down(const typed::val<Range> &v) const
29795{
29796  auto res = isl::multi_aff::scale_down(v);
29797  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29798}
29799
29800template <typename Domain2, typename Range2, typename Range>
29801typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::scale_down(long v) const
29802{
29803  auto res = isl::multi_aff::scale_down(v);
29804  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29805}
29806
29807template <typename Domain2, typename Range2, typename Range>
29808typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::set_at(int pos, const typed::aff<pair<Domain2, Range2>, Anonymous> &el) const
29809{
29810  auto res = isl::multi_aff::set_at(pos, el);
29811  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29812}
29813
29814template <typename Domain2, typename Range2, typename Range>
29815typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
29816{
29817  auto res = isl::multi_aff::set_at(pos, el);
29818  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
29819}
29820
29821template <typename Domain2, typename Range2, typename Range>
29822typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
29823{
29824  auto res = isl::multi_aff::set_at(pos, el);
29825  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
29826}
29827
29828template <typename Domain2, typename Range2, typename Range>
29829template <typename Arg1>
29830typed::multi_aff<pair<Domain2, Range2>, Arg1> typed::multi_aff<pair<Domain2, Range2>, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
29831{
29832  auto res = isl::multi_aff::set_range_tuple(id);
29833  return typed::multi_aff<pair<Domain2, Range2>, Arg1>(res);
29834}
29835
29836template <typename Domain2, typename Range2, typename Range>
29837template <typename Arg1>
29838typed::multi_aff<pair<Domain2, Range2>, Arg1> typed::multi_aff<pair<Domain2, Range2>, Range>::set_range_tuple(const std::string &id) const
29839{
29840  auto res = isl::multi_aff::set_range_tuple(id);
29841  return typed::multi_aff<pair<Domain2, Range2>, Arg1>(res);
29842}
29843
29844template <typename Domain2, typename Range2, typename Range>
29845typed::space<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::space() const
29846{
29847  auto res = isl::multi_aff::space();
29848  return typed::space<pair<Domain2, Range2>, Range>(res);
29849}
29850
29851template <typename Domain2, typename Range2, typename Range>
29852typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const
29853{
29854  auto res = isl::multi_aff::sub(multi2);
29855  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29856}
29857
29858template <typename Domain2, typename Range2, typename Range>
29859typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
29860{
29861  auto res = isl::multi_aff::sub(multi2);
29862  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
29863}
29864
29865template <typename Domain2, typename Range2, typename Range>
29866typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
29867{
29868  auto res = isl::multi_aff::sub(multi2);
29869  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
29870}
29871
29872template <typename Domain2, typename Range2, typename Range>
29873typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const
29874{
29875  auto res = isl::multi_aff::sub(pma2);
29876  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29877}
29878
29879template <typename Domain2, typename Range2, typename Range>
29880typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const
29881{
29882  auto res = isl::multi_aff::sub(upma2);
29883  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29884}
29885
29886template <typename Domain2, typename Range2, typename Range>
29887typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const
29888{
29889  auto res = isl::multi_aff::sub(multi2);
29890  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
29891}
29892
29893template <typename Domain2, typename Range2, typename Range>
29894typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::subtract_domain(const typed::set<pair<Domain2, Range2>> &set) const
29895{
29896  auto res = isl::multi_aff::subtract_domain(set);
29897  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29898}
29899
29900template <typename Domain2, typename Range2, typename Range>
29901typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::subtract_domain(const typed::space<pair<Domain2, Range2>> &space) const
29902{
29903  auto res = isl::multi_aff::subtract_domain(space);
29904  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29905}
29906
29907template <typename Domain2, typename Range2, typename Range>
29908typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::subtract_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const
29909{
29910  auto res = isl::multi_aff::subtract_domain(uset);
29911  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29912}
29913
29914template <typename Domain2, typename Range2, typename Range>
29915typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::to_multi_pw_aff() const
29916{
29917  auto res = isl::multi_aff::to_multi_pw_aff();
29918  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
29919}
29920
29921template <typename Domain2, typename Range2, typename Range>
29922typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::to_multi_union_pw_aff() const
29923{
29924  auto res = isl::multi_aff::to_multi_union_pw_aff();
29925  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
29926}
29927
29928template <typename Domain2, typename Range2, typename Range>
29929typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::to_pw_multi_aff() const
29930{
29931  auto res = isl::multi_aff::to_pw_multi_aff();
29932  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29933}
29934
29935template <typename Domain2, typename Range2, typename Range>
29936typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::to_union_pw_multi_aff() const
29937{
29938  auto res = isl::multi_aff::to_union_pw_multi_aff();
29939  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29940}
29941
29942template <typename Domain2, typename Range2, typename Range>
29943typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &mpa2) const
29944{
29945  auto res = isl::multi_aff::union_add(mpa2);
29946  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
29947}
29948
29949template <typename Domain2, typename Range2, typename Range>
29950typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &mupa2) const
29951{
29952  auto res = isl::multi_aff::union_add(mupa2);
29953  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
29954}
29955
29956template <typename Domain2, typename Range2, typename Range>
29957typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const
29958{
29959  auto res = isl::multi_aff::union_add(pma2);
29960  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29961}
29962
29963template <typename Domain2, typename Range2, typename Range>
29964typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const
29965{
29966  auto res = isl::multi_aff::union_add(upma2);
29967  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
29968}
29969
29970template <typename Domain, typename Range, typename Range2>
29971typed::multi_aff<Domain, pair<Range, Range2>>::multi_aff(const typed::aff<Domain, pair<Range, Range2>> &aff)
29972  : isl::multi_aff(aff)
29973{
29974}
29975
29976template <typename Domain, typename Range, typename Range2>
29977typed::multi_aff<Domain, pair<Range, Range2>>::multi_aff(const typed::space<Domain, pair<Range, Range2>> &space, const typed::aff_list<Domain, Anonymous> &list)
29978  : isl::multi_aff(space, list)
29979{
29980}
29981
29982template <typename Domain, typename Range, typename Range2>
29983typed::multi_aff<Domain, pair<Range, Range2>>::multi_aff(const isl::ctx &ctx, const std::string &str)
29984  : isl::multi_aff(ctx, str)
29985{
29986}
29987
29988template <typename Domain, typename Range, typename Range2>
29989typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::add(const typed::multi_aff<Domain, pair<Range, Range2>> &multi2) const
29990{
29991  auto res = isl::multi_aff::add(multi2);
29992  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
29993}
29994
29995template <typename Domain, typename Range, typename Range2>
29996typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::add(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const
29997{
29998  auto res = isl::multi_aff::add(multi2);
29999  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
30000}
30001
30002template <typename Domain, typename Range, typename Range2>
30003typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::add(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &multi2) const
30004{
30005  auto res = isl::multi_aff::add(multi2);
30006  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
30007}
30008
30009template <typename Domain, typename Range, typename Range2>
30010typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const
30011{
30012  auto res = isl::multi_aff::add(pma2);
30013  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30014}
30015
30016template <typename Domain, typename Range, typename Range2>
30017typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
30018{
30019  auto res = isl::multi_aff::add(upma2);
30020  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
30021}
30022
30023template <typename Domain, typename Range, typename Range2>
30024typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::add(const typed::aff<Domain, pair<Range, Range2>> &multi2) const
30025{
30026  auto res = isl::multi_aff::add(multi2);
30027  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30028}
30029
30030template <typename Domain, typename Range, typename Range2>
30031typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::add_constant(const typed::multi_val<pair<Range, Range2>> &mv) const
30032{
30033  auto res = isl::multi_aff::add_constant(mv);
30034  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30035}
30036
30037template <typename Domain, typename Range, typename Range2>
30038typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::add_constant(const typed::val<pair<Range, Range2>> &v) const
30039{
30040  auto res = isl::multi_aff::add_constant(v);
30041  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30042}
30043
30044template <typename Domain, typename Range, typename Range2>
30045typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::add_constant(long v) const
30046{
30047  auto res = isl::multi_aff::add_constant(v);
30048  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30049}
30050
30051template <typename Domain, typename Range, typename Range2>
30052template <typename Arg3>
30053typed::union_pw_multi_aff<Domain, Arg3> typed::multi_aff<Domain, pair<Range, Range2>>::apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg3> &upma2) const
30054{
30055  auto res = isl::multi_aff::apply(upma2);
30056  return typed::union_pw_multi_aff<Domain, Arg3>(res);
30057}
30058
30059template <typename Domain, typename Range, typename Range2>
30060typed::map<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::as_map() const
30061{
30062  auto res = isl::multi_aff::as_map();
30063  return typed::map<Domain, pair<Range, Range2>>(res);
30064}
30065
30066template <typename Domain, typename Range, typename Range2>
30067typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::as_multi_aff() const
30068{
30069  auto res = isl::multi_aff::as_multi_aff();
30070  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30071}
30072
30073template <typename Domain, typename Range, typename Range2>
30074typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::as_multi_union_pw_aff() const
30075{
30076  auto res = isl::multi_aff::as_multi_union_pw_aff();
30077  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
30078}
30079
30080template <typename Domain, typename Range, typename Range2>
30081typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::as_pw_multi_aff() const
30082{
30083  auto res = isl::multi_aff::as_pw_multi_aff();
30084  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30085}
30086
30087template <typename Domain, typename Range, typename Range2>
30088typed::union_map<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::as_union_map() const
30089{
30090  auto res = isl::multi_aff::as_union_map();
30091  return typed::union_map<Domain, pair<Range, Range2>>(res);
30092}
30093
30094template <typename Domain, typename Range, typename Range2>
30095typed::aff<Domain, Anonymous> typed::multi_aff<Domain, pair<Range, Range2>>::at(int pos) const
30096{
30097  auto res = isl::multi_aff::at(pos);
30098  return typed::aff<Domain, Anonymous>(res);
30099}
30100
30101template <typename Domain, typename Range, typename Range2>
30102typed::basic_set<Domain> typed::multi_aff<Domain, pair<Range, Range2>>::bind(const typed::multi_id<pair<Range, Range2>> &tuple) const
30103{
30104  auto res = isl::multi_aff::bind(tuple);
30105  return typed::basic_set<Domain>(res);
30106}
30107
30108template <typename Domain, typename Range, typename Range2>
30109typed::multi_aff<pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::bind_domain(const typed::multi_id<Domain> &tuple) const
30110{
30111  auto res = isl::multi_aff::bind_domain(tuple);
30112  return typed::multi_aff<pair<Range, Range2>>(res);
30113}
30114
30115template <typename Domain, typename Range, typename Range2>
30116typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::coalesce() const
30117{
30118  auto res = isl::multi_aff::coalesce();
30119  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30120}
30121
30122template <typename Domain, typename Range, typename Range2>
30123typed::multi_val<pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::constant_multi_val() const
30124{
30125  auto res = isl::multi_aff::constant_multi_val();
30126  return typed::multi_val<pair<Range, Range2>>(res);
30127}
30128
30129template <typename Domain, typename Range, typename Range2>
30130typed::set<Domain> typed::multi_aff<Domain, pair<Range, Range2>>::domain() const
30131{
30132  auto res = isl::multi_aff::domain();
30133  return typed::set<Domain>(res);
30134}
30135
30136template <typename Domain, typename Range, typename Range2>
30137typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::drop_unused_params() const
30138{
30139  auto res = isl::multi_aff::drop_unused_params();
30140  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30141}
30142
30143template <typename Domain, typename Range, typename Range2>
30144typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::extract_pw_multi_aff(const typed::space<Domain, pair<Range, Range2>> &space) const
30145{
30146  auto res = isl::multi_aff::extract_pw_multi_aff(space);
30147  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30148}
30149
30150template <typename Domain, typename Range, typename Range2>
30151typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::floor() const
30152{
30153  auto res = isl::multi_aff::floor();
30154  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30155}
30156
30157template <typename Domain, typename Range, typename Range2>
30158typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::gist(const typed::set<Domain> &context) const
30159{
30160  auto res = isl::multi_aff::gist(context);
30161  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30162}
30163
30164template <typename Domain, typename Range, typename Range2>
30165typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::gist(const typed::union_set<Domain> &context) const
30166{
30167  auto res = isl::multi_aff::gist(context);
30168  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
30169}
30170
30171template <typename Domain, typename Range, typename Range2>
30172typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::gist(const typed::basic_set<Domain> &context) const
30173{
30174  auto res = isl::multi_aff::gist(context);
30175  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30176}
30177
30178template <typename Domain, typename Range, typename Range2>
30179typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::gist(const typed::point<Domain> &context) const
30180{
30181  auto res = isl::multi_aff::gist(context);
30182  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30183}
30184
30185template <typename Domain, typename Range, typename Range2>
30186typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::gist_params(const typed::set<> &context) const
30187{
30188  auto res = isl::multi_aff::gist_params(context);
30189  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30190}
30191
30192template <typename Domain, typename Range, typename Range2>
30193typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::gist_params(const typed::basic_set<> &context) const
30194{
30195  auto res = isl::multi_aff::gist_params(context);
30196  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30197}
30198
30199template <typename Domain, typename Range, typename Range2>
30200typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::gist_params(const typed::point<> &context) const
30201{
30202  auto res = isl::multi_aff::gist_params(context);
30203  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30204}
30205
30206template <typename Domain, typename Range, typename Range2>
30207typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::identity() const
30208{
30209  auto res = isl::multi_aff::identity();
30210  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30211}
30212
30213template <typename Domain, typename Range, typename Range2>
30214typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::set<Domain> &set) const
30215{
30216  auto res = isl::multi_aff::intersect_domain(set);
30217  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30218}
30219
30220template <typename Domain, typename Range, typename Range2>
30221typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::space<Domain> &space) const
30222{
30223  auto res = isl::multi_aff::intersect_domain(space);
30224  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
30225}
30226
30227template <typename Domain, typename Range, typename Range2>
30228typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::union_set<Domain> &uset) const
30229{
30230  auto res = isl::multi_aff::intersect_domain(uset);
30231  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
30232}
30233
30234template <typename Domain, typename Range, typename Range2>
30235typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::intersect_params(const typed::set<> &set) const
30236{
30237  auto res = isl::multi_aff::intersect_params(set);
30238  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30239}
30240
30241template <typename Domain, typename Range, typename Range2>
30242typed::aff_list<Domain, Anonymous> typed::multi_aff<Domain, pair<Range, Range2>>::list() const
30243{
30244  auto res = isl::multi_aff::list();
30245  return typed::aff_list<Domain, Anonymous>(res);
30246}
30247
30248template <typename Domain, typename Range, typename Range2>
30249typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::max(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const
30250{
30251  auto res = isl::multi_aff::max(multi2);
30252  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
30253}
30254
30255template <typename Domain, typename Range, typename Range2>
30256typed::multi_val<pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::max_multi_val() const
30257{
30258  auto res = isl::multi_aff::max_multi_val();
30259  return typed::multi_val<pair<Range, Range2>>(res);
30260}
30261
30262template <typename Domain, typename Range, typename Range2>
30263typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::min(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const
30264{
30265  auto res = isl::multi_aff::min(multi2);
30266  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
30267}
30268
30269template <typename Domain, typename Range, typename Range2>
30270typed::multi_val<pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::min_multi_val() const
30271{
30272  auto res = isl::multi_aff::min_multi_val();
30273  return typed::multi_val<pair<Range, Range2>>(res);
30274}
30275
30276template <typename Domain, typename Range, typename Range2>
30277typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::neg() const
30278{
30279  auto res = isl::multi_aff::neg();
30280  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30281}
30282
30283template <typename Domain, typename Range, typename Range2>
30284template <typename Domain2, typename Arg3>
30285typed::multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::multi_aff<Domain, pair<Range, Range2>>::product(const typed::multi_aff<Domain2, Arg3> &multi2) const
30286{
30287  auto res = isl::multi_aff::product(multi2);
30288  return typed::multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
30289}
30290
30291template <typename Domain, typename Range, typename Range2>
30292template <typename Domain2, typename Arg3>
30293typed::multi_pw_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::multi_aff<Domain, pair<Range, Range2>>::product(const typed::multi_pw_aff<Domain2, Arg3> &multi2) const
30294{
30295  auto res = isl::multi_aff::product(multi2);
30296  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
30297}
30298
30299template <typename Domain, typename Range, typename Range2>
30300template <typename Domain2, typename Arg3>
30301typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::multi_aff<Domain, pair<Range, Range2>>::product(const typed::pw_multi_aff<Domain2, Arg3> &pma2) const
30302{
30303  auto res = isl::multi_aff::product(pma2);
30304  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
30305}
30306
30307template <typename Domain, typename Range, typename Range2>
30308template <typename Domain2>
30309typed::multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Anonymous>> typed::multi_aff<Domain, pair<Range, Range2>>::product(const typed::aff<Domain2, Anonymous> &multi2) const
30310{
30311  auto res = isl::multi_aff::product(multi2);
30312  return typed::multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Anonymous>>(res);
30313}
30314
30315template <typename Domain, typename Range, typename Range2>
30316template <typename Domain2>
30317typed::multi_aff<Domain2, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_aff<Domain2, Domain> &ma2) const
30318{
30319  auto res = isl::multi_aff::pullback(ma2);
30320  return typed::multi_aff<Domain2, pair<Range, Range2>>(res);
30321}
30322
30323template <typename Domain, typename Range, typename Range2>
30324typed::multi_aff<pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_aff<Domain> &ma2) const
30325{
30326  auto res = isl::multi_aff::pullback(ma2);
30327  return typed::multi_aff<pair<Range, Range2>>(res);
30328}
30329
30330template <typename Domain, typename Range, typename Range2>
30331template <typename Domain2>
30332typed::multi_pw_aff<Domain2, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const
30333{
30334  auto res = isl::multi_aff::pullback(mpa2);
30335  return typed::multi_pw_aff<Domain2, pair<Range, Range2>>(res);
30336}
30337
30338template <typename Domain, typename Range, typename Range2>
30339typed::multi_pw_aff<pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_pw_aff<Domain> &mpa2) const
30340{
30341  auto res = isl::multi_aff::pullback(mpa2);
30342  return typed::multi_pw_aff<pair<Range, Range2>>(res);
30343}
30344
30345template <typename Domain, typename Range, typename Range2>
30346template <typename Domain2>
30347typed::pw_multi_aff<Domain2, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<Domain2, Domain> &pma2) const
30348{
30349  auto res = isl::multi_aff::pullback(pma2);
30350  return typed::pw_multi_aff<Domain2, pair<Range, Range2>>(res);
30351}
30352
30353template <typename Domain, typename Range, typename Range2>
30354typed::pw_multi_aff<pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<Domain> &pma2) const
30355{
30356  auto res = isl::multi_aff::pullback(pma2);
30357  return typed::pw_multi_aff<pair<Range, Range2>>(res);
30358}
30359
30360template <typename Domain, typename Range, typename Range2>
30361template <typename Domain2>
30362typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const
30363{
30364  auto res = isl::multi_aff::pullback(upma2);
30365  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
30366}
30367
30368template <typename Domain, typename Range, typename Range2>
30369typed::union_pw_multi_aff<pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<Domain> &upma2) const
30370{
30371  auto res = isl::multi_aff::pullback(upma2);
30372  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
30373}
30374
30375template <typename Domain, typename Range, typename Range2>
30376template <typename Domain2>
30377typed::multi_aff<Domain2, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::aff<Domain2, Domain> &ma2) const
30378{
30379  auto res = isl::multi_aff::pullback(ma2);
30380  return typed::multi_aff<Domain2, pair<Range, Range2>>(res);
30381}
30382
30383template <typename Domain, typename Range, typename Range2>
30384typed::multi_aff<pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::aff<Domain> &ma2) const
30385{
30386  auto res = isl::multi_aff::pullback(ma2);
30387  return typed::multi_aff<pair<Range, Range2>>(res);
30388}
30389
30390template <typename Domain, typename Range, typename Range2>
30391typed::pw_multi_aff_list<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::pw_multi_aff_list() const
30392{
30393  auto res = isl::multi_aff::pw_multi_aff_list();
30394  return typed::pw_multi_aff_list<Domain, pair<Range, Range2>>(res);
30395}
30396
30397template <typename Domain, typename Range, typename Range2>
30398typed::pw_multi_aff<Domain, Range> typed::multi_aff<Domain, pair<Range, Range2>>::range_factor_domain() const
30399{
30400  auto res = isl::multi_aff::range_factor_domain();
30401  return typed::pw_multi_aff<Domain, Range>(res);
30402}
30403
30404template <typename Domain, typename Range, typename Range2>
30405typed::pw_multi_aff<Domain, Range2> typed::multi_aff<Domain, pair<Range, Range2>>::range_factor_range() const
30406{
30407  auto res = isl::multi_aff::range_factor_range();
30408  return typed::pw_multi_aff<Domain, Range2>(res);
30409}
30410
30411template <typename Domain, typename Range, typename Range2>
30412template <typename Arg3>
30413typed::multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::multi_aff<Domain, Arg3> &multi2) const
30414{
30415  auto res = isl::multi_aff::range_product(multi2);
30416  return typed::multi_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
30417}
30418
30419template <typename Domain, typename Range, typename Range2>
30420template <typename Arg3>
30421typed::multi_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::multi_pw_aff<Domain, Arg3> &multi2) const
30422{
30423  auto res = isl::multi_aff::range_product(multi2);
30424  return typed::multi_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
30425}
30426
30427template <typename Domain, typename Range, typename Range2>
30428template <typename Arg3>
30429typed::multi_union_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::multi_union_pw_aff<Domain, Arg3> &multi2) const
30430{
30431  auto res = isl::multi_aff::range_product(multi2);
30432  return typed::multi_union_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
30433}
30434
30435template <typename Domain, typename Range, typename Range2>
30436template <typename Arg3>
30437typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::pw_multi_aff<Domain, Arg3> &pma2) const
30438{
30439  auto res = isl::multi_aff::range_product(pma2);
30440  return typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
30441}
30442
30443template <typename Domain, typename Range, typename Range2>
30444template <typename Arg3>
30445typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::union_pw_multi_aff<Domain, Arg3> &upma2) const
30446{
30447  auto res = isl::multi_aff::range_product(upma2);
30448  return typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
30449}
30450
30451template <typename Domain, typename Range, typename Range2>
30452typed::multi_aff<Domain, pair<pair<Range, Range2>, Anonymous>> typed::multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::aff<Domain, Anonymous> &multi2) const
30453{
30454  auto res = isl::multi_aff::range_product(multi2);
30455  return typed::multi_aff<Domain, pair<pair<Range, Range2>, Anonymous>>(res);
30456}
30457
30458template <typename Domain, typename Range, typename Range2>
30459typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::scale(const typed::multi_val<pair<Range, Range2>> &mv) const
30460{
30461  auto res = isl::multi_aff::scale(mv);
30462  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30463}
30464
30465template <typename Domain, typename Range, typename Range2>
30466typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::scale(const typed::val<pair<Range, Range2>> &v) const
30467{
30468  auto res = isl::multi_aff::scale(v);
30469  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30470}
30471
30472template <typename Domain, typename Range, typename Range2>
30473typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::scale(long v) const
30474{
30475  auto res = isl::multi_aff::scale(v);
30476  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30477}
30478
30479template <typename Domain, typename Range, typename Range2>
30480typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::scale_down(const typed::multi_val<pair<Range, Range2>> &mv) const
30481{
30482  auto res = isl::multi_aff::scale_down(mv);
30483  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30484}
30485
30486template <typename Domain, typename Range, typename Range2>
30487typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::scale_down(const typed::val<pair<Range, Range2>> &v) const
30488{
30489  auto res = isl::multi_aff::scale_down(v);
30490  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30491}
30492
30493template <typename Domain, typename Range, typename Range2>
30494typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::scale_down(long v) const
30495{
30496  auto res = isl::multi_aff::scale_down(v);
30497  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30498}
30499
30500template <typename Domain, typename Range, typename Range2>
30501typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::set_at(int pos, const typed::aff<Domain, Anonymous> &el) const
30502{
30503  auto res = isl::multi_aff::set_at(pos, el);
30504  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30505}
30506
30507template <typename Domain, typename Range, typename Range2>
30508typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const
30509{
30510  auto res = isl::multi_aff::set_at(pos, el);
30511  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
30512}
30513
30514template <typename Domain, typename Range, typename Range2>
30515typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const
30516{
30517  auto res = isl::multi_aff::set_at(pos, el);
30518  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
30519}
30520
30521template <typename Domain, typename Range, typename Range2>
30522typed::space<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::space() const
30523{
30524  auto res = isl::multi_aff::space();
30525  return typed::space<Domain, pair<Range, Range2>>(res);
30526}
30527
30528template <typename Domain, typename Range, typename Range2>
30529typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::sub(const typed::multi_aff<Domain, pair<Range, Range2>> &multi2) const
30530{
30531  auto res = isl::multi_aff::sub(multi2);
30532  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30533}
30534
30535template <typename Domain, typename Range, typename Range2>
30536typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::sub(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const
30537{
30538  auto res = isl::multi_aff::sub(multi2);
30539  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
30540}
30541
30542template <typename Domain, typename Range, typename Range2>
30543typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::sub(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &multi2) const
30544{
30545  auto res = isl::multi_aff::sub(multi2);
30546  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
30547}
30548
30549template <typename Domain, typename Range, typename Range2>
30550typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::sub(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const
30551{
30552  auto res = isl::multi_aff::sub(pma2);
30553  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30554}
30555
30556template <typename Domain, typename Range, typename Range2>
30557typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::sub(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
30558{
30559  auto res = isl::multi_aff::sub(upma2);
30560  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
30561}
30562
30563template <typename Domain, typename Range, typename Range2>
30564typed::multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::sub(const typed::aff<Domain, pair<Range, Range2>> &multi2) const
30565{
30566  auto res = isl::multi_aff::sub(multi2);
30567  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
30568}
30569
30570template <typename Domain, typename Range, typename Range2>
30571typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::set<Domain> &set) const
30572{
30573  auto res = isl::multi_aff::subtract_domain(set);
30574  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30575}
30576
30577template <typename Domain, typename Range, typename Range2>
30578typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::space<Domain> &space) const
30579{
30580  auto res = isl::multi_aff::subtract_domain(space);
30581  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
30582}
30583
30584template <typename Domain, typename Range, typename Range2>
30585typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::union_set<Domain> &uset) const
30586{
30587  auto res = isl::multi_aff::subtract_domain(uset);
30588  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
30589}
30590
30591template <typename Domain, typename Range, typename Range2>
30592typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::to_multi_pw_aff() const
30593{
30594  auto res = isl::multi_aff::to_multi_pw_aff();
30595  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
30596}
30597
30598template <typename Domain, typename Range, typename Range2>
30599typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::to_multi_union_pw_aff() const
30600{
30601  auto res = isl::multi_aff::to_multi_union_pw_aff();
30602  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
30603}
30604
30605template <typename Domain, typename Range, typename Range2>
30606typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::to_pw_multi_aff() const
30607{
30608  auto res = isl::multi_aff::to_pw_multi_aff();
30609  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30610}
30611
30612template <typename Domain, typename Range, typename Range2>
30613typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::to_union_pw_multi_aff() const
30614{
30615  auto res = isl::multi_aff::to_union_pw_multi_aff();
30616  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
30617}
30618
30619template <typename Domain, typename Range, typename Range2>
30620typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &mpa2) const
30621{
30622  auto res = isl::multi_aff::union_add(mpa2);
30623  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
30624}
30625
30626template <typename Domain, typename Range, typename Range2>
30627typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &mupa2) const
30628{
30629  auto res = isl::multi_aff::union_add(mupa2);
30630  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
30631}
30632
30633template <typename Domain, typename Range, typename Range2>
30634typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const
30635{
30636  auto res = isl::multi_aff::union_add(pma2);
30637  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
30638}
30639
30640template <typename Domain, typename Range, typename Range2>
30641typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
30642{
30643  auto res = isl::multi_aff::union_add(upma2);
30644  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
30645}
30646
30647template <typename T1, typename T2, typename Range, typename Range2>
30648typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::multi_aff(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &aff)
30649  : isl::multi_aff(aff)
30650{
30651}
30652
30653template <typename T1, typename T2, typename Range, typename Range2>
30654typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::multi_aff(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space, const typed::aff_list<pair<T1, T2>, Anonymous> &list)
30655  : isl::multi_aff(space, list)
30656{
30657}
30658
30659template <typename T1, typename T2, typename Range, typename Range2>
30660typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::multi_aff(const isl::ctx &ctx, const std::string &str)
30661  : isl::multi_aff(ctx, str)
30662{
30663}
30664
30665template <typename T1, typename T2, typename Range, typename Range2>
30666typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
30667{
30668  auto res = isl::multi_aff::add(multi2);
30669  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30670}
30671
30672template <typename T1, typename T2, typename Range, typename Range2>
30673typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
30674{
30675  auto res = isl::multi_aff::add(multi2);
30676  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30677}
30678
30679template <typename T1, typename T2, typename Range, typename Range2>
30680typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
30681{
30682  auto res = isl::multi_aff::add(multi2);
30683  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30684}
30685
30686template <typename T1, typename T2, typename Range, typename Range2>
30687typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
30688{
30689  auto res = isl::multi_aff::add(pma2);
30690  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30691}
30692
30693template <typename T1, typename T2, typename Range, typename Range2>
30694typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
30695{
30696  auto res = isl::multi_aff::add(upma2);
30697  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30698}
30699
30700template <typename T1, typename T2, typename Range, typename Range2>
30701typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
30702{
30703  auto res = isl::multi_aff::add(multi2);
30704  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30705}
30706
30707template <typename T1, typename T2, typename Range, typename Range2>
30708typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::add_constant(const typed::multi_val<pair<Range, Range2>> &mv) const
30709{
30710  auto res = isl::multi_aff::add_constant(mv);
30711  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30712}
30713
30714template <typename T1, typename T2, typename Range, typename Range2>
30715typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::add_constant(const typed::val<pair<Range, Range2>> &v) const
30716{
30717  auto res = isl::multi_aff::add_constant(v);
30718  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30719}
30720
30721template <typename T1, typename T2, typename Range, typename Range2>
30722typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::add_constant(long v) const
30723{
30724  auto res = isl::multi_aff::add_constant(v);
30725  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30726}
30727
30728template <typename T1, typename T2, typename Range, typename Range2>
30729template <typename Arg2>
30730typed::union_pw_multi_aff<pair<T1, T2>, Arg2> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg2> &upma2) const
30731{
30732  auto res = isl::multi_aff::apply(upma2);
30733  return typed::union_pw_multi_aff<pair<T1, T2>, Arg2>(res);
30734}
30735
30736template <typename T1, typename T2, typename Range, typename Range2>
30737typed::map<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_map() const
30738{
30739  auto res = isl::multi_aff::as_map();
30740  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
30741}
30742
30743template <typename T1, typename T2, typename Range, typename Range2>
30744typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_multi_aff() const
30745{
30746  auto res = isl::multi_aff::as_multi_aff();
30747  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30748}
30749
30750template <typename T1, typename T2, typename Range, typename Range2>
30751typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_multi_union_pw_aff() const
30752{
30753  auto res = isl::multi_aff::as_multi_union_pw_aff();
30754  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30755}
30756
30757template <typename T1, typename T2, typename Range, typename Range2>
30758typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_pw_multi_aff() const
30759{
30760  auto res = isl::multi_aff::as_pw_multi_aff();
30761  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30762}
30763
30764template <typename T1, typename T2, typename Range, typename Range2>
30765typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_union_map() const
30766{
30767  auto res = isl::multi_aff::as_union_map();
30768  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
30769}
30770
30771template <typename T1, typename T2, typename Range, typename Range2>
30772typed::aff<pair<T1, T2>, Anonymous> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::at(int pos) const
30773{
30774  auto res = isl::multi_aff::at(pos);
30775  return typed::aff<pair<T1, T2>, Anonymous>(res);
30776}
30777
30778template <typename T1, typename T2, typename Range, typename Range2>
30779typed::basic_set<pair<T1, T2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::bind(const typed::multi_id<pair<Range, Range2>> &tuple) const
30780{
30781  auto res = isl::multi_aff::bind(tuple);
30782  return typed::basic_set<pair<T1, T2>>(res);
30783}
30784
30785template <typename T1, typename T2, typename Range, typename Range2>
30786typed::multi_aff<pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const
30787{
30788  auto res = isl::multi_aff::bind_domain(tuple);
30789  return typed::multi_aff<pair<Range, Range2>>(res);
30790}
30791
30792template <typename T1, typename T2, typename Range, typename Range2>
30793typed::multi_aff<T2, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::bind_domain_wrapped_domain(const typed::multi_id<T1> &tuple) const
30794{
30795  auto res = isl::multi_aff::bind_domain_wrapped_domain(tuple);
30796  return typed::multi_aff<T2, pair<Range, Range2>>(res);
30797}
30798
30799template <typename T1, typename T2, typename Range, typename Range2>
30800typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::coalesce() const
30801{
30802  auto res = isl::multi_aff::coalesce();
30803  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30804}
30805
30806template <typename T1, typename T2, typename Range, typename Range2>
30807typed::multi_val<pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::constant_multi_val() const
30808{
30809  auto res = isl::multi_aff::constant_multi_val();
30810  return typed::multi_val<pair<Range, Range2>>(res);
30811}
30812
30813template <typename T1, typename T2, typename Range, typename Range2>
30814typed::set<pair<T1, T2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::domain() const
30815{
30816  auto res = isl::multi_aff::domain();
30817  return typed::set<pair<T1, T2>>(res);
30818}
30819
30820template <typename T1, typename T2, typename Range, typename Range2>
30821typed::multi_aff<pair<T2, T1>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::domain_reverse() const
30822{
30823  auto res = isl::multi_aff::domain_reverse();
30824  return typed::multi_aff<pair<T2, T1>, pair<Range, Range2>>(res);
30825}
30826
30827template <typename T1, typename T2, typename Range, typename Range2>
30828typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::drop_unused_params() const
30829{
30830  auto res = isl::multi_aff::drop_unused_params();
30831  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30832}
30833
30834template <typename T1, typename T2, typename Range, typename Range2>
30835typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::extract_pw_multi_aff(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const
30836{
30837  auto res = isl::multi_aff::extract_pw_multi_aff(space);
30838  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30839}
30840
30841template <typename T1, typename T2, typename Range, typename Range2>
30842typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::floor() const
30843{
30844  auto res = isl::multi_aff::floor();
30845  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30846}
30847
30848template <typename T1, typename T2, typename Range, typename Range2>
30849typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::set<pair<T1, T2>> &context) const
30850{
30851  auto res = isl::multi_aff::gist(context);
30852  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30853}
30854
30855template <typename T1, typename T2, typename Range, typename Range2>
30856typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::union_set<pair<T1, T2>> &context) const
30857{
30858  auto res = isl::multi_aff::gist(context);
30859  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30860}
30861
30862template <typename T1, typename T2, typename Range, typename Range2>
30863typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::basic_set<pair<T1, T2>> &context) const
30864{
30865  auto res = isl::multi_aff::gist(context);
30866  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30867}
30868
30869template <typename T1, typename T2, typename Range, typename Range2>
30870typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::point<pair<T1, T2>> &context) const
30871{
30872  auto res = isl::multi_aff::gist(context);
30873  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30874}
30875
30876template <typename T1, typename T2, typename Range, typename Range2>
30877typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::set<> &context) const
30878{
30879  auto res = isl::multi_aff::gist_params(context);
30880  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30881}
30882
30883template <typename T1, typename T2, typename Range, typename Range2>
30884typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::basic_set<> &context) const
30885{
30886  auto res = isl::multi_aff::gist_params(context);
30887  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30888}
30889
30890template <typename T1, typename T2, typename Range, typename Range2>
30891typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::point<> &context) const
30892{
30893  auto res = isl::multi_aff::gist_params(context);
30894  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30895}
30896
30897template <typename T1, typename T2, typename Range, typename Range2>
30898typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::identity() const
30899{
30900  auto res = isl::multi_aff::identity();
30901  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30902}
30903
30904template <typename T1, typename T2, typename Range, typename Range2>
30905typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::set<pair<T1, T2>> &set) const
30906{
30907  auto res = isl::multi_aff::intersect_domain(set);
30908  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30909}
30910
30911template <typename T1, typename T2, typename Range, typename Range2>
30912typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::space<pair<T1, T2>> &space) const
30913{
30914  auto res = isl::multi_aff::intersect_domain(space);
30915  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30916}
30917
30918template <typename T1, typename T2, typename Range, typename Range2>
30919typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const
30920{
30921  auto res = isl::multi_aff::intersect_domain(uset);
30922  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30923}
30924
30925template <typename T1, typename T2, typename Range, typename Range2>
30926typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::union_set<T1> &uset) const
30927{
30928  auto res = isl::multi_aff::intersect_domain_wrapped_domain(uset);
30929  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30930}
30931
30932template <typename T1, typename T2, typename Range, typename Range2>
30933typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::set<> &set) const
30934{
30935  auto res = isl::multi_aff::intersect_params(set);
30936  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30937}
30938
30939template <typename T1, typename T2, typename Range, typename Range2>
30940typed::aff_list<pair<T1, T2>, Anonymous> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::list() const
30941{
30942  auto res = isl::multi_aff::list();
30943  return typed::aff_list<pair<T1, T2>, Anonymous>(res);
30944}
30945
30946template <typename T1, typename T2, typename Range, typename Range2>
30947typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::max(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
30948{
30949  auto res = isl::multi_aff::max(multi2);
30950  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30951}
30952
30953template <typename T1, typename T2, typename Range, typename Range2>
30954typed::multi_val<pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::max_multi_val() const
30955{
30956  auto res = isl::multi_aff::max_multi_val();
30957  return typed::multi_val<pair<Range, Range2>>(res);
30958}
30959
30960template <typename T1, typename T2, typename Range, typename Range2>
30961typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::min(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
30962{
30963  auto res = isl::multi_aff::min(multi2);
30964  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30965}
30966
30967template <typename T1, typename T2, typename Range, typename Range2>
30968typed::multi_val<pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::min_multi_val() const
30969{
30970  auto res = isl::multi_aff::min_multi_val();
30971  return typed::multi_val<pair<Range, Range2>>(res);
30972}
30973
30974template <typename T1, typename T2, typename Range, typename Range2>
30975typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::neg() const
30976{
30977  auto res = isl::multi_aff::neg();
30978  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
30979}
30980
30981template <typename T1, typename T2, typename Range, typename Range2>
30982template <typename Domain3>
30983typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, T1> &pma2) const
30984{
30985  auto res = isl::multi_aff::preimage_domain_wrapped_domain(pma2);
30986  return typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
30987}
30988
30989template <typename T1, typename T2, typename Range, typename Range2>
30990template <typename Domain3>
30991typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, T1> &upma2) const
30992{
30993  auto res = isl::multi_aff::preimage_domain_wrapped_domain(upma2);
30994  return typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
30995}
30996
30997template <typename T1, typename T2, typename Range, typename Range2>
30998template <typename Domain2, typename Arg2>
30999typed::multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::product(const typed::multi_aff<Domain2, Arg2> &multi2) const
31000{
31001  auto res = isl::multi_aff::product(multi2);
31002  return typed::multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
31003}
31004
31005template <typename T1, typename T2, typename Range, typename Range2>
31006template <typename Domain2, typename Arg2>
31007typed::multi_pw_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::product(const typed::multi_pw_aff<Domain2, Arg2> &multi2) const
31008{
31009  auto res = isl::multi_aff::product(multi2);
31010  return typed::multi_pw_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
31011}
31012
31013template <typename T1, typename T2, typename Range, typename Range2>
31014template <typename Domain2, typename Arg2>
31015typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::product(const typed::pw_multi_aff<Domain2, Arg2> &pma2) const
31016{
31017  auto res = isl::multi_aff::product(pma2);
31018  return typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
31019}
31020
31021template <typename T1, typename T2, typename Range, typename Range2>
31022template <typename Domain2>
31023typed::multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Anonymous>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::product(const typed::aff<Domain2, Anonymous> &multi2) const
31024{
31025  auto res = isl::multi_aff::product(multi2);
31026  return typed::multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Anonymous>>(res);
31027}
31028
31029template <typename T1, typename T2, typename Range, typename Range2>
31030template <typename Domain2>
31031typed::multi_aff<Domain2, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_aff<Domain2, pair<T1, T2>> &ma2) const
31032{
31033  auto res = isl::multi_aff::pullback(ma2);
31034  return typed::multi_aff<Domain2, pair<Range, Range2>>(res);
31035}
31036
31037template <typename T1, typename T2, typename Range, typename Range2>
31038typed::multi_aff<pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_aff<pair<T1, T2>> &ma2) const
31039{
31040  auto res = isl::multi_aff::pullback(ma2);
31041  return typed::multi_aff<pair<Range, Range2>>(res);
31042}
31043
31044template <typename T1, typename T2, typename Range, typename Range2>
31045template <typename Domain2>
31046typed::multi_pw_aff<Domain2, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa2) const
31047{
31048  auto res = isl::multi_aff::pullback(mpa2);
31049  return typed::multi_pw_aff<Domain2, pair<Range, Range2>>(res);
31050}
31051
31052template <typename T1, typename T2, typename Range, typename Range2>
31053typed::multi_pw_aff<pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_pw_aff<pair<T1, T2>> &mpa2) const
31054{
31055  auto res = isl::multi_aff::pullback(mpa2);
31056  return typed::multi_pw_aff<pair<Range, Range2>>(res);
31057}
31058
31059template <typename T1, typename T2, typename Range, typename Range2>
31060template <typename Domain2>
31061typed::pw_multi_aff<Domain2, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma2) const
31062{
31063  auto res = isl::multi_aff::pullback(pma2);
31064  return typed::pw_multi_aff<Domain2, pair<Range, Range2>>(res);
31065}
31066
31067template <typename T1, typename T2, typename Range, typename Range2>
31068typed::pw_multi_aff<pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<pair<T1, T2>> &pma2) const
31069{
31070  auto res = isl::multi_aff::pullback(pma2);
31071  return typed::pw_multi_aff<pair<Range, Range2>>(res);
31072}
31073
31074template <typename T1, typename T2, typename Range, typename Range2>
31075template <typename Domain2>
31076typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma2) const
31077{
31078  auto res = isl::multi_aff::pullback(upma2);
31079  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
31080}
31081
31082template <typename T1, typename T2, typename Range, typename Range2>
31083typed::union_pw_multi_aff<pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<pair<T1, T2>> &upma2) const
31084{
31085  auto res = isl::multi_aff::pullback(upma2);
31086  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
31087}
31088
31089template <typename T1, typename T2, typename Range, typename Range2>
31090template <typename Domain2>
31091typed::multi_aff<Domain2, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::aff<Domain2, pair<T1, T2>> &ma2) const
31092{
31093  auto res = isl::multi_aff::pullback(ma2);
31094  return typed::multi_aff<Domain2, pair<Range, Range2>>(res);
31095}
31096
31097template <typename T1, typename T2, typename Range, typename Range2>
31098typed::multi_aff<pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::aff<pair<T1, T2>> &ma2) const
31099{
31100  auto res = isl::multi_aff::pullback(ma2);
31101  return typed::multi_aff<pair<Range, Range2>>(res);
31102}
31103
31104template <typename T1, typename T2, typename Range, typename Range2>
31105typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::pw_multi_aff_list() const
31106{
31107  auto res = isl::multi_aff::pw_multi_aff_list();
31108  return typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>>(res);
31109}
31110
31111template <typename T1, typename T2, typename Range, typename Range2>
31112typed::pw_multi_aff<pair<T1, T2>, Range> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_factor_domain() const
31113{
31114  auto res = isl::multi_aff::range_factor_domain();
31115  return typed::pw_multi_aff<pair<T1, T2>, Range>(res);
31116}
31117
31118template <typename T1, typename T2, typename Range, typename Range2>
31119typed::pw_multi_aff<pair<T1, T2>, Range2> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_factor_range() const
31120{
31121  auto res = isl::multi_aff::range_factor_range();
31122  return typed::pw_multi_aff<pair<T1, T2>, Range2>(res);
31123}
31124
31125template <typename T1, typename T2, typename Range, typename Range2>
31126template <typename Arg2>
31127typed::multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::multi_aff<pair<T1, T2>, Arg2> &multi2) const
31128{
31129  auto res = isl::multi_aff::range_product(multi2);
31130  return typed::multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
31131}
31132
31133template <typename T1, typename T2, typename Range, typename Range2>
31134template <typename Arg2>
31135typed::multi_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::multi_pw_aff<pair<T1, T2>, Arg2> &multi2) const
31136{
31137  auto res = isl::multi_aff::range_product(multi2);
31138  return typed::multi_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
31139}
31140
31141template <typename T1, typename T2, typename Range, typename Range2>
31142template <typename Arg2>
31143typed::multi_union_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::multi_union_pw_aff<pair<T1, T2>, Arg2> &multi2) const
31144{
31145  auto res = isl::multi_aff::range_product(multi2);
31146  return typed::multi_union_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
31147}
31148
31149template <typename T1, typename T2, typename Range, typename Range2>
31150template <typename Arg2>
31151typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::pw_multi_aff<pair<T1, T2>, Arg2> &pma2) const
31152{
31153  auto res = isl::multi_aff::range_product(pma2);
31154  return typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
31155}
31156
31157template <typename T1, typename T2, typename Range, typename Range2>
31158template <typename Arg2>
31159typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::union_pw_multi_aff<pair<T1, T2>, Arg2> &upma2) const
31160{
31161  auto res = isl::multi_aff::range_product(upma2);
31162  return typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
31163}
31164
31165template <typename T1, typename T2, typename Range, typename Range2>
31166typed::multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Anonymous>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::aff<pair<T1, T2>, Anonymous> &multi2) const
31167{
31168  auto res = isl::multi_aff::range_product(multi2);
31169  return typed::multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Anonymous>>(res);
31170}
31171
31172template <typename T1, typename T2, typename Range, typename Range2>
31173typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale(const typed::multi_val<pair<Range, Range2>> &mv) const
31174{
31175  auto res = isl::multi_aff::scale(mv);
31176  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31177}
31178
31179template <typename T1, typename T2, typename Range, typename Range2>
31180typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale(const typed::val<pair<Range, Range2>> &v) const
31181{
31182  auto res = isl::multi_aff::scale(v);
31183  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31184}
31185
31186template <typename T1, typename T2, typename Range, typename Range2>
31187typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale(long v) const
31188{
31189  auto res = isl::multi_aff::scale(v);
31190  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31191}
31192
31193template <typename T1, typename T2, typename Range, typename Range2>
31194typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale_down(const typed::multi_val<pair<Range, Range2>> &mv) const
31195{
31196  auto res = isl::multi_aff::scale_down(mv);
31197  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31198}
31199
31200template <typename T1, typename T2, typename Range, typename Range2>
31201typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale_down(const typed::val<pair<Range, Range2>> &v) const
31202{
31203  auto res = isl::multi_aff::scale_down(v);
31204  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31205}
31206
31207template <typename T1, typename T2, typename Range, typename Range2>
31208typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale_down(long v) const
31209{
31210  auto res = isl::multi_aff::scale_down(v);
31211  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31212}
31213
31214template <typename T1, typename T2, typename Range, typename Range2>
31215typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::set_at(int pos, const typed::aff<pair<T1, T2>, Anonymous> &el) const
31216{
31217  auto res = isl::multi_aff::set_at(pos, el);
31218  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31219}
31220
31221template <typename T1, typename T2, typename Range, typename Range2>
31222typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::set_at(int pos, const typed::pw_aff<pair<T1, T2>, Anonymous> &el) const
31223{
31224  auto res = isl::multi_aff::set_at(pos, el);
31225  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31226}
31227
31228template <typename T1, typename T2, typename Range, typename Range2>
31229typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::set_at(int pos, const typed::union_pw_aff<pair<T1, T2>, Anonymous> &el) const
31230{
31231  auto res = isl::multi_aff::set_at(pos, el);
31232  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31233}
31234
31235template <typename T1, typename T2, typename Range, typename Range2>
31236typed::space<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::space() const
31237{
31238  auto res = isl::multi_aff::space();
31239  return typed::space<pair<T1, T2>, pair<Range, Range2>>(res);
31240}
31241
31242template <typename T1, typename T2, typename Range, typename Range2>
31243typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
31244{
31245  auto res = isl::multi_aff::sub(multi2);
31246  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31247}
31248
31249template <typename T1, typename T2, typename Range, typename Range2>
31250typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
31251{
31252  auto res = isl::multi_aff::sub(multi2);
31253  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31254}
31255
31256template <typename T1, typename T2, typename Range, typename Range2>
31257typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
31258{
31259  auto res = isl::multi_aff::sub(multi2);
31260  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31261}
31262
31263template <typename T1, typename T2, typename Range, typename Range2>
31264typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
31265{
31266  auto res = isl::multi_aff::sub(pma2);
31267  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31268}
31269
31270template <typename T1, typename T2, typename Range, typename Range2>
31271typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
31272{
31273  auto res = isl::multi_aff::sub(upma2);
31274  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31275}
31276
31277template <typename T1, typename T2, typename Range, typename Range2>
31278typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
31279{
31280  auto res = isl::multi_aff::sub(multi2);
31281  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31282}
31283
31284template <typename T1, typename T2, typename Range, typename Range2>
31285typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::set<pair<T1, T2>> &set) const
31286{
31287  auto res = isl::multi_aff::subtract_domain(set);
31288  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31289}
31290
31291template <typename T1, typename T2, typename Range, typename Range2>
31292typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::space<pair<T1, T2>> &space) const
31293{
31294  auto res = isl::multi_aff::subtract_domain(space);
31295  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31296}
31297
31298template <typename T1, typename T2, typename Range, typename Range2>
31299typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::union_set<pair<T1, T2>> &uset) const
31300{
31301  auto res = isl::multi_aff::subtract_domain(uset);
31302  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31303}
31304
31305template <typename T1, typename T2, typename Range, typename Range2>
31306typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::to_multi_pw_aff() const
31307{
31308  auto res = isl::multi_aff::to_multi_pw_aff();
31309  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31310}
31311
31312template <typename T1, typename T2, typename Range, typename Range2>
31313typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::to_multi_union_pw_aff() const
31314{
31315  auto res = isl::multi_aff::to_multi_union_pw_aff();
31316  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31317}
31318
31319template <typename T1, typename T2, typename Range, typename Range2>
31320typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::to_pw_multi_aff() const
31321{
31322  auto res = isl::multi_aff::to_pw_multi_aff();
31323  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31324}
31325
31326template <typename T1, typename T2, typename Range, typename Range2>
31327typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::to_union_pw_multi_aff() const
31328{
31329  auto res = isl::multi_aff::to_union_pw_multi_aff();
31330  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31331}
31332
31333template <typename T1, typename T2, typename Range, typename Range2>
31334typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &mpa2) const
31335{
31336  auto res = isl::multi_aff::union_add(mpa2);
31337  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31338}
31339
31340template <typename T1, typename T2, typename Range, typename Range2>
31341typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &mupa2) const
31342{
31343  auto res = isl::multi_aff::union_add(mupa2);
31344  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31345}
31346
31347template <typename T1, typename T2, typename Range, typename Range2>
31348typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
31349{
31350  auto res = isl::multi_aff::union_add(pma2);
31351  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31352}
31353
31354template <typename T1, typename T2, typename Range, typename Range2>
31355typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
31356{
31357  auto res = isl::multi_aff::union_add(upma2);
31358  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
31359}
31360
31361template <typename Domain>
31362typed::multi_id<Domain>::multi_id(const typed::space<Domain> &space, const typed::id_list<Anonymous> &list)
31363  : isl::multi_id(space, list)
31364{
31365}
31366
31367template <typename Domain>
31368typed::multi_id<Domain>::multi_id(const isl::ctx &ctx, const std::string &str)
31369  : isl::multi_id(ctx, str)
31370{
31371}
31372
31373template <typename Domain>
31374typed::id<Anonymous> typed::multi_id<Domain>::at(int pos) const
31375{
31376  auto res = isl::multi_id::at(pos);
31377  return typed::id<Anonymous>(res);
31378}
31379
31380template <typename Domain>
31381typed::id_list<Anonymous> typed::multi_id<Domain>::list() const
31382{
31383  auto res = isl::multi_id::list();
31384  return typed::id_list<Anonymous>(res);
31385}
31386
31387template <typename Domain>
31388typed::multi_id<Domain> typed::multi_id<Domain>::set_at(int pos, const typed::id<Anonymous> &el) const
31389{
31390  auto res = isl::multi_id::set_at(pos, el);
31391  return typed::multi_id<Domain>(res);
31392}
31393
31394template <typename Domain>
31395typed::multi_id<Domain> typed::multi_id<Domain>::set_at(int pos, const std::string &el) const
31396{
31397  auto res = isl::multi_id::set_at(pos, el);
31398  return typed::multi_id<Domain>(res);
31399}
31400
31401template <typename Domain>
31402typed::space<Domain> typed::multi_id<Domain>::space() const
31403{
31404  auto res = isl::multi_id::space();
31405  return typed::space<Domain>(res);
31406}
31407
31408template <typename Domain>
31409typed::multi_pw_aff<Domain>::multi_pw_aff(const typed::aff<Domain> &aff)
31410  : isl::multi_pw_aff(aff)
31411{
31412}
31413
31414template <typename Domain>
31415typed::multi_pw_aff<Domain>::multi_pw_aff(const typed::multi_aff<Domain> &ma)
31416  : isl::multi_pw_aff(ma)
31417{
31418}
31419
31420template <typename Domain>
31421typed::multi_pw_aff<Domain>::multi_pw_aff(const typed::pw_aff<Domain> &pa)
31422  : isl::multi_pw_aff(pa)
31423{
31424}
31425
31426template <typename Domain>
31427typed::multi_pw_aff<Domain>::multi_pw_aff(const typed::space<Domain> &space, const typed::pw_aff_list<Anonymous> &list)
31428  : isl::multi_pw_aff(space, list)
31429{
31430}
31431
31432template <typename Domain>
31433typed::multi_pw_aff<Domain>::multi_pw_aff(const typed::pw_multi_aff<Domain> &pma)
31434  : isl::multi_pw_aff(pma)
31435{
31436}
31437
31438template <typename Domain>
31439typed::multi_pw_aff<Domain>::multi_pw_aff(const isl::ctx &ctx, const std::string &str)
31440  : isl::multi_pw_aff(ctx, str)
31441{
31442}
31443
31444template <typename Domain>
31445typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::add(const typed::multi_pw_aff<Domain> &multi2) const
31446{
31447  auto res = isl::multi_pw_aff::add(multi2);
31448  return typed::multi_pw_aff<Domain>(res);
31449}
31450
31451template <typename Domain>
31452typed::multi_union_pw_aff<Domain> typed::multi_pw_aff<Domain>::add(const typed::multi_union_pw_aff<Domain> &multi2) const
31453{
31454  auto res = isl::multi_pw_aff::add(multi2);
31455  return typed::multi_union_pw_aff<Domain>(res);
31456}
31457
31458template <typename Domain>
31459typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::add(const typed::aff<Domain> &multi2) const
31460{
31461  auto res = isl::multi_pw_aff::add(multi2);
31462  return typed::multi_pw_aff<Domain>(res);
31463}
31464
31465template <typename Domain>
31466typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::add(const typed::multi_aff<Domain> &multi2) const
31467{
31468  auto res = isl::multi_pw_aff::add(multi2);
31469  return typed::multi_pw_aff<Domain>(res);
31470}
31471
31472template <typename Domain>
31473typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::add(const typed::pw_aff<Domain> &multi2) const
31474{
31475  auto res = isl::multi_pw_aff::add(multi2);
31476  return typed::multi_pw_aff<Domain>(res);
31477}
31478
31479template <typename Domain>
31480typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::add(const typed::pw_multi_aff<Domain> &multi2) const
31481{
31482  auto res = isl::multi_pw_aff::add(multi2);
31483  return typed::multi_pw_aff<Domain>(res);
31484}
31485
31486template <typename Domain>
31487typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::add_constant(const typed::multi_val<Domain> &mv) const
31488{
31489  auto res = isl::multi_pw_aff::add_constant(mv);
31490  return typed::multi_pw_aff<Domain>(res);
31491}
31492
31493template <typename Domain>
31494typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::add_constant(const typed::val<Domain> &v) const
31495{
31496  auto res = isl::multi_pw_aff::add_constant(v);
31497  return typed::multi_pw_aff<Domain>(res);
31498}
31499
31500template <typename Domain>
31501typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::add_constant(long v) const
31502{
31503  auto res = isl::multi_pw_aff::add_constant(v);
31504  return typed::multi_pw_aff<Domain>(res);
31505}
31506
31507template <typename Domain>
31508typed::multi_aff<Domain> typed::multi_pw_aff<Domain>::as_multi_aff() const
31509{
31510  auto res = isl::multi_pw_aff::as_multi_aff();
31511  return typed::multi_aff<Domain>(res);
31512}
31513
31514template <typename Domain>
31515typed::set<Domain> typed::multi_pw_aff<Domain>::as_set() const
31516{
31517  auto res = isl::multi_pw_aff::as_set();
31518  return typed::set<Domain>(res);
31519}
31520
31521template <typename Domain>
31522typed::pw_aff<Anonymous> typed::multi_pw_aff<Domain>::at(int pos) const
31523{
31524  auto res = isl::multi_pw_aff::at(pos);
31525  return typed::pw_aff<Anonymous>(res);
31526}
31527
31528template <typename Domain>
31529typed::set<> typed::multi_pw_aff<Domain>::bind(const typed::multi_id<Domain> &tuple) const
31530{
31531  auto res = isl::multi_pw_aff::bind(tuple);
31532  return typed::set<>(res);
31533}
31534
31535template <typename Domain>
31536typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::coalesce() const
31537{
31538  auto res = isl::multi_pw_aff::coalesce();
31539  return typed::multi_pw_aff<Domain>(res);
31540}
31541
31542template <typename Domain>
31543typed::set<> typed::multi_pw_aff<Domain>::domain() const
31544{
31545  auto res = isl::multi_pw_aff::domain();
31546  return typed::set<>(res);
31547}
31548
31549template <typename Domain>
31550typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::gist(const typed::set<> &set) const
31551{
31552  auto res = isl::multi_pw_aff::gist(set);
31553  return typed::multi_pw_aff<Domain>(res);
31554}
31555
31556template <typename Domain>
31557typed::multi_union_pw_aff<Domain> typed::multi_pw_aff<Domain>::gist(const typed::union_set<> &context) const
31558{
31559  auto res = isl::multi_pw_aff::gist(context);
31560  return typed::multi_union_pw_aff<Domain>(res);
31561}
31562
31563template <typename Domain>
31564typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::gist(const typed::basic_set<> &set) const
31565{
31566  auto res = isl::multi_pw_aff::gist(set);
31567  return typed::multi_pw_aff<Domain>(res);
31568}
31569
31570template <typename Domain>
31571typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::gist(const typed::point<> &set) const
31572{
31573  auto res = isl::multi_pw_aff::gist(set);
31574  return typed::multi_pw_aff<Domain>(res);
31575}
31576
31577template <typename Domain>
31578typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::gist_params(const typed::set<> &set) const
31579{
31580  auto res = isl::multi_pw_aff::gist_params(set);
31581  return typed::multi_pw_aff<Domain>(res);
31582}
31583
31584template <typename Domain>
31585typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::gist_params(const typed::basic_set<> &set) const
31586{
31587  auto res = isl::multi_pw_aff::gist_params(set);
31588  return typed::multi_pw_aff<Domain>(res);
31589}
31590
31591template <typename Domain>
31592typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::gist_params(const typed::point<> &set) const
31593{
31594  auto res = isl::multi_pw_aff::gist_params(set);
31595  return typed::multi_pw_aff<Domain>(res);
31596}
31597
31598template <typename Domain>
31599typed::multi_pw_aff<Domain, Domain> typed::multi_pw_aff<Domain>::identity() const
31600{
31601  auto res = isl::multi_pw_aff::identity();
31602  return typed::multi_pw_aff<Domain, Domain>(res);
31603}
31604
31605template <typename Domain>
31606template <typename Arg1>
31607typed::multi_pw_aff<Arg1, Domain> typed::multi_pw_aff<Domain>::insert_domain(const typed::space<Arg1> &domain) const
31608{
31609  auto res = isl::multi_pw_aff::insert_domain(domain);
31610  return typed::multi_pw_aff<Arg1, Domain>(res);
31611}
31612
31613template <typename Domain>
31614typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::intersect_params(const typed::set<> &set) const
31615{
31616  auto res = isl::multi_pw_aff::intersect_params(set);
31617  return typed::multi_pw_aff<Domain>(res);
31618}
31619
31620template <typename Domain>
31621typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::intersect_params(const typed::basic_set<> &set) const
31622{
31623  auto res = isl::multi_pw_aff::intersect_params(set);
31624  return typed::multi_pw_aff<Domain>(res);
31625}
31626
31627template <typename Domain>
31628typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::intersect_params(const typed::point<> &set) const
31629{
31630  auto res = isl::multi_pw_aff::intersect_params(set);
31631  return typed::multi_pw_aff<Domain>(res);
31632}
31633
31634template <typename Domain>
31635typed::pw_aff_list<Anonymous> typed::multi_pw_aff<Domain>::list() const
31636{
31637  auto res = isl::multi_pw_aff::list();
31638  return typed::pw_aff_list<Anonymous>(res);
31639}
31640
31641template <typename Domain>
31642typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::max(const typed::multi_pw_aff<Domain> &multi2) const
31643{
31644  auto res = isl::multi_pw_aff::max(multi2);
31645  return typed::multi_pw_aff<Domain>(res);
31646}
31647
31648template <typename Domain>
31649typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::max(const typed::aff<Domain> &multi2) const
31650{
31651  auto res = isl::multi_pw_aff::max(multi2);
31652  return typed::multi_pw_aff<Domain>(res);
31653}
31654
31655template <typename Domain>
31656typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::max(const typed::multi_aff<Domain> &multi2) const
31657{
31658  auto res = isl::multi_pw_aff::max(multi2);
31659  return typed::multi_pw_aff<Domain>(res);
31660}
31661
31662template <typename Domain>
31663typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::max(const typed::pw_aff<Domain> &multi2) const
31664{
31665  auto res = isl::multi_pw_aff::max(multi2);
31666  return typed::multi_pw_aff<Domain>(res);
31667}
31668
31669template <typename Domain>
31670typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::max(const typed::pw_multi_aff<Domain> &multi2) const
31671{
31672  auto res = isl::multi_pw_aff::max(multi2);
31673  return typed::multi_pw_aff<Domain>(res);
31674}
31675
31676template <typename Domain>
31677typed::multi_val<Domain> typed::multi_pw_aff<Domain>::max_multi_val() const
31678{
31679  auto res = isl::multi_pw_aff::max_multi_val();
31680  return typed::multi_val<Domain>(res);
31681}
31682
31683template <typename Domain>
31684typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::min(const typed::multi_pw_aff<Domain> &multi2) const
31685{
31686  auto res = isl::multi_pw_aff::min(multi2);
31687  return typed::multi_pw_aff<Domain>(res);
31688}
31689
31690template <typename Domain>
31691typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::min(const typed::aff<Domain> &multi2) const
31692{
31693  auto res = isl::multi_pw_aff::min(multi2);
31694  return typed::multi_pw_aff<Domain>(res);
31695}
31696
31697template <typename Domain>
31698typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::min(const typed::multi_aff<Domain> &multi2) const
31699{
31700  auto res = isl::multi_pw_aff::min(multi2);
31701  return typed::multi_pw_aff<Domain>(res);
31702}
31703
31704template <typename Domain>
31705typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::min(const typed::pw_aff<Domain> &multi2) const
31706{
31707  auto res = isl::multi_pw_aff::min(multi2);
31708  return typed::multi_pw_aff<Domain>(res);
31709}
31710
31711template <typename Domain>
31712typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::min(const typed::pw_multi_aff<Domain> &multi2) const
31713{
31714  auto res = isl::multi_pw_aff::min(multi2);
31715  return typed::multi_pw_aff<Domain>(res);
31716}
31717
31718template <typename Domain>
31719typed::multi_val<Domain> typed::multi_pw_aff<Domain>::min_multi_val() const
31720{
31721  auto res = isl::multi_pw_aff::min_multi_val();
31722  return typed::multi_val<Domain>(res);
31723}
31724
31725template <typename Domain>
31726typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::neg() const
31727{
31728  auto res = isl::multi_pw_aff::neg();
31729  return typed::multi_pw_aff<Domain>(res);
31730}
31731
31732template <typename Domain>
31733template <typename Range>
31734typed::multi_pw_aff<pair<Domain, Range>> typed::multi_pw_aff<Domain>::product(const typed::multi_pw_aff<Range> &multi2) const
31735{
31736  auto res = isl::multi_pw_aff::product(multi2);
31737  return typed::multi_pw_aff<pair<Domain, Range>>(res);
31738}
31739
31740template <typename Domain>
31741typed::multi_pw_aff<pair<Domain, Anonymous>> typed::multi_pw_aff<Domain>::product(const typed::aff<Anonymous> &multi2) const
31742{
31743  auto res = isl::multi_pw_aff::product(multi2);
31744  return typed::multi_pw_aff<pair<Domain, Anonymous>>(res);
31745}
31746
31747template <typename Domain>
31748template <typename Range>
31749typed::multi_pw_aff<pair<Domain, Range>> typed::multi_pw_aff<Domain>::product(const typed::multi_aff<Range> &multi2) const
31750{
31751  auto res = isl::multi_pw_aff::product(multi2);
31752  return typed::multi_pw_aff<pair<Domain, Range>>(res);
31753}
31754
31755template <typename Domain>
31756typed::multi_pw_aff<pair<Domain, Anonymous>> typed::multi_pw_aff<Domain>::product(const typed::pw_aff<Anonymous> &multi2) const
31757{
31758  auto res = isl::multi_pw_aff::product(multi2);
31759  return typed::multi_pw_aff<pair<Domain, Anonymous>>(res);
31760}
31761
31762template <typename Domain>
31763template <typename Range>
31764typed::multi_pw_aff<pair<Domain, Range>> typed::multi_pw_aff<Domain>::product(const typed::pw_multi_aff<Range> &multi2) const
31765{
31766  auto res = isl::multi_pw_aff::product(multi2);
31767  return typed::multi_pw_aff<pair<Domain, Range>>(res);
31768}
31769
31770template <typename Domain>
31771typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::scale(const typed::multi_val<Domain> &mv) const
31772{
31773  auto res = isl::multi_pw_aff::scale(mv);
31774  return typed::multi_pw_aff<Domain>(res);
31775}
31776
31777template <typename Domain>
31778typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::scale(const typed::val<Domain> &v) const
31779{
31780  auto res = isl::multi_pw_aff::scale(v);
31781  return typed::multi_pw_aff<Domain>(res);
31782}
31783
31784template <typename Domain>
31785typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::scale(long v) const
31786{
31787  auto res = isl::multi_pw_aff::scale(v);
31788  return typed::multi_pw_aff<Domain>(res);
31789}
31790
31791template <typename Domain>
31792typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::scale_down(const typed::multi_val<Domain> &mv) const
31793{
31794  auto res = isl::multi_pw_aff::scale_down(mv);
31795  return typed::multi_pw_aff<Domain>(res);
31796}
31797
31798template <typename Domain>
31799typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::scale_down(const typed::val<Domain> &v) const
31800{
31801  auto res = isl::multi_pw_aff::scale_down(v);
31802  return typed::multi_pw_aff<Domain>(res);
31803}
31804
31805template <typename Domain>
31806typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::scale_down(long v) const
31807{
31808  auto res = isl::multi_pw_aff::scale_down(v);
31809  return typed::multi_pw_aff<Domain>(res);
31810}
31811
31812template <typename Domain>
31813typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::set_at(int pos, const typed::pw_aff<Anonymous> &el) const
31814{
31815  auto res = isl::multi_pw_aff::set_at(pos, el);
31816  return typed::multi_pw_aff<Domain>(res);
31817}
31818
31819template <typename Domain>
31820typed::multi_union_pw_aff<Domain> typed::multi_pw_aff<Domain>::set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const
31821{
31822  auto res = isl::multi_pw_aff::set_at(pos, el);
31823  return typed::multi_union_pw_aff<Domain>(res);
31824}
31825
31826template <typename Domain>
31827template <typename Domain2>
31828typed::multi_pw_aff<Domain2> typed::multi_pw_aff<Domain>::set_range_tuple(const typed::id<Anonymous> &id) const
31829{
31830  auto res = isl::multi_pw_aff::set_range_tuple(id);
31831  return typed::multi_pw_aff<Domain2>(res);
31832}
31833
31834template <typename Domain>
31835template <typename Domain2>
31836typed::multi_pw_aff<Domain2> typed::multi_pw_aff<Domain>::set_range_tuple(const std::string &id) const
31837{
31838  auto res = isl::multi_pw_aff::set_range_tuple(id);
31839  return typed::multi_pw_aff<Domain2>(res);
31840}
31841
31842template <typename Domain>
31843typed::space<Domain> typed::multi_pw_aff<Domain>::space() const
31844{
31845  auto res = isl::multi_pw_aff::space();
31846  return typed::space<Domain>(res);
31847}
31848
31849template <typename Domain>
31850typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::sub(const typed::multi_pw_aff<Domain> &multi2) const
31851{
31852  auto res = isl::multi_pw_aff::sub(multi2);
31853  return typed::multi_pw_aff<Domain>(res);
31854}
31855
31856template <typename Domain>
31857typed::multi_union_pw_aff<Domain> typed::multi_pw_aff<Domain>::sub(const typed::multi_union_pw_aff<Domain> &multi2) const
31858{
31859  auto res = isl::multi_pw_aff::sub(multi2);
31860  return typed::multi_union_pw_aff<Domain>(res);
31861}
31862
31863template <typename Domain>
31864typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::sub(const typed::aff<Domain> &multi2) const
31865{
31866  auto res = isl::multi_pw_aff::sub(multi2);
31867  return typed::multi_pw_aff<Domain>(res);
31868}
31869
31870template <typename Domain>
31871typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::sub(const typed::multi_aff<Domain> &multi2) const
31872{
31873  auto res = isl::multi_pw_aff::sub(multi2);
31874  return typed::multi_pw_aff<Domain>(res);
31875}
31876
31877template <typename Domain>
31878typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::sub(const typed::pw_aff<Domain> &multi2) const
31879{
31880  auto res = isl::multi_pw_aff::sub(multi2);
31881  return typed::multi_pw_aff<Domain>(res);
31882}
31883
31884template <typename Domain>
31885typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::sub(const typed::pw_multi_aff<Domain> &multi2) const
31886{
31887  auto res = isl::multi_pw_aff::sub(multi2);
31888  return typed::multi_pw_aff<Domain>(res);
31889}
31890
31891template <typename Domain>
31892template <typename Arg1>
31893typed::multi_pw_aff<Arg1, Domain> typed::multi_pw_aff<Domain>::unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const
31894{
31895  auto res = isl::multi_pw_aff::unbind_params_insert_domain(domain);
31896  return typed::multi_pw_aff<Arg1, Domain>(res);
31897}
31898
31899template <typename Domain>
31900typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::union_add(const typed::multi_pw_aff<Domain> &mpa2) const
31901{
31902  auto res = isl::multi_pw_aff::union_add(mpa2);
31903  return typed::multi_pw_aff<Domain>(res);
31904}
31905
31906template <typename Domain>
31907typed::multi_union_pw_aff<Domain> typed::multi_pw_aff<Domain>::union_add(const typed::multi_union_pw_aff<Domain> &mupa2) const
31908{
31909  auto res = isl::multi_pw_aff::union_add(mupa2);
31910  return typed::multi_union_pw_aff<Domain>(res);
31911}
31912
31913template <typename Domain>
31914typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::union_add(const typed::aff<Domain> &mpa2) const
31915{
31916  auto res = isl::multi_pw_aff::union_add(mpa2);
31917  return typed::multi_pw_aff<Domain>(res);
31918}
31919
31920template <typename Domain>
31921typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::union_add(const typed::multi_aff<Domain> &mpa2) const
31922{
31923  auto res = isl::multi_pw_aff::union_add(mpa2);
31924  return typed::multi_pw_aff<Domain>(res);
31925}
31926
31927template <typename Domain>
31928typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::union_add(const typed::pw_aff<Domain> &mpa2) const
31929{
31930  auto res = isl::multi_pw_aff::union_add(mpa2);
31931  return typed::multi_pw_aff<Domain>(res);
31932}
31933
31934template <typename Domain>
31935typed::multi_pw_aff<Domain> typed::multi_pw_aff<Domain>::union_add(const typed::pw_multi_aff<Domain> &mpa2) const
31936{
31937  auto res = isl::multi_pw_aff::union_add(mpa2);
31938  return typed::multi_pw_aff<Domain>(res);
31939}
31940
31941template <typename Domain, typename Range>
31942typed::multi_pw_aff<Domain, Range>::multi_pw_aff(const typed::aff<Domain, Range> &aff)
31943  : isl::multi_pw_aff(aff)
31944{
31945}
31946
31947template <typename Domain, typename Range>
31948typed::multi_pw_aff<Domain, Range>::multi_pw_aff(const typed::multi_aff<Domain, Range> &ma)
31949  : isl::multi_pw_aff(ma)
31950{
31951}
31952
31953template <typename Domain, typename Range>
31954typed::multi_pw_aff<Domain, Range>::multi_pw_aff(const typed::pw_aff<Domain, Range> &pa)
31955  : isl::multi_pw_aff(pa)
31956{
31957}
31958
31959template <typename Domain, typename Range>
31960typed::multi_pw_aff<Domain, Range>::multi_pw_aff(const typed::space<Domain, Range> &space, const typed::pw_aff_list<Domain, Anonymous> &list)
31961  : isl::multi_pw_aff(space, list)
31962{
31963}
31964
31965template <typename Domain, typename Range>
31966typed::multi_pw_aff<Domain, Range>::multi_pw_aff(const typed::pw_multi_aff<Domain, Range> &pma)
31967  : isl::multi_pw_aff(pma)
31968{
31969}
31970
31971template <typename Domain, typename Range>
31972typed::multi_pw_aff<Domain, Range>::multi_pw_aff(const isl::ctx &ctx, const std::string &str)
31973  : isl::multi_pw_aff(ctx, str)
31974{
31975}
31976
31977template <typename Domain, typename Range>
31978typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::add(const typed::multi_pw_aff<Domain, Range> &multi2) const
31979{
31980  auto res = isl::multi_pw_aff::add(multi2);
31981  return typed::multi_pw_aff<Domain, Range>(res);
31982}
31983
31984template <typename Domain, typename Range>
31985typed::multi_union_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::add(const typed::multi_union_pw_aff<Domain, Range> &multi2) const
31986{
31987  auto res = isl::multi_pw_aff::add(multi2);
31988  return typed::multi_union_pw_aff<Domain, Range>(res);
31989}
31990
31991template <typename Domain, typename Range>
31992typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::add(const typed::aff<Domain, Range> &multi2) const
31993{
31994  auto res = isl::multi_pw_aff::add(multi2);
31995  return typed::multi_pw_aff<Domain, Range>(res);
31996}
31997
31998template <typename Domain, typename Range>
31999typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::add(const typed::multi_aff<Domain, Range> &multi2) const
32000{
32001  auto res = isl::multi_pw_aff::add(multi2);
32002  return typed::multi_pw_aff<Domain, Range>(res);
32003}
32004
32005template <typename Domain, typename Range>
32006typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::add(const typed::pw_aff<Domain, Range> &multi2) const
32007{
32008  auto res = isl::multi_pw_aff::add(multi2);
32009  return typed::multi_pw_aff<Domain, Range>(res);
32010}
32011
32012template <typename Domain, typename Range>
32013typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::add(const typed::pw_multi_aff<Domain, Range> &multi2) const
32014{
32015  auto res = isl::multi_pw_aff::add(multi2);
32016  return typed::multi_pw_aff<Domain, Range>(res);
32017}
32018
32019template <typename Domain, typename Range>
32020typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::add_constant(const typed::multi_val<Range> &mv) const
32021{
32022  auto res = isl::multi_pw_aff::add_constant(mv);
32023  return typed::multi_pw_aff<Domain, Range>(res);
32024}
32025
32026template <typename Domain, typename Range>
32027typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::add_constant(const typed::val<Range> &v) const
32028{
32029  auto res = isl::multi_pw_aff::add_constant(v);
32030  return typed::multi_pw_aff<Domain, Range>(res);
32031}
32032
32033template <typename Domain, typename Range>
32034typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::add_constant(long v) const
32035{
32036  auto res = isl::multi_pw_aff::add_constant(v);
32037  return typed::multi_pw_aff<Domain, Range>(res);
32038}
32039
32040template <typename Domain, typename Range>
32041typed::map<Domain, Range> typed::multi_pw_aff<Domain, Range>::as_map() const
32042{
32043  auto res = isl::multi_pw_aff::as_map();
32044  return typed::map<Domain, Range>(res);
32045}
32046
32047template <typename Domain, typename Range>
32048typed::multi_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::as_multi_aff() const
32049{
32050  auto res = isl::multi_pw_aff::as_multi_aff();
32051  return typed::multi_aff<Domain, Range>(res);
32052}
32053
32054template <typename Domain, typename Range>
32055typed::pw_aff<Domain, Anonymous> typed::multi_pw_aff<Domain, Range>::at(int pos) const
32056{
32057  auto res = isl::multi_pw_aff::at(pos);
32058  return typed::pw_aff<Domain, Anonymous>(res);
32059}
32060
32061template <typename Domain, typename Range>
32062typed::set<Domain> typed::multi_pw_aff<Domain, Range>::bind(const typed::multi_id<Range> &tuple) const
32063{
32064  auto res = isl::multi_pw_aff::bind(tuple);
32065  return typed::set<Domain>(res);
32066}
32067
32068template <typename Domain, typename Range>
32069typed::multi_pw_aff<Range> typed::multi_pw_aff<Domain, Range>::bind_domain(const typed::multi_id<Domain> &tuple) const
32070{
32071  auto res = isl::multi_pw_aff::bind_domain(tuple);
32072  return typed::multi_pw_aff<Range>(res);
32073}
32074
32075template <typename Domain, typename Range>
32076typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::coalesce() const
32077{
32078  auto res = isl::multi_pw_aff::coalesce();
32079  return typed::multi_pw_aff<Domain, Range>(res);
32080}
32081
32082template <typename Domain, typename Range>
32083typed::set<Domain> typed::multi_pw_aff<Domain, Range>::domain() const
32084{
32085  auto res = isl::multi_pw_aff::domain();
32086  return typed::set<Domain>(res);
32087}
32088
32089template <typename Domain, typename Range>
32090typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::gist(const typed::set<Domain> &set) const
32091{
32092  auto res = isl::multi_pw_aff::gist(set);
32093  return typed::multi_pw_aff<Domain, Range>(res);
32094}
32095
32096template <typename Domain, typename Range>
32097typed::multi_union_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::gist(const typed::union_set<Domain> &context) const
32098{
32099  auto res = isl::multi_pw_aff::gist(context);
32100  return typed::multi_union_pw_aff<Domain, Range>(res);
32101}
32102
32103template <typename Domain, typename Range>
32104typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::gist(const typed::basic_set<Domain> &set) const
32105{
32106  auto res = isl::multi_pw_aff::gist(set);
32107  return typed::multi_pw_aff<Domain, Range>(res);
32108}
32109
32110template <typename Domain, typename Range>
32111typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::gist(const typed::point<Domain> &set) const
32112{
32113  auto res = isl::multi_pw_aff::gist(set);
32114  return typed::multi_pw_aff<Domain, Range>(res);
32115}
32116
32117template <typename Domain, typename Range>
32118typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::gist_params(const typed::set<> &set) const
32119{
32120  auto res = isl::multi_pw_aff::gist_params(set);
32121  return typed::multi_pw_aff<Domain, Range>(res);
32122}
32123
32124template <typename Domain, typename Range>
32125typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::gist_params(const typed::basic_set<> &set) const
32126{
32127  auto res = isl::multi_pw_aff::gist_params(set);
32128  return typed::multi_pw_aff<Domain, Range>(res);
32129}
32130
32131template <typename Domain, typename Range>
32132typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::gist_params(const typed::point<> &set) const
32133{
32134  auto res = isl::multi_pw_aff::gist_params(set);
32135  return typed::multi_pw_aff<Domain, Range>(res);
32136}
32137
32138template <typename Domain, typename Range>
32139typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::identity() const
32140{
32141  auto res = isl::multi_pw_aff::identity();
32142  return typed::multi_pw_aff<Domain, Range>(res);
32143}
32144
32145template <typename Domain, typename Range>
32146typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::intersect_domain(const typed::set<Domain> &domain) const
32147{
32148  auto res = isl::multi_pw_aff::intersect_domain(domain);
32149  return typed::multi_pw_aff<Domain, Range>(res);
32150}
32151
32152template <typename Domain, typename Range>
32153typed::multi_union_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::intersect_domain(const typed::union_set<Domain> &uset) const
32154{
32155  auto res = isl::multi_pw_aff::intersect_domain(uset);
32156  return typed::multi_union_pw_aff<Domain, Range>(res);
32157}
32158
32159template <typename Domain, typename Range>
32160typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::intersect_domain(const typed::basic_set<Domain> &domain) const
32161{
32162  auto res = isl::multi_pw_aff::intersect_domain(domain);
32163  return typed::multi_pw_aff<Domain, Range>(res);
32164}
32165
32166template <typename Domain, typename Range>
32167typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::intersect_domain(const typed::point<Domain> &domain) const
32168{
32169  auto res = isl::multi_pw_aff::intersect_domain(domain);
32170  return typed::multi_pw_aff<Domain, Range>(res);
32171}
32172
32173template <typename Domain, typename Range>
32174typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::intersect_params(const typed::set<> &set) const
32175{
32176  auto res = isl::multi_pw_aff::intersect_params(set);
32177  return typed::multi_pw_aff<Domain, Range>(res);
32178}
32179
32180template <typename Domain, typename Range>
32181typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::intersect_params(const typed::basic_set<> &set) const
32182{
32183  auto res = isl::multi_pw_aff::intersect_params(set);
32184  return typed::multi_pw_aff<Domain, Range>(res);
32185}
32186
32187template <typename Domain, typename Range>
32188typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::intersect_params(const typed::point<> &set) const
32189{
32190  auto res = isl::multi_pw_aff::intersect_params(set);
32191  return typed::multi_pw_aff<Domain, Range>(res);
32192}
32193
32194template <typename Domain, typename Range>
32195typed::pw_aff_list<Domain, Anonymous> typed::multi_pw_aff<Domain, Range>::list() const
32196{
32197  auto res = isl::multi_pw_aff::list();
32198  return typed::pw_aff_list<Domain, Anonymous>(res);
32199}
32200
32201template <typename Domain, typename Range>
32202typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::max(const typed::multi_pw_aff<Domain, Range> &multi2) const
32203{
32204  auto res = isl::multi_pw_aff::max(multi2);
32205  return typed::multi_pw_aff<Domain, Range>(res);
32206}
32207
32208template <typename Domain, typename Range>
32209typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::max(const typed::aff<Domain, Range> &multi2) const
32210{
32211  auto res = isl::multi_pw_aff::max(multi2);
32212  return typed::multi_pw_aff<Domain, Range>(res);
32213}
32214
32215template <typename Domain, typename Range>
32216typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::max(const typed::multi_aff<Domain, Range> &multi2) const
32217{
32218  auto res = isl::multi_pw_aff::max(multi2);
32219  return typed::multi_pw_aff<Domain, Range>(res);
32220}
32221
32222template <typename Domain, typename Range>
32223typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::max(const typed::pw_aff<Domain, Range> &multi2) const
32224{
32225  auto res = isl::multi_pw_aff::max(multi2);
32226  return typed::multi_pw_aff<Domain, Range>(res);
32227}
32228
32229template <typename Domain, typename Range>
32230typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::max(const typed::pw_multi_aff<Domain, Range> &multi2) const
32231{
32232  auto res = isl::multi_pw_aff::max(multi2);
32233  return typed::multi_pw_aff<Domain, Range>(res);
32234}
32235
32236template <typename Domain, typename Range>
32237typed::multi_val<Range> typed::multi_pw_aff<Domain, Range>::max_multi_val() const
32238{
32239  auto res = isl::multi_pw_aff::max_multi_val();
32240  return typed::multi_val<Range>(res);
32241}
32242
32243template <typename Domain, typename Range>
32244typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::min(const typed::multi_pw_aff<Domain, Range> &multi2) const
32245{
32246  auto res = isl::multi_pw_aff::min(multi2);
32247  return typed::multi_pw_aff<Domain, Range>(res);
32248}
32249
32250template <typename Domain, typename Range>
32251typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::min(const typed::aff<Domain, Range> &multi2) const
32252{
32253  auto res = isl::multi_pw_aff::min(multi2);
32254  return typed::multi_pw_aff<Domain, Range>(res);
32255}
32256
32257template <typename Domain, typename Range>
32258typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::min(const typed::multi_aff<Domain, Range> &multi2) const
32259{
32260  auto res = isl::multi_pw_aff::min(multi2);
32261  return typed::multi_pw_aff<Domain, Range>(res);
32262}
32263
32264template <typename Domain, typename Range>
32265typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::min(const typed::pw_aff<Domain, Range> &multi2) const
32266{
32267  auto res = isl::multi_pw_aff::min(multi2);
32268  return typed::multi_pw_aff<Domain, Range>(res);
32269}
32270
32271template <typename Domain, typename Range>
32272typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::min(const typed::pw_multi_aff<Domain, Range> &multi2) const
32273{
32274  auto res = isl::multi_pw_aff::min(multi2);
32275  return typed::multi_pw_aff<Domain, Range>(res);
32276}
32277
32278template <typename Domain, typename Range>
32279typed::multi_val<Range> typed::multi_pw_aff<Domain, Range>::min_multi_val() const
32280{
32281  auto res = isl::multi_pw_aff::min_multi_val();
32282  return typed::multi_val<Range>(res);
32283}
32284
32285template <typename Domain, typename Range>
32286typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::neg() const
32287{
32288  auto res = isl::multi_pw_aff::neg();
32289  return typed::multi_pw_aff<Domain, Range>(res);
32290}
32291
32292template <typename Domain, typename Range>
32293template <typename Domain2, typename Range2>
32294typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::multi_pw_aff<Domain, Range>::product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const
32295{
32296  auto res = isl::multi_pw_aff::product(multi2);
32297  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
32298}
32299
32300template <typename Domain, typename Range>
32301template <typename Domain2>
32302typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> typed::multi_pw_aff<Domain, Range>::product(const typed::aff<Domain2, Anonymous> &multi2) const
32303{
32304  auto res = isl::multi_pw_aff::product(multi2);
32305  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Anonymous>>(res);
32306}
32307
32308template <typename Domain, typename Range>
32309template <typename Domain2, typename Range2>
32310typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::multi_pw_aff<Domain, Range>::product(const typed::multi_aff<Domain2, Range2> &multi2) const
32311{
32312  auto res = isl::multi_pw_aff::product(multi2);
32313  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
32314}
32315
32316template <typename Domain, typename Range>
32317template <typename Domain2>
32318typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> typed::multi_pw_aff<Domain, Range>::product(const typed::pw_aff<Domain2, Anonymous> &multi2) const
32319{
32320  auto res = isl::multi_pw_aff::product(multi2);
32321  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Anonymous>>(res);
32322}
32323
32324template <typename Domain, typename Range>
32325template <typename Domain2, typename Range2>
32326typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::multi_pw_aff<Domain, Range>::product(const typed::pw_multi_aff<Domain2, Range2> &multi2) const
32327{
32328  auto res = isl::multi_pw_aff::product(multi2);
32329  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
32330}
32331
32332template <typename Domain, typename Range>
32333template <typename Domain2>
32334typed::multi_pw_aff<Domain2, Range> typed::multi_pw_aff<Domain, Range>::pullback(const typed::multi_aff<Domain2, Domain> &ma) const
32335{
32336  auto res = isl::multi_pw_aff::pullback(ma);
32337  return typed::multi_pw_aff<Domain2, Range>(res);
32338}
32339
32340template <typename Domain, typename Range>
32341typed::multi_pw_aff<Range> typed::multi_pw_aff<Domain, Range>::pullback(const typed::multi_aff<Domain> &ma) const
32342{
32343  auto res = isl::multi_pw_aff::pullback(ma);
32344  return typed::multi_pw_aff<Range>(res);
32345}
32346
32347template <typename Domain, typename Range>
32348template <typename Domain2>
32349typed::multi_pw_aff<Domain2, Range> typed::multi_pw_aff<Domain, Range>::pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const
32350{
32351  auto res = isl::multi_pw_aff::pullback(mpa2);
32352  return typed::multi_pw_aff<Domain2, Range>(res);
32353}
32354
32355template <typename Domain, typename Range>
32356typed::multi_pw_aff<Range> typed::multi_pw_aff<Domain, Range>::pullback(const typed::multi_pw_aff<Domain> &mpa2) const
32357{
32358  auto res = isl::multi_pw_aff::pullback(mpa2);
32359  return typed::multi_pw_aff<Range>(res);
32360}
32361
32362template <typename Domain, typename Range>
32363template <typename Domain2>
32364typed::multi_pw_aff<Domain2, Range> typed::multi_pw_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain2, Domain> &pma) const
32365{
32366  auto res = isl::multi_pw_aff::pullback(pma);
32367  return typed::multi_pw_aff<Domain2, Range>(res);
32368}
32369
32370template <typename Domain, typename Range>
32371typed::multi_pw_aff<Range> typed::multi_pw_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain> &pma) const
32372{
32373  auto res = isl::multi_pw_aff::pullback(pma);
32374  return typed::multi_pw_aff<Range>(res);
32375}
32376
32377template <typename Domain, typename Range>
32378template <typename Domain2>
32379typed::multi_union_pw_aff<Domain2, Range> typed::multi_pw_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
32380{
32381  auto res = isl::multi_pw_aff::pullback(upma);
32382  return typed::multi_union_pw_aff<Domain2, Range>(res);
32383}
32384
32385template <typename Domain, typename Range>
32386typed::multi_union_pw_aff<Range> typed::multi_pw_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain> &upma) const
32387{
32388  auto res = isl::multi_pw_aff::pullback(upma);
32389  return typed::multi_union_pw_aff<Range>(res);
32390}
32391
32392template <typename Domain, typename Range>
32393template <typename Range2>
32394typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_pw_aff<Domain, Range>::range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const
32395{
32396  auto res = isl::multi_pw_aff::range_product(multi2);
32397  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
32398}
32399
32400template <typename Domain, typename Range>
32401template <typename Range2>
32402typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_pw_aff<Domain, Range>::range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const
32403{
32404  auto res = isl::multi_pw_aff::range_product(multi2);
32405  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
32406}
32407
32408template <typename Domain, typename Range>
32409typed::multi_pw_aff<Domain, pair<Range, Anonymous>> typed::multi_pw_aff<Domain, Range>::range_product(const typed::aff<Domain, Anonymous> &multi2) const
32410{
32411  auto res = isl::multi_pw_aff::range_product(multi2);
32412  return typed::multi_pw_aff<Domain, pair<Range, Anonymous>>(res);
32413}
32414
32415template <typename Domain, typename Range>
32416template <typename Range2>
32417typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_pw_aff<Domain, Range>::range_product(const typed::multi_aff<Domain, Range2> &multi2) const
32418{
32419  auto res = isl::multi_pw_aff::range_product(multi2);
32420  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
32421}
32422
32423template <typename Domain, typename Range>
32424typed::multi_pw_aff<Domain, pair<Range, Anonymous>> typed::multi_pw_aff<Domain, Range>::range_product(const typed::pw_aff<Domain, Anonymous> &multi2) const
32425{
32426  auto res = isl::multi_pw_aff::range_product(multi2);
32427  return typed::multi_pw_aff<Domain, pair<Range, Anonymous>>(res);
32428}
32429
32430template <typename Domain, typename Range>
32431template <typename Range2>
32432typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::multi_pw_aff<Domain, Range>::range_product(const typed::pw_multi_aff<Domain, Range2> &multi2) const
32433{
32434  auto res = isl::multi_pw_aff::range_product(multi2);
32435  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
32436}
32437
32438template <typename Domain, typename Range>
32439typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::scale(const typed::multi_val<Range> &mv) const
32440{
32441  auto res = isl::multi_pw_aff::scale(mv);
32442  return typed::multi_pw_aff<Domain, Range>(res);
32443}
32444
32445template <typename Domain, typename Range>
32446typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::scale(const typed::val<Range> &v) const
32447{
32448  auto res = isl::multi_pw_aff::scale(v);
32449  return typed::multi_pw_aff<Domain, Range>(res);
32450}
32451
32452template <typename Domain, typename Range>
32453typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::scale(long v) const
32454{
32455  auto res = isl::multi_pw_aff::scale(v);
32456  return typed::multi_pw_aff<Domain, Range>(res);
32457}
32458
32459template <typename Domain, typename Range>
32460typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::scale_down(const typed::multi_val<Range> &mv) const
32461{
32462  auto res = isl::multi_pw_aff::scale_down(mv);
32463  return typed::multi_pw_aff<Domain, Range>(res);
32464}
32465
32466template <typename Domain, typename Range>
32467typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::scale_down(const typed::val<Range> &v) const
32468{
32469  auto res = isl::multi_pw_aff::scale_down(v);
32470  return typed::multi_pw_aff<Domain, Range>(res);
32471}
32472
32473template <typename Domain, typename Range>
32474typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::scale_down(long v) const
32475{
32476  auto res = isl::multi_pw_aff::scale_down(v);
32477  return typed::multi_pw_aff<Domain, Range>(res);
32478}
32479
32480template <typename Domain, typename Range>
32481typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const
32482{
32483  auto res = isl::multi_pw_aff::set_at(pos, el);
32484  return typed::multi_pw_aff<Domain, Range>(res);
32485}
32486
32487template <typename Domain, typename Range>
32488typed::multi_union_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const
32489{
32490  auto res = isl::multi_pw_aff::set_at(pos, el);
32491  return typed::multi_union_pw_aff<Domain, Range>(res);
32492}
32493
32494template <typename Domain, typename Range>
32495template <typename Range2>
32496typed::multi_pw_aff<Domain, Range2> typed::multi_pw_aff<Domain, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
32497{
32498  auto res = isl::multi_pw_aff::set_range_tuple(id);
32499  return typed::multi_pw_aff<Domain, Range2>(res);
32500}
32501
32502template <typename Domain, typename Range>
32503template <typename Range2>
32504typed::multi_pw_aff<Domain, Range2> typed::multi_pw_aff<Domain, Range>::set_range_tuple(const std::string &id) const
32505{
32506  auto res = isl::multi_pw_aff::set_range_tuple(id);
32507  return typed::multi_pw_aff<Domain, Range2>(res);
32508}
32509
32510template <typename Domain, typename Range>
32511typed::space<Domain, Range> typed::multi_pw_aff<Domain, Range>::space() const
32512{
32513  auto res = isl::multi_pw_aff::space();
32514  return typed::space<Domain, Range>(res);
32515}
32516
32517template <typename Domain, typename Range>
32518typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::sub(const typed::multi_pw_aff<Domain, Range> &multi2) const
32519{
32520  auto res = isl::multi_pw_aff::sub(multi2);
32521  return typed::multi_pw_aff<Domain, Range>(res);
32522}
32523
32524template <typename Domain, typename Range>
32525typed::multi_union_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::sub(const typed::multi_union_pw_aff<Domain, Range> &multi2) const
32526{
32527  auto res = isl::multi_pw_aff::sub(multi2);
32528  return typed::multi_union_pw_aff<Domain, Range>(res);
32529}
32530
32531template <typename Domain, typename Range>
32532typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::sub(const typed::aff<Domain, Range> &multi2) const
32533{
32534  auto res = isl::multi_pw_aff::sub(multi2);
32535  return typed::multi_pw_aff<Domain, Range>(res);
32536}
32537
32538template <typename Domain, typename Range>
32539typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::sub(const typed::multi_aff<Domain, Range> &multi2) const
32540{
32541  auto res = isl::multi_pw_aff::sub(multi2);
32542  return typed::multi_pw_aff<Domain, Range>(res);
32543}
32544
32545template <typename Domain, typename Range>
32546typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::sub(const typed::pw_aff<Domain, Range> &multi2) const
32547{
32548  auto res = isl::multi_pw_aff::sub(multi2);
32549  return typed::multi_pw_aff<Domain, Range>(res);
32550}
32551
32552template <typename Domain, typename Range>
32553typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::sub(const typed::pw_multi_aff<Domain, Range> &multi2) const
32554{
32555  auto res = isl::multi_pw_aff::sub(multi2);
32556  return typed::multi_pw_aff<Domain, Range>(res);
32557}
32558
32559template <typename Domain, typename Range>
32560typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::union_add(const typed::multi_pw_aff<Domain, Range> &mpa2) const
32561{
32562  auto res = isl::multi_pw_aff::union_add(mpa2);
32563  return typed::multi_pw_aff<Domain, Range>(res);
32564}
32565
32566template <typename Domain, typename Range>
32567typed::multi_union_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::union_add(const typed::multi_union_pw_aff<Domain, Range> &mupa2) const
32568{
32569  auto res = isl::multi_pw_aff::union_add(mupa2);
32570  return typed::multi_union_pw_aff<Domain, Range>(res);
32571}
32572
32573template <typename Domain, typename Range>
32574typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::union_add(const typed::aff<Domain, Range> &mpa2) const
32575{
32576  auto res = isl::multi_pw_aff::union_add(mpa2);
32577  return typed::multi_pw_aff<Domain, Range>(res);
32578}
32579
32580template <typename Domain, typename Range>
32581typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::union_add(const typed::multi_aff<Domain, Range> &mpa2) const
32582{
32583  auto res = isl::multi_pw_aff::union_add(mpa2);
32584  return typed::multi_pw_aff<Domain, Range>(res);
32585}
32586
32587template <typename Domain, typename Range>
32588typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::union_add(const typed::pw_aff<Domain, Range> &mpa2) const
32589{
32590  auto res = isl::multi_pw_aff::union_add(mpa2);
32591  return typed::multi_pw_aff<Domain, Range>(res);
32592}
32593
32594template <typename Domain, typename Range>
32595typed::multi_pw_aff<Domain, Range> typed::multi_pw_aff<Domain, Range>::union_add(const typed::pw_multi_aff<Domain, Range> &mpa2) const
32596{
32597  auto res = isl::multi_pw_aff::union_add(mpa2);
32598  return typed::multi_pw_aff<Domain, Range>(res);
32599}
32600
32601template <typename Domain2, typename Range2, typename Range>
32602typed::multi_pw_aff<pair<Domain2, Range2>, Range>::multi_pw_aff(const typed::aff<pair<Domain2, Range2>, Range> &aff)
32603  : isl::multi_pw_aff(aff)
32604{
32605}
32606
32607template <typename Domain2, typename Range2, typename Range>
32608typed::multi_pw_aff<pair<Domain2, Range2>, Range>::multi_pw_aff(const typed::multi_aff<pair<Domain2, Range2>, Range> &ma)
32609  : isl::multi_pw_aff(ma)
32610{
32611}
32612
32613template <typename Domain2, typename Range2, typename Range>
32614typed::multi_pw_aff<pair<Domain2, Range2>, Range>::multi_pw_aff(const typed::pw_aff<pair<Domain2, Range2>, Range> &pa)
32615  : isl::multi_pw_aff(pa)
32616{
32617}
32618
32619template <typename Domain2, typename Range2, typename Range>
32620typed::multi_pw_aff<pair<Domain2, Range2>, Range>::multi_pw_aff(const typed::space<pair<Domain2, Range2>, Range> &space, const typed::pw_aff_list<pair<Domain2, Range2>, Anonymous> &list)
32621  : isl::multi_pw_aff(space, list)
32622{
32623}
32624
32625template <typename Domain2, typename Range2, typename Range>
32626typed::multi_pw_aff<pair<Domain2, Range2>, Range>::multi_pw_aff(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma)
32627  : isl::multi_pw_aff(pma)
32628{
32629}
32630
32631template <typename Domain2, typename Range2, typename Range>
32632typed::multi_pw_aff<pair<Domain2, Range2>, Range>::multi_pw_aff(const isl::ctx &ctx, const std::string &str)
32633  : isl::multi_pw_aff(ctx, str)
32634{
32635}
32636
32637template <typename Domain2, typename Range2, typename Range>
32638typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
32639{
32640  auto res = isl::multi_pw_aff::add(multi2);
32641  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32642}
32643
32644template <typename Domain2, typename Range2, typename Range>
32645typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
32646{
32647  auto res = isl::multi_pw_aff::add(multi2);
32648  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
32649}
32650
32651template <typename Domain2, typename Range2, typename Range>
32652typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::add(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const
32653{
32654  auto res = isl::multi_pw_aff::add(multi2);
32655  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32656}
32657
32658template <typename Domain2, typename Range2, typename Range>
32659typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::add(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const
32660{
32661  auto res = isl::multi_pw_aff::add(multi2);
32662  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32663}
32664
32665template <typename Domain2, typename Range2, typename Range>
32666typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::add(const typed::pw_aff<pair<Domain2, Range2>, Range> &multi2) const
32667{
32668  auto res = isl::multi_pw_aff::add(multi2);
32669  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32670}
32671
32672template <typename Domain2, typename Range2, typename Range>
32673typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &multi2) const
32674{
32675  auto res = isl::multi_pw_aff::add(multi2);
32676  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32677}
32678
32679template <typename Domain2, typename Range2, typename Range>
32680typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::add_constant(const typed::multi_val<Range> &mv) const
32681{
32682  auto res = isl::multi_pw_aff::add_constant(mv);
32683  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32684}
32685
32686template <typename Domain2, typename Range2, typename Range>
32687typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::add_constant(const typed::val<Range> &v) const
32688{
32689  auto res = isl::multi_pw_aff::add_constant(v);
32690  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32691}
32692
32693template <typename Domain2, typename Range2, typename Range>
32694typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::add_constant(long v) const
32695{
32696  auto res = isl::multi_pw_aff::add_constant(v);
32697  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32698}
32699
32700template <typename Domain2, typename Range2, typename Range>
32701typed::map<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::as_map() const
32702{
32703  auto res = isl::multi_pw_aff::as_map();
32704  return typed::map<pair<Domain2, Range2>, Range>(res);
32705}
32706
32707template <typename Domain2, typename Range2, typename Range>
32708typed::multi_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::as_multi_aff() const
32709{
32710  auto res = isl::multi_pw_aff::as_multi_aff();
32711  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
32712}
32713
32714template <typename Domain2, typename Range2, typename Range>
32715typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::at(int pos) const
32716{
32717  auto res = isl::multi_pw_aff::at(pos);
32718  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
32719}
32720
32721template <typename Domain2, typename Range2, typename Range>
32722typed::set<pair<Domain2, Range2>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::bind(const typed::multi_id<Range> &tuple) const
32723{
32724  auto res = isl::multi_pw_aff::bind(tuple);
32725  return typed::set<pair<Domain2, Range2>>(res);
32726}
32727
32728template <typename Domain2, typename Range2, typename Range>
32729typed::multi_pw_aff<Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const
32730{
32731  auto res = isl::multi_pw_aff::bind_domain(tuple);
32732  return typed::multi_pw_aff<Range>(res);
32733}
32734
32735template <typename Domain2, typename Range2, typename Range>
32736typed::multi_pw_aff<Range2, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const
32737{
32738  auto res = isl::multi_pw_aff::bind_domain_wrapped_domain(tuple);
32739  return typed::multi_pw_aff<Range2, Range>(res);
32740}
32741
32742template <typename Domain2, typename Range2, typename Range>
32743typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::coalesce() const
32744{
32745  auto res = isl::multi_pw_aff::coalesce();
32746  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32747}
32748
32749template <typename Domain2, typename Range2, typename Range>
32750typed::set<pair<Domain2, Range2>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::domain() const
32751{
32752  auto res = isl::multi_pw_aff::domain();
32753  return typed::set<pair<Domain2, Range2>>(res);
32754}
32755
32756template <typename Domain2, typename Range2, typename Range>
32757typed::multi_pw_aff<pair<Range2, Domain2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::domain_reverse() const
32758{
32759  auto res = isl::multi_pw_aff::domain_reverse();
32760  return typed::multi_pw_aff<pair<Range2, Domain2>, Range>(res);
32761}
32762
32763template <typename Domain2, typename Range2, typename Range>
32764typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::gist(const typed::set<pair<Domain2, Range2>> &set) const
32765{
32766  auto res = isl::multi_pw_aff::gist(set);
32767  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32768}
32769
32770template <typename Domain2, typename Range2, typename Range>
32771typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::gist(const typed::union_set<pair<Domain2, Range2>> &context) const
32772{
32773  auto res = isl::multi_pw_aff::gist(context);
32774  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
32775}
32776
32777template <typename Domain2, typename Range2, typename Range>
32778typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::gist(const typed::basic_set<pair<Domain2, Range2>> &set) const
32779{
32780  auto res = isl::multi_pw_aff::gist(set);
32781  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32782}
32783
32784template <typename Domain2, typename Range2, typename Range>
32785typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::gist(const typed::point<pair<Domain2, Range2>> &set) const
32786{
32787  auto res = isl::multi_pw_aff::gist(set);
32788  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32789}
32790
32791template <typename Domain2, typename Range2, typename Range>
32792typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::gist_params(const typed::set<> &set) const
32793{
32794  auto res = isl::multi_pw_aff::gist_params(set);
32795  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32796}
32797
32798template <typename Domain2, typename Range2, typename Range>
32799typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::gist_params(const typed::basic_set<> &set) const
32800{
32801  auto res = isl::multi_pw_aff::gist_params(set);
32802  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32803}
32804
32805template <typename Domain2, typename Range2, typename Range>
32806typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::gist_params(const typed::point<> &set) const
32807{
32808  auto res = isl::multi_pw_aff::gist_params(set);
32809  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32810}
32811
32812template <typename Domain2, typename Range2, typename Range>
32813typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::identity() const
32814{
32815  auto res = isl::multi_pw_aff::identity();
32816  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32817}
32818
32819template <typename Domain2, typename Range2, typename Range>
32820typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::set<pair<Domain2, Range2>> &domain) const
32821{
32822  auto res = isl::multi_pw_aff::intersect_domain(domain);
32823  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32824}
32825
32826template <typename Domain2, typename Range2, typename Range>
32827typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const
32828{
32829  auto res = isl::multi_pw_aff::intersect_domain(uset);
32830  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
32831}
32832
32833template <typename Domain2, typename Range2, typename Range>
32834typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::basic_set<pair<Domain2, Range2>> &domain) const
32835{
32836  auto res = isl::multi_pw_aff::intersect_domain(domain);
32837  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32838}
32839
32840template <typename Domain2, typename Range2, typename Range>
32841typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::point<pair<Domain2, Range2>> &domain) const
32842{
32843  auto res = isl::multi_pw_aff::intersect_domain(domain);
32844  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32845}
32846
32847template <typename Domain2, typename Range2, typename Range>
32848typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::intersect_params(const typed::set<> &set) const
32849{
32850  auto res = isl::multi_pw_aff::intersect_params(set);
32851  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32852}
32853
32854template <typename Domain2, typename Range2, typename Range>
32855typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::intersect_params(const typed::basic_set<> &set) const
32856{
32857  auto res = isl::multi_pw_aff::intersect_params(set);
32858  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32859}
32860
32861template <typename Domain2, typename Range2, typename Range>
32862typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::intersect_params(const typed::point<> &set) const
32863{
32864  auto res = isl::multi_pw_aff::intersect_params(set);
32865  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32866}
32867
32868template <typename Domain2, typename Range2, typename Range>
32869typed::pw_aff_list<pair<Domain2, Range2>, Anonymous> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::list() const
32870{
32871  auto res = isl::multi_pw_aff::list();
32872  return typed::pw_aff_list<pair<Domain2, Range2>, Anonymous>(res);
32873}
32874
32875template <typename Domain2, typename Range2, typename Range>
32876typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::max(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
32877{
32878  auto res = isl::multi_pw_aff::max(multi2);
32879  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32880}
32881
32882template <typename Domain2, typename Range2, typename Range>
32883typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::max(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const
32884{
32885  auto res = isl::multi_pw_aff::max(multi2);
32886  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32887}
32888
32889template <typename Domain2, typename Range2, typename Range>
32890typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::max(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const
32891{
32892  auto res = isl::multi_pw_aff::max(multi2);
32893  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32894}
32895
32896template <typename Domain2, typename Range2, typename Range>
32897typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::max(const typed::pw_aff<pair<Domain2, Range2>, Range> &multi2) const
32898{
32899  auto res = isl::multi_pw_aff::max(multi2);
32900  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32901}
32902
32903template <typename Domain2, typename Range2, typename Range>
32904typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::max(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &multi2) const
32905{
32906  auto res = isl::multi_pw_aff::max(multi2);
32907  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32908}
32909
32910template <typename Domain2, typename Range2, typename Range>
32911typed::multi_val<Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::max_multi_val() const
32912{
32913  auto res = isl::multi_pw_aff::max_multi_val();
32914  return typed::multi_val<Range>(res);
32915}
32916
32917template <typename Domain2, typename Range2, typename Range>
32918typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::min(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
32919{
32920  auto res = isl::multi_pw_aff::min(multi2);
32921  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32922}
32923
32924template <typename Domain2, typename Range2, typename Range>
32925typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::min(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const
32926{
32927  auto res = isl::multi_pw_aff::min(multi2);
32928  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32929}
32930
32931template <typename Domain2, typename Range2, typename Range>
32932typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::min(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const
32933{
32934  auto res = isl::multi_pw_aff::min(multi2);
32935  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32936}
32937
32938template <typename Domain2, typename Range2, typename Range>
32939typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::min(const typed::pw_aff<pair<Domain2, Range2>, Range> &multi2) const
32940{
32941  auto res = isl::multi_pw_aff::min(multi2);
32942  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32943}
32944
32945template <typename Domain2, typename Range2, typename Range>
32946typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::min(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &multi2) const
32947{
32948  auto res = isl::multi_pw_aff::min(multi2);
32949  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32950}
32951
32952template <typename Domain2, typename Range2, typename Range>
32953typed::multi_val<Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::min_multi_val() const
32954{
32955  auto res = isl::multi_pw_aff::min_multi_val();
32956  return typed::multi_val<Range>(res);
32957}
32958
32959template <typename Domain2, typename Range2, typename Range>
32960typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::neg() const
32961{
32962  auto res = isl::multi_pw_aff::neg();
32963  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
32964}
32965
32966template <typename Domain2, typename Range2, typename Range>
32967template <typename Arg2, typename Arg3>
32968typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::product(const typed::multi_pw_aff<Arg2, Arg3> &multi2) const
32969{
32970  auto res = isl::multi_pw_aff::product(multi2);
32971  return typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>>(res);
32972}
32973
32974template <typename Domain2, typename Range2, typename Range>
32975template <typename Arg2>
32976typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::product(const typed::aff<Arg2, Anonymous> &multi2) const
32977{
32978  auto res = isl::multi_pw_aff::product(multi2);
32979  return typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>>(res);
32980}
32981
32982template <typename Domain2, typename Range2, typename Range>
32983template <typename Arg2, typename Arg3>
32984typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::product(const typed::multi_aff<Arg2, Arg3> &multi2) const
32985{
32986  auto res = isl::multi_pw_aff::product(multi2);
32987  return typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>>(res);
32988}
32989
32990template <typename Domain2, typename Range2, typename Range>
32991template <typename Arg2>
32992typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::product(const typed::pw_aff<Arg2, Anonymous> &multi2) const
32993{
32994  auto res = isl::multi_pw_aff::product(multi2);
32995  return typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>>(res);
32996}
32997
32998template <typename Domain2, typename Range2, typename Range>
32999template <typename Arg2, typename Arg3>
33000typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::product(const typed::pw_multi_aff<Arg2, Arg3> &multi2) const
33001{
33002  auto res = isl::multi_pw_aff::product(multi2);
33003  return typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>>(res);
33004}
33005
33006template <typename Domain2, typename Range2, typename Range>
33007template <typename Arg2>
33008typed::multi_pw_aff<Arg2, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_aff<Arg2, pair<Domain2, Range2>> &ma) const
33009{
33010  auto res = isl::multi_pw_aff::pullback(ma);
33011  return typed::multi_pw_aff<Arg2, Range>(res);
33012}
33013
33014template <typename Domain2, typename Range2, typename Range>
33015typed::multi_pw_aff<Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma) const
33016{
33017  auto res = isl::multi_pw_aff::pullback(ma);
33018  return typed::multi_pw_aff<Range>(res);
33019}
33020
33021template <typename Domain2, typename Range2, typename Range>
33022template <typename Arg2>
33023typed::multi_pw_aff<Arg2, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_pw_aff<Arg2, pair<Domain2, Range2>> &mpa2) const
33024{
33025  auto res = isl::multi_pw_aff::pullback(mpa2);
33026  return typed::multi_pw_aff<Arg2, Range>(res);
33027}
33028
33029template <typename Domain2, typename Range2, typename Range>
33030typed::multi_pw_aff<Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa2) const
33031{
33032  auto res = isl::multi_pw_aff::pullback(mpa2);
33033  return typed::multi_pw_aff<Range>(res);
33034}
33035
33036template <typename Domain2, typename Range2, typename Range>
33037template <typename Arg2>
33038typed::multi_pw_aff<Arg2, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::pullback(const typed::pw_multi_aff<Arg2, pair<Domain2, Range2>> &pma) const
33039{
33040  auto res = isl::multi_pw_aff::pullback(pma);
33041  return typed::multi_pw_aff<Arg2, Range>(res);
33042}
33043
33044template <typename Domain2, typename Range2, typename Range>
33045typed::multi_pw_aff<Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma) const
33046{
33047  auto res = isl::multi_pw_aff::pullback(pma);
33048  return typed::multi_pw_aff<Range>(res);
33049}
33050
33051template <typename Domain2, typename Range2, typename Range>
33052template <typename Arg2>
33053typed::multi_union_pw_aff<Arg2, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::pullback(const typed::union_pw_multi_aff<Arg2, pair<Domain2, Range2>> &upma) const
33054{
33055  auto res = isl::multi_pw_aff::pullback(upma);
33056  return typed::multi_union_pw_aff<Arg2, Range>(res);
33057}
33058
33059template <typename Domain2, typename Range2, typename Range>
33060typed::multi_union_pw_aff<Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma) const
33061{
33062  auto res = isl::multi_pw_aff::pullback(upma);
33063  return typed::multi_union_pw_aff<Range>(res);
33064}
33065
33066template <typename Domain2, typename Range2, typename Range>
33067template <typename Arg2>
33068typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const
33069{
33070  auto res = isl::multi_pw_aff::range_product(multi2);
33071  return typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
33072}
33073
33074template <typename Domain2, typename Range2, typename Range>
33075template <typename Arg2>
33076typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const
33077{
33078  auto res = isl::multi_pw_aff::range_product(multi2);
33079  return typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
33080}
33081
33082template <typename Domain2, typename Range2, typename Range>
33083typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Anonymous>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::range_product(const typed::aff<pair<Domain2, Range2>, Anonymous> &multi2) const
33084{
33085  auto res = isl::multi_pw_aff::range_product(multi2);
33086  return typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Anonymous>>(res);
33087}
33088
33089template <typename Domain2, typename Range2, typename Range>
33090template <typename Arg2>
33091typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::range_product(const typed::multi_aff<pair<Domain2, Range2>, Arg2> &multi2) const
33092{
33093  auto res = isl::multi_pw_aff::range_product(multi2);
33094  return typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
33095}
33096
33097template <typename Domain2, typename Range2, typename Range>
33098typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Anonymous>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::range_product(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
33099{
33100  auto res = isl::multi_pw_aff::range_product(multi2);
33101  return typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Anonymous>>(res);
33102}
33103
33104template <typename Domain2, typename Range2, typename Range>
33105template <typename Arg2>
33106typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg2> &multi2) const
33107{
33108  auto res = isl::multi_pw_aff::range_product(multi2);
33109  return typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
33110}
33111
33112template <typename Domain2, typename Range2, typename Range>
33113typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::scale(const typed::multi_val<Range> &mv) const
33114{
33115  auto res = isl::multi_pw_aff::scale(mv);
33116  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33117}
33118
33119template <typename Domain2, typename Range2, typename Range>
33120typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::scale(const typed::val<Range> &v) const
33121{
33122  auto res = isl::multi_pw_aff::scale(v);
33123  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33124}
33125
33126template <typename Domain2, typename Range2, typename Range>
33127typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::scale(long v) const
33128{
33129  auto res = isl::multi_pw_aff::scale(v);
33130  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33131}
33132
33133template <typename Domain2, typename Range2, typename Range>
33134typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::scale_down(const typed::multi_val<Range> &mv) const
33135{
33136  auto res = isl::multi_pw_aff::scale_down(mv);
33137  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33138}
33139
33140template <typename Domain2, typename Range2, typename Range>
33141typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::scale_down(const typed::val<Range> &v) const
33142{
33143  auto res = isl::multi_pw_aff::scale_down(v);
33144  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33145}
33146
33147template <typename Domain2, typename Range2, typename Range>
33148typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::scale_down(long v) const
33149{
33150  auto res = isl::multi_pw_aff::scale_down(v);
33151  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33152}
33153
33154template <typename Domain2, typename Range2, typename Range>
33155typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
33156{
33157  auto res = isl::multi_pw_aff::set_at(pos, el);
33158  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33159}
33160
33161template <typename Domain2, typename Range2, typename Range>
33162typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
33163{
33164  auto res = isl::multi_pw_aff::set_at(pos, el);
33165  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
33166}
33167
33168template <typename Domain2, typename Range2, typename Range>
33169template <typename Arg1>
33170typed::multi_pw_aff<pair<Domain2, Range2>, Arg1> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
33171{
33172  auto res = isl::multi_pw_aff::set_range_tuple(id);
33173  return typed::multi_pw_aff<pair<Domain2, Range2>, Arg1>(res);
33174}
33175
33176template <typename Domain2, typename Range2, typename Range>
33177template <typename Arg1>
33178typed::multi_pw_aff<pair<Domain2, Range2>, Arg1> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::set_range_tuple(const std::string &id) const
33179{
33180  auto res = isl::multi_pw_aff::set_range_tuple(id);
33181  return typed::multi_pw_aff<pair<Domain2, Range2>, Arg1>(res);
33182}
33183
33184template <typename Domain2, typename Range2, typename Range>
33185typed::space<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::space() const
33186{
33187  auto res = isl::multi_pw_aff::space();
33188  return typed::space<pair<Domain2, Range2>, Range>(res);
33189}
33190
33191template <typename Domain2, typename Range2, typename Range>
33192typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
33193{
33194  auto res = isl::multi_pw_aff::sub(multi2);
33195  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33196}
33197
33198template <typename Domain2, typename Range2, typename Range>
33199typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
33200{
33201  auto res = isl::multi_pw_aff::sub(multi2);
33202  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
33203}
33204
33205template <typename Domain2, typename Range2, typename Range>
33206typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::sub(const typed::aff<pair<Domain2, Range2>, Range> &multi2) const
33207{
33208  auto res = isl::multi_pw_aff::sub(multi2);
33209  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33210}
33211
33212template <typename Domain2, typename Range2, typename Range>
33213typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::sub(const typed::multi_aff<pair<Domain2, Range2>, Range> &multi2) const
33214{
33215  auto res = isl::multi_pw_aff::sub(multi2);
33216  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33217}
33218
33219template <typename Domain2, typename Range2, typename Range>
33220typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::sub(const typed::pw_aff<pair<Domain2, Range2>, Range> &multi2) const
33221{
33222  auto res = isl::multi_pw_aff::sub(multi2);
33223  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33224}
33225
33226template <typename Domain2, typename Range2, typename Range>
33227typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &multi2) const
33228{
33229  auto res = isl::multi_pw_aff::sub(multi2);
33230  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33231}
33232
33233template <typename Domain2, typename Range2, typename Range>
33234typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &mpa2) const
33235{
33236  auto res = isl::multi_pw_aff::union_add(mpa2);
33237  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33238}
33239
33240template <typename Domain2, typename Range2, typename Range>
33241typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &mupa2) const
33242{
33243  auto res = isl::multi_pw_aff::union_add(mupa2);
33244  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
33245}
33246
33247template <typename Domain2, typename Range2, typename Range>
33248typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::union_add(const typed::aff<pair<Domain2, Range2>, Range> &mpa2) const
33249{
33250  auto res = isl::multi_pw_aff::union_add(mpa2);
33251  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33252}
33253
33254template <typename Domain2, typename Range2, typename Range>
33255typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::union_add(const typed::multi_aff<pair<Domain2, Range2>, Range> &mpa2) const
33256{
33257  auto res = isl::multi_pw_aff::union_add(mpa2);
33258  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33259}
33260
33261template <typename Domain2, typename Range2, typename Range>
33262typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::union_add(const typed::pw_aff<pair<Domain2, Range2>, Range> &mpa2) const
33263{
33264  auto res = isl::multi_pw_aff::union_add(mpa2);
33265  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33266}
33267
33268template <typename Domain2, typename Range2, typename Range>
33269typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::multi_pw_aff<pair<Domain2, Range2>, Range>::union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &mpa2) const
33270{
33271  auto res = isl::multi_pw_aff::union_add(mpa2);
33272  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
33273}
33274
33275template <typename Domain>
33276typed::multi_union_pw_aff<Domain>::multi_union_pw_aff(const typed::multi_pw_aff<Domain> &mpa)
33277  : isl::multi_union_pw_aff(mpa)
33278{
33279}
33280
33281template <typename Domain>
33282typed::multi_union_pw_aff<Domain>::multi_union_pw_aff(const typed::union_pw_aff<Domain> &upa)
33283  : isl::multi_union_pw_aff(upa)
33284{
33285}
33286
33287template <typename Domain>
33288typed::multi_union_pw_aff<Domain>::multi_union_pw_aff(const typed::space<Domain> &space, const typed::union_pw_aff_list<Anonymous> &list)
33289  : isl::multi_union_pw_aff(space, list)
33290{
33291}
33292
33293template <typename Domain>
33294typed::multi_union_pw_aff<Domain>::multi_union_pw_aff(const isl::ctx &ctx, const std::string &str)
33295  : isl::multi_union_pw_aff(ctx, str)
33296{
33297}
33298
33299template <typename Domain>
33300typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::add(const typed::multi_union_pw_aff<Domain> &multi2) const
33301{
33302  auto res = isl::multi_union_pw_aff::add(multi2);
33303  return typed::multi_union_pw_aff<Domain>(res);
33304}
33305
33306template <typename Domain>
33307typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::add(const typed::multi_pw_aff<Domain> &multi2) const
33308{
33309  auto res = isl::multi_union_pw_aff::add(multi2);
33310  return typed::multi_union_pw_aff<Domain>(res);
33311}
33312
33313template <typename Domain>
33314typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::add(const typed::union_pw_aff<Domain> &multi2) const
33315{
33316  auto res = isl::multi_union_pw_aff::add(multi2);
33317  return typed::multi_union_pw_aff<Domain>(res);
33318}
33319
33320template <typename Domain>
33321typed::union_pw_aff<Anonymous> typed::multi_union_pw_aff<Domain>::at(int pos) const
33322{
33323  auto res = isl::multi_union_pw_aff::at(pos);
33324  return typed::union_pw_aff<Anonymous>(res);
33325}
33326
33327template <typename Domain>
33328typed::union_set<> typed::multi_union_pw_aff<Domain>::bind(const typed::multi_id<Domain> &tuple) const
33329{
33330  auto res = isl::multi_union_pw_aff::bind(tuple);
33331  return typed::union_set<>(res);
33332}
33333
33334template <typename Domain>
33335typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::coalesce() const
33336{
33337  auto res = isl::multi_union_pw_aff::coalesce();
33338  return typed::multi_union_pw_aff<Domain>(res);
33339}
33340
33341template <typename Domain>
33342typed::union_set<> typed::multi_union_pw_aff<Domain>::domain() const
33343{
33344  auto res = isl::multi_union_pw_aff::domain();
33345  return typed::union_set<>(res);
33346}
33347
33348template <typename Domain>
33349typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::gist(const typed::union_set<> &context) const
33350{
33351  auto res = isl::multi_union_pw_aff::gist(context);
33352  return typed::multi_union_pw_aff<Domain>(res);
33353}
33354
33355template <typename Domain>
33356typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::gist(const typed::basic_set<> &context) const
33357{
33358  auto res = isl::multi_union_pw_aff::gist(context);
33359  return typed::multi_union_pw_aff<Domain>(res);
33360}
33361
33362template <typename Domain>
33363typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::gist(const typed::point<> &context) const
33364{
33365  auto res = isl::multi_union_pw_aff::gist(context);
33366  return typed::multi_union_pw_aff<Domain>(res);
33367}
33368
33369template <typename Domain>
33370typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::gist(const typed::set<> &context) const
33371{
33372  auto res = isl::multi_union_pw_aff::gist(context);
33373  return typed::multi_union_pw_aff<Domain>(res);
33374}
33375
33376template <typename Domain>
33377typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::gist_params(const typed::set<> &context) const
33378{
33379  auto res = isl::multi_union_pw_aff::gist_params(context);
33380  return typed::multi_union_pw_aff<Domain>(res);
33381}
33382
33383template <typename Domain>
33384typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::gist_params(const typed::basic_set<> &context) const
33385{
33386  auto res = isl::multi_union_pw_aff::gist_params(context);
33387  return typed::multi_union_pw_aff<Domain>(res);
33388}
33389
33390template <typename Domain>
33391typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::gist_params(const typed::point<> &context) const
33392{
33393  auto res = isl::multi_union_pw_aff::gist_params(context);
33394  return typed::multi_union_pw_aff<Domain>(res);
33395}
33396
33397template <typename Domain>
33398typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::intersect_params(const typed::set<> &params) const
33399{
33400  auto res = isl::multi_union_pw_aff::intersect_params(params);
33401  return typed::multi_union_pw_aff<Domain>(res);
33402}
33403
33404template <typename Domain>
33405typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::intersect_params(const typed::basic_set<> &params) const
33406{
33407  auto res = isl::multi_union_pw_aff::intersect_params(params);
33408  return typed::multi_union_pw_aff<Domain>(res);
33409}
33410
33411template <typename Domain>
33412typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::intersect_params(const typed::point<> &params) const
33413{
33414  auto res = isl::multi_union_pw_aff::intersect_params(params);
33415  return typed::multi_union_pw_aff<Domain>(res);
33416}
33417
33418template <typename Domain>
33419typed::union_pw_aff_list<Anonymous> typed::multi_union_pw_aff<Domain>::list() const
33420{
33421  auto res = isl::multi_union_pw_aff::list();
33422  return typed::union_pw_aff_list<Anonymous>(res);
33423}
33424
33425template <typename Domain>
33426typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::neg() const
33427{
33428  auto res = isl::multi_union_pw_aff::neg();
33429  return typed::multi_union_pw_aff<Domain>(res);
33430}
33431
33432template <typename Domain>
33433typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::scale(const typed::multi_val<Domain> &mv) const
33434{
33435  auto res = isl::multi_union_pw_aff::scale(mv);
33436  return typed::multi_union_pw_aff<Domain>(res);
33437}
33438
33439template <typename Domain>
33440typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::scale(const typed::val<Domain> &v) const
33441{
33442  auto res = isl::multi_union_pw_aff::scale(v);
33443  return typed::multi_union_pw_aff<Domain>(res);
33444}
33445
33446template <typename Domain>
33447typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::scale(long v) const
33448{
33449  auto res = isl::multi_union_pw_aff::scale(v);
33450  return typed::multi_union_pw_aff<Domain>(res);
33451}
33452
33453template <typename Domain>
33454typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::scale_down(const typed::multi_val<Domain> &mv) const
33455{
33456  auto res = isl::multi_union_pw_aff::scale_down(mv);
33457  return typed::multi_union_pw_aff<Domain>(res);
33458}
33459
33460template <typename Domain>
33461typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::scale_down(const typed::val<Domain> &v) const
33462{
33463  auto res = isl::multi_union_pw_aff::scale_down(v);
33464  return typed::multi_union_pw_aff<Domain>(res);
33465}
33466
33467template <typename Domain>
33468typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::scale_down(long v) const
33469{
33470  auto res = isl::multi_union_pw_aff::scale_down(v);
33471  return typed::multi_union_pw_aff<Domain>(res);
33472}
33473
33474template <typename Domain>
33475typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const
33476{
33477  auto res = isl::multi_union_pw_aff::set_at(pos, el);
33478  return typed::multi_union_pw_aff<Domain>(res);
33479}
33480
33481template <typename Domain>
33482template <typename Domain2>
33483typed::multi_union_pw_aff<Domain2> typed::multi_union_pw_aff<Domain>::set_range_tuple(const typed::id<Anonymous> &id) const
33484{
33485  auto res = isl::multi_union_pw_aff::set_range_tuple(id);
33486  return typed::multi_union_pw_aff<Domain2>(res);
33487}
33488
33489template <typename Domain>
33490template <typename Domain2>
33491typed::multi_union_pw_aff<Domain2> typed::multi_union_pw_aff<Domain>::set_range_tuple(const std::string &id) const
33492{
33493  auto res = isl::multi_union_pw_aff::set_range_tuple(id);
33494  return typed::multi_union_pw_aff<Domain2>(res);
33495}
33496
33497template <typename Domain>
33498typed::space<Domain> typed::multi_union_pw_aff<Domain>::space() const
33499{
33500  auto res = isl::multi_union_pw_aff::space();
33501  return typed::space<Domain>(res);
33502}
33503
33504template <typename Domain>
33505typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::sub(const typed::multi_union_pw_aff<Domain> &multi2) const
33506{
33507  auto res = isl::multi_union_pw_aff::sub(multi2);
33508  return typed::multi_union_pw_aff<Domain>(res);
33509}
33510
33511template <typename Domain>
33512typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::sub(const typed::multi_pw_aff<Domain> &multi2) const
33513{
33514  auto res = isl::multi_union_pw_aff::sub(multi2);
33515  return typed::multi_union_pw_aff<Domain>(res);
33516}
33517
33518template <typename Domain>
33519typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::sub(const typed::union_pw_aff<Domain> &multi2) const
33520{
33521  auto res = isl::multi_union_pw_aff::sub(multi2);
33522  return typed::multi_union_pw_aff<Domain>(res);
33523}
33524
33525template <typename Domain>
33526typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::union_add(const typed::multi_union_pw_aff<Domain> &mupa2) const
33527{
33528  auto res = isl::multi_union_pw_aff::union_add(mupa2);
33529  return typed::multi_union_pw_aff<Domain>(res);
33530}
33531
33532template <typename Domain>
33533typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::union_add(const typed::multi_pw_aff<Domain> &mupa2) const
33534{
33535  auto res = isl::multi_union_pw_aff::union_add(mupa2);
33536  return typed::multi_union_pw_aff<Domain>(res);
33537}
33538
33539template <typename Domain>
33540typed::multi_union_pw_aff<Domain> typed::multi_union_pw_aff<Domain>::union_add(const typed::union_pw_aff<Domain> &mupa2) const
33541{
33542  auto res = isl::multi_union_pw_aff::union_add(mupa2);
33543  return typed::multi_union_pw_aff<Domain>(res);
33544}
33545
33546template <typename Domain, typename Range>
33547typed::multi_union_pw_aff<Domain, Range>::multi_union_pw_aff(const typed::multi_pw_aff<Domain, Range> &mpa)
33548  : isl::multi_union_pw_aff(mpa)
33549{
33550}
33551
33552template <typename Domain, typename Range>
33553typed::multi_union_pw_aff<Domain, Range>::multi_union_pw_aff(const typed::union_pw_aff<Domain, Range> &upa)
33554  : isl::multi_union_pw_aff(upa)
33555{
33556}
33557
33558template <typename Domain, typename Range>
33559typed::multi_union_pw_aff<Domain, Range>::multi_union_pw_aff(const typed::space<Domain, Range> &space, const typed::union_pw_aff_list<Domain, Anonymous> &list)
33560  : isl::multi_union_pw_aff(space, list)
33561{
33562}
33563
33564template <typename Domain, typename Range>
33565typed::multi_union_pw_aff<Domain, Range>::multi_union_pw_aff(const isl::ctx &ctx, const std::string &str)
33566  : isl::multi_union_pw_aff(ctx, str)
33567{
33568}
33569
33570template <typename Domain, typename Range>
33571typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::add(const typed::multi_union_pw_aff<Domain, Range> &multi2) const
33572{
33573  auto res = isl::multi_union_pw_aff::add(multi2);
33574  return typed::multi_union_pw_aff<Domain, Range>(res);
33575}
33576
33577template <typename Domain, typename Range>
33578typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::add(const typed::multi_pw_aff<Domain, Range> &multi2) const
33579{
33580  auto res = isl::multi_union_pw_aff::add(multi2);
33581  return typed::multi_union_pw_aff<Domain, Range>(res);
33582}
33583
33584template <typename Domain, typename Range>
33585typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::add(const typed::union_pw_aff<Domain, Range> &multi2) const
33586{
33587  auto res = isl::multi_union_pw_aff::add(multi2);
33588  return typed::multi_union_pw_aff<Domain, Range>(res);
33589}
33590
33591template <typename Domain, typename Range>
33592typed::union_pw_aff<Domain, Anonymous> typed::multi_union_pw_aff<Domain, Range>::at(int pos) const
33593{
33594  auto res = isl::multi_union_pw_aff::at(pos);
33595  return typed::union_pw_aff<Domain, Anonymous>(res);
33596}
33597
33598template <typename Domain, typename Range>
33599typed::union_set<Domain> typed::multi_union_pw_aff<Domain, Range>::bind(const typed::multi_id<Range> &tuple) const
33600{
33601  auto res = isl::multi_union_pw_aff::bind(tuple);
33602  return typed::union_set<Domain>(res);
33603}
33604
33605template <typename Domain, typename Range>
33606typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::coalesce() const
33607{
33608  auto res = isl::multi_union_pw_aff::coalesce();
33609  return typed::multi_union_pw_aff<Domain, Range>(res);
33610}
33611
33612template <typename Domain, typename Range>
33613typed::union_set<Domain> typed::multi_union_pw_aff<Domain, Range>::domain() const
33614{
33615  auto res = isl::multi_union_pw_aff::domain();
33616  return typed::union_set<Domain>(res);
33617}
33618
33619template <typename Domain, typename Range>
33620typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::gist(const typed::union_set<Domain> &context) const
33621{
33622  auto res = isl::multi_union_pw_aff::gist(context);
33623  return typed::multi_union_pw_aff<Domain, Range>(res);
33624}
33625
33626template <typename Domain, typename Range>
33627typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::gist(const typed::basic_set<Domain> &context) const
33628{
33629  auto res = isl::multi_union_pw_aff::gist(context);
33630  return typed::multi_union_pw_aff<Domain, Range>(res);
33631}
33632
33633template <typename Domain, typename Range>
33634typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::gist(const typed::point<Domain> &context) const
33635{
33636  auto res = isl::multi_union_pw_aff::gist(context);
33637  return typed::multi_union_pw_aff<Domain, Range>(res);
33638}
33639
33640template <typename Domain, typename Range>
33641typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::gist(const typed::set<Domain> &context) const
33642{
33643  auto res = isl::multi_union_pw_aff::gist(context);
33644  return typed::multi_union_pw_aff<Domain, Range>(res);
33645}
33646
33647template <typename Domain, typename Range>
33648typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::gist_params(const typed::set<> &context) const
33649{
33650  auto res = isl::multi_union_pw_aff::gist_params(context);
33651  return typed::multi_union_pw_aff<Domain, Range>(res);
33652}
33653
33654template <typename Domain, typename Range>
33655typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::gist_params(const typed::basic_set<> &context) const
33656{
33657  auto res = isl::multi_union_pw_aff::gist_params(context);
33658  return typed::multi_union_pw_aff<Domain, Range>(res);
33659}
33660
33661template <typename Domain, typename Range>
33662typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::gist_params(const typed::point<> &context) const
33663{
33664  auto res = isl::multi_union_pw_aff::gist_params(context);
33665  return typed::multi_union_pw_aff<Domain, Range>(res);
33666}
33667
33668template <typename Domain, typename Range>
33669typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::intersect_domain(const typed::union_set<Domain> &uset) const
33670{
33671  auto res = isl::multi_union_pw_aff::intersect_domain(uset);
33672  return typed::multi_union_pw_aff<Domain, Range>(res);
33673}
33674
33675template <typename Domain, typename Range>
33676typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::intersect_domain(const typed::basic_set<Domain> &uset) const
33677{
33678  auto res = isl::multi_union_pw_aff::intersect_domain(uset);
33679  return typed::multi_union_pw_aff<Domain, Range>(res);
33680}
33681
33682template <typename Domain, typename Range>
33683typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::intersect_domain(const typed::point<Domain> &uset) const
33684{
33685  auto res = isl::multi_union_pw_aff::intersect_domain(uset);
33686  return typed::multi_union_pw_aff<Domain, Range>(res);
33687}
33688
33689template <typename Domain, typename Range>
33690typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::intersect_domain(const typed::set<Domain> &uset) const
33691{
33692  auto res = isl::multi_union_pw_aff::intersect_domain(uset);
33693  return typed::multi_union_pw_aff<Domain, Range>(res);
33694}
33695
33696template <typename Domain, typename Range>
33697typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::intersect_params(const typed::set<> &params) const
33698{
33699  auto res = isl::multi_union_pw_aff::intersect_params(params);
33700  return typed::multi_union_pw_aff<Domain, Range>(res);
33701}
33702
33703template <typename Domain, typename Range>
33704typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::intersect_params(const typed::basic_set<> &params) const
33705{
33706  auto res = isl::multi_union_pw_aff::intersect_params(params);
33707  return typed::multi_union_pw_aff<Domain, Range>(res);
33708}
33709
33710template <typename Domain, typename Range>
33711typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::intersect_params(const typed::point<> &params) const
33712{
33713  auto res = isl::multi_union_pw_aff::intersect_params(params);
33714  return typed::multi_union_pw_aff<Domain, Range>(res);
33715}
33716
33717template <typename Domain, typename Range>
33718typed::union_pw_aff_list<Domain, Anonymous> typed::multi_union_pw_aff<Domain, Range>::list() const
33719{
33720  auto res = isl::multi_union_pw_aff::list();
33721  return typed::union_pw_aff_list<Domain, Anonymous>(res);
33722}
33723
33724template <typename Domain, typename Range>
33725typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::neg() const
33726{
33727  auto res = isl::multi_union_pw_aff::neg();
33728  return typed::multi_union_pw_aff<Domain, Range>(res);
33729}
33730
33731template <typename Domain, typename Range>
33732template <typename Domain2>
33733typed::multi_union_pw_aff<Domain2, Range> typed::multi_union_pw_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
33734{
33735  auto res = isl::multi_union_pw_aff::pullback(upma);
33736  return typed::multi_union_pw_aff<Domain2, Range>(res);
33737}
33738
33739template <typename Domain, typename Range>
33740typed::multi_union_pw_aff<Range> typed::multi_union_pw_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain> &upma) const
33741{
33742  auto res = isl::multi_union_pw_aff::pullback(upma);
33743  return typed::multi_union_pw_aff<Range>(res);
33744}
33745
33746template <typename Domain, typename Range>
33747template <typename Domain2>
33748typed::multi_union_pw_aff<Domain2, Range> typed::multi_union_pw_aff<Domain, Range>::pullback(const typed::multi_aff<Domain2, Domain> &upma) const
33749{
33750  auto res = isl::multi_union_pw_aff::pullback(upma);
33751  return typed::multi_union_pw_aff<Domain2, Range>(res);
33752}
33753
33754template <typename Domain, typename Range>
33755typed::multi_union_pw_aff<Range> typed::multi_union_pw_aff<Domain, Range>::pullback(const typed::multi_aff<Domain> &upma) const
33756{
33757  auto res = isl::multi_union_pw_aff::pullback(upma);
33758  return typed::multi_union_pw_aff<Range>(res);
33759}
33760
33761template <typename Domain, typename Range>
33762template <typename Domain2>
33763typed::multi_union_pw_aff<Domain2, Range> typed::multi_union_pw_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain2, Domain> &upma) const
33764{
33765  auto res = isl::multi_union_pw_aff::pullback(upma);
33766  return typed::multi_union_pw_aff<Domain2, Range>(res);
33767}
33768
33769template <typename Domain, typename Range>
33770typed::multi_union_pw_aff<Range> typed::multi_union_pw_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain> &upma) const
33771{
33772  auto res = isl::multi_union_pw_aff::pullback(upma);
33773  return typed::multi_union_pw_aff<Range>(res);
33774}
33775
33776template <typename Domain, typename Range>
33777template <typename Domain2>
33778typed::multi_union_pw_aff<Domain2, Range> typed::multi_union_pw_aff<Domain, Range>::pullback(const typed::union_pw_aff<Domain2, Domain> &upma) const
33779{
33780  auto res = isl::multi_union_pw_aff::pullback(upma);
33781  return typed::multi_union_pw_aff<Domain2, Range>(res);
33782}
33783
33784template <typename Domain, typename Range>
33785typed::multi_union_pw_aff<Range> typed::multi_union_pw_aff<Domain, Range>::pullback(const typed::union_pw_aff<Domain> &upma) const
33786{
33787  auto res = isl::multi_union_pw_aff::pullback(upma);
33788  return typed::multi_union_pw_aff<Range>(res);
33789}
33790
33791template <typename Domain, typename Range>
33792template <typename Range2>
33793typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_union_pw_aff<Domain, Range>::range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const
33794{
33795  auto res = isl::multi_union_pw_aff::range_product(multi2);
33796  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
33797}
33798
33799template <typename Domain, typename Range>
33800template <typename Range2>
33801typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::multi_union_pw_aff<Domain, Range>::range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const
33802{
33803  auto res = isl::multi_union_pw_aff::range_product(multi2);
33804  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
33805}
33806
33807template <typename Domain, typename Range>
33808typed::multi_union_pw_aff<Domain, pair<Range, Anonymous>> typed::multi_union_pw_aff<Domain, Range>::range_product(const typed::union_pw_aff<Domain, Anonymous> &multi2) const
33809{
33810  auto res = isl::multi_union_pw_aff::range_product(multi2);
33811  return typed::multi_union_pw_aff<Domain, pair<Range, Anonymous>>(res);
33812}
33813
33814template <typename Domain, typename Range>
33815typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::scale(const typed::multi_val<Range> &mv) const
33816{
33817  auto res = isl::multi_union_pw_aff::scale(mv);
33818  return typed::multi_union_pw_aff<Domain, Range>(res);
33819}
33820
33821template <typename Domain, typename Range>
33822typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::scale(const typed::val<Range> &v) const
33823{
33824  auto res = isl::multi_union_pw_aff::scale(v);
33825  return typed::multi_union_pw_aff<Domain, Range>(res);
33826}
33827
33828template <typename Domain, typename Range>
33829typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::scale(long v) const
33830{
33831  auto res = isl::multi_union_pw_aff::scale(v);
33832  return typed::multi_union_pw_aff<Domain, Range>(res);
33833}
33834
33835template <typename Domain, typename Range>
33836typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::scale_down(const typed::multi_val<Range> &mv) const
33837{
33838  auto res = isl::multi_union_pw_aff::scale_down(mv);
33839  return typed::multi_union_pw_aff<Domain, Range>(res);
33840}
33841
33842template <typename Domain, typename Range>
33843typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::scale_down(const typed::val<Range> &v) const
33844{
33845  auto res = isl::multi_union_pw_aff::scale_down(v);
33846  return typed::multi_union_pw_aff<Domain, Range>(res);
33847}
33848
33849template <typename Domain, typename Range>
33850typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::scale_down(long v) const
33851{
33852  auto res = isl::multi_union_pw_aff::scale_down(v);
33853  return typed::multi_union_pw_aff<Domain, Range>(res);
33854}
33855
33856template <typename Domain, typename Range>
33857typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const
33858{
33859  auto res = isl::multi_union_pw_aff::set_at(pos, el);
33860  return typed::multi_union_pw_aff<Domain, Range>(res);
33861}
33862
33863template <typename Domain, typename Range>
33864template <typename Range2>
33865typed::multi_union_pw_aff<Domain, Range2> typed::multi_union_pw_aff<Domain, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
33866{
33867  auto res = isl::multi_union_pw_aff::set_range_tuple(id);
33868  return typed::multi_union_pw_aff<Domain, Range2>(res);
33869}
33870
33871template <typename Domain, typename Range>
33872template <typename Range2>
33873typed::multi_union_pw_aff<Domain, Range2> typed::multi_union_pw_aff<Domain, Range>::set_range_tuple(const std::string &id) const
33874{
33875  auto res = isl::multi_union_pw_aff::set_range_tuple(id);
33876  return typed::multi_union_pw_aff<Domain, Range2>(res);
33877}
33878
33879template <typename Domain, typename Range>
33880typed::space<Range> typed::multi_union_pw_aff<Domain, Range>::space() const
33881{
33882  auto res = isl::multi_union_pw_aff::space();
33883  return typed::space<Range>(res);
33884}
33885
33886template <typename Domain, typename Range>
33887typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::sub(const typed::multi_union_pw_aff<Domain, Range> &multi2) const
33888{
33889  auto res = isl::multi_union_pw_aff::sub(multi2);
33890  return typed::multi_union_pw_aff<Domain, Range>(res);
33891}
33892
33893template <typename Domain, typename Range>
33894typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::sub(const typed::multi_pw_aff<Domain, Range> &multi2) const
33895{
33896  auto res = isl::multi_union_pw_aff::sub(multi2);
33897  return typed::multi_union_pw_aff<Domain, Range>(res);
33898}
33899
33900template <typename Domain, typename Range>
33901typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::sub(const typed::union_pw_aff<Domain, Range> &multi2) const
33902{
33903  auto res = isl::multi_union_pw_aff::sub(multi2);
33904  return typed::multi_union_pw_aff<Domain, Range>(res);
33905}
33906
33907template <typename Domain, typename Range>
33908typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::union_add(const typed::multi_union_pw_aff<Domain, Range> &mupa2) const
33909{
33910  auto res = isl::multi_union_pw_aff::union_add(mupa2);
33911  return typed::multi_union_pw_aff<Domain, Range>(res);
33912}
33913
33914template <typename Domain, typename Range>
33915typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::union_add(const typed::multi_pw_aff<Domain, Range> &mupa2) const
33916{
33917  auto res = isl::multi_union_pw_aff::union_add(mupa2);
33918  return typed::multi_union_pw_aff<Domain, Range>(res);
33919}
33920
33921template <typename Domain, typename Range>
33922typed::multi_union_pw_aff<Domain, Range> typed::multi_union_pw_aff<Domain, Range>::union_add(const typed::union_pw_aff<Domain, Range> &mupa2) const
33923{
33924  auto res = isl::multi_union_pw_aff::union_add(mupa2);
33925  return typed::multi_union_pw_aff<Domain, Range>(res);
33926}
33927
33928template <typename Domain>
33929typed::multi_val<Domain>::multi_val(const typed::space<Domain> &space, const typed::val_list<Anonymous> &list)
33930  : isl::multi_val(space, list)
33931{
33932}
33933
33934template <typename Domain>
33935typed::multi_val<Domain>::multi_val(const isl::ctx &ctx, const std::string &str)
33936  : isl::multi_val(ctx, str)
33937{
33938}
33939
33940template <typename Domain>
33941typed::multi_val<Domain> typed::multi_val<Domain>::add(const typed::multi_val<Domain> &multi2) const
33942{
33943  auto res = isl::multi_val::add(multi2);
33944  return typed::multi_val<Domain>(res);
33945}
33946
33947template <typename Domain>
33948typed::multi_val<Domain> typed::multi_val<Domain>::add(const typed::val<Domain> &v) const
33949{
33950  auto res = isl::multi_val::add(v);
33951  return typed::multi_val<Domain>(res);
33952}
33953
33954template <typename Domain>
33955typed::multi_val<Domain> typed::multi_val<Domain>::add(long v) const
33956{
33957  auto res = isl::multi_val::add(v);
33958  return typed::multi_val<Domain>(res);
33959}
33960
33961template <typename Domain>
33962typed::val<Anonymous> typed::multi_val<Domain>::at(int pos) const
33963{
33964  auto res = isl::multi_val::at(pos);
33965  return typed::val<Anonymous>(res);
33966}
33967
33968template <typename Domain>
33969typed::val_list<Anonymous> typed::multi_val<Domain>::list() const
33970{
33971  auto res = isl::multi_val::list();
33972  return typed::val_list<Anonymous>(res);
33973}
33974
33975template <typename Domain>
33976typed::multi_val<Domain> typed::multi_val<Domain>::max(const typed::multi_val<Domain> &multi2) const
33977{
33978  auto res = isl::multi_val::max(multi2);
33979  return typed::multi_val<Domain>(res);
33980}
33981
33982template <typename Domain>
33983typed::multi_val<Domain> typed::multi_val<Domain>::min(const typed::multi_val<Domain> &multi2) const
33984{
33985  auto res = isl::multi_val::min(multi2);
33986  return typed::multi_val<Domain>(res);
33987}
33988
33989template <typename Domain>
33990typed::multi_val<Domain> typed::multi_val<Domain>::neg() const
33991{
33992  auto res = isl::multi_val::neg();
33993  return typed::multi_val<Domain>(res);
33994}
33995
33996template <typename Domain>
33997template <typename Range>
33998typed::multi_val<pair<Domain, Range>> typed::multi_val<Domain>::product(const typed::multi_val<Range> &multi2) const
33999{
34000  auto res = isl::multi_val::product(multi2);
34001  return typed::multi_val<pair<Domain, Range>>(res);
34002}
34003
34004template <typename Domain>
34005typed::multi_val<Domain> typed::multi_val<Domain>::scale(const typed::multi_val<Domain> &mv) const
34006{
34007  auto res = isl::multi_val::scale(mv);
34008  return typed::multi_val<Domain>(res);
34009}
34010
34011template <typename Domain>
34012typed::multi_val<Domain> typed::multi_val<Domain>::scale(const typed::val<Domain> &v) const
34013{
34014  auto res = isl::multi_val::scale(v);
34015  return typed::multi_val<Domain>(res);
34016}
34017
34018template <typename Domain>
34019typed::multi_val<Domain> typed::multi_val<Domain>::scale(long v) const
34020{
34021  auto res = isl::multi_val::scale(v);
34022  return typed::multi_val<Domain>(res);
34023}
34024
34025template <typename Domain>
34026typed::multi_val<Domain> typed::multi_val<Domain>::scale_down(const typed::multi_val<Domain> &mv) const
34027{
34028  auto res = isl::multi_val::scale_down(mv);
34029  return typed::multi_val<Domain>(res);
34030}
34031
34032template <typename Domain>
34033typed::multi_val<Domain> typed::multi_val<Domain>::scale_down(const typed::val<Domain> &v) const
34034{
34035  auto res = isl::multi_val::scale_down(v);
34036  return typed::multi_val<Domain>(res);
34037}
34038
34039template <typename Domain>
34040typed::multi_val<Domain> typed::multi_val<Domain>::scale_down(long v) const
34041{
34042  auto res = isl::multi_val::scale_down(v);
34043  return typed::multi_val<Domain>(res);
34044}
34045
34046template <typename Domain>
34047typed::multi_val<Domain> typed::multi_val<Domain>::set_at(int pos, const typed::val<Anonymous> &el) const
34048{
34049  auto res = isl::multi_val::set_at(pos, el);
34050  return typed::multi_val<Domain>(res);
34051}
34052
34053template <typename Domain>
34054typed::multi_val<Domain> typed::multi_val<Domain>::set_at(int pos, long el) const
34055{
34056  auto res = isl::multi_val::set_at(pos, el);
34057  return typed::multi_val<Domain>(res);
34058}
34059
34060template <typename Domain>
34061template <typename Domain2>
34062typed::multi_val<Domain2> typed::multi_val<Domain>::set_range_tuple(const typed::id<Anonymous> &id) const
34063{
34064  auto res = isl::multi_val::set_range_tuple(id);
34065  return typed::multi_val<Domain2>(res);
34066}
34067
34068template <typename Domain>
34069template <typename Domain2>
34070typed::multi_val<Domain2> typed::multi_val<Domain>::set_range_tuple(const std::string &id) const
34071{
34072  auto res = isl::multi_val::set_range_tuple(id);
34073  return typed::multi_val<Domain2>(res);
34074}
34075
34076template <typename Domain>
34077typed::space<Domain> typed::multi_val<Domain>::space() const
34078{
34079  auto res = isl::multi_val::space();
34080  return typed::space<Domain>(res);
34081}
34082
34083template <typename Domain>
34084typed::multi_val<Domain> typed::multi_val<Domain>::sub(const typed::multi_val<Domain> &multi2) const
34085{
34086  auto res = isl::multi_val::sub(multi2);
34087  return typed::multi_val<Domain>(res);
34088}
34089
34090typed::set<> typed::point<>::coalesce() const
34091{
34092  auto res = isl::point::coalesce();
34093  return typed::set<>(res);
34094}
34095
34096typed::basic_set<> typed::point<>::detect_equalities() const
34097{
34098  auto res = isl::point::detect_equalities();
34099  return typed::basic_set<>(res);
34100}
34101
34102typed::set<> typed::point<>::drop_unused_params() const
34103{
34104  auto res = isl::point::drop_unused_params();
34105  return typed::set<>(res);
34106}
34107
34108bool typed::point<>::every_set(const std::function<bool(typed::set<>)> &test) const
34109{
34110  auto lambda_test = [&] (isl::set arg0) {
34111    return test(typed::set<>(arg0));
34112  };
34113  return isl::point::every_set(lambda_test);
34114}
34115
34116typed::set<> typed::point<>::extract_set(const typed::space<> &space) const
34117{
34118  auto res = isl::point::extract_set(space);
34119  return typed::set<>(res);
34120}
34121
34122void typed::point<>::foreach_basic_set(const std::function<void(typed::basic_set<>)> &fn) const
34123{
34124  auto lambda_fn = [&] (isl::basic_set arg0) {
34125    return fn(typed::basic_set<>(arg0));
34126  };
34127  return isl::point::foreach_basic_set(lambda_fn);
34128}
34129
34130void typed::point<>::foreach_point(const std::function<void(typed::point<>)> &fn) const
34131{
34132  auto lambda_fn = [&] (isl::point arg0) {
34133    return fn(typed::point<>(arg0));
34134  };
34135  return isl::point::foreach_point(lambda_fn);
34136}
34137
34138void typed::point<>::foreach_set(const std::function<void(typed::set<>)> &fn) const
34139{
34140  auto lambda_fn = [&] (isl::set arg0) {
34141    return fn(typed::set<>(arg0));
34142  };
34143  return isl::point::foreach_set(lambda_fn);
34144}
34145
34146typed::basic_set<> typed::point<>::gist(const typed::basic_set<> &context) const
34147{
34148  auto res = isl::point::gist(context);
34149  return typed::basic_set<>(res);
34150}
34151
34152typed::set<> typed::point<>::gist(const typed::set<> &context) const
34153{
34154  auto res = isl::point::gist(context);
34155  return typed::set<>(res);
34156}
34157
34158typed::union_set<> typed::point<>::gist(const typed::union_set<> &context) const
34159{
34160  auto res = isl::point::gist(context);
34161  return typed::union_set<>(res);
34162}
34163
34164typed::pw_aff<Anonymous> typed::point<>::indicator_function() const
34165{
34166  auto res = isl::point::indicator_function();
34167  return typed::pw_aff<Anonymous>(res);
34168}
34169
34170typed::basic_set<> typed::point<>::intersect(const typed::basic_set<> &bset2) const
34171{
34172  auto res = isl::point::intersect(bset2);
34173  return typed::basic_set<>(res);
34174}
34175
34176typed::set<> typed::point<>::intersect(const typed::set<> &set2) const
34177{
34178  auto res = isl::point::intersect(set2);
34179  return typed::set<>(res);
34180}
34181
34182typed::union_set<> typed::point<>::intersect(const typed::union_set<> &uset2) const
34183{
34184  auto res = isl::point::intersect(uset2);
34185  return typed::union_set<>(res);
34186}
34187
34188typed::pw_aff<Anonymous> typed::point<>::param_pw_aff_on_domain(const typed::id<Anonymous> &id) const
34189{
34190  auto res = isl::point::param_pw_aff_on_domain(id);
34191  return typed::pw_aff<Anonymous>(res);
34192}
34193
34194typed::pw_aff<Anonymous> typed::point<>::param_pw_aff_on_domain(const std::string &id) const
34195{
34196  auto res = isl::point::param_pw_aff_on_domain(id);
34197  return typed::pw_aff<Anonymous>(res);
34198}
34199
34200typed::set<> typed::point<>::project_out_all_params() const
34201{
34202  auto res = isl::point::project_out_all_params();
34203  return typed::set<>(res);
34204}
34205
34206typed::set<> typed::point<>::project_out_param(const typed::id<Anonymous> &id) const
34207{
34208  auto res = isl::point::project_out_param(id);
34209  return typed::set<>(res);
34210}
34211
34212typed::set<> typed::point<>::project_out_param(const std::string &id) const
34213{
34214  auto res = isl::point::project_out_param(id);
34215  return typed::set<>(res);
34216}
34217
34218typed::set<> typed::point<>::project_out_param(const typed::id_list<Anonymous> &list) const
34219{
34220  auto res = isl::point::project_out_param(list);
34221  return typed::set<>(res);
34222}
34223
34224typed::pw_aff<Anonymous> typed::point<>::pw_aff_on_domain(const typed::val<Anonymous> &v) const
34225{
34226  auto res = isl::point::pw_aff_on_domain(v);
34227  return typed::pw_aff<Anonymous>(res);
34228}
34229
34230typed::pw_aff<Anonymous> typed::point<>::pw_aff_on_domain(long v) const
34231{
34232  auto res = isl::point::pw_aff_on_domain(v);
34233  return typed::pw_aff<Anonymous>(res);
34234}
34235
34236template <typename Domain>
34237typed::pw_multi_aff<Domain> typed::point<>::pw_multi_aff_on_domain(const typed::multi_val<Domain> &mv) const
34238{
34239  auto res = isl::point::pw_multi_aff_on_domain(mv);
34240  return typed::pw_multi_aff<Domain>(res);
34241}
34242
34243typed::set_list<> typed::point<>::set_list() const
34244{
34245  auto res = isl::point::set_list();
34246  return typed::set_list<>(res);
34247}
34248
34249typed::space<> typed::point<>::space() const
34250{
34251  auto res = isl::point::space();
34252  return typed::space<>(res);
34253}
34254
34255typed::set<> typed::point<>::subtract(const typed::set<> &set2) const
34256{
34257  auto res = isl::point::subtract(set2);
34258  return typed::set<>(res);
34259}
34260
34261typed::union_set<> typed::point<>::subtract(const typed::union_set<> &uset2) const
34262{
34263  auto res = isl::point::subtract(uset2);
34264  return typed::union_set<>(res);
34265}
34266
34267typed::set<> typed::point<>::to_set() const
34268{
34269  auto res = isl::point::to_set();
34270  return typed::set<>(res);
34271}
34272
34273typed::union_set<> typed::point<>::to_union_set() const
34274{
34275  auto res = isl::point::to_union_set();
34276  return typed::union_set<>(res);
34277}
34278
34279template <typename Domain>
34280typed::set<Domain> typed::point<>::unbind_params(const typed::multi_id<Domain> &tuple) const
34281{
34282  auto res = isl::point::unbind_params(tuple);
34283  return typed::set<Domain>(res);
34284}
34285
34286typed::set<> typed::point<>::unite(const typed::basic_set<> &bset2) const
34287{
34288  auto res = isl::point::unite(bset2);
34289  return typed::set<>(res);
34290}
34291
34292typed::set<> typed::point<>::unite(const typed::set<> &set2) const
34293{
34294  auto res = isl::point::unite(set2);
34295  return typed::set<>(res);
34296}
34297
34298typed::union_set<> typed::point<>::unite(const typed::union_set<> &uset2) const
34299{
34300  auto res = isl::point::unite(uset2);
34301  return typed::union_set<>(res);
34302}
34303
34304template <typename Domain>
34305template <typename Range>
34306typed::basic_set<Range> typed::point<Domain>::apply(const typed::basic_map<Domain, Range> &bmap) const
34307{
34308  auto res = isl::point::apply(bmap);
34309  return typed::basic_set<Range>(res);
34310}
34311
34312template <typename Domain>
34313template <typename Range>
34314typed::set<Range> typed::point<Domain>::apply(const typed::map<Domain, Range> &map) const
34315{
34316  auto res = isl::point::apply(map);
34317  return typed::set<Range>(res);
34318}
34319
34320template <typename Domain>
34321template <typename Range>
34322typed::union_set<Range> typed::point<Domain>::apply(const typed::union_map<Domain, Range> &umap) const
34323{
34324  auto res = isl::point::apply(umap);
34325  return typed::union_set<Range>(res);
34326}
34327
34328template <typename Domain>
34329typed::pw_multi_aff<Domain> typed::point<Domain>::as_pw_multi_aff() const
34330{
34331  auto res = isl::point::as_pw_multi_aff();
34332  return typed::pw_multi_aff<Domain>(res);
34333}
34334
34335template <typename Domain>
34336typed::set<Domain> typed::point<Domain>::as_set() const
34337{
34338  auto res = isl::point::as_set();
34339  return typed::set<Domain>(res);
34340}
34341
34342template <typename Domain>
34343typed::set<> typed::point<Domain>::bind(const typed::multi_id<Domain> &tuple) const
34344{
34345  auto res = isl::point::bind(tuple);
34346  return typed::set<>(res);
34347}
34348
34349template <typename Domain>
34350typed::set<Domain> typed::point<Domain>::coalesce() const
34351{
34352  auto res = isl::point::coalesce();
34353  return typed::set<Domain>(res);
34354}
34355
34356template <typename Domain>
34357typed::basic_set<Domain> typed::point<Domain>::detect_equalities() const
34358{
34359  auto res = isl::point::detect_equalities();
34360  return typed::basic_set<Domain>(res);
34361}
34362
34363template <typename Domain>
34364typed::set<Domain> typed::point<Domain>::drop_unused_params() const
34365{
34366  auto res = isl::point::drop_unused_params();
34367  return typed::set<Domain>(res);
34368}
34369
34370template <typename Domain>
34371bool typed::point<Domain>::every_set(const std::function<bool(typed::set<Domain>)> &test) const
34372{
34373  auto lambda_test = [&] (isl::set arg0) {
34374    return test(typed::set<Domain>(arg0));
34375  };
34376  return isl::point::every_set(lambda_test);
34377}
34378
34379template <typename Domain>
34380typed::set<Domain> typed::point<Domain>::extract_set(const typed::space<Domain> &space) const
34381{
34382  auto res = isl::point::extract_set(space);
34383  return typed::set<Domain>(res);
34384}
34385
34386template <typename Domain>
34387void typed::point<Domain>::foreach_basic_set(const std::function<void(typed::basic_set<Domain>)> &fn) const
34388{
34389  auto lambda_fn = [&] (isl::basic_set arg0) {
34390    return fn(typed::basic_set<Domain>(arg0));
34391  };
34392  return isl::point::foreach_basic_set(lambda_fn);
34393}
34394
34395template <typename Domain>
34396void typed::point<Domain>::foreach_point(const std::function<void(typed::point<Domain>)> &fn) const
34397{
34398  auto lambda_fn = [&] (isl::point arg0) {
34399    return fn(typed::point<Domain>(arg0));
34400  };
34401  return isl::point::foreach_point(lambda_fn);
34402}
34403
34404template <typename Domain>
34405void typed::point<Domain>::foreach_set(const std::function<void(typed::set<Domain>)> &fn) const
34406{
34407  auto lambda_fn = [&] (isl::set arg0) {
34408    return fn(typed::set<Domain>(arg0));
34409  };
34410  return isl::point::foreach_set(lambda_fn);
34411}
34412
34413template <typename Domain>
34414typed::basic_set<Domain> typed::point<Domain>::gist(const typed::basic_set<Domain> &context) const
34415{
34416  auto res = isl::point::gist(context);
34417  return typed::basic_set<Domain>(res);
34418}
34419
34420template <typename Domain>
34421typed::set<Domain> typed::point<Domain>::gist(const typed::set<Domain> &context) const
34422{
34423  auto res = isl::point::gist(context);
34424  return typed::set<Domain>(res);
34425}
34426
34427template <typename Domain>
34428typed::union_set<Domain> typed::point<Domain>::gist(const typed::union_set<Domain> &context) const
34429{
34430  auto res = isl::point::gist(context);
34431  return typed::union_set<Domain>(res);
34432}
34433
34434template <typename Domain>
34435typed::set<Domain> typed::point<Domain>::gist_params(const typed::set<> &context) const
34436{
34437  auto res = isl::point::gist_params(context);
34438  return typed::set<Domain>(res);
34439}
34440
34441template <typename Domain>
34442typed::map<Domain, Domain> typed::point<Domain>::identity() const
34443{
34444  auto res = isl::point::identity();
34445  return typed::map<Domain, Domain>(res);
34446}
34447
34448template <typename Domain>
34449typed::pw_aff<Domain, Anonymous> typed::point<Domain>::indicator_function() const
34450{
34451  auto res = isl::point::indicator_function();
34452  return typed::pw_aff<Domain, Anonymous>(res);
34453}
34454
34455template <typename Domain>
34456template <typename Arg1>
34457typed::map<Arg1, Domain> typed::point<Domain>::insert_domain(const typed::space<Arg1> &domain) const
34458{
34459  auto res = isl::point::insert_domain(domain);
34460  return typed::map<Arg1, Domain>(res);
34461}
34462
34463template <typename Domain>
34464typed::basic_set<Domain> typed::point<Domain>::intersect(const typed::basic_set<Domain> &bset2) const
34465{
34466  auto res = isl::point::intersect(bset2);
34467  return typed::basic_set<Domain>(res);
34468}
34469
34470template <typename Domain>
34471typed::set<Domain> typed::point<Domain>::intersect(const typed::set<Domain> &set2) const
34472{
34473  auto res = isl::point::intersect(set2);
34474  return typed::set<Domain>(res);
34475}
34476
34477template <typename Domain>
34478typed::union_set<Domain> typed::point<Domain>::intersect(const typed::union_set<Domain> &uset2) const
34479{
34480  auto res = isl::point::intersect(uset2);
34481  return typed::union_set<Domain>(res);
34482}
34483
34484template <typename Domain>
34485typed::basic_set<Domain> typed::point<Domain>::intersect_params(const typed::basic_set<> &bset2) const
34486{
34487  auto res = isl::point::intersect_params(bset2);
34488  return typed::basic_set<Domain>(res);
34489}
34490
34491template <typename Domain>
34492typed::set<Domain> typed::point<Domain>::intersect_params(const typed::set<> &params) const
34493{
34494  auto res = isl::point::intersect_params(params);
34495  return typed::set<Domain>(res);
34496}
34497
34498template <typename Domain>
34499typed::fixed_box<Domain> typed::point<Domain>::lattice_tile() const
34500{
34501  auto res = isl::point::lattice_tile();
34502  return typed::fixed_box<Domain>(res);
34503}
34504
34505template <typename Domain>
34506typed::set<Domain> typed::point<Domain>::lexmax() const
34507{
34508  auto res = isl::point::lexmax();
34509  return typed::set<Domain>(res);
34510}
34511
34512template <typename Domain>
34513typed::pw_multi_aff<Domain> typed::point<Domain>::lexmax_pw_multi_aff() const
34514{
34515  auto res = isl::point::lexmax_pw_multi_aff();
34516  return typed::pw_multi_aff<Domain>(res);
34517}
34518
34519template <typename Domain>
34520typed::set<Domain> typed::point<Domain>::lexmin() const
34521{
34522  auto res = isl::point::lexmin();
34523  return typed::set<Domain>(res);
34524}
34525
34526template <typename Domain>
34527typed::pw_multi_aff<Domain> typed::point<Domain>::lexmin_pw_multi_aff() const
34528{
34529  auto res = isl::point::lexmin_pw_multi_aff();
34530  return typed::pw_multi_aff<Domain>(res);
34531}
34532
34533template <typename Domain>
34534typed::set<Domain> typed::point<Domain>::lower_bound(const typed::multi_pw_aff<Domain> &lower) const
34535{
34536  auto res = isl::point::lower_bound(lower);
34537  return typed::set<Domain>(res);
34538}
34539
34540template <typename Domain>
34541typed::set<Domain> typed::point<Domain>::lower_bound(const typed::multi_val<Domain> &lower) const
34542{
34543  auto res = isl::point::lower_bound(lower);
34544  return typed::set<Domain>(res);
34545}
34546
34547template <typename Domain>
34548typed::multi_pw_aff<Domain> typed::point<Domain>::max_multi_pw_aff() const
34549{
34550  auto res = isl::point::max_multi_pw_aff();
34551  return typed::multi_pw_aff<Domain>(res);
34552}
34553
34554template <typename Domain>
34555typed::multi_pw_aff<Domain> typed::point<Domain>::min_multi_pw_aff() const
34556{
34557  auto res = isl::point::min_multi_pw_aff();
34558  return typed::multi_pw_aff<Domain>(res);
34559}
34560
34561template <typename Domain>
34562typed::multi_val<Domain> typed::point<Domain>::multi_val() const
34563{
34564  auto res = isl::point::multi_val();
34565  return typed::multi_val<Domain>(res);
34566}
34567
34568template <typename Domain>
34569typed::pw_aff<Domain, Anonymous> typed::point<Domain>::param_pw_aff_on_domain(const typed::id<Anonymous> &id) const
34570{
34571  auto res = isl::point::param_pw_aff_on_domain(id);
34572  return typed::pw_aff<Domain, Anonymous>(res);
34573}
34574
34575template <typename Domain>
34576typed::pw_aff<Domain, Anonymous> typed::point<Domain>::param_pw_aff_on_domain(const std::string &id) const
34577{
34578  auto res = isl::point::param_pw_aff_on_domain(id);
34579  return typed::pw_aff<Domain, Anonymous>(res);
34580}
34581
34582template <typename Domain>
34583typed::basic_set<> typed::point<Domain>::params() const
34584{
34585  auto res = isl::point::params();
34586  return typed::basic_set<>(res);
34587}
34588
34589template <typename Domain>
34590typed::multi_val<Domain> typed::point<Domain>::plain_multi_val_if_fixed() const
34591{
34592  auto res = isl::point::plain_multi_val_if_fixed();
34593  return typed::multi_val<Domain>(res);
34594}
34595
34596template <typename Domain>
34597template <typename Domain2>
34598typed::set<Domain2> typed::point<Domain>::preimage(const typed::multi_aff<Domain2, Domain> &ma) const
34599{
34600  auto res = isl::point::preimage(ma);
34601  return typed::set<Domain2>(res);
34602}
34603
34604template <typename Domain>
34605template <typename Domain2>
34606typed::set<Domain2> typed::point<Domain>::preimage(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
34607{
34608  auto res = isl::point::preimage(mpa);
34609  return typed::set<Domain2>(res);
34610}
34611
34612template <typename Domain>
34613template <typename Domain2>
34614typed::set<Domain2> typed::point<Domain>::preimage(const typed::pw_multi_aff<Domain2, Domain> &pma) const
34615{
34616  auto res = isl::point::preimage(pma);
34617  return typed::set<Domain2>(res);
34618}
34619
34620template <typename Domain>
34621template <typename Domain2>
34622typed::union_set<Domain2> typed::point<Domain>::preimage(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
34623{
34624  auto res = isl::point::preimage(upma);
34625  return typed::union_set<Domain2>(res);
34626}
34627
34628template <typename Domain>
34629template <typename Range>
34630typed::set<pair<Domain, Range>> typed::point<Domain>::product(const typed::set<Range> &set2) const
34631{
34632  auto res = isl::point::product(set2);
34633  return typed::set<pair<Domain, Range>>(res);
34634}
34635
34636template <typename Domain>
34637typed::set<Domain> typed::point<Domain>::project_out_all_params() const
34638{
34639  auto res = isl::point::project_out_all_params();
34640  return typed::set<Domain>(res);
34641}
34642
34643template <typename Domain>
34644typed::set<Domain> typed::point<Domain>::project_out_param(const typed::id<Anonymous> &id) const
34645{
34646  auto res = isl::point::project_out_param(id);
34647  return typed::set<Domain>(res);
34648}
34649
34650template <typename Domain>
34651typed::set<Domain> typed::point<Domain>::project_out_param(const std::string &id) const
34652{
34653  auto res = isl::point::project_out_param(id);
34654  return typed::set<Domain>(res);
34655}
34656
34657template <typename Domain>
34658typed::set<Domain> typed::point<Domain>::project_out_param(const typed::id_list<Anonymous> &list) const
34659{
34660  auto res = isl::point::project_out_param(list);
34661  return typed::set<Domain>(res);
34662}
34663
34664template <typename Domain>
34665typed::pw_aff<Domain, Anonymous> typed::point<Domain>::pw_aff_on_domain(const typed::val<Anonymous> &v) const
34666{
34667  auto res = isl::point::pw_aff_on_domain(v);
34668  return typed::pw_aff<Domain, Anonymous>(res);
34669}
34670
34671template <typename Domain>
34672typed::pw_aff<Domain, Anonymous> typed::point<Domain>::pw_aff_on_domain(long v) const
34673{
34674  auto res = isl::point::pw_aff_on_domain(v);
34675  return typed::pw_aff<Domain, Anonymous>(res);
34676}
34677
34678template <typename Domain>
34679template <typename Range>
34680typed::pw_multi_aff<Domain, Range> typed::point<Domain>::pw_multi_aff_on_domain(const typed::multi_val<Range> &mv) const
34681{
34682  auto res = isl::point::pw_multi_aff_on_domain(mv);
34683  return typed::pw_multi_aff<Domain, Range>(res);
34684}
34685
34686template <typename Domain>
34687typed::set_list<Domain> typed::point<Domain>::set_list() const
34688{
34689  auto res = isl::point::set_list();
34690  return typed::set_list<Domain>(res);
34691}
34692
34693template <typename Domain>
34694typed::fixed_box<Domain> typed::point<Domain>::simple_fixed_box_hull() const
34695{
34696  auto res = isl::point::simple_fixed_box_hull();
34697  return typed::fixed_box<Domain>(res);
34698}
34699
34700template <typename Domain>
34701typed::space<Domain> typed::point<Domain>::space() const
34702{
34703  auto res = isl::point::space();
34704  return typed::space<Domain>(res);
34705}
34706
34707template <typename Domain>
34708typed::set<Domain> typed::point<Domain>::subtract(const typed::set<Domain> &set2) const
34709{
34710  auto res = isl::point::subtract(set2);
34711  return typed::set<Domain>(res);
34712}
34713
34714template <typename Domain>
34715typed::union_set<Domain> typed::point<Domain>::subtract(const typed::union_set<Domain> &uset2) const
34716{
34717  auto res = isl::point::subtract(uset2);
34718  return typed::union_set<Domain>(res);
34719}
34720
34721template <typename Domain>
34722typed::set<Domain> typed::point<Domain>::to_set() const
34723{
34724  auto res = isl::point::to_set();
34725  return typed::set<Domain>(res);
34726}
34727
34728template <typename Domain>
34729typed::union_set<Domain> typed::point<Domain>::to_union_set() const
34730{
34731  auto res = isl::point::to_union_set();
34732  return typed::union_set<Domain>(res);
34733}
34734
34735template <typename Domain>
34736typed::map<Domain, Domain> typed::point<Domain>::translation() const
34737{
34738  auto res = isl::point::translation();
34739  return typed::map<Domain, Domain>(res);
34740}
34741
34742template <typename Domain>
34743template <typename Arg1>
34744typed::map<Arg1, Domain> typed::point<Domain>::unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const
34745{
34746  auto res = isl::point::unbind_params_insert_domain(domain);
34747  return typed::map<Arg1, Domain>(res);
34748}
34749
34750template <typename Domain>
34751typed::set<Domain> typed::point<Domain>::unite(const typed::basic_set<Domain> &bset2) const
34752{
34753  auto res = isl::point::unite(bset2);
34754  return typed::set<Domain>(res);
34755}
34756
34757template <typename Domain>
34758typed::set<Domain> typed::point<Domain>::unite(const typed::set<Domain> &set2) const
34759{
34760  auto res = isl::point::unite(set2);
34761  return typed::set<Domain>(res);
34762}
34763
34764template <typename Domain>
34765typed::union_set<Domain> typed::point<Domain>::unite(const typed::union_set<Domain> &uset2) const
34766{
34767  auto res = isl::point::unite(uset2);
34768  return typed::union_set<Domain>(res);
34769}
34770
34771template <typename Domain>
34772typed::set<Domain> typed::point<Domain>::upper_bound(const typed::multi_pw_aff<Domain> &upper) const
34773{
34774  auto res = isl::point::upper_bound(upper);
34775  return typed::set<Domain>(res);
34776}
34777
34778template <typename Domain>
34779typed::set<Domain> typed::point<Domain>::upper_bound(const typed::multi_val<Domain> &upper) const
34780{
34781  auto res = isl::point::upper_bound(upper);
34782  return typed::set<Domain>(res);
34783}
34784
34785template <typename Domain, typename Range>
34786template <typename Arg2>
34787typed::basic_set<Arg2> typed::point<pair<Domain, Range>>::apply(const typed::basic_map<pair<Domain, Range>, Arg2> &bmap) const
34788{
34789  auto res = isl::point::apply(bmap);
34790  return typed::basic_set<Arg2>(res);
34791}
34792
34793template <typename Domain, typename Range>
34794template <typename Arg2>
34795typed::set<Arg2> typed::point<pair<Domain, Range>>::apply(const typed::map<pair<Domain, Range>, Arg2> &map) const
34796{
34797  auto res = isl::point::apply(map);
34798  return typed::set<Arg2>(res);
34799}
34800
34801template <typename Domain, typename Range>
34802template <typename Arg2>
34803typed::union_set<Arg2> typed::point<pair<Domain, Range>>::apply(const typed::union_map<pair<Domain, Range>, Arg2> &umap) const
34804{
34805  auto res = isl::point::apply(umap);
34806  return typed::union_set<Arg2>(res);
34807}
34808
34809template <typename Domain, typename Range>
34810typed::pw_multi_aff<pair<Domain, Range>> typed::point<pair<Domain, Range>>::as_pw_multi_aff() const
34811{
34812  auto res = isl::point::as_pw_multi_aff();
34813  return typed::pw_multi_aff<pair<Domain, Range>>(res);
34814}
34815
34816template <typename Domain, typename Range>
34817typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::as_set() const
34818{
34819  auto res = isl::point::as_set();
34820  return typed::set<pair<Domain, Range>>(res);
34821}
34822
34823template <typename Domain, typename Range>
34824typed::set<> typed::point<pair<Domain, Range>>::bind(const typed::multi_id<pair<Domain, Range>> &tuple) const
34825{
34826  auto res = isl::point::bind(tuple);
34827  return typed::set<>(res);
34828}
34829
34830template <typename Domain, typename Range>
34831typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::coalesce() const
34832{
34833  auto res = isl::point::coalesce();
34834  return typed::set<pair<Domain, Range>>(res);
34835}
34836
34837template <typename Domain, typename Range>
34838typed::basic_set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::detect_equalities() const
34839{
34840  auto res = isl::point::detect_equalities();
34841  return typed::basic_set<pair<Domain, Range>>(res);
34842}
34843
34844template <typename Domain, typename Range>
34845typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::drop_unused_params() const
34846{
34847  auto res = isl::point::drop_unused_params();
34848  return typed::set<pair<Domain, Range>>(res);
34849}
34850
34851template <typename Domain, typename Range>
34852bool typed::point<pair<Domain, Range>>::every_set(const std::function<bool(typed::set<pair<Domain, Range>>)> &test) const
34853{
34854  auto lambda_test = [&] (isl::set arg0) {
34855    return test(typed::set<pair<Domain, Range>>(arg0));
34856  };
34857  return isl::point::every_set(lambda_test);
34858}
34859
34860template <typename Domain, typename Range>
34861typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::extract_set(const typed::space<pair<Domain, Range>> &space) const
34862{
34863  auto res = isl::point::extract_set(space);
34864  return typed::set<pair<Domain, Range>>(res);
34865}
34866
34867template <typename Domain, typename Range>
34868void typed::point<pair<Domain, Range>>::foreach_basic_set(const std::function<void(typed::basic_set<pair<Domain, Range>>)> &fn) const
34869{
34870  auto lambda_fn = [&] (isl::basic_set arg0) {
34871    return fn(typed::basic_set<pair<Domain, Range>>(arg0));
34872  };
34873  return isl::point::foreach_basic_set(lambda_fn);
34874}
34875
34876template <typename Domain, typename Range>
34877void typed::point<pair<Domain, Range>>::foreach_point(const std::function<void(typed::point<pair<Domain, Range>>)> &fn) const
34878{
34879  auto lambda_fn = [&] (isl::point arg0) {
34880    return fn(typed::point<pair<Domain, Range>>(arg0));
34881  };
34882  return isl::point::foreach_point(lambda_fn);
34883}
34884
34885template <typename Domain, typename Range>
34886void typed::point<pair<Domain, Range>>::foreach_set(const std::function<void(typed::set<pair<Domain, Range>>)> &fn) const
34887{
34888  auto lambda_fn = [&] (isl::set arg0) {
34889    return fn(typed::set<pair<Domain, Range>>(arg0));
34890  };
34891  return isl::point::foreach_set(lambda_fn);
34892}
34893
34894template <typename Domain, typename Range>
34895typed::basic_set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::gist(const typed::basic_set<pair<Domain, Range>> &context) const
34896{
34897  auto res = isl::point::gist(context);
34898  return typed::basic_set<pair<Domain, Range>>(res);
34899}
34900
34901template <typename Domain, typename Range>
34902typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::gist(const typed::set<pair<Domain, Range>> &context) const
34903{
34904  auto res = isl::point::gist(context);
34905  return typed::set<pair<Domain, Range>>(res);
34906}
34907
34908template <typename Domain, typename Range>
34909typed::union_set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::gist(const typed::union_set<pair<Domain, Range>> &context) const
34910{
34911  auto res = isl::point::gist(context);
34912  return typed::union_set<pair<Domain, Range>>(res);
34913}
34914
34915template <typename Domain, typename Range>
34916typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::gist_params(const typed::set<> &context) const
34917{
34918  auto res = isl::point::gist_params(context);
34919  return typed::set<pair<Domain, Range>>(res);
34920}
34921
34922template <typename Domain, typename Range>
34923typed::map<pair<Domain, Range>, pair<Domain, Range>> typed::point<pair<Domain, Range>>::identity() const
34924{
34925  auto res = isl::point::identity();
34926  return typed::map<pair<Domain, Range>, pair<Domain, Range>>(res);
34927}
34928
34929template <typename Domain, typename Range>
34930typed::pw_aff<pair<Domain, Range>, Anonymous> typed::point<pair<Domain, Range>>::indicator_function() const
34931{
34932  auto res = isl::point::indicator_function();
34933  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
34934}
34935
34936template <typename Domain, typename Range>
34937template <typename Arg2>
34938typed::map<Arg2, pair<Domain, Range>> typed::point<pair<Domain, Range>>::insert_domain(const typed::space<Arg2> &domain) const
34939{
34940  auto res = isl::point::insert_domain(domain);
34941  return typed::map<Arg2, pair<Domain, Range>>(res);
34942}
34943
34944template <typename Domain, typename Range>
34945typed::basic_set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::intersect(const typed::basic_set<pair<Domain, Range>> &bset2) const
34946{
34947  auto res = isl::point::intersect(bset2);
34948  return typed::basic_set<pair<Domain, Range>>(res);
34949}
34950
34951template <typename Domain, typename Range>
34952typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::intersect(const typed::set<pair<Domain, Range>> &set2) const
34953{
34954  auto res = isl::point::intersect(set2);
34955  return typed::set<pair<Domain, Range>>(res);
34956}
34957
34958template <typename Domain, typename Range>
34959typed::union_set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::intersect(const typed::union_set<pair<Domain, Range>> &uset2) const
34960{
34961  auto res = isl::point::intersect(uset2);
34962  return typed::union_set<pair<Domain, Range>>(res);
34963}
34964
34965template <typename Domain, typename Range>
34966typed::basic_set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::intersect_params(const typed::basic_set<> &bset2) const
34967{
34968  auto res = isl::point::intersect_params(bset2);
34969  return typed::basic_set<pair<Domain, Range>>(res);
34970}
34971
34972template <typename Domain, typename Range>
34973typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::intersect_params(const typed::set<> &params) const
34974{
34975  auto res = isl::point::intersect_params(params);
34976  return typed::set<pair<Domain, Range>>(res);
34977}
34978
34979template <typename Domain, typename Range>
34980typed::fixed_box<pair<Domain, Range>> typed::point<pair<Domain, Range>>::lattice_tile() const
34981{
34982  auto res = isl::point::lattice_tile();
34983  return typed::fixed_box<pair<Domain, Range>>(res);
34984}
34985
34986template <typename Domain, typename Range>
34987typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::lexmax() const
34988{
34989  auto res = isl::point::lexmax();
34990  return typed::set<pair<Domain, Range>>(res);
34991}
34992
34993template <typename Domain, typename Range>
34994typed::pw_multi_aff<pair<Domain, Range>> typed::point<pair<Domain, Range>>::lexmax_pw_multi_aff() const
34995{
34996  auto res = isl::point::lexmax_pw_multi_aff();
34997  return typed::pw_multi_aff<pair<Domain, Range>>(res);
34998}
34999
35000template <typename Domain, typename Range>
35001typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::lexmin() const
35002{
35003  auto res = isl::point::lexmin();
35004  return typed::set<pair<Domain, Range>>(res);
35005}
35006
35007template <typename Domain, typename Range>
35008typed::pw_multi_aff<pair<Domain, Range>> typed::point<pair<Domain, Range>>::lexmin_pw_multi_aff() const
35009{
35010  auto res = isl::point::lexmin_pw_multi_aff();
35011  return typed::pw_multi_aff<pair<Domain, Range>>(res);
35012}
35013
35014template <typename Domain, typename Range>
35015typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::lower_bound(const typed::multi_pw_aff<pair<Domain, Range>> &lower) const
35016{
35017  auto res = isl::point::lower_bound(lower);
35018  return typed::set<pair<Domain, Range>>(res);
35019}
35020
35021template <typename Domain, typename Range>
35022typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::lower_bound(const typed::multi_val<pair<Domain, Range>> &lower) const
35023{
35024  auto res = isl::point::lower_bound(lower);
35025  return typed::set<pair<Domain, Range>>(res);
35026}
35027
35028template <typename Domain, typename Range>
35029typed::multi_pw_aff<pair<Domain, Range>> typed::point<pair<Domain, Range>>::max_multi_pw_aff() const
35030{
35031  auto res = isl::point::max_multi_pw_aff();
35032  return typed::multi_pw_aff<pair<Domain, Range>>(res);
35033}
35034
35035template <typename Domain, typename Range>
35036typed::multi_pw_aff<pair<Domain, Range>> typed::point<pair<Domain, Range>>::min_multi_pw_aff() const
35037{
35038  auto res = isl::point::min_multi_pw_aff();
35039  return typed::multi_pw_aff<pair<Domain, Range>>(res);
35040}
35041
35042template <typename Domain, typename Range>
35043typed::multi_val<pair<Domain, Range>> typed::point<pair<Domain, Range>>::multi_val() const
35044{
35045  auto res = isl::point::multi_val();
35046  return typed::multi_val<pair<Domain, Range>>(res);
35047}
35048
35049template <typename Domain, typename Range>
35050typed::pw_aff<pair<Domain, Range>, Anonymous> typed::point<pair<Domain, Range>>::param_pw_aff_on_domain(const typed::id<Anonymous> &id) const
35051{
35052  auto res = isl::point::param_pw_aff_on_domain(id);
35053  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
35054}
35055
35056template <typename Domain, typename Range>
35057typed::pw_aff<pair<Domain, Range>, Anonymous> typed::point<pair<Domain, Range>>::param_pw_aff_on_domain(const std::string &id) const
35058{
35059  auto res = isl::point::param_pw_aff_on_domain(id);
35060  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
35061}
35062
35063template <typename Domain, typename Range>
35064typed::basic_set<> typed::point<pair<Domain, Range>>::params() const
35065{
35066  auto res = isl::point::params();
35067  return typed::basic_set<>(res);
35068}
35069
35070template <typename Domain, typename Range>
35071typed::multi_val<pair<Domain, Range>> typed::point<pair<Domain, Range>>::plain_multi_val_if_fixed() const
35072{
35073  auto res = isl::point::plain_multi_val_if_fixed();
35074  return typed::multi_val<pair<Domain, Range>>(res);
35075}
35076
35077template <typename Domain, typename Range>
35078template <typename Domain2>
35079typed::set<Domain2> typed::point<pair<Domain, Range>>::preimage(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const
35080{
35081  auto res = isl::point::preimage(ma);
35082  return typed::set<Domain2>(res);
35083}
35084
35085template <typename Domain, typename Range>
35086template <typename Domain2>
35087typed::set<Domain2> typed::point<pair<Domain, Range>>::preimage(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const
35088{
35089  auto res = isl::point::preimage(mpa);
35090  return typed::set<Domain2>(res);
35091}
35092
35093template <typename Domain, typename Range>
35094template <typename Domain2>
35095typed::set<Domain2> typed::point<pair<Domain, Range>>::preimage(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const
35096{
35097  auto res = isl::point::preimage(pma);
35098  return typed::set<Domain2>(res);
35099}
35100
35101template <typename Domain, typename Range>
35102template <typename Domain2>
35103typed::union_set<Domain2> typed::point<pair<Domain, Range>>::preimage(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const
35104{
35105  auto res = isl::point::preimage(upma);
35106  return typed::union_set<Domain2>(res);
35107}
35108
35109template <typename Domain, typename Range>
35110template <typename Arg2>
35111typed::set<pair<pair<Domain, Range>, Arg2>> typed::point<pair<Domain, Range>>::product(const typed::set<Arg2> &set2) const
35112{
35113  auto res = isl::point::product(set2);
35114  return typed::set<pair<pair<Domain, Range>, Arg2>>(res);
35115}
35116
35117template <typename Domain, typename Range>
35118typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::project_out_all_params() const
35119{
35120  auto res = isl::point::project_out_all_params();
35121  return typed::set<pair<Domain, Range>>(res);
35122}
35123
35124template <typename Domain, typename Range>
35125typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::project_out_param(const typed::id<Anonymous> &id) const
35126{
35127  auto res = isl::point::project_out_param(id);
35128  return typed::set<pair<Domain, Range>>(res);
35129}
35130
35131template <typename Domain, typename Range>
35132typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::project_out_param(const std::string &id) const
35133{
35134  auto res = isl::point::project_out_param(id);
35135  return typed::set<pair<Domain, Range>>(res);
35136}
35137
35138template <typename Domain, typename Range>
35139typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::project_out_param(const typed::id_list<Anonymous> &list) const
35140{
35141  auto res = isl::point::project_out_param(list);
35142  return typed::set<pair<Domain, Range>>(res);
35143}
35144
35145template <typename Domain, typename Range>
35146typed::pw_aff<pair<Domain, Range>, Anonymous> typed::point<pair<Domain, Range>>::pw_aff_on_domain(const typed::val<Anonymous> &v) const
35147{
35148  auto res = isl::point::pw_aff_on_domain(v);
35149  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
35150}
35151
35152template <typename Domain, typename Range>
35153typed::pw_aff<pair<Domain, Range>, Anonymous> typed::point<pair<Domain, Range>>::pw_aff_on_domain(long v) const
35154{
35155  auto res = isl::point::pw_aff_on_domain(v);
35156  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
35157}
35158
35159template <typename Domain, typename Range>
35160template <typename Arg2>
35161typed::pw_multi_aff<pair<Domain, Range>, Arg2> typed::point<pair<Domain, Range>>::pw_multi_aff_on_domain(const typed::multi_val<Arg2> &mv) const
35162{
35163  auto res = isl::point::pw_multi_aff_on_domain(mv);
35164  return typed::pw_multi_aff<pair<Domain, Range>, Arg2>(res);
35165}
35166
35167template <typename Domain, typename Range>
35168typed::set_list<pair<Domain, Range>> typed::point<pair<Domain, Range>>::set_list() const
35169{
35170  auto res = isl::point::set_list();
35171  return typed::set_list<pair<Domain, Range>>(res);
35172}
35173
35174template <typename Domain, typename Range>
35175typed::fixed_box<pair<Domain, Range>> typed::point<pair<Domain, Range>>::simple_fixed_box_hull() const
35176{
35177  auto res = isl::point::simple_fixed_box_hull();
35178  return typed::fixed_box<pair<Domain, Range>>(res);
35179}
35180
35181template <typename Domain, typename Range>
35182typed::space<pair<Domain, Range>> typed::point<pair<Domain, Range>>::space() const
35183{
35184  auto res = isl::point::space();
35185  return typed::space<pair<Domain, Range>>(res);
35186}
35187
35188template <typename Domain, typename Range>
35189typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::subtract(const typed::set<pair<Domain, Range>> &set2) const
35190{
35191  auto res = isl::point::subtract(set2);
35192  return typed::set<pair<Domain, Range>>(res);
35193}
35194
35195template <typename Domain, typename Range>
35196typed::union_set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::subtract(const typed::union_set<pair<Domain, Range>> &uset2) const
35197{
35198  auto res = isl::point::subtract(uset2);
35199  return typed::union_set<pair<Domain, Range>>(res);
35200}
35201
35202template <typename Domain, typename Range>
35203typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::to_set() const
35204{
35205  auto res = isl::point::to_set();
35206  return typed::set<pair<Domain, Range>>(res);
35207}
35208
35209template <typename Domain, typename Range>
35210typed::union_set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::to_union_set() const
35211{
35212  auto res = isl::point::to_union_set();
35213  return typed::union_set<pair<Domain, Range>>(res);
35214}
35215
35216template <typename Domain, typename Range>
35217typed::map<pair<Domain, Range>, pair<Domain, Range>> typed::point<pair<Domain, Range>>::translation() const
35218{
35219  auto res = isl::point::translation();
35220  return typed::map<pair<Domain, Range>, pair<Domain, Range>>(res);
35221}
35222
35223template <typename Domain, typename Range>
35224template <typename Arg2>
35225typed::map<Arg2, pair<Domain, Range>> typed::point<pair<Domain, Range>>::unbind_params_insert_domain(const typed::multi_id<Arg2> &domain) const
35226{
35227  auto res = isl::point::unbind_params_insert_domain(domain);
35228  return typed::map<Arg2, pair<Domain, Range>>(res);
35229}
35230
35231template <typename Domain, typename Range>
35232typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::unite(const typed::basic_set<pair<Domain, Range>> &bset2) const
35233{
35234  auto res = isl::point::unite(bset2);
35235  return typed::set<pair<Domain, Range>>(res);
35236}
35237
35238template <typename Domain, typename Range>
35239typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::unite(const typed::set<pair<Domain, Range>> &set2) const
35240{
35241  auto res = isl::point::unite(set2);
35242  return typed::set<pair<Domain, Range>>(res);
35243}
35244
35245template <typename Domain, typename Range>
35246typed::union_set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::unite(const typed::union_set<pair<Domain, Range>> &uset2) const
35247{
35248  auto res = isl::point::unite(uset2);
35249  return typed::union_set<pair<Domain, Range>>(res);
35250}
35251
35252template <typename Domain, typename Range>
35253typed::map<Domain, Range> typed::point<pair<Domain, Range>>::unwrap() const
35254{
35255  auto res = isl::point::unwrap();
35256  return typed::map<Domain, Range>(res);
35257}
35258
35259template <typename Domain, typename Range>
35260typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::upper_bound(const typed::multi_pw_aff<pair<Domain, Range>> &upper) const
35261{
35262  auto res = isl::point::upper_bound(upper);
35263  return typed::set<pair<Domain, Range>>(res);
35264}
35265
35266template <typename Domain, typename Range>
35267typed::set<pair<Domain, Range>> typed::point<pair<Domain, Range>>::upper_bound(const typed::multi_val<pair<Domain, Range>> &upper) const
35268{
35269  auto res = isl::point::upper_bound(upper);
35270  return typed::set<pair<Domain, Range>>(res);
35271}
35272
35273template <typename Domain, typename Range>
35274typed::set<pair<Range, Domain>> typed::point<pair<Domain, Range>>::wrapped_reverse() const
35275{
35276  auto res = isl::point::wrapped_reverse();
35277  return typed::set<pair<Range, Domain>>(res);
35278}
35279
35280typed::pw_aff<Anonymous>::pw_aff(const typed::aff<Anonymous> &aff)
35281  : isl::pw_aff(aff)
35282{
35283}
35284
35285typed::pw_aff<Anonymous>::pw_aff(const isl::ctx &ctx, const std::string &str)
35286  : isl::pw_aff(ctx, str)
35287{
35288}
35289
35290typed::multi_pw_aff<Anonymous> typed::pw_aff<Anonymous>::add(const typed::multi_pw_aff<Anonymous> &multi2) const
35291{
35292  auto res = isl::pw_aff::add(multi2);
35293  return typed::multi_pw_aff<Anonymous>(res);
35294}
35295
35296typed::multi_union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::add(const typed::multi_union_pw_aff<Anonymous> &multi2) const
35297{
35298  auto res = isl::pw_aff::add(multi2);
35299  return typed::multi_union_pw_aff<Anonymous>(res);
35300}
35301
35302typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::add(const typed::pw_aff<Anonymous> &pwaff2) const
35303{
35304  auto res = isl::pw_aff::add(pwaff2);
35305  return typed::pw_aff<Anonymous>(res);
35306}
35307
35308typed::pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::add(const typed::pw_multi_aff<Anonymous> &pma2) const
35309{
35310  auto res = isl::pw_aff::add(pma2);
35311  return typed::pw_multi_aff<Anonymous>(res);
35312}
35313
35314typed::union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::add(const typed::union_pw_aff<Anonymous> &upa2) const
35315{
35316  auto res = isl::pw_aff::add(upa2);
35317  return typed::union_pw_aff<Anonymous>(res);
35318}
35319
35320typed::union_pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::add(const typed::union_pw_multi_aff<Anonymous> &upma2) const
35321{
35322  auto res = isl::pw_aff::add(upma2);
35323  return typed::union_pw_multi_aff<Anonymous>(res);
35324}
35325
35326typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::add(const typed::aff<Anonymous> &pwaff2) const
35327{
35328  auto res = isl::pw_aff::add(pwaff2);
35329  return typed::pw_aff<Anonymous>(res);
35330}
35331
35332typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::add_constant(const typed::val<Anonymous> &v) const
35333{
35334  auto res = isl::pw_aff::add_constant(v);
35335  return typed::pw_aff<Anonymous>(res);
35336}
35337
35338typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::add_constant(long v) const
35339{
35340  auto res = isl::pw_aff::add_constant(v);
35341  return typed::pw_aff<Anonymous>(res);
35342}
35343
35344typed::pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::add_constant(const typed::multi_val<Anonymous> &mv) const
35345{
35346  auto res = isl::pw_aff::add_constant(mv);
35347  return typed::pw_multi_aff<Anonymous>(res);
35348}
35349
35350template <typename Range>
35351typed::union_pw_multi_aff<Range> typed::pw_aff<Anonymous>::apply(const typed::union_pw_multi_aff<Anonymous, Range> &upma2) const
35352{
35353  auto res = isl::pw_aff::apply(upma2);
35354  return typed::union_pw_multi_aff<Range>(res);
35355}
35356
35357typed::aff<Anonymous> typed::pw_aff<Anonymous>::as_aff() const
35358{
35359  auto res = isl::pw_aff::as_aff();
35360  return typed::aff<Anonymous>(res);
35361}
35362
35363typed::multi_aff<Anonymous> typed::pw_aff<Anonymous>::as_multi_aff() const
35364{
35365  auto res = isl::pw_aff::as_multi_aff();
35366  return typed::multi_aff<Anonymous>(res);
35367}
35368
35369typed::multi_union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::as_multi_union_pw_aff() const
35370{
35371  auto res = isl::pw_aff::as_multi_union_pw_aff();
35372  return typed::multi_union_pw_aff<Anonymous>(res);
35373}
35374
35375typed::pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::as_pw_multi_aff() const
35376{
35377  auto res = isl::pw_aff::as_pw_multi_aff();
35378  return typed::pw_multi_aff<Anonymous>(res);
35379}
35380
35381typed::set<Anonymous> typed::pw_aff<Anonymous>::as_set() const
35382{
35383  auto res = isl::pw_aff::as_set();
35384  return typed::set<Anonymous>(res);
35385}
35386
35387typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::at(int pos) const
35388{
35389  auto res = isl::pw_aff::at(pos);
35390  return typed::pw_aff<Anonymous>(res);
35391}
35392
35393typed::set<> typed::pw_aff<Anonymous>::bind(const typed::multi_id<Anonymous> &tuple) const
35394{
35395  auto res = isl::pw_aff::bind(tuple);
35396  return typed::set<>(res);
35397}
35398
35399typed::set<> typed::pw_aff<Anonymous>::bind(const typed::id<Anonymous> &id) const
35400{
35401  auto res = isl::pw_aff::bind(id);
35402  return typed::set<>(res);
35403}
35404
35405typed::set<> typed::pw_aff<Anonymous>::bind(const std::string &id) const
35406{
35407  auto res = isl::pw_aff::bind(id);
35408  return typed::set<>(res);
35409}
35410
35411typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::ceil() const
35412{
35413  auto res = isl::pw_aff::ceil();
35414  return typed::pw_aff<Anonymous>(res);
35415}
35416
35417typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::coalesce() const
35418{
35419  auto res = isl::pw_aff::coalesce();
35420  return typed::pw_aff<Anonymous>(res);
35421}
35422
35423typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::cond(const typed::pw_aff<Anonymous> &pwaff_true, const typed::pw_aff<Anonymous> &pwaff_false) const
35424{
35425  auto res = isl::pw_aff::cond(pwaff_true, pwaff_false);
35426  return typed::pw_aff<Anonymous>(res);
35427}
35428
35429typed::set<> typed::pw_aff<Anonymous>::domain() const
35430{
35431  auto res = isl::pw_aff::domain();
35432  return typed::set<>(res);
35433}
35434
35435typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::drop_unused_params() const
35436{
35437  auto res = isl::pw_aff::drop_unused_params();
35438  return typed::pw_aff<Anonymous>(res);
35439}
35440
35441typed::pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::extract_pw_multi_aff(const typed::space<Anonymous> &space) const
35442{
35443  auto res = isl::pw_aff::extract_pw_multi_aff(space);
35444  return typed::pw_multi_aff<Anonymous>(res);
35445}
35446
35447typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::floor() const
35448{
35449  auto res = isl::pw_aff::floor();
35450  return typed::pw_aff<Anonymous>(res);
35451}
35452
35453typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::gist(const typed::set<> &context) const
35454{
35455  auto res = isl::pw_aff::gist(context);
35456  return typed::pw_aff<Anonymous>(res);
35457}
35458
35459typed::union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::gist(const typed::union_set<> &context) const
35460{
35461  auto res = isl::pw_aff::gist(context);
35462  return typed::union_pw_aff<Anonymous>(res);
35463}
35464
35465typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::gist(const typed::basic_set<> &context) const
35466{
35467  auto res = isl::pw_aff::gist(context);
35468  return typed::pw_aff<Anonymous>(res);
35469}
35470
35471typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::gist(const typed::point<> &context) const
35472{
35473  auto res = isl::pw_aff::gist(context);
35474  return typed::pw_aff<Anonymous>(res);
35475}
35476
35477typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::gist_params(const typed::set<> &context) const
35478{
35479  auto res = isl::pw_aff::gist_params(context);
35480  return typed::pw_aff<Anonymous>(res);
35481}
35482
35483typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::gist_params(const typed::basic_set<> &context) const
35484{
35485  auto res = isl::pw_aff::gist_params(context);
35486  return typed::pw_aff<Anonymous>(res);
35487}
35488
35489typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::gist_params(const typed::point<> &context) const
35490{
35491  auto res = isl::pw_aff::gist_params(context);
35492  return typed::pw_aff<Anonymous>(res);
35493}
35494
35495typed::multi_pw_aff<Anonymous, Anonymous> typed::pw_aff<Anonymous>::identity() const
35496{
35497  auto res = isl::pw_aff::identity();
35498  return typed::multi_pw_aff<Anonymous, Anonymous>(res);
35499}
35500
35501template <typename Domain>
35502typed::pw_aff<Domain, Anonymous> typed::pw_aff<Anonymous>::insert_domain(const typed::space<Domain> &domain) const
35503{
35504  auto res = isl::pw_aff::insert_domain(domain);
35505  return typed::pw_aff<Domain, Anonymous>(res);
35506}
35507
35508typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::intersect_params(const typed::set<> &set) const
35509{
35510  auto res = isl::pw_aff::intersect_params(set);
35511  return typed::pw_aff<Anonymous>(res);
35512}
35513
35514typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::intersect_params(const typed::basic_set<> &set) const
35515{
35516  auto res = isl::pw_aff::intersect_params(set);
35517  return typed::pw_aff<Anonymous>(res);
35518}
35519
35520typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::intersect_params(const typed::point<> &set) const
35521{
35522  auto res = isl::pw_aff::intersect_params(set);
35523  return typed::pw_aff<Anonymous>(res);
35524}
35525
35526typed::pw_aff_list<Anonymous> typed::pw_aff<Anonymous>::list() const
35527{
35528  auto res = isl::pw_aff::list();
35529  return typed::pw_aff_list<Anonymous>(res);
35530}
35531
35532typed::multi_pw_aff<Anonymous> typed::pw_aff<Anonymous>::max(const typed::multi_pw_aff<Anonymous> &multi2) const
35533{
35534  auto res = isl::pw_aff::max(multi2);
35535  return typed::multi_pw_aff<Anonymous>(res);
35536}
35537
35538typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::max(const typed::pw_aff<Anonymous> &pwaff2) const
35539{
35540  auto res = isl::pw_aff::max(pwaff2);
35541  return typed::pw_aff<Anonymous>(res);
35542}
35543
35544typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::max(const typed::aff<Anonymous> &pwaff2) const
35545{
35546  auto res = isl::pw_aff::max(pwaff2);
35547  return typed::pw_aff<Anonymous>(res);
35548}
35549
35550typed::multi_val<Anonymous> typed::pw_aff<Anonymous>::max_multi_val() const
35551{
35552  auto res = isl::pw_aff::max_multi_val();
35553  return typed::multi_val<Anonymous>(res);
35554}
35555
35556typed::val<Anonymous> typed::pw_aff<Anonymous>::max_val() const
35557{
35558  auto res = isl::pw_aff::max_val();
35559  return typed::val<Anonymous>(res);
35560}
35561
35562typed::multi_pw_aff<Anonymous> typed::pw_aff<Anonymous>::min(const typed::multi_pw_aff<Anonymous> &multi2) const
35563{
35564  auto res = isl::pw_aff::min(multi2);
35565  return typed::multi_pw_aff<Anonymous>(res);
35566}
35567
35568typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::min(const typed::pw_aff<Anonymous> &pwaff2) const
35569{
35570  auto res = isl::pw_aff::min(pwaff2);
35571  return typed::pw_aff<Anonymous>(res);
35572}
35573
35574typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::min(const typed::aff<Anonymous> &pwaff2) const
35575{
35576  auto res = isl::pw_aff::min(pwaff2);
35577  return typed::pw_aff<Anonymous>(res);
35578}
35579
35580typed::multi_val<Anonymous> typed::pw_aff<Anonymous>::min_multi_val() const
35581{
35582  auto res = isl::pw_aff::min_multi_val();
35583  return typed::multi_val<Anonymous>(res);
35584}
35585
35586typed::val<Anonymous> typed::pw_aff<Anonymous>::min_val() const
35587{
35588  auto res = isl::pw_aff::min_val();
35589  return typed::val<Anonymous>(res);
35590}
35591
35592typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::mod(const typed::val<Anonymous> &mod) const
35593{
35594  auto res = isl::pw_aff::mod(mod);
35595  return typed::pw_aff<Anonymous>(res);
35596}
35597
35598typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::mod(long mod) const
35599{
35600  auto res = isl::pw_aff::mod(mod);
35601  return typed::pw_aff<Anonymous>(res);
35602}
35603
35604typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::neg() const
35605{
35606  auto res = isl::pw_aff::neg();
35607  return typed::pw_aff<Anonymous>(res);
35608}
35609
35610typed::set<> typed::pw_aff<Anonymous>::params() const
35611{
35612  auto res = isl::pw_aff::params();
35613  return typed::set<>(res);
35614}
35615
35616template <typename Range>
35617typed::multi_pw_aff<pair<Anonymous, Range>> typed::pw_aff<Anonymous>::product(const typed::multi_pw_aff<Range> &multi2) const
35618{
35619  auto res = isl::pw_aff::product(multi2);
35620  return typed::multi_pw_aff<pair<Anonymous, Range>>(res);
35621}
35622
35623template <typename Range>
35624typed::pw_multi_aff<pair<Anonymous, Range>> typed::pw_aff<Anonymous>::product(const typed::pw_multi_aff<Range> &pma2) const
35625{
35626  auto res = isl::pw_aff::product(pma2);
35627  return typed::pw_multi_aff<pair<Anonymous, Range>>(res);
35628}
35629
35630typed::pw_multi_aff_list<Anonymous> typed::pw_aff<Anonymous>::pw_multi_aff_list() const
35631{
35632  auto res = isl::pw_aff::pw_multi_aff_list();
35633  return typed::pw_multi_aff_list<Anonymous>(res);
35634}
35635
35636typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::scale(const typed::val<Anonymous> &v) const
35637{
35638  auto res = isl::pw_aff::scale(v);
35639  return typed::pw_aff<Anonymous>(res);
35640}
35641
35642typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::scale(long v) const
35643{
35644  auto res = isl::pw_aff::scale(v);
35645  return typed::pw_aff<Anonymous>(res);
35646}
35647
35648typed::pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::scale(const typed::multi_val<Anonymous> &mv) const
35649{
35650  auto res = isl::pw_aff::scale(mv);
35651  return typed::pw_multi_aff<Anonymous>(res);
35652}
35653
35654typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::scale_down(const typed::val<Anonymous> &f) const
35655{
35656  auto res = isl::pw_aff::scale_down(f);
35657  return typed::pw_aff<Anonymous>(res);
35658}
35659
35660typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::scale_down(long f) const
35661{
35662  auto res = isl::pw_aff::scale_down(f);
35663  return typed::pw_aff<Anonymous>(res);
35664}
35665
35666typed::pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::scale_down(const typed::multi_val<Anonymous> &mv) const
35667{
35668  auto res = isl::pw_aff::scale_down(mv);
35669  return typed::pw_multi_aff<Anonymous>(res);
35670}
35671
35672typed::multi_pw_aff<Anonymous> typed::pw_aff<Anonymous>::set_at(int pos, const typed::pw_aff<Anonymous> &el) const
35673{
35674  auto res = isl::pw_aff::set_at(pos, el);
35675  return typed::multi_pw_aff<Anonymous>(res);
35676}
35677
35678typed::multi_union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const
35679{
35680  auto res = isl::pw_aff::set_at(pos, el);
35681  return typed::multi_union_pw_aff<Anonymous>(res);
35682}
35683
35684template <typename Domain2>
35685typed::pw_multi_aff<Domain2> typed::pw_aff<Anonymous>::set_range_tuple(const typed::id<Anonymous> &id) const
35686{
35687  auto res = isl::pw_aff::set_range_tuple(id);
35688  return typed::pw_multi_aff<Domain2>(res);
35689}
35690
35691template <typename Domain2>
35692typed::pw_multi_aff<Domain2> typed::pw_aff<Anonymous>::set_range_tuple(const std::string &id) const
35693{
35694  auto res = isl::pw_aff::set_range_tuple(id);
35695  return typed::pw_multi_aff<Domain2>(res);
35696}
35697
35698typed::space<Anonymous> typed::pw_aff<Anonymous>::space() const
35699{
35700  auto res = isl::pw_aff::space();
35701  return typed::space<Anonymous>(res);
35702}
35703
35704typed::multi_pw_aff<Anonymous> typed::pw_aff<Anonymous>::sub(const typed::multi_pw_aff<Anonymous> &multi2) const
35705{
35706  auto res = isl::pw_aff::sub(multi2);
35707  return typed::multi_pw_aff<Anonymous>(res);
35708}
35709
35710typed::multi_union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::sub(const typed::multi_union_pw_aff<Anonymous> &multi2) const
35711{
35712  auto res = isl::pw_aff::sub(multi2);
35713  return typed::multi_union_pw_aff<Anonymous>(res);
35714}
35715
35716typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::sub(const typed::pw_aff<Anonymous> &pwaff2) const
35717{
35718  auto res = isl::pw_aff::sub(pwaff2);
35719  return typed::pw_aff<Anonymous>(res);
35720}
35721
35722typed::pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::sub(const typed::pw_multi_aff<Anonymous> &pma2) const
35723{
35724  auto res = isl::pw_aff::sub(pma2);
35725  return typed::pw_multi_aff<Anonymous>(res);
35726}
35727
35728typed::union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::sub(const typed::union_pw_aff<Anonymous> &upa2) const
35729{
35730  auto res = isl::pw_aff::sub(upa2);
35731  return typed::union_pw_aff<Anonymous>(res);
35732}
35733
35734typed::union_pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::sub(const typed::union_pw_multi_aff<Anonymous> &upma2) const
35735{
35736  auto res = isl::pw_aff::sub(upma2);
35737  return typed::union_pw_multi_aff<Anonymous>(res);
35738}
35739
35740typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::sub(const typed::aff<Anonymous> &pwaff2) const
35741{
35742  auto res = isl::pw_aff::sub(pwaff2);
35743  return typed::pw_aff<Anonymous>(res);
35744}
35745
35746typed::multi_pw_aff<Anonymous> typed::pw_aff<Anonymous>::to_multi_pw_aff() const
35747{
35748  auto res = isl::pw_aff::to_multi_pw_aff();
35749  return typed::multi_pw_aff<Anonymous>(res);
35750}
35751
35752typed::union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::to_union_pw_aff() const
35753{
35754  auto res = isl::pw_aff::to_union_pw_aff();
35755  return typed::union_pw_aff<Anonymous>(res);
35756}
35757
35758typed::union_pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::to_union_pw_multi_aff() const
35759{
35760  auto res = isl::pw_aff::to_union_pw_multi_aff();
35761  return typed::union_pw_multi_aff<Anonymous>(res);
35762}
35763
35764template <typename Domain>
35765typed::multi_pw_aff<Domain, Anonymous> typed::pw_aff<Anonymous>::unbind_params_insert_domain(const typed::multi_id<Domain> &domain) const
35766{
35767  auto res = isl::pw_aff::unbind_params_insert_domain(domain);
35768  return typed::multi_pw_aff<Domain, Anonymous>(res);
35769}
35770
35771typed::multi_pw_aff<Anonymous> typed::pw_aff<Anonymous>::union_add(const typed::multi_pw_aff<Anonymous> &mpa2) const
35772{
35773  auto res = isl::pw_aff::union_add(mpa2);
35774  return typed::multi_pw_aff<Anonymous>(res);
35775}
35776
35777typed::multi_union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::union_add(const typed::multi_union_pw_aff<Anonymous> &mupa2) const
35778{
35779  auto res = isl::pw_aff::union_add(mupa2);
35780  return typed::multi_union_pw_aff<Anonymous>(res);
35781}
35782
35783typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::union_add(const typed::pw_aff<Anonymous> &pwaff2) const
35784{
35785  auto res = isl::pw_aff::union_add(pwaff2);
35786  return typed::pw_aff<Anonymous>(res);
35787}
35788
35789typed::pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::union_add(const typed::pw_multi_aff<Anonymous> &pma2) const
35790{
35791  auto res = isl::pw_aff::union_add(pma2);
35792  return typed::pw_multi_aff<Anonymous>(res);
35793}
35794
35795typed::union_pw_aff<Anonymous> typed::pw_aff<Anonymous>::union_add(const typed::union_pw_aff<Anonymous> &upa2) const
35796{
35797  auto res = isl::pw_aff::union_add(upa2);
35798  return typed::union_pw_aff<Anonymous>(res);
35799}
35800
35801typed::union_pw_multi_aff<Anonymous> typed::pw_aff<Anonymous>::union_add(const typed::union_pw_multi_aff<Anonymous> &upma2) const
35802{
35803  auto res = isl::pw_aff::union_add(upma2);
35804  return typed::union_pw_multi_aff<Anonymous>(res);
35805}
35806
35807typed::pw_aff<Anonymous> typed::pw_aff<Anonymous>::union_add(const typed::aff<Anonymous> &pwaff2) const
35808{
35809  auto res = isl::pw_aff::union_add(pwaff2);
35810  return typed::pw_aff<Anonymous>(res);
35811}
35812
35813template <typename Domain>
35814typed::pw_aff<Domain, Anonymous>::pw_aff(const typed::aff<Domain, Anonymous> &aff)
35815  : isl::pw_aff(aff)
35816{
35817}
35818
35819template <typename Domain>
35820typed::pw_aff<Domain, Anonymous>::pw_aff(const isl::ctx &ctx, const std::string &str)
35821  : isl::pw_aff(ctx, str)
35822{
35823}
35824
35825template <typename Domain>
35826typed::multi_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const
35827{
35828  auto res = isl::pw_aff::add(multi2);
35829  return typed::multi_pw_aff<Domain, Anonymous>(res);
35830}
35831
35832template <typename Domain>
35833typed::multi_union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const
35834{
35835  auto res = isl::pw_aff::add(multi2);
35836  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
35837}
35838
35839template <typename Domain>
35840typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
35841{
35842  auto res = isl::pw_aff::add(pwaff2);
35843  return typed::pw_aff<Domain, Anonymous>(res);
35844}
35845
35846template <typename Domain>
35847typed::pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const
35848{
35849  auto res = isl::pw_aff::add(pma2);
35850  return typed::pw_multi_aff<Domain, Anonymous>(res);
35851}
35852
35853template <typename Domain>
35854typed::union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const
35855{
35856  auto res = isl::pw_aff::add(upa2);
35857  return typed::union_pw_aff<Domain, Anonymous>(res);
35858}
35859
35860template <typename Domain>
35861typed::union_pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const
35862{
35863  auto res = isl::pw_aff::add(upma2);
35864  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
35865}
35866
35867template <typename Domain>
35868typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add(const typed::aff<Domain, Anonymous> &pwaff2) const
35869{
35870  auto res = isl::pw_aff::add(pwaff2);
35871  return typed::pw_aff<Domain, Anonymous>(res);
35872}
35873
35874template <typename Domain>
35875typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add_constant(const typed::val<Anonymous> &v) const
35876{
35877  auto res = isl::pw_aff::add_constant(v);
35878  return typed::pw_aff<Domain, Anonymous>(res);
35879}
35880
35881template <typename Domain>
35882typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add_constant(long v) const
35883{
35884  auto res = isl::pw_aff::add_constant(v);
35885  return typed::pw_aff<Domain, Anonymous>(res);
35886}
35887
35888template <typename Domain>
35889typed::pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::add_constant(const typed::multi_val<Anonymous> &mv) const
35890{
35891  auto res = isl::pw_aff::add_constant(mv);
35892  return typed::pw_multi_aff<Domain, Anonymous>(res);
35893}
35894
35895template <typename Domain>
35896template <typename Range2>
35897typed::union_pw_multi_aff<Domain, Range2> typed::pw_aff<Domain, Anonymous>::apply(const typed::union_pw_multi_aff<Anonymous, Range2> &upma2) const
35898{
35899  auto res = isl::pw_aff::apply(upma2);
35900  return typed::union_pw_multi_aff<Domain, Range2>(res);
35901}
35902
35903template <typename Domain>
35904typed::aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::as_aff() const
35905{
35906  auto res = isl::pw_aff::as_aff();
35907  return typed::aff<Domain, Anonymous>(res);
35908}
35909
35910template <typename Domain>
35911typed::map<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::as_map() const
35912{
35913  auto res = isl::pw_aff::as_map();
35914  return typed::map<Domain, Anonymous>(res);
35915}
35916
35917template <typename Domain>
35918typed::multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::as_multi_aff() const
35919{
35920  auto res = isl::pw_aff::as_multi_aff();
35921  return typed::multi_aff<Domain, Anonymous>(res);
35922}
35923
35924template <typename Domain>
35925typed::multi_union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::as_multi_union_pw_aff() const
35926{
35927  auto res = isl::pw_aff::as_multi_union_pw_aff();
35928  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
35929}
35930
35931template <typename Domain>
35932typed::pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::as_pw_multi_aff() const
35933{
35934  auto res = isl::pw_aff::as_pw_multi_aff();
35935  return typed::pw_multi_aff<Domain, Anonymous>(res);
35936}
35937
35938template <typename Domain>
35939typed::union_map<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::as_union_map() const
35940{
35941  auto res = isl::pw_aff::as_union_map();
35942  return typed::union_map<Domain, Anonymous>(res);
35943}
35944
35945template <typename Domain>
35946typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::at(int pos) const
35947{
35948  auto res = isl::pw_aff::at(pos);
35949  return typed::pw_aff<Domain, Anonymous>(res);
35950}
35951
35952template <typename Domain>
35953typed::set<Domain> typed::pw_aff<Domain, Anonymous>::bind(const typed::multi_id<Anonymous> &tuple) const
35954{
35955  auto res = isl::pw_aff::bind(tuple);
35956  return typed::set<Domain>(res);
35957}
35958
35959template <typename Domain>
35960typed::set<Domain> typed::pw_aff<Domain, Anonymous>::bind(const typed::id<Anonymous> &id) const
35961{
35962  auto res = isl::pw_aff::bind(id);
35963  return typed::set<Domain>(res);
35964}
35965
35966template <typename Domain>
35967typed::set<Domain> typed::pw_aff<Domain, Anonymous>::bind(const std::string &id) const
35968{
35969  auto res = isl::pw_aff::bind(id);
35970  return typed::set<Domain>(res);
35971}
35972
35973template <typename Domain>
35974typed::pw_aff<Anonymous> typed::pw_aff<Domain, Anonymous>::bind_domain(const typed::multi_id<Domain> &tuple) const
35975{
35976  auto res = isl::pw_aff::bind_domain(tuple);
35977  return typed::pw_aff<Anonymous>(res);
35978}
35979
35980template <typename Domain>
35981typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::ceil() const
35982{
35983  auto res = isl::pw_aff::ceil();
35984  return typed::pw_aff<Domain, Anonymous>(res);
35985}
35986
35987template <typename Domain>
35988typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::coalesce() const
35989{
35990  auto res = isl::pw_aff::coalesce();
35991  return typed::pw_aff<Domain, Anonymous>(res);
35992}
35993
35994template <typename Domain>
35995typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::cond(const typed::pw_aff<Domain, Anonymous> &pwaff_true, const typed::pw_aff<Domain, Anonymous> &pwaff_false) const
35996{
35997  auto res = isl::pw_aff::cond(pwaff_true, pwaff_false);
35998  return typed::pw_aff<Domain, Anonymous>(res);
35999}
36000
36001template <typename Domain>
36002typed::set<Domain> typed::pw_aff<Domain, Anonymous>::domain() const
36003{
36004  auto res = isl::pw_aff::domain();
36005  return typed::set<Domain>(res);
36006}
36007
36008template <typename Domain>
36009typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::drop_unused_params() const
36010{
36011  auto res = isl::pw_aff::drop_unused_params();
36012  return typed::pw_aff<Domain, Anonymous>(res);
36013}
36014
36015template <typename Domain>
36016typed::pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::extract_pw_multi_aff(const typed::space<Domain, Anonymous> &space) const
36017{
36018  auto res = isl::pw_aff::extract_pw_multi_aff(space);
36019  return typed::pw_multi_aff<Domain, Anonymous>(res);
36020}
36021
36022template <typename Domain>
36023typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::floor() const
36024{
36025  auto res = isl::pw_aff::floor();
36026  return typed::pw_aff<Domain, Anonymous>(res);
36027}
36028
36029template <typename Domain>
36030typed::set<Domain> typed::pw_aff<Domain, Anonymous>::ge_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
36031{
36032  auto res = isl::pw_aff::ge_set(pwaff2);
36033  return typed::set<Domain>(res);
36034}
36035
36036template <typename Domain>
36037typed::set<Domain> typed::pw_aff<Domain, Anonymous>::ge_set(const typed::aff<Domain, Anonymous> &pwaff2) const
36038{
36039  auto res = isl::pw_aff::ge_set(pwaff2);
36040  return typed::set<Domain>(res);
36041}
36042
36043template <typename Domain>
36044typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::gist(const typed::set<Domain> &context) const
36045{
36046  auto res = isl::pw_aff::gist(context);
36047  return typed::pw_aff<Domain, Anonymous>(res);
36048}
36049
36050template <typename Domain>
36051typed::union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::gist(const typed::union_set<Domain> &context) const
36052{
36053  auto res = isl::pw_aff::gist(context);
36054  return typed::union_pw_aff<Domain, Anonymous>(res);
36055}
36056
36057template <typename Domain>
36058typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::gist(const typed::basic_set<Domain> &context) const
36059{
36060  auto res = isl::pw_aff::gist(context);
36061  return typed::pw_aff<Domain, Anonymous>(res);
36062}
36063
36064template <typename Domain>
36065typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::gist(const typed::point<Domain> &context) const
36066{
36067  auto res = isl::pw_aff::gist(context);
36068  return typed::pw_aff<Domain, Anonymous>(res);
36069}
36070
36071template <typename Domain>
36072typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::gist_params(const typed::set<> &context) const
36073{
36074  auto res = isl::pw_aff::gist_params(context);
36075  return typed::pw_aff<Domain, Anonymous>(res);
36076}
36077
36078template <typename Domain>
36079typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::gist_params(const typed::basic_set<> &context) const
36080{
36081  auto res = isl::pw_aff::gist_params(context);
36082  return typed::pw_aff<Domain, Anonymous>(res);
36083}
36084
36085template <typename Domain>
36086typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::gist_params(const typed::point<> &context) const
36087{
36088  auto res = isl::pw_aff::gist_params(context);
36089  return typed::pw_aff<Domain, Anonymous>(res);
36090}
36091
36092template <typename Domain>
36093typed::set<Domain> typed::pw_aff<Domain, Anonymous>::gt_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
36094{
36095  auto res = isl::pw_aff::gt_set(pwaff2);
36096  return typed::set<Domain>(res);
36097}
36098
36099template <typename Domain>
36100typed::set<Domain> typed::pw_aff<Domain, Anonymous>::gt_set(const typed::aff<Domain, Anonymous> &pwaff2) const
36101{
36102  auto res = isl::pw_aff::gt_set(pwaff2);
36103  return typed::set<Domain>(res);
36104}
36105
36106template <typename Domain>
36107typed::multi_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::identity() const
36108{
36109  auto res = isl::pw_aff::identity();
36110  return typed::multi_pw_aff<Domain, Anonymous>(res);
36111}
36112
36113template <typename Domain>
36114typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::intersect_domain(const typed::set<Domain> &set) const
36115{
36116  auto res = isl::pw_aff::intersect_domain(set);
36117  return typed::pw_aff<Domain, Anonymous>(res);
36118}
36119
36120template <typename Domain>
36121typed::union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::intersect_domain(const typed::space<Domain> &space) const
36122{
36123  auto res = isl::pw_aff::intersect_domain(space);
36124  return typed::union_pw_aff<Domain, Anonymous>(res);
36125}
36126
36127template <typename Domain>
36128typed::union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::intersect_domain(const typed::union_set<Domain> &uset) const
36129{
36130  auto res = isl::pw_aff::intersect_domain(uset);
36131  return typed::union_pw_aff<Domain, Anonymous>(res);
36132}
36133
36134template <typename Domain>
36135typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::intersect_domain(const typed::basic_set<Domain> &set) const
36136{
36137  auto res = isl::pw_aff::intersect_domain(set);
36138  return typed::pw_aff<Domain, Anonymous>(res);
36139}
36140
36141template <typename Domain>
36142typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::intersect_domain(const typed::point<Domain> &set) const
36143{
36144  auto res = isl::pw_aff::intersect_domain(set);
36145  return typed::pw_aff<Domain, Anonymous>(res);
36146}
36147
36148template <typename Domain>
36149typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::intersect_params(const typed::set<> &set) const
36150{
36151  auto res = isl::pw_aff::intersect_params(set);
36152  return typed::pw_aff<Domain, Anonymous>(res);
36153}
36154
36155template <typename Domain>
36156typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::intersect_params(const typed::basic_set<> &set) const
36157{
36158  auto res = isl::pw_aff::intersect_params(set);
36159  return typed::pw_aff<Domain, Anonymous>(res);
36160}
36161
36162template <typename Domain>
36163typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::intersect_params(const typed::point<> &set) const
36164{
36165  auto res = isl::pw_aff::intersect_params(set);
36166  return typed::pw_aff<Domain, Anonymous>(res);
36167}
36168
36169template <typename Domain>
36170typed::set<Domain> typed::pw_aff<Domain, Anonymous>::le_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
36171{
36172  auto res = isl::pw_aff::le_set(pwaff2);
36173  return typed::set<Domain>(res);
36174}
36175
36176template <typename Domain>
36177typed::set<Domain> typed::pw_aff<Domain, Anonymous>::le_set(const typed::aff<Domain, Anonymous> &pwaff2) const
36178{
36179  auto res = isl::pw_aff::le_set(pwaff2);
36180  return typed::set<Domain>(res);
36181}
36182
36183template <typename Domain>
36184typed::pw_aff_list<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::list() const
36185{
36186  auto res = isl::pw_aff::list();
36187  return typed::pw_aff_list<Domain, Anonymous>(res);
36188}
36189
36190template <typename Domain>
36191typed::set<Domain> typed::pw_aff<Domain, Anonymous>::lt_set(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
36192{
36193  auto res = isl::pw_aff::lt_set(pwaff2);
36194  return typed::set<Domain>(res);
36195}
36196
36197template <typename Domain>
36198typed::set<Domain> typed::pw_aff<Domain, Anonymous>::lt_set(const typed::aff<Domain, Anonymous> &pwaff2) const
36199{
36200  auto res = isl::pw_aff::lt_set(pwaff2);
36201  return typed::set<Domain>(res);
36202}
36203
36204template <typename Domain>
36205typed::multi_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::max(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const
36206{
36207  auto res = isl::pw_aff::max(multi2);
36208  return typed::multi_pw_aff<Domain, Anonymous>(res);
36209}
36210
36211template <typename Domain>
36212typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::max(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
36213{
36214  auto res = isl::pw_aff::max(pwaff2);
36215  return typed::pw_aff<Domain, Anonymous>(res);
36216}
36217
36218template <typename Domain>
36219typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::max(const typed::aff<Domain, Anonymous> &pwaff2) const
36220{
36221  auto res = isl::pw_aff::max(pwaff2);
36222  return typed::pw_aff<Domain, Anonymous>(res);
36223}
36224
36225template <typename Domain>
36226typed::multi_val<Anonymous> typed::pw_aff<Domain, Anonymous>::max_multi_val() const
36227{
36228  auto res = isl::pw_aff::max_multi_val();
36229  return typed::multi_val<Anonymous>(res);
36230}
36231
36232template <typename Domain>
36233typed::val<Anonymous> typed::pw_aff<Domain, Anonymous>::max_val() const
36234{
36235  auto res = isl::pw_aff::max_val();
36236  return typed::val<Anonymous>(res);
36237}
36238
36239template <typename Domain>
36240typed::multi_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::min(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const
36241{
36242  auto res = isl::pw_aff::min(multi2);
36243  return typed::multi_pw_aff<Domain, Anonymous>(res);
36244}
36245
36246template <typename Domain>
36247typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::min(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
36248{
36249  auto res = isl::pw_aff::min(pwaff2);
36250  return typed::pw_aff<Domain, Anonymous>(res);
36251}
36252
36253template <typename Domain>
36254typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::min(const typed::aff<Domain, Anonymous> &pwaff2) const
36255{
36256  auto res = isl::pw_aff::min(pwaff2);
36257  return typed::pw_aff<Domain, Anonymous>(res);
36258}
36259
36260template <typename Domain>
36261typed::multi_val<Anonymous> typed::pw_aff<Domain, Anonymous>::min_multi_val() const
36262{
36263  auto res = isl::pw_aff::min_multi_val();
36264  return typed::multi_val<Anonymous>(res);
36265}
36266
36267template <typename Domain>
36268typed::val<Anonymous> typed::pw_aff<Domain, Anonymous>::min_val() const
36269{
36270  auto res = isl::pw_aff::min_val();
36271  return typed::val<Anonymous>(res);
36272}
36273
36274template <typename Domain>
36275typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::mod(const typed::val<Anonymous> &mod) const
36276{
36277  auto res = isl::pw_aff::mod(mod);
36278  return typed::pw_aff<Domain, Anonymous>(res);
36279}
36280
36281template <typename Domain>
36282typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::mod(long mod) const
36283{
36284  auto res = isl::pw_aff::mod(mod);
36285  return typed::pw_aff<Domain, Anonymous>(res);
36286}
36287
36288template <typename Domain>
36289typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::neg() const
36290{
36291  auto res = isl::pw_aff::neg();
36292  return typed::pw_aff<Domain, Anonymous>(res);
36293}
36294
36295template <typename Domain>
36296typed::set<> typed::pw_aff<Domain, Anonymous>::params() const
36297{
36298  auto res = isl::pw_aff::params();
36299  return typed::set<>(res);
36300}
36301
36302template <typename Domain>
36303template <typename Domain2, typename Range2>
36304typed::multi_pw_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> typed::pw_aff<Domain, Anonymous>::product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const
36305{
36306  auto res = isl::pw_aff::product(multi2);
36307  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>>(res);
36308}
36309
36310template <typename Domain>
36311template <typename Domain2, typename Range2>
36312typed::pw_multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> typed::pw_aff<Domain, Anonymous>::product(const typed::pw_multi_aff<Domain2, Range2> &pma2) const
36313{
36314  auto res = isl::pw_aff::product(pma2);
36315  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>>(res);
36316}
36317
36318template <typename Domain>
36319template <typename Domain2>
36320typed::pw_aff<Domain2, Anonymous> typed::pw_aff<Domain, Anonymous>::pullback(const typed::multi_aff<Domain2, Domain> &ma) const
36321{
36322  auto res = isl::pw_aff::pullback(ma);
36323  return typed::pw_aff<Domain2, Anonymous>(res);
36324}
36325
36326template <typename Domain>
36327typed::pw_aff<Anonymous> typed::pw_aff<Domain, Anonymous>::pullback(const typed::multi_aff<Domain> &ma) const
36328{
36329  auto res = isl::pw_aff::pullback(ma);
36330  return typed::pw_aff<Anonymous>(res);
36331}
36332
36333template <typename Domain>
36334template <typename Domain2>
36335typed::pw_aff<Domain2, Anonymous> typed::pw_aff<Domain, Anonymous>::pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
36336{
36337  auto res = isl::pw_aff::pullback(mpa);
36338  return typed::pw_aff<Domain2, Anonymous>(res);
36339}
36340
36341template <typename Domain>
36342typed::pw_aff<Anonymous> typed::pw_aff<Domain, Anonymous>::pullback(const typed::multi_pw_aff<Domain> &mpa) const
36343{
36344  auto res = isl::pw_aff::pullback(mpa);
36345  return typed::pw_aff<Anonymous>(res);
36346}
36347
36348template <typename Domain>
36349template <typename Domain2>
36350typed::pw_aff<Domain2, Anonymous> typed::pw_aff<Domain, Anonymous>::pullback(const typed::pw_multi_aff<Domain2, Domain> &pma) const
36351{
36352  auto res = isl::pw_aff::pullback(pma);
36353  return typed::pw_aff<Domain2, Anonymous>(res);
36354}
36355
36356template <typename Domain>
36357typed::pw_aff<Anonymous> typed::pw_aff<Domain, Anonymous>::pullback(const typed::pw_multi_aff<Domain> &pma) const
36358{
36359  auto res = isl::pw_aff::pullback(pma);
36360  return typed::pw_aff<Anonymous>(res);
36361}
36362
36363template <typename Domain>
36364template <typename Domain2>
36365typed::union_pw_aff<Domain2, Anonymous> typed::pw_aff<Domain, Anonymous>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
36366{
36367  auto res = isl::pw_aff::pullback(upma);
36368  return typed::union_pw_aff<Domain2, Anonymous>(res);
36369}
36370
36371template <typename Domain>
36372typed::union_pw_aff<Anonymous> typed::pw_aff<Domain, Anonymous>::pullback(const typed::union_pw_multi_aff<Domain> &upma) const
36373{
36374  auto res = isl::pw_aff::pullback(upma);
36375  return typed::union_pw_aff<Anonymous>(res);
36376}
36377
36378template <typename Domain>
36379typed::pw_multi_aff_list<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::pw_multi_aff_list() const
36380{
36381  auto res = isl::pw_aff::pw_multi_aff_list();
36382  return typed::pw_multi_aff_list<Domain, Anonymous>(res);
36383}
36384
36385template <typename Domain>
36386template <typename Range2>
36387typed::multi_pw_aff<Domain, pair<Anonymous, Range2>> typed::pw_aff<Domain, Anonymous>::range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const
36388{
36389  auto res = isl::pw_aff::range_product(multi2);
36390  return typed::multi_pw_aff<Domain, pair<Anonymous, Range2>>(res);
36391}
36392
36393template <typename Domain>
36394template <typename Range2>
36395typed::multi_union_pw_aff<Domain, pair<Anonymous, Range2>> typed::pw_aff<Domain, Anonymous>::range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const
36396{
36397  auto res = isl::pw_aff::range_product(multi2);
36398  return typed::multi_union_pw_aff<Domain, pair<Anonymous, Range2>>(res);
36399}
36400
36401template <typename Domain>
36402template <typename Range2>
36403typed::pw_multi_aff<Domain, pair<Anonymous, Range2>> typed::pw_aff<Domain, Anonymous>::range_product(const typed::pw_multi_aff<Domain, Range2> &pma2) const
36404{
36405  auto res = isl::pw_aff::range_product(pma2);
36406  return typed::pw_multi_aff<Domain, pair<Anonymous, Range2>>(res);
36407}
36408
36409template <typename Domain>
36410template <typename Range2>
36411typed::union_pw_multi_aff<Domain, pair<Anonymous, Range2>> typed::pw_aff<Domain, Anonymous>::range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const
36412{
36413  auto res = isl::pw_aff::range_product(upma2);
36414  return typed::union_pw_multi_aff<Domain, pair<Anonymous, Range2>>(res);
36415}
36416
36417template <typename Domain>
36418typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::scale(const typed::val<Anonymous> &v) const
36419{
36420  auto res = isl::pw_aff::scale(v);
36421  return typed::pw_aff<Domain, Anonymous>(res);
36422}
36423
36424template <typename Domain>
36425typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::scale(long v) const
36426{
36427  auto res = isl::pw_aff::scale(v);
36428  return typed::pw_aff<Domain, Anonymous>(res);
36429}
36430
36431template <typename Domain>
36432typed::pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::scale(const typed::multi_val<Anonymous> &mv) const
36433{
36434  auto res = isl::pw_aff::scale(mv);
36435  return typed::pw_multi_aff<Domain, Anonymous>(res);
36436}
36437
36438template <typename Domain>
36439typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::scale_down(const typed::val<Anonymous> &f) const
36440{
36441  auto res = isl::pw_aff::scale_down(f);
36442  return typed::pw_aff<Domain, Anonymous>(res);
36443}
36444
36445template <typename Domain>
36446typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::scale_down(long f) const
36447{
36448  auto res = isl::pw_aff::scale_down(f);
36449  return typed::pw_aff<Domain, Anonymous>(res);
36450}
36451
36452template <typename Domain>
36453typed::pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::scale_down(const typed::multi_val<Anonymous> &mv) const
36454{
36455  auto res = isl::pw_aff::scale_down(mv);
36456  return typed::pw_multi_aff<Domain, Anonymous>(res);
36457}
36458
36459template <typename Domain>
36460typed::multi_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const
36461{
36462  auto res = isl::pw_aff::set_at(pos, el);
36463  return typed::multi_pw_aff<Domain, Anonymous>(res);
36464}
36465
36466template <typename Domain>
36467typed::multi_union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const
36468{
36469  auto res = isl::pw_aff::set_at(pos, el);
36470  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
36471}
36472
36473template <typename Domain>
36474template <typename Range2>
36475typed::pw_multi_aff<Domain, Range2> typed::pw_aff<Domain, Anonymous>::set_range_tuple(const typed::id<Anonymous> &id) const
36476{
36477  auto res = isl::pw_aff::set_range_tuple(id);
36478  return typed::pw_multi_aff<Domain, Range2>(res);
36479}
36480
36481template <typename Domain>
36482template <typename Range2>
36483typed::pw_multi_aff<Domain, Range2> typed::pw_aff<Domain, Anonymous>::set_range_tuple(const std::string &id) const
36484{
36485  auto res = isl::pw_aff::set_range_tuple(id);
36486  return typed::pw_multi_aff<Domain, Range2>(res);
36487}
36488
36489template <typename Domain>
36490typed::space<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::space() const
36491{
36492  auto res = isl::pw_aff::space();
36493  return typed::space<Domain, Anonymous>(res);
36494}
36495
36496template <typename Domain>
36497typed::multi_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::sub(const typed::multi_pw_aff<Domain, Anonymous> &multi2) const
36498{
36499  auto res = isl::pw_aff::sub(multi2);
36500  return typed::multi_pw_aff<Domain, Anonymous>(res);
36501}
36502
36503template <typename Domain>
36504typed::multi_union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::sub(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const
36505{
36506  auto res = isl::pw_aff::sub(multi2);
36507  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
36508}
36509
36510template <typename Domain>
36511typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::sub(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
36512{
36513  auto res = isl::pw_aff::sub(pwaff2);
36514  return typed::pw_aff<Domain, Anonymous>(res);
36515}
36516
36517template <typename Domain>
36518typed::pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::sub(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const
36519{
36520  auto res = isl::pw_aff::sub(pma2);
36521  return typed::pw_multi_aff<Domain, Anonymous>(res);
36522}
36523
36524template <typename Domain>
36525typed::union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::sub(const typed::union_pw_aff<Domain, Anonymous> &upa2) const
36526{
36527  auto res = isl::pw_aff::sub(upa2);
36528  return typed::union_pw_aff<Domain, Anonymous>(res);
36529}
36530
36531template <typename Domain>
36532typed::union_pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::sub(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const
36533{
36534  auto res = isl::pw_aff::sub(upma2);
36535  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
36536}
36537
36538template <typename Domain>
36539typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::sub(const typed::aff<Domain, Anonymous> &pwaff2) const
36540{
36541  auto res = isl::pw_aff::sub(pwaff2);
36542  return typed::pw_aff<Domain, Anonymous>(res);
36543}
36544
36545template <typename Domain>
36546typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::subtract_domain(const typed::set<Domain> &set) const
36547{
36548  auto res = isl::pw_aff::subtract_domain(set);
36549  return typed::pw_aff<Domain, Anonymous>(res);
36550}
36551
36552template <typename Domain>
36553typed::union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::subtract_domain(const typed::space<Domain> &space) const
36554{
36555  auto res = isl::pw_aff::subtract_domain(space);
36556  return typed::union_pw_aff<Domain, Anonymous>(res);
36557}
36558
36559template <typename Domain>
36560typed::union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::subtract_domain(const typed::union_set<Domain> &uset) const
36561{
36562  auto res = isl::pw_aff::subtract_domain(uset);
36563  return typed::union_pw_aff<Domain, Anonymous>(res);
36564}
36565
36566template <typename Domain>
36567typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::subtract_domain(const typed::basic_set<Domain> &set) const
36568{
36569  auto res = isl::pw_aff::subtract_domain(set);
36570  return typed::pw_aff<Domain, Anonymous>(res);
36571}
36572
36573template <typename Domain>
36574typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::subtract_domain(const typed::point<Domain> &set) const
36575{
36576  auto res = isl::pw_aff::subtract_domain(set);
36577  return typed::pw_aff<Domain, Anonymous>(res);
36578}
36579
36580template <typename Domain>
36581typed::multi_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::to_multi_pw_aff() const
36582{
36583  auto res = isl::pw_aff::to_multi_pw_aff();
36584  return typed::multi_pw_aff<Domain, Anonymous>(res);
36585}
36586
36587template <typename Domain>
36588typed::union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::to_union_pw_aff() const
36589{
36590  auto res = isl::pw_aff::to_union_pw_aff();
36591  return typed::union_pw_aff<Domain, Anonymous>(res);
36592}
36593
36594template <typename Domain>
36595typed::union_pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::to_union_pw_multi_aff() const
36596{
36597  auto res = isl::pw_aff::to_union_pw_multi_aff();
36598  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
36599}
36600
36601template <typename Domain>
36602typed::multi_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::union_add(const typed::multi_pw_aff<Domain, Anonymous> &mpa2) const
36603{
36604  auto res = isl::pw_aff::union_add(mpa2);
36605  return typed::multi_pw_aff<Domain, Anonymous>(res);
36606}
36607
36608template <typename Domain>
36609typed::multi_union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::union_add(const typed::multi_union_pw_aff<Domain, Anonymous> &mupa2) const
36610{
36611  auto res = isl::pw_aff::union_add(mupa2);
36612  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
36613}
36614
36615template <typename Domain>
36616typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::union_add(const typed::pw_aff<Domain, Anonymous> &pwaff2) const
36617{
36618  auto res = isl::pw_aff::union_add(pwaff2);
36619  return typed::pw_aff<Domain, Anonymous>(res);
36620}
36621
36622template <typename Domain>
36623typed::pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::union_add(const typed::pw_multi_aff<Domain, Anonymous> &pma2) const
36624{
36625  auto res = isl::pw_aff::union_add(pma2);
36626  return typed::pw_multi_aff<Domain, Anonymous>(res);
36627}
36628
36629template <typename Domain>
36630typed::union_pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::union_add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const
36631{
36632  auto res = isl::pw_aff::union_add(upa2);
36633  return typed::union_pw_aff<Domain, Anonymous>(res);
36634}
36635
36636template <typename Domain>
36637typed::union_pw_multi_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::union_add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const
36638{
36639  auto res = isl::pw_aff::union_add(upma2);
36640  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
36641}
36642
36643template <typename Domain>
36644typed::pw_aff<Domain, Anonymous> typed::pw_aff<Domain, Anonymous>::union_add(const typed::aff<Domain, Anonymous> &pwaff2) const
36645{
36646  auto res = isl::pw_aff::union_add(pwaff2);
36647  return typed::pw_aff<Domain, Anonymous>(res);
36648}
36649
36650template <typename Domain2, typename Range2>
36651typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pw_aff(const typed::aff<pair<Domain2, Range2>, Anonymous> &aff)
36652  : isl::pw_aff(aff)
36653{
36654}
36655
36656template <typename Domain2, typename Range2>
36657typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pw_aff(const isl::ctx &ctx, const std::string &str)
36658  : isl::pw_aff(ctx, str)
36659{
36660}
36661
36662template <typename Domain2, typename Range2>
36663typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
36664{
36665  auto res = isl::pw_aff::add(multi2);
36666  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36667}
36668
36669template <typename Domain2, typename Range2>
36670typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
36671{
36672  auto res = isl::pw_aff::add(multi2);
36673  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36674}
36675
36676template <typename Domain2, typename Range2>
36677typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
36678{
36679  auto res = isl::pw_aff::add(pwaff2);
36680  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36681}
36682
36683template <typename Domain2, typename Range2>
36684typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const
36685{
36686  auto res = isl::pw_aff::add(pma2);
36687  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
36688}
36689
36690template <typename Domain2, typename Range2>
36691typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const
36692{
36693  auto res = isl::pw_aff::add(upa2);
36694  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36695}
36696
36697template <typename Domain2, typename Range2>
36698typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const
36699{
36700  auto res = isl::pw_aff::add(upma2);
36701  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
36702}
36703
36704template <typename Domain2, typename Range2>
36705typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
36706{
36707  auto res = isl::pw_aff::add(pwaff2);
36708  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36709}
36710
36711template <typename Domain2, typename Range2>
36712typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add_constant(const typed::val<Anonymous> &v) const
36713{
36714  auto res = isl::pw_aff::add_constant(v);
36715  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36716}
36717
36718template <typename Domain2, typename Range2>
36719typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add_constant(long v) const
36720{
36721  auto res = isl::pw_aff::add_constant(v);
36722  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36723}
36724
36725template <typename Domain2, typename Range2>
36726typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::add_constant(const typed::multi_val<Anonymous> &mv) const
36727{
36728  auto res = isl::pw_aff::add_constant(mv);
36729  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
36730}
36731
36732template <typename Domain2, typename Range2>
36733template <typename Arg1>
36734typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::apply(const typed::union_pw_multi_aff<Anonymous, Arg1> &upma2) const
36735{
36736  auto res = isl::pw_aff::apply(upma2);
36737  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1>(res);
36738}
36739
36740template <typename Domain2, typename Range2>
36741typed::aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::as_aff() const
36742{
36743  auto res = isl::pw_aff::as_aff();
36744  return typed::aff<pair<Domain2, Range2>, Anonymous>(res);
36745}
36746
36747template <typename Domain2, typename Range2>
36748typed::map<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::as_map() const
36749{
36750  auto res = isl::pw_aff::as_map();
36751  return typed::map<pair<Domain2, Range2>, Anonymous>(res);
36752}
36753
36754template <typename Domain2, typename Range2>
36755typed::multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::as_multi_aff() const
36756{
36757  auto res = isl::pw_aff::as_multi_aff();
36758  return typed::multi_aff<pair<Domain2, Range2>, Anonymous>(res);
36759}
36760
36761template <typename Domain2, typename Range2>
36762typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::as_multi_union_pw_aff() const
36763{
36764  auto res = isl::pw_aff::as_multi_union_pw_aff();
36765  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36766}
36767
36768template <typename Domain2, typename Range2>
36769typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::as_pw_multi_aff() const
36770{
36771  auto res = isl::pw_aff::as_pw_multi_aff();
36772  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
36773}
36774
36775template <typename Domain2, typename Range2>
36776typed::union_map<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::as_union_map() const
36777{
36778  auto res = isl::pw_aff::as_union_map();
36779  return typed::union_map<pair<Domain2, Range2>, Anonymous>(res);
36780}
36781
36782template <typename Domain2, typename Range2>
36783typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::at(int pos) const
36784{
36785  auto res = isl::pw_aff::at(pos);
36786  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36787}
36788
36789template <typename Domain2, typename Range2>
36790typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::bind(const typed::multi_id<Anonymous> &tuple) const
36791{
36792  auto res = isl::pw_aff::bind(tuple);
36793  return typed::set<pair<Domain2, Range2>>(res);
36794}
36795
36796template <typename Domain2, typename Range2>
36797typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::bind(const typed::id<Anonymous> &id) const
36798{
36799  auto res = isl::pw_aff::bind(id);
36800  return typed::set<pair<Domain2, Range2>>(res);
36801}
36802
36803template <typename Domain2, typename Range2>
36804typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::bind(const std::string &id) const
36805{
36806  auto res = isl::pw_aff::bind(id);
36807  return typed::set<pair<Domain2, Range2>>(res);
36808}
36809
36810template <typename Domain2, typename Range2>
36811typed::pw_aff<Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const
36812{
36813  auto res = isl::pw_aff::bind_domain(tuple);
36814  return typed::pw_aff<Anonymous>(res);
36815}
36816
36817template <typename Domain2, typename Range2>
36818typed::pw_aff<Range2, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const
36819{
36820  auto res = isl::pw_aff::bind_domain_wrapped_domain(tuple);
36821  return typed::pw_aff<Range2, Anonymous>(res);
36822}
36823
36824template <typename Domain2, typename Range2>
36825typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::ceil() const
36826{
36827  auto res = isl::pw_aff::ceil();
36828  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36829}
36830
36831template <typename Domain2, typename Range2>
36832typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::coalesce() const
36833{
36834  auto res = isl::pw_aff::coalesce();
36835  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36836}
36837
36838template <typename Domain2, typename Range2>
36839typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::cond(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff_true, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff_false) const
36840{
36841  auto res = isl::pw_aff::cond(pwaff_true, pwaff_false);
36842  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36843}
36844
36845template <typename Domain2, typename Range2>
36846typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::domain() const
36847{
36848  auto res = isl::pw_aff::domain();
36849  return typed::set<pair<Domain2, Range2>>(res);
36850}
36851
36852template <typename Domain2, typename Range2>
36853typed::pw_aff<pair<Range2, Domain2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::domain_reverse() const
36854{
36855  auto res = isl::pw_aff::domain_reverse();
36856  return typed::pw_aff<pair<Range2, Domain2>, Anonymous>(res);
36857}
36858
36859template <typename Domain2, typename Range2>
36860typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::drop_unused_params() const
36861{
36862  auto res = isl::pw_aff::drop_unused_params();
36863  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36864}
36865
36866template <typename Domain2, typename Range2>
36867typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::extract_pw_multi_aff(const typed::space<pair<Domain2, Range2>, Anonymous> &space) const
36868{
36869  auto res = isl::pw_aff::extract_pw_multi_aff(space);
36870  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
36871}
36872
36873template <typename Domain2, typename Range2>
36874typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::floor() const
36875{
36876  auto res = isl::pw_aff::floor();
36877  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36878}
36879
36880template <typename Domain2, typename Range2>
36881typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::ge_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
36882{
36883  auto res = isl::pw_aff::ge_set(pwaff2);
36884  return typed::set<pair<Domain2, Range2>>(res);
36885}
36886
36887template <typename Domain2, typename Range2>
36888typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::ge_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
36889{
36890  auto res = isl::pw_aff::ge_set(pwaff2);
36891  return typed::set<pair<Domain2, Range2>>(res);
36892}
36893
36894template <typename Domain2, typename Range2>
36895typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::gist(const typed::set<pair<Domain2, Range2>> &context) const
36896{
36897  auto res = isl::pw_aff::gist(context);
36898  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36899}
36900
36901template <typename Domain2, typename Range2>
36902typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::gist(const typed::union_set<pair<Domain2, Range2>> &context) const
36903{
36904  auto res = isl::pw_aff::gist(context);
36905  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36906}
36907
36908template <typename Domain2, typename Range2>
36909typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::gist(const typed::basic_set<pair<Domain2, Range2>> &context) const
36910{
36911  auto res = isl::pw_aff::gist(context);
36912  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36913}
36914
36915template <typename Domain2, typename Range2>
36916typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::gist(const typed::point<pair<Domain2, Range2>> &context) const
36917{
36918  auto res = isl::pw_aff::gist(context);
36919  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36920}
36921
36922template <typename Domain2, typename Range2>
36923typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::gist_params(const typed::set<> &context) const
36924{
36925  auto res = isl::pw_aff::gist_params(context);
36926  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36927}
36928
36929template <typename Domain2, typename Range2>
36930typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::gist_params(const typed::basic_set<> &context) const
36931{
36932  auto res = isl::pw_aff::gist_params(context);
36933  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36934}
36935
36936template <typename Domain2, typename Range2>
36937typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::gist_params(const typed::point<> &context) const
36938{
36939  auto res = isl::pw_aff::gist_params(context);
36940  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36941}
36942
36943template <typename Domain2, typename Range2>
36944typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::gt_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
36945{
36946  auto res = isl::pw_aff::gt_set(pwaff2);
36947  return typed::set<pair<Domain2, Range2>>(res);
36948}
36949
36950template <typename Domain2, typename Range2>
36951typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::gt_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
36952{
36953  auto res = isl::pw_aff::gt_set(pwaff2);
36954  return typed::set<pair<Domain2, Range2>>(res);
36955}
36956
36957template <typename Domain2, typename Range2>
36958typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::identity() const
36959{
36960  auto res = isl::pw_aff::identity();
36961  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36962}
36963
36964template <typename Domain2, typename Range2>
36965typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::intersect_domain(const typed::set<pair<Domain2, Range2>> &set) const
36966{
36967  auto res = isl::pw_aff::intersect_domain(set);
36968  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36969}
36970
36971template <typename Domain2, typename Range2>
36972typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::intersect_domain(const typed::space<pair<Domain2, Range2>> &space) const
36973{
36974  auto res = isl::pw_aff::intersect_domain(space);
36975  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36976}
36977
36978template <typename Domain2, typename Range2>
36979typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const
36980{
36981  auto res = isl::pw_aff::intersect_domain(uset);
36982  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36983}
36984
36985template <typename Domain2, typename Range2>
36986typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::intersect_domain(const typed::basic_set<pair<Domain2, Range2>> &set) const
36987{
36988  auto res = isl::pw_aff::intersect_domain(set);
36989  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36990}
36991
36992template <typename Domain2, typename Range2>
36993typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::intersect_domain(const typed::point<pair<Domain2, Range2>> &set) const
36994{
36995  auto res = isl::pw_aff::intersect_domain(set);
36996  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
36997}
36998
36999template <typename Domain2, typename Range2>
37000typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::intersect_domain_wrapped_domain(const typed::union_set<Domain2> &uset) const
37001{
37002  auto res = isl::pw_aff::intersect_domain_wrapped_domain(uset);
37003  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37004}
37005
37006template <typename Domain2, typename Range2>
37007typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::intersect_params(const typed::set<> &set) const
37008{
37009  auto res = isl::pw_aff::intersect_params(set);
37010  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37011}
37012
37013template <typename Domain2, typename Range2>
37014typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::intersect_params(const typed::basic_set<> &set) const
37015{
37016  auto res = isl::pw_aff::intersect_params(set);
37017  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37018}
37019
37020template <typename Domain2, typename Range2>
37021typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::intersect_params(const typed::point<> &set) const
37022{
37023  auto res = isl::pw_aff::intersect_params(set);
37024  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37025}
37026
37027template <typename Domain2, typename Range2>
37028typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::le_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37029{
37030  auto res = isl::pw_aff::le_set(pwaff2);
37031  return typed::set<pair<Domain2, Range2>>(res);
37032}
37033
37034template <typename Domain2, typename Range2>
37035typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::le_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37036{
37037  auto res = isl::pw_aff::le_set(pwaff2);
37038  return typed::set<pair<Domain2, Range2>>(res);
37039}
37040
37041template <typename Domain2, typename Range2>
37042typed::pw_aff_list<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::list() const
37043{
37044  auto res = isl::pw_aff::list();
37045  return typed::pw_aff_list<pair<Domain2, Range2>, Anonymous>(res);
37046}
37047
37048template <typename Domain2, typename Range2>
37049typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::lt_set(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37050{
37051  auto res = isl::pw_aff::lt_set(pwaff2);
37052  return typed::set<pair<Domain2, Range2>>(res);
37053}
37054
37055template <typename Domain2, typename Range2>
37056typed::set<pair<Domain2, Range2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::lt_set(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37057{
37058  auto res = isl::pw_aff::lt_set(pwaff2);
37059  return typed::set<pair<Domain2, Range2>>(res);
37060}
37061
37062template <typename Domain2, typename Range2>
37063typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::max(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
37064{
37065  auto res = isl::pw_aff::max(multi2);
37066  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37067}
37068
37069template <typename Domain2, typename Range2>
37070typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::max(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37071{
37072  auto res = isl::pw_aff::max(pwaff2);
37073  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37074}
37075
37076template <typename Domain2, typename Range2>
37077typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::max(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37078{
37079  auto res = isl::pw_aff::max(pwaff2);
37080  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37081}
37082
37083template <typename Domain2, typename Range2>
37084typed::multi_val<Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::max_multi_val() const
37085{
37086  auto res = isl::pw_aff::max_multi_val();
37087  return typed::multi_val<Anonymous>(res);
37088}
37089
37090template <typename Domain2, typename Range2>
37091typed::val<Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::max_val() const
37092{
37093  auto res = isl::pw_aff::max_val();
37094  return typed::val<Anonymous>(res);
37095}
37096
37097template <typename Domain2, typename Range2>
37098typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::min(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
37099{
37100  auto res = isl::pw_aff::min(multi2);
37101  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37102}
37103
37104template <typename Domain2, typename Range2>
37105typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::min(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37106{
37107  auto res = isl::pw_aff::min(pwaff2);
37108  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37109}
37110
37111template <typename Domain2, typename Range2>
37112typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::min(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37113{
37114  auto res = isl::pw_aff::min(pwaff2);
37115  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37116}
37117
37118template <typename Domain2, typename Range2>
37119typed::multi_val<Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::min_multi_val() const
37120{
37121  auto res = isl::pw_aff::min_multi_val();
37122  return typed::multi_val<Anonymous>(res);
37123}
37124
37125template <typename Domain2, typename Range2>
37126typed::val<Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::min_val() const
37127{
37128  auto res = isl::pw_aff::min_val();
37129  return typed::val<Anonymous>(res);
37130}
37131
37132template <typename Domain2, typename Range2>
37133typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::mod(const typed::val<Anonymous> &mod) const
37134{
37135  auto res = isl::pw_aff::mod(mod);
37136  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37137}
37138
37139template <typename Domain2, typename Range2>
37140typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::mod(long mod) const
37141{
37142  auto res = isl::pw_aff::mod(mod);
37143  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37144}
37145
37146template <typename Domain2, typename Range2>
37147typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::neg() const
37148{
37149  auto res = isl::pw_aff::neg();
37150  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37151}
37152
37153template <typename Domain2, typename Range2>
37154typed::set<> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::params() const
37155{
37156  auto res = isl::pw_aff::params();
37157  return typed::set<>(res);
37158}
37159
37160template <typename Domain2, typename Range2>
37161template <typename Domain3>
37162typed::pw_multi_aff<pair<Domain3, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain2> &pma2) const
37163{
37164  auto res = isl::pw_aff::preimage_domain_wrapped_domain(pma2);
37165  return typed::pw_multi_aff<pair<Domain3, Range2>, Anonymous>(res);
37166}
37167
37168template <typename Domain2, typename Range2>
37169template <typename Domain3>
37170typed::union_pw_multi_aff<pair<Domain3, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain2> &upma2) const
37171{
37172  auto res = isl::pw_aff::preimage_domain_wrapped_domain(upma2);
37173  return typed::union_pw_multi_aff<pair<Domain3, Range2>, Anonymous>(res);
37174}
37175
37176template <typename Domain2, typename Range2>
37177template <typename Arg1, typename Arg2>
37178typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::product(const typed::multi_pw_aff<Arg1, Arg2> &multi2) const
37179{
37180  auto res = isl::pw_aff::product(multi2);
37181  return typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>>(res);
37182}
37183
37184template <typename Domain2, typename Range2>
37185template <typename Arg1, typename Arg2>
37186typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::product(const typed::pw_multi_aff<Arg1, Arg2> &pma2) const
37187{
37188  auto res = isl::pw_aff::product(pma2);
37189  return typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg1>, pair<Anonymous, Arg2>>(res);
37190}
37191
37192template <typename Domain2, typename Range2>
37193template <typename Arg1>
37194typed::pw_aff<Arg1, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::multi_aff<Arg1, pair<Domain2, Range2>> &ma) const
37195{
37196  auto res = isl::pw_aff::pullback(ma);
37197  return typed::pw_aff<Arg1, Anonymous>(res);
37198}
37199
37200template <typename Domain2, typename Range2>
37201typed::pw_aff<Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma) const
37202{
37203  auto res = isl::pw_aff::pullback(ma);
37204  return typed::pw_aff<Anonymous>(res);
37205}
37206
37207template <typename Domain2, typename Range2>
37208template <typename Arg1>
37209typed::pw_aff<Arg1, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::multi_pw_aff<Arg1, pair<Domain2, Range2>> &mpa) const
37210{
37211  auto res = isl::pw_aff::pullback(mpa);
37212  return typed::pw_aff<Arg1, Anonymous>(res);
37213}
37214
37215template <typename Domain2, typename Range2>
37216typed::pw_aff<Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa) const
37217{
37218  auto res = isl::pw_aff::pullback(mpa);
37219  return typed::pw_aff<Anonymous>(res);
37220}
37221
37222template <typename Domain2, typename Range2>
37223template <typename Arg1>
37224typed::pw_aff<Arg1, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::pw_multi_aff<Arg1, pair<Domain2, Range2>> &pma) const
37225{
37226  auto res = isl::pw_aff::pullback(pma);
37227  return typed::pw_aff<Arg1, Anonymous>(res);
37228}
37229
37230template <typename Domain2, typename Range2>
37231typed::pw_aff<Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma) const
37232{
37233  auto res = isl::pw_aff::pullback(pma);
37234  return typed::pw_aff<Anonymous>(res);
37235}
37236
37237template <typename Domain2, typename Range2>
37238template <typename Arg1>
37239typed::union_pw_aff<Arg1, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::union_pw_multi_aff<Arg1, pair<Domain2, Range2>> &upma) const
37240{
37241  auto res = isl::pw_aff::pullback(upma);
37242  return typed::union_pw_aff<Arg1, Anonymous>(res);
37243}
37244
37245template <typename Domain2, typename Range2>
37246typed::union_pw_aff<Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma) const
37247{
37248  auto res = isl::pw_aff::pullback(upma);
37249  return typed::union_pw_aff<Anonymous>(res);
37250}
37251
37252template <typename Domain2, typename Range2>
37253typed::pw_multi_aff_list<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::pw_multi_aff_list() const
37254{
37255  auto res = isl::pw_aff::pw_multi_aff_list();
37256  return typed::pw_multi_aff_list<pair<Domain2, Range2>, Anonymous>(res);
37257}
37258
37259template <typename Domain2, typename Range2>
37260template <typename Arg1>
37261typed::multi_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg1> &multi2) const
37262{
37263  auto res = isl::pw_aff::range_product(multi2);
37264  return typed::multi_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>>(res);
37265}
37266
37267template <typename Domain2, typename Range2>
37268template <typename Arg1>
37269typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg1> &multi2) const
37270{
37271  auto res = isl::pw_aff::range_product(multi2);
37272  return typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>>(res);
37273}
37274
37275template <typename Domain2, typename Range2>
37276template <typename Arg1>
37277typed::pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> &pma2) const
37278{
37279  auto res = isl::pw_aff::range_product(pma2);
37280  return typed::pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>>(res);
37281}
37282
37283template <typename Domain2, typename Range2>
37284template <typename Arg1>
37285typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::range_product(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg1> &upma2) const
37286{
37287  auto res = isl::pw_aff::range_product(upma2);
37288  return typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Anonymous, Arg1>>(res);
37289}
37290
37291template <typename Domain2, typename Range2>
37292typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::scale(const typed::val<Anonymous> &v) const
37293{
37294  auto res = isl::pw_aff::scale(v);
37295  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37296}
37297
37298template <typename Domain2, typename Range2>
37299typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::scale(long v) const
37300{
37301  auto res = isl::pw_aff::scale(v);
37302  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37303}
37304
37305template <typename Domain2, typename Range2>
37306typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::scale(const typed::multi_val<Anonymous> &mv) const
37307{
37308  auto res = isl::pw_aff::scale(mv);
37309  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
37310}
37311
37312template <typename Domain2, typename Range2>
37313typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::scale_down(const typed::val<Anonymous> &f) const
37314{
37315  auto res = isl::pw_aff::scale_down(f);
37316  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37317}
37318
37319template <typename Domain2, typename Range2>
37320typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::scale_down(long f) const
37321{
37322  auto res = isl::pw_aff::scale_down(f);
37323  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37324}
37325
37326template <typename Domain2, typename Range2>
37327typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::scale_down(const typed::multi_val<Anonymous> &mv) const
37328{
37329  auto res = isl::pw_aff::scale_down(mv);
37330  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
37331}
37332
37333template <typename Domain2, typename Range2>
37334typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
37335{
37336  auto res = isl::pw_aff::set_at(pos, el);
37337  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37338}
37339
37340template <typename Domain2, typename Range2>
37341typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
37342{
37343  auto res = isl::pw_aff::set_at(pos, el);
37344  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37345}
37346
37347template <typename Domain2, typename Range2>
37348template <typename Arg1>
37349typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::set_range_tuple(const typed::id<Anonymous> &id) const
37350{
37351  auto res = isl::pw_aff::set_range_tuple(id);
37352  return typed::pw_multi_aff<pair<Domain2, Range2>, Arg1>(res);
37353}
37354
37355template <typename Domain2, typename Range2>
37356template <typename Arg1>
37357typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::set_range_tuple(const std::string &id) const
37358{
37359  auto res = isl::pw_aff::set_range_tuple(id);
37360  return typed::pw_multi_aff<pair<Domain2, Range2>, Arg1>(res);
37361}
37362
37363template <typename Domain2, typename Range2>
37364typed::space<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::space() const
37365{
37366  auto res = isl::pw_aff::space();
37367  return typed::space<pair<Domain2, Range2>, Anonymous>(res);
37368}
37369
37370template <typename Domain2, typename Range2>
37371typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
37372{
37373  auto res = isl::pw_aff::sub(multi2);
37374  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37375}
37376
37377template <typename Domain2, typename Range2>
37378typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &multi2) const
37379{
37380  auto res = isl::pw_aff::sub(multi2);
37381  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37382}
37383
37384template <typename Domain2, typename Range2>
37385typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37386{
37387  auto res = isl::pw_aff::sub(pwaff2);
37388  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37389}
37390
37391template <typename Domain2, typename Range2>
37392typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const
37393{
37394  auto res = isl::pw_aff::sub(pma2);
37395  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
37396}
37397
37398template <typename Domain2, typename Range2>
37399typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const
37400{
37401  auto res = isl::pw_aff::sub(upa2);
37402  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37403}
37404
37405template <typename Domain2, typename Range2>
37406typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const
37407{
37408  auto res = isl::pw_aff::sub(upma2);
37409  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
37410}
37411
37412template <typename Domain2, typename Range2>
37413typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::sub(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37414{
37415  auto res = isl::pw_aff::sub(pwaff2);
37416  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37417}
37418
37419template <typename Domain2, typename Range2>
37420typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::subtract_domain(const typed::set<pair<Domain2, Range2>> &set) const
37421{
37422  auto res = isl::pw_aff::subtract_domain(set);
37423  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37424}
37425
37426template <typename Domain2, typename Range2>
37427typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::subtract_domain(const typed::space<pair<Domain2, Range2>> &space) const
37428{
37429  auto res = isl::pw_aff::subtract_domain(space);
37430  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37431}
37432
37433template <typename Domain2, typename Range2>
37434typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::subtract_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const
37435{
37436  auto res = isl::pw_aff::subtract_domain(uset);
37437  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37438}
37439
37440template <typename Domain2, typename Range2>
37441typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::subtract_domain(const typed::basic_set<pair<Domain2, Range2>> &set) const
37442{
37443  auto res = isl::pw_aff::subtract_domain(set);
37444  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37445}
37446
37447template <typename Domain2, typename Range2>
37448typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::subtract_domain(const typed::point<pair<Domain2, Range2>> &set) const
37449{
37450  auto res = isl::pw_aff::subtract_domain(set);
37451  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37452}
37453
37454template <typename Domain2, typename Range2>
37455typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::to_multi_pw_aff() const
37456{
37457  auto res = isl::pw_aff::to_multi_pw_aff();
37458  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37459}
37460
37461template <typename Domain2, typename Range2>
37462typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::to_union_pw_aff() const
37463{
37464  auto res = isl::pw_aff::to_union_pw_aff();
37465  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37466}
37467
37468template <typename Domain2, typename Range2>
37469typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::to_union_pw_multi_aff() const
37470{
37471  auto res = isl::pw_aff::to_union_pw_multi_aff();
37472  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
37473}
37474
37475template <typename Domain2, typename Range2>
37476typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous> &mpa2) const
37477{
37478  auto res = isl::pw_aff::union_add(mpa2);
37479  return typed::multi_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37480}
37481
37482template <typename Domain2, typename Range2>
37483typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous> &mupa2) const
37484{
37485  auto res = isl::pw_aff::union_add(mupa2);
37486  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37487}
37488
37489template <typename Domain2, typename Range2>
37490typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37491{
37492  auto res = isl::pw_aff::union_add(pwaff2);
37493  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37494}
37495
37496template <typename Domain2, typename Range2>
37497typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous> &pma2) const
37498{
37499  auto res = isl::pw_aff::union_add(pma2);
37500  return typed::pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
37501}
37502
37503template <typename Domain2, typename Range2>
37504typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &upa2) const
37505{
37506  auto res = isl::pw_aff::union_add(upa2);
37507  return typed::union_pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37508}
37509
37510template <typename Domain2, typename Range2>
37511typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous> &upma2) const
37512{
37513  auto res = isl::pw_aff::union_add(upma2);
37514  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Anonymous>(res);
37515}
37516
37517template <typename Domain2, typename Range2>
37518typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_aff<pair<Domain2, Range2>, Anonymous>::union_add(const typed::aff<pair<Domain2, Range2>, Anonymous> &pwaff2) const
37519{
37520  auto res = isl::pw_aff::union_add(pwaff2);
37521  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
37522}
37523
37524typed::pw_aff_list<Anonymous>::pw_aff_list(const isl::ctx &ctx, int n)
37525  : isl::pw_aff_list(ctx, n)
37526{
37527}
37528
37529typed::pw_aff_list<Anonymous>::pw_aff_list(const typed::pw_aff<Anonymous> &el)
37530  : isl::pw_aff_list(el)
37531{
37532}
37533
37534typed::pw_aff_list<Anonymous>::pw_aff_list(const isl::ctx &ctx, const std::string &str)
37535  : isl::pw_aff_list(ctx, str)
37536{
37537}
37538
37539typed::pw_aff_list<Anonymous> typed::pw_aff_list<Anonymous>::add(const typed::pw_aff<Anonymous> &el) const
37540{
37541  auto res = isl::pw_aff_list::add(el);
37542  return typed::pw_aff_list<Anonymous>(res);
37543}
37544
37545typed::pw_aff_list<Anonymous> typed::pw_aff_list<Anonymous>::add(const typed::aff<Anonymous> &el) const
37546{
37547  auto res = isl::pw_aff_list::add(el);
37548  return typed::pw_aff_list<Anonymous>(res);
37549}
37550
37551typed::pw_aff<Anonymous> typed::pw_aff_list<Anonymous>::at(int index) const
37552{
37553  auto res = isl::pw_aff_list::at(index);
37554  return typed::pw_aff<Anonymous>(res);
37555}
37556
37557typed::pw_aff_list<Anonymous> typed::pw_aff_list<Anonymous>::drop(unsigned int first, unsigned int n) const
37558{
37559  auto res = isl::pw_aff_list::drop(first, n);
37560  return typed::pw_aff_list<Anonymous>(res);
37561}
37562
37563void typed::pw_aff_list<Anonymous>::foreach(const std::function<void(typed::pw_aff<Anonymous>)> &fn) const
37564{
37565  auto lambda_fn = [&] (isl::pw_aff arg0) {
37566    return fn(typed::pw_aff<Anonymous>(arg0));
37567  };
37568  return isl::pw_aff_list::foreach(lambda_fn);
37569}
37570
37571void typed::pw_aff_list<Anonymous>::foreach_scc(const std::function<bool(typed::pw_aff<Anonymous>, typed::pw_aff<Anonymous>)> &follows, const std::function<void(typed::pw_aff_list<Anonymous>)> &fn) const
37572{
37573  auto lambda_follows = [&] (isl::pw_aff arg0, isl::pw_aff arg1) {
37574    return follows(typed::pw_aff<Anonymous>(arg0), typed::pw_aff<Anonymous>(arg1));
37575  };
37576  auto lambda_fn = [&] (isl::pw_aff_list arg0) {
37577    return fn(typed::pw_aff_list<Anonymous>(arg0));
37578  };
37579  return isl::pw_aff_list::foreach_scc(lambda_follows, lambda_fn);
37580}
37581
37582typed::pw_aff_list<Anonymous> typed::pw_aff_list<Anonymous>::set_at(int index, const typed::pw_aff<Anonymous> &el) const
37583{
37584  auto res = isl::pw_aff_list::set_at(index, el);
37585  return typed::pw_aff_list<Anonymous>(res);
37586}
37587
37588template <typename Domain>
37589typed::pw_aff_list<Domain, Anonymous>::pw_aff_list(const isl::ctx &ctx, int n)
37590  : isl::pw_aff_list(ctx, n)
37591{
37592}
37593
37594template <typename Domain>
37595typed::pw_aff_list<Domain, Anonymous>::pw_aff_list(const typed::pw_aff<Domain, Anonymous> &el)
37596  : isl::pw_aff_list(el)
37597{
37598}
37599
37600template <typename Domain>
37601typed::pw_aff_list<Domain, Anonymous>::pw_aff_list(const isl::ctx &ctx, const std::string &str)
37602  : isl::pw_aff_list(ctx, str)
37603{
37604}
37605
37606template <typename Domain>
37607typed::pw_aff_list<Domain, Anonymous> typed::pw_aff_list<Domain, Anonymous>::add(const typed::pw_aff<Domain, Anonymous> &el) const
37608{
37609  auto res = isl::pw_aff_list::add(el);
37610  return typed::pw_aff_list<Domain, Anonymous>(res);
37611}
37612
37613template <typename Domain>
37614typed::pw_aff_list<Domain, Anonymous> typed::pw_aff_list<Domain, Anonymous>::add(const typed::aff<Domain, Anonymous> &el) const
37615{
37616  auto res = isl::pw_aff_list::add(el);
37617  return typed::pw_aff_list<Domain, Anonymous>(res);
37618}
37619
37620template <typename Domain>
37621typed::pw_aff<Domain, Anonymous> typed::pw_aff_list<Domain, Anonymous>::at(int index) const
37622{
37623  auto res = isl::pw_aff_list::at(index);
37624  return typed::pw_aff<Domain, Anonymous>(res);
37625}
37626
37627template <typename Domain>
37628typed::pw_aff_list<Domain, Anonymous> typed::pw_aff_list<Domain, Anonymous>::drop(unsigned int first, unsigned int n) const
37629{
37630  auto res = isl::pw_aff_list::drop(first, n);
37631  return typed::pw_aff_list<Domain, Anonymous>(res);
37632}
37633
37634template <typename Domain>
37635void typed::pw_aff_list<Domain, Anonymous>::foreach(const std::function<void(typed::pw_aff<Domain, Anonymous>)> &fn) const
37636{
37637  auto lambda_fn = [&] (isl::pw_aff arg0) {
37638    return fn(typed::pw_aff<Domain, Anonymous>(arg0));
37639  };
37640  return isl::pw_aff_list::foreach(lambda_fn);
37641}
37642
37643template <typename Domain>
37644void typed::pw_aff_list<Domain, Anonymous>::foreach_scc(const std::function<bool(typed::pw_aff<Domain, Anonymous>, typed::pw_aff<Domain, Anonymous>)> &follows, const std::function<void(typed::pw_aff_list<Domain, Anonymous>)> &fn) const
37645{
37646  auto lambda_follows = [&] (isl::pw_aff arg0, isl::pw_aff arg1) {
37647    return follows(typed::pw_aff<Domain, Anonymous>(arg0), typed::pw_aff<Domain, Anonymous>(arg1));
37648  };
37649  auto lambda_fn = [&] (isl::pw_aff_list arg0) {
37650    return fn(typed::pw_aff_list<Domain, Anonymous>(arg0));
37651  };
37652  return isl::pw_aff_list::foreach_scc(lambda_follows, lambda_fn);
37653}
37654
37655template <typename Domain>
37656typed::pw_aff_list<Domain, Anonymous> typed::pw_aff_list<Domain, Anonymous>::set_at(int index, const typed::pw_aff<Domain, Anonymous> &el) const
37657{
37658  auto res = isl::pw_aff_list::set_at(index, el);
37659  return typed::pw_aff_list<Domain, Anonymous>(res);
37660}
37661
37662template <typename Domain>
37663typed::pw_multi_aff<Domain>::pw_multi_aff(const typed::multi_aff<Domain> &ma)
37664  : isl::pw_multi_aff(ma)
37665{
37666}
37667
37668template <typename Domain>
37669typed::pw_multi_aff<Domain>::pw_multi_aff(const typed::pw_aff<Domain> &pa)
37670  : isl::pw_multi_aff(pa)
37671{
37672}
37673
37674template <typename Domain>
37675typed::pw_multi_aff<Domain>::pw_multi_aff(const isl::ctx &ctx, const std::string &str)
37676  : isl::pw_multi_aff(ctx, str)
37677{
37678}
37679
37680template <typename Domain>
37681typed::multi_pw_aff<Domain> typed::pw_multi_aff<Domain>::add(const typed::multi_pw_aff<Domain> &multi2) const
37682{
37683  auto res = isl::pw_multi_aff::add(multi2);
37684  return typed::multi_pw_aff<Domain>(res);
37685}
37686
37687template <typename Domain>
37688typed::multi_union_pw_aff<Domain> typed::pw_multi_aff<Domain>::add(const typed::multi_union_pw_aff<Domain> &multi2) const
37689{
37690  auto res = isl::pw_multi_aff::add(multi2);
37691  return typed::multi_union_pw_aff<Domain>(res);
37692}
37693
37694template <typename Domain>
37695typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::add(const typed::pw_multi_aff<Domain> &pma2) const
37696{
37697  auto res = isl::pw_multi_aff::add(pma2);
37698  return typed::pw_multi_aff<Domain>(res);
37699}
37700
37701template <typename Domain>
37702typed::union_pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::add(const typed::union_pw_multi_aff<Domain> &upma2) const
37703{
37704  auto res = isl::pw_multi_aff::add(upma2);
37705  return typed::union_pw_multi_aff<Domain>(res);
37706}
37707
37708template <typename Domain>
37709typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::add(const typed::multi_aff<Domain> &pma2) const
37710{
37711  auto res = isl::pw_multi_aff::add(pma2);
37712  return typed::pw_multi_aff<Domain>(res);
37713}
37714
37715template <typename Domain>
37716typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::add(const typed::pw_aff<Domain> &pma2) const
37717{
37718  auto res = isl::pw_multi_aff::add(pma2);
37719  return typed::pw_multi_aff<Domain>(res);
37720}
37721
37722template <typename Domain>
37723typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::add_constant(const typed::multi_val<Domain> &mv) const
37724{
37725  auto res = isl::pw_multi_aff::add_constant(mv);
37726  return typed::pw_multi_aff<Domain>(res);
37727}
37728
37729template <typename Domain>
37730typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::add_constant(const typed::val<Domain> &v) const
37731{
37732  auto res = isl::pw_multi_aff::add_constant(v);
37733  return typed::pw_multi_aff<Domain>(res);
37734}
37735
37736template <typename Domain>
37737typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::add_constant(long v) const
37738{
37739  auto res = isl::pw_multi_aff::add_constant(v);
37740  return typed::pw_multi_aff<Domain>(res);
37741}
37742
37743template <typename Domain>
37744template <typename Range>
37745typed::union_pw_multi_aff<Range> typed::pw_multi_aff<Domain>::apply(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
37746{
37747  auto res = isl::pw_multi_aff::apply(upma2);
37748  return typed::union_pw_multi_aff<Range>(res);
37749}
37750
37751template <typename Domain>
37752typed::multi_aff<Domain> typed::pw_multi_aff<Domain>::as_multi_aff() const
37753{
37754  auto res = isl::pw_multi_aff::as_multi_aff();
37755  return typed::multi_aff<Domain>(res);
37756}
37757
37758template <typename Domain>
37759typed::multi_union_pw_aff<Domain> typed::pw_multi_aff<Domain>::as_multi_union_pw_aff() const
37760{
37761  auto res = isl::pw_multi_aff::as_multi_union_pw_aff();
37762  return typed::multi_union_pw_aff<Domain>(res);
37763}
37764
37765template <typename Domain>
37766typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::as_pw_multi_aff() const
37767{
37768  auto res = isl::pw_multi_aff::as_pw_multi_aff();
37769  return typed::pw_multi_aff<Domain>(res);
37770}
37771
37772template <typename Domain>
37773typed::set<Domain> typed::pw_multi_aff<Domain>::as_set() const
37774{
37775  auto res = isl::pw_multi_aff::as_set();
37776  return typed::set<Domain>(res);
37777}
37778
37779template <typename Domain>
37780typed::pw_aff<Anonymous> typed::pw_multi_aff<Domain>::at(int pos) const
37781{
37782  auto res = isl::pw_multi_aff::at(pos);
37783  return typed::pw_aff<Anonymous>(res);
37784}
37785
37786template <typename Domain>
37787typed::set<> typed::pw_multi_aff<Domain>::bind(const typed::multi_id<Domain> &tuple) const
37788{
37789  auto res = isl::pw_multi_aff::bind(tuple);
37790  return typed::set<>(res);
37791}
37792
37793template <typename Domain>
37794typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::coalesce() const
37795{
37796  auto res = isl::pw_multi_aff::coalesce();
37797  return typed::pw_multi_aff<Domain>(res);
37798}
37799
37800template <typename Domain>
37801typed::set<> typed::pw_multi_aff<Domain>::domain() const
37802{
37803  auto res = isl::pw_multi_aff::domain();
37804  return typed::set<>(res);
37805}
37806
37807template <typename Domain>
37808typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::drop_unused_params() const
37809{
37810  auto res = isl::pw_multi_aff::drop_unused_params();
37811  return typed::pw_multi_aff<Domain>(res);
37812}
37813
37814template <typename Domain>
37815typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::extract_pw_multi_aff(const typed::space<Domain> &space) const
37816{
37817  auto res = isl::pw_multi_aff::extract_pw_multi_aff(space);
37818  return typed::pw_multi_aff<Domain>(res);
37819}
37820
37821template <typename Domain>
37822typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::gist(const typed::set<> &set) const
37823{
37824  auto res = isl::pw_multi_aff::gist(set);
37825  return typed::pw_multi_aff<Domain>(res);
37826}
37827
37828template <typename Domain>
37829typed::union_pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::gist(const typed::union_set<> &context) const
37830{
37831  auto res = isl::pw_multi_aff::gist(context);
37832  return typed::union_pw_multi_aff<Domain>(res);
37833}
37834
37835template <typename Domain>
37836typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::gist(const typed::basic_set<> &set) const
37837{
37838  auto res = isl::pw_multi_aff::gist(set);
37839  return typed::pw_multi_aff<Domain>(res);
37840}
37841
37842template <typename Domain>
37843typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::gist(const typed::point<> &set) const
37844{
37845  auto res = isl::pw_multi_aff::gist(set);
37846  return typed::pw_multi_aff<Domain>(res);
37847}
37848
37849template <typename Domain>
37850typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::gist_params(const typed::set<> &set) const
37851{
37852  auto res = isl::pw_multi_aff::gist_params(set);
37853  return typed::pw_multi_aff<Domain>(res);
37854}
37855
37856template <typename Domain>
37857typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::gist_params(const typed::basic_set<> &set) const
37858{
37859  auto res = isl::pw_multi_aff::gist_params(set);
37860  return typed::pw_multi_aff<Domain>(res);
37861}
37862
37863template <typename Domain>
37864typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::gist_params(const typed::point<> &set) const
37865{
37866  auto res = isl::pw_multi_aff::gist_params(set);
37867  return typed::pw_multi_aff<Domain>(res);
37868}
37869
37870template <typename Domain>
37871typed::multi_pw_aff<Domain, Domain> typed::pw_multi_aff<Domain>::identity() const
37872{
37873  auto res = isl::pw_multi_aff::identity();
37874  return typed::multi_pw_aff<Domain, Domain>(res);
37875}
37876
37877template <typename Domain>
37878template <typename Arg1>
37879typed::pw_multi_aff<Arg1, Domain> typed::pw_multi_aff<Domain>::insert_domain(const typed::space<Arg1> &domain) const
37880{
37881  auto res = isl::pw_multi_aff::insert_domain(domain);
37882  return typed::pw_multi_aff<Arg1, Domain>(res);
37883}
37884
37885template <typename Domain>
37886typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::intersect_params(const typed::set<> &set) const
37887{
37888  auto res = isl::pw_multi_aff::intersect_params(set);
37889  return typed::pw_multi_aff<Domain>(res);
37890}
37891
37892template <typename Domain>
37893typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::intersect_params(const typed::basic_set<> &set) const
37894{
37895  auto res = isl::pw_multi_aff::intersect_params(set);
37896  return typed::pw_multi_aff<Domain>(res);
37897}
37898
37899template <typename Domain>
37900typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::intersect_params(const typed::point<> &set) const
37901{
37902  auto res = isl::pw_multi_aff::intersect_params(set);
37903  return typed::pw_multi_aff<Domain>(res);
37904}
37905
37906template <typename Domain>
37907typed::pw_aff_list<Anonymous> typed::pw_multi_aff<Domain>::list() const
37908{
37909  auto res = isl::pw_multi_aff::list();
37910  return typed::pw_aff_list<Anonymous>(res);
37911}
37912
37913template <typename Domain>
37914typed::multi_pw_aff<Domain> typed::pw_multi_aff<Domain>::max(const typed::multi_pw_aff<Domain> &multi2) const
37915{
37916  auto res = isl::pw_multi_aff::max(multi2);
37917  return typed::multi_pw_aff<Domain>(res);
37918}
37919
37920template <typename Domain>
37921typed::multi_val<Domain> typed::pw_multi_aff<Domain>::max_multi_val() const
37922{
37923  auto res = isl::pw_multi_aff::max_multi_val();
37924  return typed::multi_val<Domain>(res);
37925}
37926
37927template <typename Domain>
37928typed::multi_pw_aff<Domain> typed::pw_multi_aff<Domain>::min(const typed::multi_pw_aff<Domain> &multi2) const
37929{
37930  auto res = isl::pw_multi_aff::min(multi2);
37931  return typed::multi_pw_aff<Domain>(res);
37932}
37933
37934template <typename Domain>
37935typed::multi_val<Domain> typed::pw_multi_aff<Domain>::min_multi_val() const
37936{
37937  auto res = isl::pw_multi_aff::min_multi_val();
37938  return typed::multi_val<Domain>(res);
37939}
37940
37941template <typename Domain>
37942typed::multi_pw_aff<Domain> typed::pw_multi_aff<Domain>::neg() const
37943{
37944  auto res = isl::pw_multi_aff::neg();
37945  return typed::multi_pw_aff<Domain>(res);
37946}
37947
37948template <typename Domain>
37949template <typename Range>
37950typed::multi_pw_aff<pair<Domain, Range>> typed::pw_multi_aff<Domain>::product(const typed::multi_pw_aff<Range> &multi2) const
37951{
37952  auto res = isl::pw_multi_aff::product(multi2);
37953  return typed::multi_pw_aff<pair<Domain, Range>>(res);
37954}
37955
37956template <typename Domain>
37957template <typename Range>
37958typed::pw_multi_aff<pair<Domain, Range>> typed::pw_multi_aff<Domain>::product(const typed::pw_multi_aff<Range> &pma2) const
37959{
37960  auto res = isl::pw_multi_aff::product(pma2);
37961  return typed::pw_multi_aff<pair<Domain, Range>>(res);
37962}
37963
37964template <typename Domain>
37965template <typename Range>
37966typed::pw_multi_aff<pair<Domain, Range>> typed::pw_multi_aff<Domain>::product(const typed::multi_aff<Range> &pma2) const
37967{
37968  auto res = isl::pw_multi_aff::product(pma2);
37969  return typed::pw_multi_aff<pair<Domain, Range>>(res);
37970}
37971
37972template <typename Domain>
37973typed::pw_multi_aff<pair<Domain, Anonymous>> typed::pw_multi_aff<Domain>::product(const typed::pw_aff<Anonymous> &pma2) const
37974{
37975  auto res = isl::pw_multi_aff::product(pma2);
37976  return typed::pw_multi_aff<pair<Domain, Anonymous>>(res);
37977}
37978
37979template <typename Domain>
37980typed::pw_multi_aff_list<Domain> typed::pw_multi_aff<Domain>::pw_multi_aff_list() const
37981{
37982  auto res = isl::pw_multi_aff::pw_multi_aff_list();
37983  return typed::pw_multi_aff_list<Domain>(res);
37984}
37985
37986template <typename Domain>
37987typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::scale(const typed::multi_val<Domain> &mv) const
37988{
37989  auto res = isl::pw_multi_aff::scale(mv);
37990  return typed::pw_multi_aff<Domain>(res);
37991}
37992
37993template <typename Domain>
37994typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::scale(const typed::val<Domain> &v) const
37995{
37996  auto res = isl::pw_multi_aff::scale(v);
37997  return typed::pw_multi_aff<Domain>(res);
37998}
37999
38000template <typename Domain>
38001typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::scale(long v) const
38002{
38003  auto res = isl::pw_multi_aff::scale(v);
38004  return typed::pw_multi_aff<Domain>(res);
38005}
38006
38007template <typename Domain>
38008typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::scale_down(const typed::multi_val<Domain> &mv) const
38009{
38010  auto res = isl::pw_multi_aff::scale_down(mv);
38011  return typed::pw_multi_aff<Domain>(res);
38012}
38013
38014template <typename Domain>
38015typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::scale_down(const typed::val<Domain> &v) const
38016{
38017  auto res = isl::pw_multi_aff::scale_down(v);
38018  return typed::pw_multi_aff<Domain>(res);
38019}
38020
38021template <typename Domain>
38022typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::scale_down(long v) const
38023{
38024  auto res = isl::pw_multi_aff::scale_down(v);
38025  return typed::pw_multi_aff<Domain>(res);
38026}
38027
38028template <typename Domain>
38029typed::multi_pw_aff<Domain> typed::pw_multi_aff<Domain>::set_at(int pos, const typed::pw_aff<Anonymous> &el) const
38030{
38031  auto res = isl::pw_multi_aff::set_at(pos, el);
38032  return typed::multi_pw_aff<Domain>(res);
38033}
38034
38035template <typename Domain>
38036typed::multi_union_pw_aff<Domain> typed::pw_multi_aff<Domain>::set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const
38037{
38038  auto res = isl::pw_multi_aff::set_at(pos, el);
38039  return typed::multi_union_pw_aff<Domain>(res);
38040}
38041
38042template <typename Domain>
38043template <typename Domain2>
38044typed::pw_multi_aff<Domain2> typed::pw_multi_aff<Domain>::set_range_tuple(const typed::id<Anonymous> &id) const
38045{
38046  auto res = isl::pw_multi_aff::set_range_tuple(id);
38047  return typed::pw_multi_aff<Domain2>(res);
38048}
38049
38050template <typename Domain>
38051template <typename Domain2>
38052typed::pw_multi_aff<Domain2> typed::pw_multi_aff<Domain>::set_range_tuple(const std::string &id) const
38053{
38054  auto res = isl::pw_multi_aff::set_range_tuple(id);
38055  return typed::pw_multi_aff<Domain2>(res);
38056}
38057
38058template <typename Domain>
38059typed::space<Domain> typed::pw_multi_aff<Domain>::space() const
38060{
38061  auto res = isl::pw_multi_aff::space();
38062  return typed::space<Domain>(res);
38063}
38064
38065template <typename Domain>
38066typed::multi_pw_aff<Domain> typed::pw_multi_aff<Domain>::sub(const typed::multi_pw_aff<Domain> &multi2) const
38067{
38068  auto res = isl::pw_multi_aff::sub(multi2);
38069  return typed::multi_pw_aff<Domain>(res);
38070}
38071
38072template <typename Domain>
38073typed::multi_union_pw_aff<Domain> typed::pw_multi_aff<Domain>::sub(const typed::multi_union_pw_aff<Domain> &multi2) const
38074{
38075  auto res = isl::pw_multi_aff::sub(multi2);
38076  return typed::multi_union_pw_aff<Domain>(res);
38077}
38078
38079template <typename Domain>
38080typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::sub(const typed::pw_multi_aff<Domain> &pma2) const
38081{
38082  auto res = isl::pw_multi_aff::sub(pma2);
38083  return typed::pw_multi_aff<Domain>(res);
38084}
38085
38086template <typename Domain>
38087typed::union_pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::sub(const typed::union_pw_multi_aff<Domain> &upma2) const
38088{
38089  auto res = isl::pw_multi_aff::sub(upma2);
38090  return typed::union_pw_multi_aff<Domain>(res);
38091}
38092
38093template <typename Domain>
38094typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::sub(const typed::multi_aff<Domain> &pma2) const
38095{
38096  auto res = isl::pw_multi_aff::sub(pma2);
38097  return typed::pw_multi_aff<Domain>(res);
38098}
38099
38100template <typename Domain>
38101typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::sub(const typed::pw_aff<Domain> &pma2) const
38102{
38103  auto res = isl::pw_multi_aff::sub(pma2);
38104  return typed::pw_multi_aff<Domain>(res);
38105}
38106
38107template <typename Domain>
38108typed::multi_pw_aff<Domain> typed::pw_multi_aff<Domain>::to_multi_pw_aff() const
38109{
38110  auto res = isl::pw_multi_aff::to_multi_pw_aff();
38111  return typed::multi_pw_aff<Domain>(res);
38112}
38113
38114template <typename Domain>
38115typed::union_pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::to_union_pw_multi_aff() const
38116{
38117  auto res = isl::pw_multi_aff::to_union_pw_multi_aff();
38118  return typed::union_pw_multi_aff<Domain>(res);
38119}
38120
38121template <typename Domain>
38122template <typename Arg1>
38123typed::multi_pw_aff<Arg1, Domain> typed::pw_multi_aff<Domain>::unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const
38124{
38125  auto res = isl::pw_multi_aff::unbind_params_insert_domain(domain);
38126  return typed::multi_pw_aff<Arg1, Domain>(res);
38127}
38128
38129template <typename Domain>
38130typed::multi_pw_aff<Domain> typed::pw_multi_aff<Domain>::union_add(const typed::multi_pw_aff<Domain> &mpa2) const
38131{
38132  auto res = isl::pw_multi_aff::union_add(mpa2);
38133  return typed::multi_pw_aff<Domain>(res);
38134}
38135
38136template <typename Domain>
38137typed::multi_union_pw_aff<Domain> typed::pw_multi_aff<Domain>::union_add(const typed::multi_union_pw_aff<Domain> &mupa2) const
38138{
38139  auto res = isl::pw_multi_aff::union_add(mupa2);
38140  return typed::multi_union_pw_aff<Domain>(res);
38141}
38142
38143template <typename Domain>
38144typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::union_add(const typed::pw_multi_aff<Domain> &pma2) const
38145{
38146  auto res = isl::pw_multi_aff::union_add(pma2);
38147  return typed::pw_multi_aff<Domain>(res);
38148}
38149
38150template <typename Domain>
38151typed::union_pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::union_add(const typed::union_pw_multi_aff<Domain> &upma2) const
38152{
38153  auto res = isl::pw_multi_aff::union_add(upma2);
38154  return typed::union_pw_multi_aff<Domain>(res);
38155}
38156
38157template <typename Domain>
38158typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::union_add(const typed::multi_aff<Domain> &pma2) const
38159{
38160  auto res = isl::pw_multi_aff::union_add(pma2);
38161  return typed::pw_multi_aff<Domain>(res);
38162}
38163
38164template <typename Domain>
38165typed::pw_multi_aff<Domain> typed::pw_multi_aff<Domain>::union_add(const typed::pw_aff<Domain> &pma2) const
38166{
38167  auto res = isl::pw_multi_aff::union_add(pma2);
38168  return typed::pw_multi_aff<Domain>(res);
38169}
38170
38171template <typename Domain, typename Range>
38172typed::pw_multi_aff<Domain, Range>::pw_multi_aff(const typed::multi_aff<Domain, Range> &ma)
38173  : isl::pw_multi_aff(ma)
38174{
38175}
38176
38177template <typename Domain, typename Range>
38178typed::pw_multi_aff<Domain, Range>::pw_multi_aff(const typed::pw_aff<Domain, Range> &pa)
38179  : isl::pw_multi_aff(pa)
38180{
38181}
38182
38183template <typename Domain, typename Range>
38184typed::pw_multi_aff<Domain, Range>::pw_multi_aff(const isl::ctx &ctx, const std::string &str)
38185  : isl::pw_multi_aff(ctx, str)
38186{
38187}
38188
38189template <typename Domain, typename Range>
38190typed::multi_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::add(const typed::multi_pw_aff<Domain, Range> &multi2) const
38191{
38192  auto res = isl::pw_multi_aff::add(multi2);
38193  return typed::multi_pw_aff<Domain, Range>(res);
38194}
38195
38196template <typename Domain, typename Range>
38197typed::multi_union_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::add(const typed::multi_union_pw_aff<Domain, Range> &multi2) const
38198{
38199  auto res = isl::pw_multi_aff::add(multi2);
38200  return typed::multi_union_pw_aff<Domain, Range>(res);
38201}
38202
38203template <typename Domain, typename Range>
38204typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::add(const typed::pw_multi_aff<Domain, Range> &pma2) const
38205{
38206  auto res = isl::pw_multi_aff::add(pma2);
38207  return typed::pw_multi_aff<Domain, Range>(res);
38208}
38209
38210template <typename Domain, typename Range>
38211typed::union_pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
38212{
38213  auto res = isl::pw_multi_aff::add(upma2);
38214  return typed::union_pw_multi_aff<Domain, Range>(res);
38215}
38216
38217template <typename Domain, typename Range>
38218typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::add(const typed::multi_aff<Domain, Range> &pma2) const
38219{
38220  auto res = isl::pw_multi_aff::add(pma2);
38221  return typed::pw_multi_aff<Domain, Range>(res);
38222}
38223
38224template <typename Domain, typename Range>
38225typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::add(const typed::pw_aff<Domain, Range> &pma2) const
38226{
38227  auto res = isl::pw_multi_aff::add(pma2);
38228  return typed::pw_multi_aff<Domain, Range>(res);
38229}
38230
38231template <typename Domain, typename Range>
38232typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::add_constant(const typed::multi_val<Range> &mv) const
38233{
38234  auto res = isl::pw_multi_aff::add_constant(mv);
38235  return typed::pw_multi_aff<Domain, Range>(res);
38236}
38237
38238template <typename Domain, typename Range>
38239typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::add_constant(const typed::val<Range> &v) const
38240{
38241  auto res = isl::pw_multi_aff::add_constant(v);
38242  return typed::pw_multi_aff<Domain, Range>(res);
38243}
38244
38245template <typename Domain, typename Range>
38246typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::add_constant(long v) const
38247{
38248  auto res = isl::pw_multi_aff::add_constant(v);
38249  return typed::pw_multi_aff<Domain, Range>(res);
38250}
38251
38252template <typename Domain, typename Range>
38253template <typename Range2>
38254typed::union_pw_multi_aff<Domain, Range2> typed::pw_multi_aff<Domain, Range>::apply(const typed::union_pw_multi_aff<Range, Range2> &upma2) const
38255{
38256  auto res = isl::pw_multi_aff::apply(upma2);
38257  return typed::union_pw_multi_aff<Domain, Range2>(res);
38258}
38259
38260template <typename Domain, typename Range>
38261typed::map<Domain, Range> typed::pw_multi_aff<Domain, Range>::as_map() const
38262{
38263  auto res = isl::pw_multi_aff::as_map();
38264  return typed::map<Domain, Range>(res);
38265}
38266
38267template <typename Domain, typename Range>
38268typed::multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::as_multi_aff() const
38269{
38270  auto res = isl::pw_multi_aff::as_multi_aff();
38271  return typed::multi_aff<Domain, Range>(res);
38272}
38273
38274template <typename Domain, typename Range>
38275typed::multi_union_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::as_multi_union_pw_aff() const
38276{
38277  auto res = isl::pw_multi_aff::as_multi_union_pw_aff();
38278  return typed::multi_union_pw_aff<Domain, Range>(res);
38279}
38280
38281template <typename Domain, typename Range>
38282typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::as_pw_multi_aff() const
38283{
38284  auto res = isl::pw_multi_aff::as_pw_multi_aff();
38285  return typed::pw_multi_aff<Domain, Range>(res);
38286}
38287
38288template <typename Domain, typename Range>
38289typed::union_map<Domain, Range> typed::pw_multi_aff<Domain, Range>::as_union_map() const
38290{
38291  auto res = isl::pw_multi_aff::as_union_map();
38292  return typed::union_map<Domain, Range>(res);
38293}
38294
38295template <typename Domain, typename Range>
38296typed::pw_aff<Domain, Anonymous> typed::pw_multi_aff<Domain, Range>::at(int pos) const
38297{
38298  auto res = isl::pw_multi_aff::at(pos);
38299  return typed::pw_aff<Domain, Anonymous>(res);
38300}
38301
38302template <typename Domain, typename Range>
38303typed::set<Domain> typed::pw_multi_aff<Domain, Range>::bind(const typed::multi_id<Range> &tuple) const
38304{
38305  auto res = isl::pw_multi_aff::bind(tuple);
38306  return typed::set<Domain>(res);
38307}
38308
38309template <typename Domain, typename Range>
38310typed::pw_multi_aff<Range> typed::pw_multi_aff<Domain, Range>::bind_domain(const typed::multi_id<Domain> &tuple) const
38311{
38312  auto res = isl::pw_multi_aff::bind_domain(tuple);
38313  return typed::pw_multi_aff<Range>(res);
38314}
38315
38316template <typename Domain, typename Range>
38317typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::coalesce() const
38318{
38319  auto res = isl::pw_multi_aff::coalesce();
38320  return typed::pw_multi_aff<Domain, Range>(res);
38321}
38322
38323template <typename Domain, typename Range>
38324typed::set<Domain> typed::pw_multi_aff<Domain, Range>::domain() const
38325{
38326  auto res = isl::pw_multi_aff::domain();
38327  return typed::set<Domain>(res);
38328}
38329
38330template <typename Domain, typename Range>
38331typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::drop_unused_params() const
38332{
38333  auto res = isl::pw_multi_aff::drop_unused_params();
38334  return typed::pw_multi_aff<Domain, Range>(res);
38335}
38336
38337template <typename Domain, typename Range>
38338typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::extract_pw_multi_aff(const typed::space<Domain, Range> &space) const
38339{
38340  auto res = isl::pw_multi_aff::extract_pw_multi_aff(space);
38341  return typed::pw_multi_aff<Domain, Range>(res);
38342}
38343
38344template <typename Domain, typename Range>
38345typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::gist(const typed::set<Domain> &set) const
38346{
38347  auto res = isl::pw_multi_aff::gist(set);
38348  return typed::pw_multi_aff<Domain, Range>(res);
38349}
38350
38351template <typename Domain, typename Range>
38352typed::union_pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::gist(const typed::union_set<Domain> &context) const
38353{
38354  auto res = isl::pw_multi_aff::gist(context);
38355  return typed::union_pw_multi_aff<Domain, Range>(res);
38356}
38357
38358template <typename Domain, typename Range>
38359typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::gist(const typed::basic_set<Domain> &set) const
38360{
38361  auto res = isl::pw_multi_aff::gist(set);
38362  return typed::pw_multi_aff<Domain, Range>(res);
38363}
38364
38365template <typename Domain, typename Range>
38366typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::gist(const typed::point<Domain> &set) const
38367{
38368  auto res = isl::pw_multi_aff::gist(set);
38369  return typed::pw_multi_aff<Domain, Range>(res);
38370}
38371
38372template <typename Domain, typename Range>
38373typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::gist_params(const typed::set<> &set) const
38374{
38375  auto res = isl::pw_multi_aff::gist_params(set);
38376  return typed::pw_multi_aff<Domain, Range>(res);
38377}
38378
38379template <typename Domain, typename Range>
38380typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::gist_params(const typed::basic_set<> &set) const
38381{
38382  auto res = isl::pw_multi_aff::gist_params(set);
38383  return typed::pw_multi_aff<Domain, Range>(res);
38384}
38385
38386template <typename Domain, typename Range>
38387typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::gist_params(const typed::point<> &set) const
38388{
38389  auto res = isl::pw_multi_aff::gist_params(set);
38390  return typed::pw_multi_aff<Domain, Range>(res);
38391}
38392
38393template <typename Domain, typename Range>
38394typed::multi_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::identity() const
38395{
38396  auto res = isl::pw_multi_aff::identity();
38397  return typed::multi_pw_aff<Domain, Range>(res);
38398}
38399
38400template <typename Domain, typename Range>
38401typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::intersect_domain(const typed::set<Domain> &set) const
38402{
38403  auto res = isl::pw_multi_aff::intersect_domain(set);
38404  return typed::pw_multi_aff<Domain, Range>(res);
38405}
38406
38407template <typename Domain, typename Range>
38408typed::union_pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::intersect_domain(const typed::space<Domain> &space) const
38409{
38410  auto res = isl::pw_multi_aff::intersect_domain(space);
38411  return typed::union_pw_multi_aff<Domain, Range>(res);
38412}
38413
38414template <typename Domain, typename Range>
38415typed::union_pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::intersect_domain(const typed::union_set<Domain> &uset) const
38416{
38417  auto res = isl::pw_multi_aff::intersect_domain(uset);
38418  return typed::union_pw_multi_aff<Domain, Range>(res);
38419}
38420
38421template <typename Domain, typename Range>
38422typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::intersect_domain(const typed::basic_set<Domain> &set) const
38423{
38424  auto res = isl::pw_multi_aff::intersect_domain(set);
38425  return typed::pw_multi_aff<Domain, Range>(res);
38426}
38427
38428template <typename Domain, typename Range>
38429typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::intersect_domain(const typed::point<Domain> &set) const
38430{
38431  auto res = isl::pw_multi_aff::intersect_domain(set);
38432  return typed::pw_multi_aff<Domain, Range>(res);
38433}
38434
38435template <typename Domain, typename Range>
38436typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::intersect_params(const typed::set<> &set) const
38437{
38438  auto res = isl::pw_multi_aff::intersect_params(set);
38439  return typed::pw_multi_aff<Domain, Range>(res);
38440}
38441
38442template <typename Domain, typename Range>
38443typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::intersect_params(const typed::basic_set<> &set) const
38444{
38445  auto res = isl::pw_multi_aff::intersect_params(set);
38446  return typed::pw_multi_aff<Domain, Range>(res);
38447}
38448
38449template <typename Domain, typename Range>
38450typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::intersect_params(const typed::point<> &set) const
38451{
38452  auto res = isl::pw_multi_aff::intersect_params(set);
38453  return typed::pw_multi_aff<Domain, Range>(res);
38454}
38455
38456template <typename Domain, typename Range>
38457typed::pw_aff_list<Domain, Anonymous> typed::pw_multi_aff<Domain, Range>::list() const
38458{
38459  auto res = isl::pw_multi_aff::list();
38460  return typed::pw_aff_list<Domain, Anonymous>(res);
38461}
38462
38463template <typename Domain, typename Range>
38464typed::multi_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::max(const typed::multi_pw_aff<Domain, Range> &multi2) const
38465{
38466  auto res = isl::pw_multi_aff::max(multi2);
38467  return typed::multi_pw_aff<Domain, Range>(res);
38468}
38469
38470template <typename Domain, typename Range>
38471typed::multi_val<Range> typed::pw_multi_aff<Domain, Range>::max_multi_val() const
38472{
38473  auto res = isl::pw_multi_aff::max_multi_val();
38474  return typed::multi_val<Range>(res);
38475}
38476
38477template <typename Domain, typename Range>
38478typed::multi_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::min(const typed::multi_pw_aff<Domain, Range> &multi2) const
38479{
38480  auto res = isl::pw_multi_aff::min(multi2);
38481  return typed::multi_pw_aff<Domain, Range>(res);
38482}
38483
38484template <typename Domain, typename Range>
38485typed::multi_val<Range> typed::pw_multi_aff<Domain, Range>::min_multi_val() const
38486{
38487  auto res = isl::pw_multi_aff::min_multi_val();
38488  return typed::multi_val<Range>(res);
38489}
38490
38491template <typename Domain, typename Range>
38492typed::multi_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::neg() const
38493{
38494  auto res = isl::pw_multi_aff::neg();
38495  return typed::multi_pw_aff<Domain, Range>(res);
38496}
38497
38498template <typename Domain, typename Range>
38499template <typename Domain2, typename Range2>
38500typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::pw_multi_aff<Domain, Range>::product(const typed::multi_pw_aff<Domain2, Range2> &multi2) const
38501{
38502  auto res = isl::pw_multi_aff::product(multi2);
38503  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
38504}
38505
38506template <typename Domain, typename Range>
38507template <typename Domain2, typename Range2>
38508typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::pw_multi_aff<Domain, Range>::product(const typed::pw_multi_aff<Domain2, Range2> &pma2) const
38509{
38510  auto res = isl::pw_multi_aff::product(pma2);
38511  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
38512}
38513
38514template <typename Domain, typename Range>
38515template <typename Domain2, typename Range2>
38516typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::pw_multi_aff<Domain, Range>::product(const typed::multi_aff<Domain2, Range2> &pma2) const
38517{
38518  auto res = isl::pw_multi_aff::product(pma2);
38519  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
38520}
38521
38522template <typename Domain, typename Range>
38523template <typename Domain2>
38524typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> typed::pw_multi_aff<Domain, Range>::product(const typed::pw_aff<Domain2, Anonymous> &pma2) const
38525{
38526  auto res = isl::pw_multi_aff::product(pma2);
38527  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<Range, Anonymous>>(res);
38528}
38529
38530template <typename Domain, typename Range>
38531template <typename Domain2>
38532typed::multi_pw_aff<Domain2, Range> typed::pw_multi_aff<Domain, Range>::pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const
38533{
38534  auto res = isl::pw_multi_aff::pullback(mpa2);
38535  return typed::multi_pw_aff<Domain2, Range>(res);
38536}
38537
38538template <typename Domain, typename Range>
38539typed::multi_pw_aff<Range> typed::pw_multi_aff<Domain, Range>::pullback(const typed::multi_pw_aff<Domain> &mpa2) const
38540{
38541  auto res = isl::pw_multi_aff::pullback(mpa2);
38542  return typed::multi_pw_aff<Range>(res);
38543}
38544
38545template <typename Domain, typename Range>
38546template <typename Domain2>
38547typed::pw_multi_aff<Domain2, Range> typed::pw_multi_aff<Domain, Range>::pullback(const typed::multi_aff<Domain2, Domain> &ma) const
38548{
38549  auto res = isl::pw_multi_aff::pullback(ma);
38550  return typed::pw_multi_aff<Domain2, Range>(res);
38551}
38552
38553template <typename Domain, typename Range>
38554typed::pw_multi_aff<Range> typed::pw_multi_aff<Domain, Range>::pullback(const typed::multi_aff<Domain> &ma) const
38555{
38556  auto res = isl::pw_multi_aff::pullback(ma);
38557  return typed::pw_multi_aff<Range>(res);
38558}
38559
38560template <typename Domain, typename Range>
38561template <typename Domain2>
38562typed::pw_multi_aff<Domain2, Range> typed::pw_multi_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain2, Domain> &pma2) const
38563{
38564  auto res = isl::pw_multi_aff::pullback(pma2);
38565  return typed::pw_multi_aff<Domain2, Range>(res);
38566}
38567
38568template <typename Domain, typename Range>
38569typed::pw_multi_aff<Range> typed::pw_multi_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain> &pma2) const
38570{
38571  auto res = isl::pw_multi_aff::pullback(pma2);
38572  return typed::pw_multi_aff<Range>(res);
38573}
38574
38575template <typename Domain, typename Range>
38576template <typename Domain2>
38577typed::union_pw_multi_aff<Domain2, Range> typed::pw_multi_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const
38578{
38579  auto res = isl::pw_multi_aff::pullback(upma2);
38580  return typed::union_pw_multi_aff<Domain2, Range>(res);
38581}
38582
38583template <typename Domain, typename Range>
38584typed::union_pw_multi_aff<Range> typed::pw_multi_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain> &upma2) const
38585{
38586  auto res = isl::pw_multi_aff::pullback(upma2);
38587  return typed::union_pw_multi_aff<Range>(res);
38588}
38589
38590template <typename Domain, typename Range>
38591typed::pw_multi_aff_list<Domain, Range> typed::pw_multi_aff<Domain, Range>::pw_multi_aff_list() const
38592{
38593  auto res = isl::pw_multi_aff::pw_multi_aff_list();
38594  return typed::pw_multi_aff_list<Domain, Range>(res);
38595}
38596
38597template <typename Domain, typename Range>
38598template <typename Range2>
38599typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, Range>::range_product(const typed::multi_pw_aff<Domain, Range2> &multi2) const
38600{
38601  auto res = isl::pw_multi_aff::range_product(multi2);
38602  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
38603}
38604
38605template <typename Domain, typename Range>
38606template <typename Range2>
38607typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, Range>::range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const
38608{
38609  auto res = isl::pw_multi_aff::range_product(multi2);
38610  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
38611}
38612
38613template <typename Domain, typename Range>
38614template <typename Range2>
38615typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, Range>::range_product(const typed::pw_multi_aff<Domain, Range2> &pma2) const
38616{
38617  auto res = isl::pw_multi_aff::range_product(pma2);
38618  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
38619}
38620
38621template <typename Domain, typename Range>
38622template <typename Range2>
38623typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, Range>::range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const
38624{
38625  auto res = isl::pw_multi_aff::range_product(upma2);
38626  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
38627}
38628
38629template <typename Domain, typename Range>
38630template <typename Range2>
38631typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, Range>::range_product(const typed::multi_aff<Domain, Range2> &pma2) const
38632{
38633  auto res = isl::pw_multi_aff::range_product(pma2);
38634  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
38635}
38636
38637template <typename Domain, typename Range>
38638typed::pw_multi_aff<Domain, pair<Range, Anonymous>> typed::pw_multi_aff<Domain, Range>::range_product(const typed::pw_aff<Domain, Anonymous> &pma2) const
38639{
38640  auto res = isl::pw_multi_aff::range_product(pma2);
38641  return typed::pw_multi_aff<Domain, pair<Range, Anonymous>>(res);
38642}
38643
38644template <typename Domain, typename Range>
38645typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::scale(const typed::multi_val<Range> &mv) const
38646{
38647  auto res = isl::pw_multi_aff::scale(mv);
38648  return typed::pw_multi_aff<Domain, Range>(res);
38649}
38650
38651template <typename Domain, typename Range>
38652typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::scale(const typed::val<Range> &v) const
38653{
38654  auto res = isl::pw_multi_aff::scale(v);
38655  return typed::pw_multi_aff<Domain, Range>(res);
38656}
38657
38658template <typename Domain, typename Range>
38659typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::scale(long v) const
38660{
38661  auto res = isl::pw_multi_aff::scale(v);
38662  return typed::pw_multi_aff<Domain, Range>(res);
38663}
38664
38665template <typename Domain, typename Range>
38666typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::scale_down(const typed::multi_val<Range> &mv) const
38667{
38668  auto res = isl::pw_multi_aff::scale_down(mv);
38669  return typed::pw_multi_aff<Domain, Range>(res);
38670}
38671
38672template <typename Domain, typename Range>
38673typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::scale_down(const typed::val<Range> &v) const
38674{
38675  auto res = isl::pw_multi_aff::scale_down(v);
38676  return typed::pw_multi_aff<Domain, Range>(res);
38677}
38678
38679template <typename Domain, typename Range>
38680typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::scale_down(long v) const
38681{
38682  auto res = isl::pw_multi_aff::scale_down(v);
38683  return typed::pw_multi_aff<Domain, Range>(res);
38684}
38685
38686template <typename Domain, typename Range>
38687typed::multi_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const
38688{
38689  auto res = isl::pw_multi_aff::set_at(pos, el);
38690  return typed::multi_pw_aff<Domain, Range>(res);
38691}
38692
38693template <typename Domain, typename Range>
38694typed::multi_union_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const
38695{
38696  auto res = isl::pw_multi_aff::set_at(pos, el);
38697  return typed::multi_union_pw_aff<Domain, Range>(res);
38698}
38699
38700template <typename Domain, typename Range>
38701template <typename Range2>
38702typed::pw_multi_aff<Domain, Range2> typed::pw_multi_aff<Domain, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
38703{
38704  auto res = isl::pw_multi_aff::set_range_tuple(id);
38705  return typed::pw_multi_aff<Domain, Range2>(res);
38706}
38707
38708template <typename Domain, typename Range>
38709template <typename Range2>
38710typed::pw_multi_aff<Domain, Range2> typed::pw_multi_aff<Domain, Range>::set_range_tuple(const std::string &id) const
38711{
38712  auto res = isl::pw_multi_aff::set_range_tuple(id);
38713  return typed::pw_multi_aff<Domain, Range2>(res);
38714}
38715
38716template <typename Domain, typename Range>
38717typed::space<Domain, Range> typed::pw_multi_aff<Domain, Range>::space() const
38718{
38719  auto res = isl::pw_multi_aff::space();
38720  return typed::space<Domain, Range>(res);
38721}
38722
38723template <typename Domain, typename Range>
38724typed::multi_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::sub(const typed::multi_pw_aff<Domain, Range> &multi2) const
38725{
38726  auto res = isl::pw_multi_aff::sub(multi2);
38727  return typed::multi_pw_aff<Domain, Range>(res);
38728}
38729
38730template <typename Domain, typename Range>
38731typed::multi_union_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::sub(const typed::multi_union_pw_aff<Domain, Range> &multi2) const
38732{
38733  auto res = isl::pw_multi_aff::sub(multi2);
38734  return typed::multi_union_pw_aff<Domain, Range>(res);
38735}
38736
38737template <typename Domain, typename Range>
38738typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::sub(const typed::pw_multi_aff<Domain, Range> &pma2) const
38739{
38740  auto res = isl::pw_multi_aff::sub(pma2);
38741  return typed::pw_multi_aff<Domain, Range>(res);
38742}
38743
38744template <typename Domain, typename Range>
38745typed::union_pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::sub(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
38746{
38747  auto res = isl::pw_multi_aff::sub(upma2);
38748  return typed::union_pw_multi_aff<Domain, Range>(res);
38749}
38750
38751template <typename Domain, typename Range>
38752typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::sub(const typed::multi_aff<Domain, Range> &pma2) const
38753{
38754  auto res = isl::pw_multi_aff::sub(pma2);
38755  return typed::pw_multi_aff<Domain, Range>(res);
38756}
38757
38758template <typename Domain, typename Range>
38759typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::sub(const typed::pw_aff<Domain, Range> &pma2) const
38760{
38761  auto res = isl::pw_multi_aff::sub(pma2);
38762  return typed::pw_multi_aff<Domain, Range>(res);
38763}
38764
38765template <typename Domain, typename Range>
38766typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::subtract_domain(const typed::set<Domain> &set) const
38767{
38768  auto res = isl::pw_multi_aff::subtract_domain(set);
38769  return typed::pw_multi_aff<Domain, Range>(res);
38770}
38771
38772template <typename Domain, typename Range>
38773typed::union_pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::subtract_domain(const typed::space<Domain> &space) const
38774{
38775  auto res = isl::pw_multi_aff::subtract_domain(space);
38776  return typed::union_pw_multi_aff<Domain, Range>(res);
38777}
38778
38779template <typename Domain, typename Range>
38780typed::union_pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::subtract_domain(const typed::union_set<Domain> &uset) const
38781{
38782  auto res = isl::pw_multi_aff::subtract_domain(uset);
38783  return typed::union_pw_multi_aff<Domain, Range>(res);
38784}
38785
38786template <typename Domain, typename Range>
38787typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::subtract_domain(const typed::basic_set<Domain> &set) const
38788{
38789  auto res = isl::pw_multi_aff::subtract_domain(set);
38790  return typed::pw_multi_aff<Domain, Range>(res);
38791}
38792
38793template <typename Domain, typename Range>
38794typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::subtract_domain(const typed::point<Domain> &set) const
38795{
38796  auto res = isl::pw_multi_aff::subtract_domain(set);
38797  return typed::pw_multi_aff<Domain, Range>(res);
38798}
38799
38800template <typename Domain, typename Range>
38801typed::multi_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::to_multi_pw_aff() const
38802{
38803  auto res = isl::pw_multi_aff::to_multi_pw_aff();
38804  return typed::multi_pw_aff<Domain, Range>(res);
38805}
38806
38807template <typename Domain, typename Range>
38808typed::union_pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::to_union_pw_multi_aff() const
38809{
38810  auto res = isl::pw_multi_aff::to_union_pw_multi_aff();
38811  return typed::union_pw_multi_aff<Domain, Range>(res);
38812}
38813
38814template <typename Domain, typename Range>
38815typed::multi_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::union_add(const typed::multi_pw_aff<Domain, Range> &mpa2) const
38816{
38817  auto res = isl::pw_multi_aff::union_add(mpa2);
38818  return typed::multi_pw_aff<Domain, Range>(res);
38819}
38820
38821template <typename Domain, typename Range>
38822typed::multi_union_pw_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::union_add(const typed::multi_union_pw_aff<Domain, Range> &mupa2) const
38823{
38824  auto res = isl::pw_multi_aff::union_add(mupa2);
38825  return typed::multi_union_pw_aff<Domain, Range>(res);
38826}
38827
38828template <typename Domain, typename Range>
38829typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::union_add(const typed::pw_multi_aff<Domain, Range> &pma2) const
38830{
38831  auto res = isl::pw_multi_aff::union_add(pma2);
38832  return typed::pw_multi_aff<Domain, Range>(res);
38833}
38834
38835template <typename Domain, typename Range>
38836typed::union_pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::union_add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
38837{
38838  auto res = isl::pw_multi_aff::union_add(upma2);
38839  return typed::union_pw_multi_aff<Domain, Range>(res);
38840}
38841
38842template <typename Domain, typename Range>
38843typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::union_add(const typed::multi_aff<Domain, Range> &pma2) const
38844{
38845  auto res = isl::pw_multi_aff::union_add(pma2);
38846  return typed::pw_multi_aff<Domain, Range>(res);
38847}
38848
38849template <typename Domain, typename Range>
38850typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, Range>::union_add(const typed::pw_aff<Domain, Range> &pma2) const
38851{
38852  auto res = isl::pw_multi_aff::union_add(pma2);
38853  return typed::pw_multi_aff<Domain, Range>(res);
38854}
38855
38856template <typename Domain2, typename Range2, typename Range>
38857typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pw_multi_aff(const typed::multi_aff<pair<Domain2, Range2>, Range> &ma)
38858  : isl::pw_multi_aff(ma)
38859{
38860}
38861
38862template <typename Domain2, typename Range2, typename Range>
38863typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pw_multi_aff(const typed::pw_aff<pair<Domain2, Range2>, Range> &pa)
38864  : isl::pw_multi_aff(pa)
38865{
38866}
38867
38868template <typename Domain2, typename Range2, typename Range>
38869typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pw_multi_aff(const isl::ctx &ctx, const std::string &str)
38870  : isl::pw_multi_aff(ctx, str)
38871{
38872}
38873
38874template <typename Domain2, typename Range2, typename Range>
38875typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
38876{
38877  auto res = isl::pw_multi_aff::add(multi2);
38878  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
38879}
38880
38881template <typename Domain2, typename Range2, typename Range>
38882typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
38883{
38884  auto res = isl::pw_multi_aff::add(multi2);
38885  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
38886}
38887
38888template <typename Domain2, typename Range2, typename Range>
38889typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const
38890{
38891  auto res = isl::pw_multi_aff::add(pma2);
38892  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
38893}
38894
38895template <typename Domain2, typename Range2, typename Range>
38896typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const
38897{
38898  auto res = isl::pw_multi_aff::add(upma2);
38899  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
38900}
38901
38902template <typename Domain2, typename Range2, typename Range>
38903typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::add(const typed::multi_aff<pair<Domain2, Range2>, Range> &pma2) const
38904{
38905  auto res = isl::pw_multi_aff::add(pma2);
38906  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
38907}
38908
38909template <typename Domain2, typename Range2, typename Range>
38910typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::add(const typed::pw_aff<pair<Domain2, Range2>, Range> &pma2) const
38911{
38912  auto res = isl::pw_multi_aff::add(pma2);
38913  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
38914}
38915
38916template <typename Domain2, typename Range2, typename Range>
38917typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::add_constant(const typed::multi_val<Range> &mv) const
38918{
38919  auto res = isl::pw_multi_aff::add_constant(mv);
38920  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
38921}
38922
38923template <typename Domain2, typename Range2, typename Range>
38924typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::add_constant(const typed::val<Range> &v) const
38925{
38926  auto res = isl::pw_multi_aff::add_constant(v);
38927  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
38928}
38929
38930template <typename Domain2, typename Range2, typename Range>
38931typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::add_constant(long v) const
38932{
38933  auto res = isl::pw_multi_aff::add_constant(v);
38934  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
38935}
38936
38937template <typename Domain2, typename Range2, typename Range>
38938template <typename Arg2>
38939typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::apply(const typed::union_pw_multi_aff<Range, Arg2> &upma2) const
38940{
38941  auto res = isl::pw_multi_aff::apply(upma2);
38942  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2>(res);
38943}
38944
38945template <typename Domain2, typename Range2, typename Range>
38946typed::map<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::as_map() const
38947{
38948  auto res = isl::pw_multi_aff::as_map();
38949  return typed::map<pair<Domain2, Range2>, Range>(res);
38950}
38951
38952template <typename Domain2, typename Range2, typename Range>
38953typed::multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::as_multi_aff() const
38954{
38955  auto res = isl::pw_multi_aff::as_multi_aff();
38956  return typed::multi_aff<pair<Domain2, Range2>, Range>(res);
38957}
38958
38959template <typename Domain2, typename Range2, typename Range>
38960typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::as_multi_union_pw_aff() const
38961{
38962  auto res = isl::pw_multi_aff::as_multi_union_pw_aff();
38963  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
38964}
38965
38966template <typename Domain2, typename Range2, typename Range>
38967typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::as_pw_multi_aff() const
38968{
38969  auto res = isl::pw_multi_aff::as_pw_multi_aff();
38970  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
38971}
38972
38973template <typename Domain2, typename Range2, typename Range>
38974typed::union_map<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::as_union_map() const
38975{
38976  auto res = isl::pw_multi_aff::as_union_map();
38977  return typed::union_map<pair<Domain2, Range2>, Range>(res);
38978}
38979
38980template <typename Domain2, typename Range2, typename Range>
38981typed::pw_aff<pair<Domain2, Range2>, Anonymous> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::at(int pos) const
38982{
38983  auto res = isl::pw_multi_aff::at(pos);
38984  return typed::pw_aff<pair<Domain2, Range2>, Anonymous>(res);
38985}
38986
38987template <typename Domain2, typename Range2, typename Range>
38988typed::set<pair<Domain2, Range2>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::bind(const typed::multi_id<Range> &tuple) const
38989{
38990  auto res = isl::pw_multi_aff::bind(tuple);
38991  return typed::set<pair<Domain2, Range2>>(res);
38992}
38993
38994template <typename Domain2, typename Range2, typename Range>
38995typed::pw_multi_aff<Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::bind_domain(const typed::multi_id<pair<Domain2, Range2>> &tuple) const
38996{
38997  auto res = isl::pw_multi_aff::bind_domain(tuple);
38998  return typed::pw_multi_aff<Range>(res);
38999}
39000
39001template <typename Domain2, typename Range2, typename Range>
39002typed::pw_multi_aff<Range2, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::bind_domain_wrapped_domain(const typed::multi_id<Domain2> &tuple) const
39003{
39004  auto res = isl::pw_multi_aff::bind_domain_wrapped_domain(tuple);
39005  return typed::pw_multi_aff<Range2, Range>(res);
39006}
39007
39008template <typename Domain2, typename Range2, typename Range>
39009typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::coalesce() const
39010{
39011  auto res = isl::pw_multi_aff::coalesce();
39012  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39013}
39014
39015template <typename Domain2, typename Range2, typename Range>
39016typed::set<pair<Domain2, Range2>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::domain() const
39017{
39018  auto res = isl::pw_multi_aff::domain();
39019  return typed::set<pair<Domain2, Range2>>(res);
39020}
39021
39022template <typename Domain2, typename Range2, typename Range>
39023typed::pw_multi_aff<pair<Range2, Domain2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::domain_reverse() const
39024{
39025  auto res = isl::pw_multi_aff::domain_reverse();
39026  return typed::pw_multi_aff<pair<Range2, Domain2>, Range>(res);
39027}
39028
39029template <typename Domain2, typename Range2, typename Range>
39030typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::drop_unused_params() const
39031{
39032  auto res = isl::pw_multi_aff::drop_unused_params();
39033  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39034}
39035
39036template <typename Domain2, typename Range2, typename Range>
39037typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::extract_pw_multi_aff(const typed::space<pair<Domain2, Range2>, Range> &space) const
39038{
39039  auto res = isl::pw_multi_aff::extract_pw_multi_aff(space);
39040  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39041}
39042
39043template <typename Domain2, typename Range2, typename Range>
39044typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::gist(const typed::set<pair<Domain2, Range2>> &set) const
39045{
39046  auto res = isl::pw_multi_aff::gist(set);
39047  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39048}
39049
39050template <typename Domain2, typename Range2, typename Range>
39051typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::gist(const typed::union_set<pair<Domain2, Range2>> &context) const
39052{
39053  auto res = isl::pw_multi_aff::gist(context);
39054  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39055}
39056
39057template <typename Domain2, typename Range2, typename Range>
39058typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::gist(const typed::basic_set<pair<Domain2, Range2>> &set) const
39059{
39060  auto res = isl::pw_multi_aff::gist(set);
39061  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39062}
39063
39064template <typename Domain2, typename Range2, typename Range>
39065typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::gist(const typed::point<pair<Domain2, Range2>> &set) const
39066{
39067  auto res = isl::pw_multi_aff::gist(set);
39068  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39069}
39070
39071template <typename Domain2, typename Range2, typename Range>
39072typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::gist_params(const typed::set<> &set) const
39073{
39074  auto res = isl::pw_multi_aff::gist_params(set);
39075  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39076}
39077
39078template <typename Domain2, typename Range2, typename Range>
39079typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::gist_params(const typed::basic_set<> &set) const
39080{
39081  auto res = isl::pw_multi_aff::gist_params(set);
39082  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39083}
39084
39085template <typename Domain2, typename Range2, typename Range>
39086typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::gist_params(const typed::point<> &set) const
39087{
39088  auto res = isl::pw_multi_aff::gist_params(set);
39089  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39090}
39091
39092template <typename Domain2, typename Range2, typename Range>
39093typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::identity() const
39094{
39095  auto res = isl::pw_multi_aff::identity();
39096  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
39097}
39098
39099template <typename Domain2, typename Range2, typename Range>
39100typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::set<pair<Domain2, Range2>> &set) const
39101{
39102  auto res = isl::pw_multi_aff::intersect_domain(set);
39103  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39104}
39105
39106template <typename Domain2, typename Range2, typename Range>
39107typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::space<pair<Domain2, Range2>> &space) const
39108{
39109  auto res = isl::pw_multi_aff::intersect_domain(space);
39110  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39111}
39112
39113template <typename Domain2, typename Range2, typename Range>
39114typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const
39115{
39116  auto res = isl::pw_multi_aff::intersect_domain(uset);
39117  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39118}
39119
39120template <typename Domain2, typename Range2, typename Range>
39121typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::basic_set<pair<Domain2, Range2>> &set) const
39122{
39123  auto res = isl::pw_multi_aff::intersect_domain(set);
39124  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39125}
39126
39127template <typename Domain2, typename Range2, typename Range>
39128typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::intersect_domain(const typed::point<pair<Domain2, Range2>> &set) const
39129{
39130  auto res = isl::pw_multi_aff::intersect_domain(set);
39131  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39132}
39133
39134template <typename Domain2, typename Range2, typename Range>
39135typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::intersect_domain_wrapped_domain(const typed::union_set<Domain2> &uset) const
39136{
39137  auto res = isl::pw_multi_aff::intersect_domain_wrapped_domain(uset);
39138  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39139}
39140
39141template <typename Domain2, typename Range2, typename Range>
39142typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::intersect_params(const typed::set<> &set) const
39143{
39144  auto res = isl::pw_multi_aff::intersect_params(set);
39145  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39146}
39147
39148template <typename Domain2, typename Range2, typename Range>
39149typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::intersect_params(const typed::basic_set<> &set) const
39150{
39151  auto res = isl::pw_multi_aff::intersect_params(set);
39152  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39153}
39154
39155template <typename Domain2, typename Range2, typename Range>
39156typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::intersect_params(const typed::point<> &set) const
39157{
39158  auto res = isl::pw_multi_aff::intersect_params(set);
39159  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39160}
39161
39162template <typename Domain2, typename Range2, typename Range>
39163typed::pw_aff_list<pair<Domain2, Range2>, Anonymous> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::list() const
39164{
39165  auto res = isl::pw_multi_aff::list();
39166  return typed::pw_aff_list<pair<Domain2, Range2>, Anonymous>(res);
39167}
39168
39169template <typename Domain2, typename Range2, typename Range>
39170typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::max(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
39171{
39172  auto res = isl::pw_multi_aff::max(multi2);
39173  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
39174}
39175
39176template <typename Domain2, typename Range2, typename Range>
39177typed::multi_val<Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::max_multi_val() const
39178{
39179  auto res = isl::pw_multi_aff::max_multi_val();
39180  return typed::multi_val<Range>(res);
39181}
39182
39183template <typename Domain2, typename Range2, typename Range>
39184typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::min(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
39185{
39186  auto res = isl::pw_multi_aff::min(multi2);
39187  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
39188}
39189
39190template <typename Domain2, typename Range2, typename Range>
39191typed::multi_val<Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::min_multi_val() const
39192{
39193  auto res = isl::pw_multi_aff::min_multi_val();
39194  return typed::multi_val<Range>(res);
39195}
39196
39197template <typename Domain2, typename Range2, typename Range>
39198typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::neg() const
39199{
39200  auto res = isl::pw_multi_aff::neg();
39201  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
39202}
39203
39204template <typename Domain2, typename Range2, typename Range>
39205template <typename Domain3>
39206typed::pw_multi_aff<pair<Domain3, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain2> &pma2) const
39207{
39208  auto res = isl::pw_multi_aff::preimage_domain_wrapped_domain(pma2);
39209  return typed::pw_multi_aff<pair<Domain3, Range2>, Range>(res);
39210}
39211
39212template <typename Domain2, typename Range2, typename Range>
39213template <typename Domain3>
39214typed::union_pw_multi_aff<pair<Domain3, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain2> &upma2) const
39215{
39216  auto res = isl::pw_multi_aff::preimage_domain_wrapped_domain(upma2);
39217  return typed::union_pw_multi_aff<pair<Domain3, Range2>, Range>(res);
39218}
39219
39220template <typename Domain2, typename Range2, typename Range>
39221template <typename Domain3>
39222typed::pw_multi_aff<pair<Domain3, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::preimage_domain_wrapped_domain(const typed::multi_aff<Domain3, Domain2> &pma2) const
39223{
39224  auto res = isl::pw_multi_aff::preimage_domain_wrapped_domain(pma2);
39225  return typed::pw_multi_aff<pair<Domain3, Range2>, Range>(res);
39226}
39227
39228template <typename Domain2, typename Range2, typename Range>
39229template <typename Domain3>
39230typed::pw_multi_aff<pair<Domain3, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::preimage_domain_wrapped_domain(const typed::pw_aff<Domain3, Domain2> &pma2) const
39231{
39232  auto res = isl::pw_multi_aff::preimage_domain_wrapped_domain(pma2);
39233  return typed::pw_multi_aff<pair<Domain3, Range2>, Range>(res);
39234}
39235
39236template <typename Domain2, typename Range2, typename Range>
39237template <typename Arg2, typename Arg3>
39238typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::product(const typed::multi_pw_aff<Arg2, Arg3> &multi2) const
39239{
39240  auto res = isl::pw_multi_aff::product(multi2);
39241  return typed::multi_pw_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>>(res);
39242}
39243
39244template <typename Domain2, typename Range2, typename Range>
39245template <typename Arg2, typename Arg3>
39246typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::product(const typed::pw_multi_aff<Arg2, Arg3> &pma2) const
39247{
39248  auto res = isl::pw_multi_aff::product(pma2);
39249  return typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>>(res);
39250}
39251
39252template <typename Domain2, typename Range2, typename Range>
39253template <typename Arg2, typename Arg3>
39254typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::product(const typed::multi_aff<Arg2, Arg3> &pma2) const
39255{
39256  auto res = isl::pw_multi_aff::product(pma2);
39257  return typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Arg3>>(res);
39258}
39259
39260template <typename Domain2, typename Range2, typename Range>
39261template <typename Arg2>
39262typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::product(const typed::pw_aff<Arg2, Anonymous> &pma2) const
39263{
39264  auto res = isl::pw_multi_aff::product(pma2);
39265  return typed::pw_multi_aff<pair<pair<Domain2, Range2>, Arg2>, pair<Range, Anonymous>>(res);
39266}
39267
39268template <typename Domain2, typename Range2, typename Range>
39269template <typename Arg2>
39270typed::multi_pw_aff<Arg2, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_pw_aff<Arg2, pair<Domain2, Range2>> &mpa2) const
39271{
39272  auto res = isl::pw_multi_aff::pullback(mpa2);
39273  return typed::multi_pw_aff<Arg2, Range>(res);
39274}
39275
39276template <typename Domain2, typename Range2, typename Range>
39277typed::multi_pw_aff<Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_pw_aff<pair<Domain2, Range2>> &mpa2) const
39278{
39279  auto res = isl::pw_multi_aff::pullback(mpa2);
39280  return typed::multi_pw_aff<Range>(res);
39281}
39282
39283template <typename Domain2, typename Range2, typename Range>
39284template <typename Arg2>
39285typed::pw_multi_aff<Arg2, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_aff<Arg2, pair<Domain2, Range2>> &ma) const
39286{
39287  auto res = isl::pw_multi_aff::pullback(ma);
39288  return typed::pw_multi_aff<Arg2, Range>(res);
39289}
39290
39291template <typename Domain2, typename Range2, typename Range>
39292typed::pw_multi_aff<Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::multi_aff<pair<Domain2, Range2>> &ma) const
39293{
39294  auto res = isl::pw_multi_aff::pullback(ma);
39295  return typed::pw_multi_aff<Range>(res);
39296}
39297
39298template <typename Domain2, typename Range2, typename Range>
39299template <typename Arg2>
39300typed::pw_multi_aff<Arg2, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::pw_multi_aff<Arg2, pair<Domain2, Range2>> &pma2) const
39301{
39302  auto res = isl::pw_multi_aff::pullback(pma2);
39303  return typed::pw_multi_aff<Arg2, Range>(res);
39304}
39305
39306template <typename Domain2, typename Range2, typename Range>
39307typed::pw_multi_aff<Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::pw_multi_aff<pair<Domain2, Range2>> &pma2) const
39308{
39309  auto res = isl::pw_multi_aff::pullback(pma2);
39310  return typed::pw_multi_aff<Range>(res);
39311}
39312
39313template <typename Domain2, typename Range2, typename Range>
39314template <typename Arg2>
39315typed::union_pw_multi_aff<Arg2, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::union_pw_multi_aff<Arg2, pair<Domain2, Range2>> &upma2) const
39316{
39317  auto res = isl::pw_multi_aff::pullback(upma2);
39318  return typed::union_pw_multi_aff<Arg2, Range>(res);
39319}
39320
39321template <typename Domain2, typename Range2, typename Range>
39322typed::union_pw_multi_aff<Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pullback(const typed::union_pw_multi_aff<pair<Domain2, Range2>> &upma2) const
39323{
39324  auto res = isl::pw_multi_aff::pullback(upma2);
39325  return typed::union_pw_multi_aff<Range>(res);
39326}
39327
39328template <typename Domain2, typename Range2, typename Range>
39329typed::pw_multi_aff_list<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::pw_multi_aff_list() const
39330{
39331  auto res = isl::pw_multi_aff::pw_multi_aff_list();
39332  return typed::pw_multi_aff_list<pair<Domain2, Range2>, Range>(res);
39333}
39334
39335template <typename Domain2, typename Range2, typename Range>
39336template <typename Arg2>
39337typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::multi_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const
39338{
39339  auto res = isl::pw_multi_aff::range_product(multi2);
39340  return typed::multi_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
39341}
39342
39343template <typename Domain2, typename Range2, typename Range>
39344template <typename Arg2>
39345typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Arg2> &multi2) const
39346{
39347  auto res = isl::pw_multi_aff::range_product(multi2);
39348  return typed::multi_union_pw_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
39349}
39350
39351template <typename Domain2, typename Range2, typename Range>
39352template <typename Arg2>
39353typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::pw_multi_aff<pair<Domain2, Range2>, Arg2> &pma2) const
39354{
39355  auto res = isl::pw_multi_aff::range_product(pma2);
39356  return typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
39357}
39358
39359template <typename Domain2, typename Range2, typename Range>
39360template <typename Arg2>
39361typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Arg2> &upma2) const
39362{
39363  auto res = isl::pw_multi_aff::range_product(upma2);
39364  return typed::union_pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
39365}
39366
39367template <typename Domain2, typename Range2, typename Range>
39368template <typename Arg2>
39369typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::multi_aff<pair<Domain2, Range2>, Arg2> &pma2) const
39370{
39371  auto res = isl::pw_multi_aff::range_product(pma2);
39372  return typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Arg2>>(res);
39373}
39374
39375template <typename Domain2, typename Range2, typename Range>
39376typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Anonymous>> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::range_product(const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &pma2) const
39377{
39378  auto res = isl::pw_multi_aff::range_product(pma2);
39379  return typed::pw_multi_aff<pair<Domain2, Range2>, pair<Range, Anonymous>>(res);
39380}
39381
39382template <typename Domain2, typename Range2, typename Range>
39383typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::scale(const typed::multi_val<Range> &mv) const
39384{
39385  auto res = isl::pw_multi_aff::scale(mv);
39386  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39387}
39388
39389template <typename Domain2, typename Range2, typename Range>
39390typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::scale(const typed::val<Range> &v) const
39391{
39392  auto res = isl::pw_multi_aff::scale(v);
39393  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39394}
39395
39396template <typename Domain2, typename Range2, typename Range>
39397typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::scale(long v) const
39398{
39399  auto res = isl::pw_multi_aff::scale(v);
39400  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39401}
39402
39403template <typename Domain2, typename Range2, typename Range>
39404typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::scale_down(const typed::multi_val<Range> &mv) const
39405{
39406  auto res = isl::pw_multi_aff::scale_down(mv);
39407  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39408}
39409
39410template <typename Domain2, typename Range2, typename Range>
39411typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::scale_down(const typed::val<Range> &v) const
39412{
39413  auto res = isl::pw_multi_aff::scale_down(v);
39414  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39415}
39416
39417template <typename Domain2, typename Range2, typename Range>
39418typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::scale_down(long v) const
39419{
39420  auto res = isl::pw_multi_aff::scale_down(v);
39421  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39422}
39423
39424template <typename Domain2, typename Range2, typename Range>
39425typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::set_at(int pos, const typed::pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
39426{
39427  auto res = isl::pw_multi_aff::set_at(pos, el);
39428  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
39429}
39430
39431template <typename Domain2, typename Range2, typename Range>
39432typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::set_at(int pos, const typed::union_pw_aff<pair<Domain2, Range2>, Anonymous> &el) const
39433{
39434  auto res = isl::pw_multi_aff::set_at(pos, el);
39435  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
39436}
39437
39438template <typename Domain2, typename Range2, typename Range>
39439template <typename Arg1>
39440typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
39441{
39442  auto res = isl::pw_multi_aff::set_range_tuple(id);
39443  return typed::pw_multi_aff<pair<Domain2, Range2>, Arg1>(res);
39444}
39445
39446template <typename Domain2, typename Range2, typename Range>
39447template <typename Arg1>
39448typed::pw_multi_aff<pair<Domain2, Range2>, Arg1> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::set_range_tuple(const std::string &id) const
39449{
39450  auto res = isl::pw_multi_aff::set_range_tuple(id);
39451  return typed::pw_multi_aff<pair<Domain2, Range2>, Arg1>(res);
39452}
39453
39454template <typename Domain2, typename Range2, typename Range>
39455typed::space<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::space() const
39456{
39457  auto res = isl::pw_multi_aff::space();
39458  return typed::space<pair<Domain2, Range2>, Range>(res);
39459}
39460
39461template <typename Domain2, typename Range2, typename Range>
39462typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
39463{
39464  auto res = isl::pw_multi_aff::sub(multi2);
39465  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
39466}
39467
39468template <typename Domain2, typename Range2, typename Range>
39469typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &multi2) const
39470{
39471  auto res = isl::pw_multi_aff::sub(multi2);
39472  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
39473}
39474
39475template <typename Domain2, typename Range2, typename Range>
39476typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const
39477{
39478  auto res = isl::pw_multi_aff::sub(pma2);
39479  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39480}
39481
39482template <typename Domain2, typename Range2, typename Range>
39483typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const
39484{
39485  auto res = isl::pw_multi_aff::sub(upma2);
39486  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39487}
39488
39489template <typename Domain2, typename Range2, typename Range>
39490typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::multi_aff<pair<Domain2, Range2>, Range> &pma2) const
39491{
39492  auto res = isl::pw_multi_aff::sub(pma2);
39493  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39494}
39495
39496template <typename Domain2, typename Range2, typename Range>
39497typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::sub(const typed::pw_aff<pair<Domain2, Range2>, Range> &pma2) const
39498{
39499  auto res = isl::pw_multi_aff::sub(pma2);
39500  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39501}
39502
39503template <typename Domain2, typename Range2, typename Range>
39504typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::subtract_domain(const typed::set<pair<Domain2, Range2>> &set) const
39505{
39506  auto res = isl::pw_multi_aff::subtract_domain(set);
39507  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39508}
39509
39510template <typename Domain2, typename Range2, typename Range>
39511typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::subtract_domain(const typed::space<pair<Domain2, Range2>> &space) const
39512{
39513  auto res = isl::pw_multi_aff::subtract_domain(space);
39514  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39515}
39516
39517template <typename Domain2, typename Range2, typename Range>
39518typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::subtract_domain(const typed::union_set<pair<Domain2, Range2>> &uset) const
39519{
39520  auto res = isl::pw_multi_aff::subtract_domain(uset);
39521  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39522}
39523
39524template <typename Domain2, typename Range2, typename Range>
39525typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::subtract_domain(const typed::basic_set<pair<Domain2, Range2>> &set) const
39526{
39527  auto res = isl::pw_multi_aff::subtract_domain(set);
39528  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39529}
39530
39531template <typename Domain2, typename Range2, typename Range>
39532typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::subtract_domain(const typed::point<pair<Domain2, Range2>> &set) const
39533{
39534  auto res = isl::pw_multi_aff::subtract_domain(set);
39535  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39536}
39537
39538template <typename Domain2, typename Range2, typename Range>
39539typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::to_multi_pw_aff() const
39540{
39541  auto res = isl::pw_multi_aff::to_multi_pw_aff();
39542  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
39543}
39544
39545template <typename Domain2, typename Range2, typename Range>
39546typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::to_union_pw_multi_aff() const
39547{
39548  auto res = isl::pw_multi_aff::to_union_pw_multi_aff();
39549  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39550}
39551
39552template <typename Domain2, typename Range2, typename Range>
39553typed::multi_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::multi_pw_aff<pair<Domain2, Range2>, Range> &mpa2) const
39554{
39555  auto res = isl::pw_multi_aff::union_add(mpa2);
39556  return typed::multi_pw_aff<pair<Domain2, Range2>, Range>(res);
39557}
39558
39559template <typename Domain2, typename Range2, typename Range>
39560typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::multi_union_pw_aff<pair<Domain2, Range2>, Range> &mupa2) const
39561{
39562  auto res = isl::pw_multi_aff::union_add(mupa2);
39563  return typed::multi_union_pw_aff<pair<Domain2, Range2>, Range>(res);
39564}
39565
39566template <typename Domain2, typename Range2, typename Range>
39567typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::pw_multi_aff<pair<Domain2, Range2>, Range> &pma2) const
39568{
39569  auto res = isl::pw_multi_aff::union_add(pma2);
39570  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39571}
39572
39573template <typename Domain2, typename Range2, typename Range>
39574typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::union_pw_multi_aff<pair<Domain2, Range2>, Range> &upma2) const
39575{
39576  auto res = isl::pw_multi_aff::union_add(upma2);
39577  return typed::union_pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39578}
39579
39580template <typename Domain2, typename Range2, typename Range>
39581typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::multi_aff<pair<Domain2, Range2>, Range> &pma2) const
39582{
39583  auto res = isl::pw_multi_aff::union_add(pma2);
39584  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39585}
39586
39587template <typename Domain2, typename Range2, typename Range>
39588typed::pw_multi_aff<pair<Domain2, Range2>, Range> typed::pw_multi_aff<pair<Domain2, Range2>, Range>::union_add(const typed::pw_aff<pair<Domain2, Range2>, Range> &pma2) const
39589{
39590  auto res = isl::pw_multi_aff::union_add(pma2);
39591  return typed::pw_multi_aff<pair<Domain2, Range2>, Range>(res);
39592}
39593
39594template <typename Domain, typename Range, typename Range2>
39595typed::pw_multi_aff<Domain, pair<Range, Range2>>::pw_multi_aff(const typed::multi_aff<Domain, pair<Range, Range2>> &ma)
39596  : isl::pw_multi_aff(ma)
39597{
39598}
39599
39600template <typename Domain, typename Range, typename Range2>
39601typed::pw_multi_aff<Domain, pair<Range, Range2>>::pw_multi_aff(const typed::pw_aff<Domain, pair<Range, Range2>> &pa)
39602  : isl::pw_multi_aff(pa)
39603{
39604}
39605
39606template <typename Domain, typename Range, typename Range2>
39607typed::pw_multi_aff<Domain, pair<Range, Range2>>::pw_multi_aff(const isl::ctx &ctx, const std::string &str)
39608  : isl::pw_multi_aff(ctx, str)
39609{
39610}
39611
39612template <typename Domain, typename Range, typename Range2>
39613typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const
39614{
39615  auto res = isl::pw_multi_aff::add(multi2);
39616  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
39617}
39618
39619template <typename Domain, typename Range, typename Range2>
39620typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &multi2) const
39621{
39622  auto res = isl::pw_multi_aff::add(multi2);
39623  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
39624}
39625
39626template <typename Domain, typename Range, typename Range2>
39627typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const
39628{
39629  auto res = isl::pw_multi_aff::add(pma2);
39630  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39631}
39632
39633template <typename Domain, typename Range, typename Range2>
39634typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
39635{
39636  auto res = isl::pw_multi_aff::add(upma2);
39637  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
39638}
39639
39640template <typename Domain, typename Range, typename Range2>
39641typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::multi_aff<Domain, pair<Range, Range2>> &pma2) const
39642{
39643  auto res = isl::pw_multi_aff::add(pma2);
39644  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39645}
39646
39647template <typename Domain, typename Range, typename Range2>
39648typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::pw_aff<Domain, pair<Range, Range2>> &pma2) const
39649{
39650  auto res = isl::pw_multi_aff::add(pma2);
39651  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39652}
39653
39654template <typename Domain, typename Range, typename Range2>
39655typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::add_constant(const typed::multi_val<pair<Range, Range2>> &mv) const
39656{
39657  auto res = isl::pw_multi_aff::add_constant(mv);
39658  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39659}
39660
39661template <typename Domain, typename Range, typename Range2>
39662typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::add_constant(const typed::val<pair<Range, Range2>> &v) const
39663{
39664  auto res = isl::pw_multi_aff::add_constant(v);
39665  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39666}
39667
39668template <typename Domain, typename Range, typename Range2>
39669typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::add_constant(long v) const
39670{
39671  auto res = isl::pw_multi_aff::add_constant(v);
39672  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39673}
39674
39675template <typename Domain, typename Range, typename Range2>
39676template <typename Arg3>
39677typed::union_pw_multi_aff<Domain, Arg3> typed::pw_multi_aff<Domain, pair<Range, Range2>>::apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg3> &upma2) const
39678{
39679  auto res = isl::pw_multi_aff::apply(upma2);
39680  return typed::union_pw_multi_aff<Domain, Arg3>(res);
39681}
39682
39683template <typename Domain, typename Range, typename Range2>
39684typed::map<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::as_map() const
39685{
39686  auto res = isl::pw_multi_aff::as_map();
39687  return typed::map<Domain, pair<Range, Range2>>(res);
39688}
39689
39690template <typename Domain, typename Range, typename Range2>
39691typed::multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::as_multi_aff() const
39692{
39693  auto res = isl::pw_multi_aff::as_multi_aff();
39694  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
39695}
39696
39697template <typename Domain, typename Range, typename Range2>
39698typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::as_multi_union_pw_aff() const
39699{
39700  auto res = isl::pw_multi_aff::as_multi_union_pw_aff();
39701  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
39702}
39703
39704template <typename Domain, typename Range, typename Range2>
39705typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::as_pw_multi_aff() const
39706{
39707  auto res = isl::pw_multi_aff::as_pw_multi_aff();
39708  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39709}
39710
39711template <typename Domain, typename Range, typename Range2>
39712typed::union_map<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::as_union_map() const
39713{
39714  auto res = isl::pw_multi_aff::as_union_map();
39715  return typed::union_map<Domain, pair<Range, Range2>>(res);
39716}
39717
39718template <typename Domain, typename Range, typename Range2>
39719typed::pw_aff<Domain, Anonymous> typed::pw_multi_aff<Domain, pair<Range, Range2>>::at(int pos) const
39720{
39721  auto res = isl::pw_multi_aff::at(pos);
39722  return typed::pw_aff<Domain, Anonymous>(res);
39723}
39724
39725template <typename Domain, typename Range, typename Range2>
39726typed::set<Domain> typed::pw_multi_aff<Domain, pair<Range, Range2>>::bind(const typed::multi_id<pair<Range, Range2>> &tuple) const
39727{
39728  auto res = isl::pw_multi_aff::bind(tuple);
39729  return typed::set<Domain>(res);
39730}
39731
39732template <typename Domain, typename Range, typename Range2>
39733typed::pw_multi_aff<pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::bind_domain(const typed::multi_id<Domain> &tuple) const
39734{
39735  auto res = isl::pw_multi_aff::bind_domain(tuple);
39736  return typed::pw_multi_aff<pair<Range, Range2>>(res);
39737}
39738
39739template <typename Domain, typename Range, typename Range2>
39740typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::coalesce() const
39741{
39742  auto res = isl::pw_multi_aff::coalesce();
39743  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39744}
39745
39746template <typename Domain, typename Range, typename Range2>
39747typed::set<Domain> typed::pw_multi_aff<Domain, pair<Range, Range2>>::domain() const
39748{
39749  auto res = isl::pw_multi_aff::domain();
39750  return typed::set<Domain>(res);
39751}
39752
39753template <typename Domain, typename Range, typename Range2>
39754typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::drop_unused_params() const
39755{
39756  auto res = isl::pw_multi_aff::drop_unused_params();
39757  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39758}
39759
39760template <typename Domain, typename Range, typename Range2>
39761typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::extract_pw_multi_aff(const typed::space<Domain, pair<Range, Range2>> &space) const
39762{
39763  auto res = isl::pw_multi_aff::extract_pw_multi_aff(space);
39764  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39765}
39766
39767template <typename Domain, typename Range, typename Range2>
39768typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::gist(const typed::set<Domain> &set) const
39769{
39770  auto res = isl::pw_multi_aff::gist(set);
39771  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39772}
39773
39774template <typename Domain, typename Range, typename Range2>
39775typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::gist(const typed::union_set<Domain> &context) const
39776{
39777  auto res = isl::pw_multi_aff::gist(context);
39778  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
39779}
39780
39781template <typename Domain, typename Range, typename Range2>
39782typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::gist(const typed::basic_set<Domain> &set) const
39783{
39784  auto res = isl::pw_multi_aff::gist(set);
39785  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39786}
39787
39788template <typename Domain, typename Range, typename Range2>
39789typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::gist(const typed::point<Domain> &set) const
39790{
39791  auto res = isl::pw_multi_aff::gist(set);
39792  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39793}
39794
39795template <typename Domain, typename Range, typename Range2>
39796typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::gist_params(const typed::set<> &set) const
39797{
39798  auto res = isl::pw_multi_aff::gist_params(set);
39799  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39800}
39801
39802template <typename Domain, typename Range, typename Range2>
39803typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::gist_params(const typed::basic_set<> &set) const
39804{
39805  auto res = isl::pw_multi_aff::gist_params(set);
39806  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39807}
39808
39809template <typename Domain, typename Range, typename Range2>
39810typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::gist_params(const typed::point<> &set) const
39811{
39812  auto res = isl::pw_multi_aff::gist_params(set);
39813  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39814}
39815
39816template <typename Domain, typename Range, typename Range2>
39817typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::identity() const
39818{
39819  auto res = isl::pw_multi_aff::identity();
39820  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
39821}
39822
39823template <typename Domain, typename Range, typename Range2>
39824typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::set<Domain> &set) const
39825{
39826  auto res = isl::pw_multi_aff::intersect_domain(set);
39827  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39828}
39829
39830template <typename Domain, typename Range, typename Range2>
39831typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::space<Domain> &space) const
39832{
39833  auto res = isl::pw_multi_aff::intersect_domain(space);
39834  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
39835}
39836
39837template <typename Domain, typename Range, typename Range2>
39838typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::union_set<Domain> &uset) const
39839{
39840  auto res = isl::pw_multi_aff::intersect_domain(uset);
39841  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
39842}
39843
39844template <typename Domain, typename Range, typename Range2>
39845typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::basic_set<Domain> &set) const
39846{
39847  auto res = isl::pw_multi_aff::intersect_domain(set);
39848  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39849}
39850
39851template <typename Domain, typename Range, typename Range2>
39852typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::point<Domain> &set) const
39853{
39854  auto res = isl::pw_multi_aff::intersect_domain(set);
39855  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39856}
39857
39858template <typename Domain, typename Range, typename Range2>
39859typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::intersect_params(const typed::set<> &set) const
39860{
39861  auto res = isl::pw_multi_aff::intersect_params(set);
39862  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39863}
39864
39865template <typename Domain, typename Range, typename Range2>
39866typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::intersect_params(const typed::basic_set<> &set) const
39867{
39868  auto res = isl::pw_multi_aff::intersect_params(set);
39869  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39870}
39871
39872template <typename Domain, typename Range, typename Range2>
39873typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::intersect_params(const typed::point<> &set) const
39874{
39875  auto res = isl::pw_multi_aff::intersect_params(set);
39876  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
39877}
39878
39879template <typename Domain, typename Range, typename Range2>
39880typed::pw_aff_list<Domain, Anonymous> typed::pw_multi_aff<Domain, pair<Range, Range2>>::list() const
39881{
39882  auto res = isl::pw_multi_aff::list();
39883  return typed::pw_aff_list<Domain, Anonymous>(res);
39884}
39885
39886template <typename Domain, typename Range, typename Range2>
39887typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::max(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const
39888{
39889  auto res = isl::pw_multi_aff::max(multi2);
39890  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
39891}
39892
39893template <typename Domain, typename Range, typename Range2>
39894typed::multi_val<pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::max_multi_val() const
39895{
39896  auto res = isl::pw_multi_aff::max_multi_val();
39897  return typed::multi_val<pair<Range, Range2>>(res);
39898}
39899
39900template <typename Domain, typename Range, typename Range2>
39901typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::min(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const
39902{
39903  auto res = isl::pw_multi_aff::min(multi2);
39904  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
39905}
39906
39907template <typename Domain, typename Range, typename Range2>
39908typed::multi_val<pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::min_multi_val() const
39909{
39910  auto res = isl::pw_multi_aff::min_multi_val();
39911  return typed::multi_val<pair<Range, Range2>>(res);
39912}
39913
39914template <typename Domain, typename Range, typename Range2>
39915typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::neg() const
39916{
39917  auto res = isl::pw_multi_aff::neg();
39918  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
39919}
39920
39921template <typename Domain, typename Range, typename Range2>
39922template <typename Domain2, typename Arg3>
39923typed::multi_pw_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::product(const typed::multi_pw_aff<Domain2, Arg3> &multi2) const
39924{
39925  auto res = isl::pw_multi_aff::product(multi2);
39926  return typed::multi_pw_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
39927}
39928
39929template <typename Domain, typename Range, typename Range2>
39930template <typename Domain2, typename Arg3>
39931typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::product(const typed::pw_multi_aff<Domain2, Arg3> &pma2) const
39932{
39933  auto res = isl::pw_multi_aff::product(pma2);
39934  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
39935}
39936
39937template <typename Domain, typename Range, typename Range2>
39938template <typename Domain2, typename Arg3>
39939typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::product(const typed::multi_aff<Domain2, Arg3> &pma2) const
39940{
39941  auto res = isl::pw_multi_aff::product(pma2);
39942  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
39943}
39944
39945template <typename Domain, typename Range, typename Range2>
39946template <typename Domain2>
39947typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Anonymous>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::product(const typed::pw_aff<Domain2, Anonymous> &pma2) const
39948{
39949  auto res = isl::pw_multi_aff::product(pma2);
39950  return typed::pw_multi_aff<pair<Domain, Domain2>, pair<pair<Range, Range2>, Anonymous>>(res);
39951}
39952
39953template <typename Domain, typename Range, typename Range2>
39954template <typename Domain2>
39955typed::multi_pw_aff<Domain2, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_pw_aff<Domain2, Domain> &mpa2) const
39956{
39957  auto res = isl::pw_multi_aff::pullback(mpa2);
39958  return typed::multi_pw_aff<Domain2, pair<Range, Range2>>(res);
39959}
39960
39961template <typename Domain, typename Range, typename Range2>
39962typed::multi_pw_aff<pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_pw_aff<Domain> &mpa2) const
39963{
39964  auto res = isl::pw_multi_aff::pullback(mpa2);
39965  return typed::multi_pw_aff<pair<Range, Range2>>(res);
39966}
39967
39968template <typename Domain, typename Range, typename Range2>
39969template <typename Domain2>
39970typed::pw_multi_aff<Domain2, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_aff<Domain2, Domain> &ma) const
39971{
39972  auto res = isl::pw_multi_aff::pullback(ma);
39973  return typed::pw_multi_aff<Domain2, pair<Range, Range2>>(res);
39974}
39975
39976template <typename Domain, typename Range, typename Range2>
39977typed::pw_multi_aff<pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_aff<Domain> &ma) const
39978{
39979  auto res = isl::pw_multi_aff::pullback(ma);
39980  return typed::pw_multi_aff<pair<Range, Range2>>(res);
39981}
39982
39983template <typename Domain, typename Range, typename Range2>
39984template <typename Domain2>
39985typed::pw_multi_aff<Domain2, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<Domain2, Domain> &pma2) const
39986{
39987  auto res = isl::pw_multi_aff::pullback(pma2);
39988  return typed::pw_multi_aff<Domain2, pair<Range, Range2>>(res);
39989}
39990
39991template <typename Domain, typename Range, typename Range2>
39992typed::pw_multi_aff<pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<Domain> &pma2) const
39993{
39994  auto res = isl::pw_multi_aff::pullback(pma2);
39995  return typed::pw_multi_aff<pair<Range, Range2>>(res);
39996}
39997
39998template <typename Domain, typename Range, typename Range2>
39999template <typename Domain2>
40000typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const
40001{
40002  auto res = isl::pw_multi_aff::pullback(upma2);
40003  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
40004}
40005
40006template <typename Domain, typename Range, typename Range2>
40007typed::union_pw_multi_aff<pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<Domain> &upma2) const
40008{
40009  auto res = isl::pw_multi_aff::pullback(upma2);
40010  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
40011}
40012
40013template <typename Domain, typename Range, typename Range2>
40014typed::pw_multi_aff_list<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::pw_multi_aff_list() const
40015{
40016  auto res = isl::pw_multi_aff::pw_multi_aff_list();
40017  return typed::pw_multi_aff_list<Domain, pair<Range, Range2>>(res);
40018}
40019
40020template <typename Domain, typename Range, typename Range2>
40021typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff<Domain, pair<Range, Range2>>::range_factor_domain() const
40022{
40023  auto res = isl::pw_multi_aff::range_factor_domain();
40024  return typed::pw_multi_aff<Domain, Range>(res);
40025}
40026
40027template <typename Domain, typename Range, typename Range2>
40028typed::pw_multi_aff<Domain, Range2> typed::pw_multi_aff<Domain, pair<Range, Range2>>::range_factor_range() const
40029{
40030  auto res = isl::pw_multi_aff::range_factor_range();
40031  return typed::pw_multi_aff<Domain, Range2>(res);
40032}
40033
40034template <typename Domain, typename Range, typename Range2>
40035template <typename Arg3>
40036typed::multi_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::multi_pw_aff<Domain, Arg3> &multi2) const
40037{
40038  auto res = isl::pw_multi_aff::range_product(multi2);
40039  return typed::multi_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
40040}
40041
40042template <typename Domain, typename Range, typename Range2>
40043template <typename Arg3>
40044typed::multi_union_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::multi_union_pw_aff<Domain, Arg3> &multi2) const
40045{
40046  auto res = isl::pw_multi_aff::range_product(multi2);
40047  return typed::multi_union_pw_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
40048}
40049
40050template <typename Domain, typename Range, typename Range2>
40051template <typename Arg3>
40052typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::pw_multi_aff<Domain, Arg3> &pma2) const
40053{
40054  auto res = isl::pw_multi_aff::range_product(pma2);
40055  return typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
40056}
40057
40058template <typename Domain, typename Range, typename Range2>
40059template <typename Arg3>
40060typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::union_pw_multi_aff<Domain, Arg3> &upma2) const
40061{
40062  auto res = isl::pw_multi_aff::range_product(upma2);
40063  return typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
40064}
40065
40066template <typename Domain, typename Range, typename Range2>
40067template <typename Arg3>
40068typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::multi_aff<Domain, Arg3> &pma2) const
40069{
40070  auto res = isl::pw_multi_aff::range_product(pma2);
40071  return typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
40072}
40073
40074template <typename Domain, typename Range, typename Range2>
40075typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Anonymous>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::pw_aff<Domain, Anonymous> &pma2) const
40076{
40077  auto res = isl::pw_multi_aff::range_product(pma2);
40078  return typed::pw_multi_aff<Domain, pair<pair<Range, Range2>, Anonymous>>(res);
40079}
40080
40081template <typename Domain, typename Range, typename Range2>
40082typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::scale(const typed::multi_val<pair<Range, Range2>> &mv) const
40083{
40084  auto res = isl::pw_multi_aff::scale(mv);
40085  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40086}
40087
40088template <typename Domain, typename Range, typename Range2>
40089typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::scale(const typed::val<pair<Range, Range2>> &v) const
40090{
40091  auto res = isl::pw_multi_aff::scale(v);
40092  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40093}
40094
40095template <typename Domain, typename Range, typename Range2>
40096typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::scale(long v) const
40097{
40098  auto res = isl::pw_multi_aff::scale(v);
40099  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40100}
40101
40102template <typename Domain, typename Range, typename Range2>
40103typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::scale_down(const typed::multi_val<pair<Range, Range2>> &mv) const
40104{
40105  auto res = isl::pw_multi_aff::scale_down(mv);
40106  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40107}
40108
40109template <typename Domain, typename Range, typename Range2>
40110typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::scale_down(const typed::val<pair<Range, Range2>> &v) const
40111{
40112  auto res = isl::pw_multi_aff::scale_down(v);
40113  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40114}
40115
40116template <typename Domain, typename Range, typename Range2>
40117typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::scale_down(long v) const
40118{
40119  auto res = isl::pw_multi_aff::scale_down(v);
40120  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40121}
40122
40123template <typename Domain, typename Range, typename Range2>
40124typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::set_at(int pos, const typed::pw_aff<Domain, Anonymous> &el) const
40125{
40126  auto res = isl::pw_multi_aff::set_at(pos, el);
40127  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
40128}
40129
40130template <typename Domain, typename Range, typename Range2>
40131typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const
40132{
40133  auto res = isl::pw_multi_aff::set_at(pos, el);
40134  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
40135}
40136
40137template <typename Domain, typename Range, typename Range2>
40138typed::space<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::space() const
40139{
40140  auto res = isl::pw_multi_aff::space();
40141  return typed::space<Domain, pair<Range, Range2>>(res);
40142}
40143
40144template <typename Domain, typename Range, typename Range2>
40145typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &multi2) const
40146{
40147  auto res = isl::pw_multi_aff::sub(multi2);
40148  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
40149}
40150
40151template <typename Domain, typename Range, typename Range2>
40152typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &multi2) const
40153{
40154  auto res = isl::pw_multi_aff::sub(multi2);
40155  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
40156}
40157
40158template <typename Domain, typename Range, typename Range2>
40159typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const
40160{
40161  auto res = isl::pw_multi_aff::sub(pma2);
40162  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40163}
40164
40165template <typename Domain, typename Range, typename Range2>
40166typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
40167{
40168  auto res = isl::pw_multi_aff::sub(upma2);
40169  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
40170}
40171
40172template <typename Domain, typename Range, typename Range2>
40173typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::multi_aff<Domain, pair<Range, Range2>> &pma2) const
40174{
40175  auto res = isl::pw_multi_aff::sub(pma2);
40176  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40177}
40178
40179template <typename Domain, typename Range, typename Range2>
40180typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::pw_aff<Domain, pair<Range, Range2>> &pma2) const
40181{
40182  auto res = isl::pw_multi_aff::sub(pma2);
40183  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40184}
40185
40186template <typename Domain, typename Range, typename Range2>
40187typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::set<Domain> &set) const
40188{
40189  auto res = isl::pw_multi_aff::subtract_domain(set);
40190  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40191}
40192
40193template <typename Domain, typename Range, typename Range2>
40194typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::space<Domain> &space) const
40195{
40196  auto res = isl::pw_multi_aff::subtract_domain(space);
40197  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
40198}
40199
40200template <typename Domain, typename Range, typename Range2>
40201typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::union_set<Domain> &uset) const
40202{
40203  auto res = isl::pw_multi_aff::subtract_domain(uset);
40204  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
40205}
40206
40207template <typename Domain, typename Range, typename Range2>
40208typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::basic_set<Domain> &set) const
40209{
40210  auto res = isl::pw_multi_aff::subtract_domain(set);
40211  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40212}
40213
40214template <typename Domain, typename Range, typename Range2>
40215typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::point<Domain> &set) const
40216{
40217  auto res = isl::pw_multi_aff::subtract_domain(set);
40218  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40219}
40220
40221template <typename Domain, typename Range, typename Range2>
40222typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::to_multi_pw_aff() const
40223{
40224  auto res = isl::pw_multi_aff::to_multi_pw_aff();
40225  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
40226}
40227
40228template <typename Domain, typename Range, typename Range2>
40229typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::to_union_pw_multi_aff() const
40230{
40231  auto res = isl::pw_multi_aff::to_union_pw_multi_aff();
40232  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
40233}
40234
40235template <typename Domain, typename Range, typename Range2>
40236typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::multi_pw_aff<Domain, pair<Range, Range2>> &mpa2) const
40237{
40238  auto res = isl::pw_multi_aff::union_add(mpa2);
40239  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
40240}
40241
40242template <typename Domain, typename Range, typename Range2>
40243typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::multi_union_pw_aff<Domain, pair<Range, Range2>> &mupa2) const
40244{
40245  auto res = isl::pw_multi_aff::union_add(mupa2);
40246  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
40247}
40248
40249template <typename Domain, typename Range, typename Range2>
40250typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma2) const
40251{
40252  auto res = isl::pw_multi_aff::union_add(pma2);
40253  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40254}
40255
40256template <typename Domain, typename Range, typename Range2>
40257typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
40258{
40259  auto res = isl::pw_multi_aff::union_add(upma2);
40260  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
40261}
40262
40263template <typename Domain, typename Range, typename Range2>
40264typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::multi_aff<Domain, pair<Range, Range2>> &pma2) const
40265{
40266  auto res = isl::pw_multi_aff::union_add(pma2);
40267  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40268}
40269
40270template <typename Domain, typename Range, typename Range2>
40271typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::pw_aff<Domain, pair<Range, Range2>> &pma2) const
40272{
40273  auto res = isl::pw_multi_aff::union_add(pma2);
40274  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
40275}
40276
40277template <typename T1, typename T2, typename Range, typename Range2>
40278typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pw_multi_aff(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &ma)
40279  : isl::pw_multi_aff(ma)
40280{
40281}
40282
40283template <typename T1, typename T2, typename Range, typename Range2>
40284typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pw_multi_aff(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &pa)
40285  : isl::pw_multi_aff(pa)
40286{
40287}
40288
40289template <typename T1, typename T2, typename Range, typename Range2>
40290typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pw_multi_aff(const isl::ctx &ctx, const std::string &str)
40291  : isl::pw_multi_aff(ctx, str)
40292{
40293}
40294
40295template <typename T1, typename T2, typename Range, typename Range2>
40296typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
40297{
40298  auto res = isl::pw_multi_aff::add(multi2);
40299  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40300}
40301
40302template <typename T1, typename T2, typename Range, typename Range2>
40303typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
40304{
40305  auto res = isl::pw_multi_aff::add(multi2);
40306  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40307}
40308
40309template <typename T1, typename T2, typename Range, typename Range2>
40310typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
40311{
40312  auto res = isl::pw_multi_aff::add(pma2);
40313  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40314}
40315
40316template <typename T1, typename T2, typename Range, typename Range2>
40317typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
40318{
40319  auto res = isl::pw_multi_aff::add(upma2);
40320  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40321}
40322
40323template <typename T1, typename T2, typename Range, typename Range2>
40324typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
40325{
40326  auto res = isl::pw_multi_aff::add(pma2);
40327  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40328}
40329
40330template <typename T1, typename T2, typename Range, typename Range2>
40331typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
40332{
40333  auto res = isl::pw_multi_aff::add(pma2);
40334  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40335}
40336
40337template <typename T1, typename T2, typename Range, typename Range2>
40338typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add_constant(const typed::multi_val<pair<Range, Range2>> &mv) const
40339{
40340  auto res = isl::pw_multi_aff::add_constant(mv);
40341  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40342}
40343
40344template <typename T1, typename T2, typename Range, typename Range2>
40345typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add_constant(const typed::val<pair<Range, Range2>> &v) const
40346{
40347  auto res = isl::pw_multi_aff::add_constant(v);
40348  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40349}
40350
40351template <typename T1, typename T2, typename Range, typename Range2>
40352typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add_constant(long v) const
40353{
40354  auto res = isl::pw_multi_aff::add_constant(v);
40355  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40356}
40357
40358template <typename T1, typename T2, typename Range, typename Range2>
40359template <typename Arg2>
40360typed::union_pw_multi_aff<pair<T1, T2>, Arg2> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg2> &upma2) const
40361{
40362  auto res = isl::pw_multi_aff::apply(upma2);
40363  return typed::union_pw_multi_aff<pair<T1, T2>, Arg2>(res);
40364}
40365
40366template <typename T1, typename T2, typename Range, typename Range2>
40367typed::map<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_map() const
40368{
40369  auto res = isl::pw_multi_aff::as_map();
40370  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
40371}
40372
40373template <typename T1, typename T2, typename Range, typename Range2>
40374typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_multi_aff() const
40375{
40376  auto res = isl::pw_multi_aff::as_multi_aff();
40377  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40378}
40379
40380template <typename T1, typename T2, typename Range, typename Range2>
40381typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_multi_union_pw_aff() const
40382{
40383  auto res = isl::pw_multi_aff::as_multi_union_pw_aff();
40384  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40385}
40386
40387template <typename T1, typename T2, typename Range, typename Range2>
40388typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_pw_multi_aff() const
40389{
40390  auto res = isl::pw_multi_aff::as_pw_multi_aff();
40391  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40392}
40393
40394template <typename T1, typename T2, typename Range, typename Range2>
40395typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_union_map() const
40396{
40397  auto res = isl::pw_multi_aff::as_union_map();
40398  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
40399}
40400
40401template <typename T1, typename T2, typename Range, typename Range2>
40402typed::pw_aff<pair<T1, T2>, Anonymous> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::at(int pos) const
40403{
40404  auto res = isl::pw_multi_aff::at(pos);
40405  return typed::pw_aff<pair<T1, T2>, Anonymous>(res);
40406}
40407
40408template <typename T1, typename T2, typename Range, typename Range2>
40409typed::set<pair<T1, T2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::bind(const typed::multi_id<pair<Range, Range2>> &tuple) const
40410{
40411  auto res = isl::pw_multi_aff::bind(tuple);
40412  return typed::set<pair<T1, T2>>(res);
40413}
40414
40415template <typename T1, typename T2, typename Range, typename Range2>
40416typed::pw_multi_aff<pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::bind_domain(const typed::multi_id<pair<T1, T2>> &tuple) const
40417{
40418  auto res = isl::pw_multi_aff::bind_domain(tuple);
40419  return typed::pw_multi_aff<pair<Range, Range2>>(res);
40420}
40421
40422template <typename T1, typename T2, typename Range, typename Range2>
40423typed::pw_multi_aff<T2, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::bind_domain_wrapped_domain(const typed::multi_id<T1> &tuple) const
40424{
40425  auto res = isl::pw_multi_aff::bind_domain_wrapped_domain(tuple);
40426  return typed::pw_multi_aff<T2, pair<Range, Range2>>(res);
40427}
40428
40429template <typename T1, typename T2, typename Range, typename Range2>
40430typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::coalesce() const
40431{
40432  auto res = isl::pw_multi_aff::coalesce();
40433  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40434}
40435
40436template <typename T1, typename T2, typename Range, typename Range2>
40437typed::set<pair<T1, T2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::domain() const
40438{
40439  auto res = isl::pw_multi_aff::domain();
40440  return typed::set<pair<T1, T2>>(res);
40441}
40442
40443template <typename T1, typename T2, typename Range, typename Range2>
40444typed::pw_multi_aff<pair<T2, T1>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::domain_reverse() const
40445{
40446  auto res = isl::pw_multi_aff::domain_reverse();
40447  return typed::pw_multi_aff<pair<T2, T1>, pair<Range, Range2>>(res);
40448}
40449
40450template <typename T1, typename T2, typename Range, typename Range2>
40451typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::drop_unused_params() const
40452{
40453  auto res = isl::pw_multi_aff::drop_unused_params();
40454  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40455}
40456
40457template <typename T1, typename T2, typename Range, typename Range2>
40458typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::extract_pw_multi_aff(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const
40459{
40460  auto res = isl::pw_multi_aff::extract_pw_multi_aff(space);
40461  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40462}
40463
40464template <typename T1, typename T2, typename Range, typename Range2>
40465typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::set<pair<T1, T2>> &set) const
40466{
40467  auto res = isl::pw_multi_aff::gist(set);
40468  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40469}
40470
40471template <typename T1, typename T2, typename Range, typename Range2>
40472typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::union_set<pair<T1, T2>> &context) const
40473{
40474  auto res = isl::pw_multi_aff::gist(context);
40475  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40476}
40477
40478template <typename T1, typename T2, typename Range, typename Range2>
40479typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::basic_set<pair<T1, T2>> &set) const
40480{
40481  auto res = isl::pw_multi_aff::gist(set);
40482  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40483}
40484
40485template <typename T1, typename T2, typename Range, typename Range2>
40486typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::point<pair<T1, T2>> &set) const
40487{
40488  auto res = isl::pw_multi_aff::gist(set);
40489  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40490}
40491
40492template <typename T1, typename T2, typename Range, typename Range2>
40493typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::set<> &set) const
40494{
40495  auto res = isl::pw_multi_aff::gist_params(set);
40496  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40497}
40498
40499template <typename T1, typename T2, typename Range, typename Range2>
40500typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::basic_set<> &set) const
40501{
40502  auto res = isl::pw_multi_aff::gist_params(set);
40503  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40504}
40505
40506template <typename T1, typename T2, typename Range, typename Range2>
40507typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::point<> &set) const
40508{
40509  auto res = isl::pw_multi_aff::gist_params(set);
40510  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40511}
40512
40513template <typename T1, typename T2, typename Range, typename Range2>
40514typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::identity() const
40515{
40516  auto res = isl::pw_multi_aff::identity();
40517  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40518}
40519
40520template <typename T1, typename T2, typename Range, typename Range2>
40521typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::set<pair<T1, T2>> &set) const
40522{
40523  auto res = isl::pw_multi_aff::intersect_domain(set);
40524  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40525}
40526
40527template <typename T1, typename T2, typename Range, typename Range2>
40528typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::space<pair<T1, T2>> &space) const
40529{
40530  auto res = isl::pw_multi_aff::intersect_domain(space);
40531  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40532}
40533
40534template <typename T1, typename T2, typename Range, typename Range2>
40535typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const
40536{
40537  auto res = isl::pw_multi_aff::intersect_domain(uset);
40538  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40539}
40540
40541template <typename T1, typename T2, typename Range, typename Range2>
40542typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::basic_set<pair<T1, T2>> &set) const
40543{
40544  auto res = isl::pw_multi_aff::intersect_domain(set);
40545  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40546}
40547
40548template <typename T1, typename T2, typename Range, typename Range2>
40549typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::point<pair<T1, T2>> &set) const
40550{
40551  auto res = isl::pw_multi_aff::intersect_domain(set);
40552  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40553}
40554
40555template <typename T1, typename T2, typename Range, typename Range2>
40556typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::union_set<T1> &uset) const
40557{
40558  auto res = isl::pw_multi_aff::intersect_domain_wrapped_domain(uset);
40559  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40560}
40561
40562template <typename T1, typename T2, typename Range, typename Range2>
40563typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::set<> &set) const
40564{
40565  auto res = isl::pw_multi_aff::intersect_params(set);
40566  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40567}
40568
40569template <typename T1, typename T2, typename Range, typename Range2>
40570typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::basic_set<> &set) const
40571{
40572  auto res = isl::pw_multi_aff::intersect_params(set);
40573  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40574}
40575
40576template <typename T1, typename T2, typename Range, typename Range2>
40577typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::point<> &set) const
40578{
40579  auto res = isl::pw_multi_aff::intersect_params(set);
40580  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40581}
40582
40583template <typename T1, typename T2, typename Range, typename Range2>
40584typed::pw_aff_list<pair<T1, T2>, Anonymous> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::list() const
40585{
40586  auto res = isl::pw_multi_aff::list();
40587  return typed::pw_aff_list<pair<T1, T2>, Anonymous>(res);
40588}
40589
40590template <typename T1, typename T2, typename Range, typename Range2>
40591typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::max(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
40592{
40593  auto res = isl::pw_multi_aff::max(multi2);
40594  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40595}
40596
40597template <typename T1, typename T2, typename Range, typename Range2>
40598typed::multi_val<pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::max_multi_val() const
40599{
40600  auto res = isl::pw_multi_aff::max_multi_val();
40601  return typed::multi_val<pair<Range, Range2>>(res);
40602}
40603
40604template <typename T1, typename T2, typename Range, typename Range2>
40605typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::min(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
40606{
40607  auto res = isl::pw_multi_aff::min(multi2);
40608  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40609}
40610
40611template <typename T1, typename T2, typename Range, typename Range2>
40612typed::multi_val<pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::min_multi_val() const
40613{
40614  auto res = isl::pw_multi_aff::min_multi_val();
40615  return typed::multi_val<pair<Range, Range2>>(res);
40616}
40617
40618template <typename T1, typename T2, typename Range, typename Range2>
40619typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::neg() const
40620{
40621  auto res = isl::pw_multi_aff::neg();
40622  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40623}
40624
40625template <typename T1, typename T2, typename Range, typename Range2>
40626template <typename Domain3>
40627typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, T1> &pma2) const
40628{
40629  auto res = isl::pw_multi_aff::preimage_domain_wrapped_domain(pma2);
40630  return typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
40631}
40632
40633template <typename T1, typename T2, typename Range, typename Range2>
40634template <typename Domain3>
40635typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, T1> &upma2) const
40636{
40637  auto res = isl::pw_multi_aff::preimage_domain_wrapped_domain(upma2);
40638  return typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
40639}
40640
40641template <typename T1, typename T2, typename Range, typename Range2>
40642template <typename Domain3>
40643typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::multi_aff<Domain3, T1> &pma2) const
40644{
40645  auto res = isl::pw_multi_aff::preimage_domain_wrapped_domain(pma2);
40646  return typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
40647}
40648
40649template <typename T1, typename T2, typename Range, typename Range2>
40650template <typename Domain3>
40651typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::pw_aff<Domain3, T1> &pma2) const
40652{
40653  auto res = isl::pw_multi_aff::preimage_domain_wrapped_domain(pma2);
40654  return typed::pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
40655}
40656
40657template <typename T1, typename T2, typename Range, typename Range2>
40658template <typename Domain2, typename Arg2>
40659typed::multi_pw_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::product(const typed::multi_pw_aff<Domain2, Arg2> &multi2) const
40660{
40661  auto res = isl::pw_multi_aff::product(multi2);
40662  return typed::multi_pw_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
40663}
40664
40665template <typename T1, typename T2, typename Range, typename Range2>
40666template <typename Domain2, typename Arg2>
40667typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::product(const typed::pw_multi_aff<Domain2, Arg2> &pma2) const
40668{
40669  auto res = isl::pw_multi_aff::product(pma2);
40670  return typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
40671}
40672
40673template <typename T1, typename T2, typename Range, typename Range2>
40674template <typename Domain2, typename Arg2>
40675typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::product(const typed::multi_aff<Domain2, Arg2> &pma2) const
40676{
40677  auto res = isl::pw_multi_aff::product(pma2);
40678  return typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
40679}
40680
40681template <typename T1, typename T2, typename Range, typename Range2>
40682template <typename Domain2>
40683typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Anonymous>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::product(const typed::pw_aff<Domain2, Anonymous> &pma2) const
40684{
40685  auto res = isl::pw_multi_aff::product(pma2);
40686  return typed::pw_multi_aff<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Anonymous>>(res);
40687}
40688
40689template <typename T1, typename T2, typename Range, typename Range2>
40690template <typename Domain2>
40691typed::multi_pw_aff<Domain2, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa2) const
40692{
40693  auto res = isl::pw_multi_aff::pullback(mpa2);
40694  return typed::multi_pw_aff<Domain2, pair<Range, Range2>>(res);
40695}
40696
40697template <typename T1, typename T2, typename Range, typename Range2>
40698typed::multi_pw_aff<pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_pw_aff<pair<T1, T2>> &mpa2) const
40699{
40700  auto res = isl::pw_multi_aff::pullback(mpa2);
40701  return typed::multi_pw_aff<pair<Range, Range2>>(res);
40702}
40703
40704template <typename T1, typename T2, typename Range, typename Range2>
40705template <typename Domain2>
40706typed::pw_multi_aff<Domain2, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const
40707{
40708  auto res = isl::pw_multi_aff::pullback(ma);
40709  return typed::pw_multi_aff<Domain2, pair<Range, Range2>>(res);
40710}
40711
40712template <typename T1, typename T2, typename Range, typename Range2>
40713typed::pw_multi_aff<pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_aff<pair<T1, T2>> &ma) const
40714{
40715  auto res = isl::pw_multi_aff::pullback(ma);
40716  return typed::pw_multi_aff<pair<Range, Range2>>(res);
40717}
40718
40719template <typename T1, typename T2, typename Range, typename Range2>
40720template <typename Domain2>
40721typed::pw_multi_aff<Domain2, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma2) const
40722{
40723  auto res = isl::pw_multi_aff::pullback(pma2);
40724  return typed::pw_multi_aff<Domain2, pair<Range, Range2>>(res);
40725}
40726
40727template <typename T1, typename T2, typename Range, typename Range2>
40728typed::pw_multi_aff<pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<pair<T1, T2>> &pma2) const
40729{
40730  auto res = isl::pw_multi_aff::pullback(pma2);
40731  return typed::pw_multi_aff<pair<Range, Range2>>(res);
40732}
40733
40734template <typename T1, typename T2, typename Range, typename Range2>
40735template <typename Domain2>
40736typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma2) const
40737{
40738  auto res = isl::pw_multi_aff::pullback(upma2);
40739  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
40740}
40741
40742template <typename T1, typename T2, typename Range, typename Range2>
40743typed::union_pw_multi_aff<pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<pair<T1, T2>> &upma2) const
40744{
40745  auto res = isl::pw_multi_aff::pullback(upma2);
40746  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
40747}
40748
40749template <typename T1, typename T2, typename Range, typename Range2>
40750typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pw_multi_aff_list() const
40751{
40752  auto res = isl::pw_multi_aff::pw_multi_aff_list();
40753  return typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>>(res);
40754}
40755
40756template <typename T1, typename T2, typename Range, typename Range2>
40757typed::pw_multi_aff<pair<T1, T2>, Range> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_factor_domain() const
40758{
40759  auto res = isl::pw_multi_aff::range_factor_domain();
40760  return typed::pw_multi_aff<pair<T1, T2>, Range>(res);
40761}
40762
40763template <typename T1, typename T2, typename Range, typename Range2>
40764typed::pw_multi_aff<pair<T1, T2>, Range2> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_factor_range() const
40765{
40766  auto res = isl::pw_multi_aff::range_factor_range();
40767  return typed::pw_multi_aff<pair<T1, T2>, Range2>(res);
40768}
40769
40770template <typename T1, typename T2, typename Range, typename Range2>
40771template <typename Arg2>
40772typed::multi_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::multi_pw_aff<pair<T1, T2>, Arg2> &multi2) const
40773{
40774  auto res = isl::pw_multi_aff::range_product(multi2);
40775  return typed::multi_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
40776}
40777
40778template <typename T1, typename T2, typename Range, typename Range2>
40779template <typename Arg2>
40780typed::multi_union_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::multi_union_pw_aff<pair<T1, T2>, Arg2> &multi2) const
40781{
40782  auto res = isl::pw_multi_aff::range_product(multi2);
40783  return typed::multi_union_pw_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
40784}
40785
40786template <typename T1, typename T2, typename Range, typename Range2>
40787template <typename Arg2>
40788typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::pw_multi_aff<pair<T1, T2>, Arg2> &pma2) const
40789{
40790  auto res = isl::pw_multi_aff::range_product(pma2);
40791  return typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
40792}
40793
40794template <typename T1, typename T2, typename Range, typename Range2>
40795template <typename Arg2>
40796typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::union_pw_multi_aff<pair<T1, T2>, Arg2> &upma2) const
40797{
40798  auto res = isl::pw_multi_aff::range_product(upma2);
40799  return typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
40800}
40801
40802template <typename T1, typename T2, typename Range, typename Range2>
40803template <typename Arg2>
40804typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::multi_aff<pair<T1, T2>, Arg2> &pma2) const
40805{
40806  auto res = isl::pw_multi_aff::range_product(pma2);
40807  return typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
40808}
40809
40810template <typename T1, typename T2, typename Range, typename Range2>
40811typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Anonymous>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::pw_aff<pair<T1, T2>, Anonymous> &pma2) const
40812{
40813  auto res = isl::pw_multi_aff::range_product(pma2);
40814  return typed::pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Anonymous>>(res);
40815}
40816
40817template <typename T1, typename T2, typename Range, typename Range2>
40818typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale(const typed::multi_val<pair<Range, Range2>> &mv) const
40819{
40820  auto res = isl::pw_multi_aff::scale(mv);
40821  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40822}
40823
40824template <typename T1, typename T2, typename Range, typename Range2>
40825typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale(const typed::val<pair<Range, Range2>> &v) const
40826{
40827  auto res = isl::pw_multi_aff::scale(v);
40828  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40829}
40830
40831template <typename T1, typename T2, typename Range, typename Range2>
40832typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale(long v) const
40833{
40834  auto res = isl::pw_multi_aff::scale(v);
40835  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40836}
40837
40838template <typename T1, typename T2, typename Range, typename Range2>
40839typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale_down(const typed::multi_val<pair<Range, Range2>> &mv) const
40840{
40841  auto res = isl::pw_multi_aff::scale_down(mv);
40842  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40843}
40844
40845template <typename T1, typename T2, typename Range, typename Range2>
40846typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale_down(const typed::val<pair<Range, Range2>> &v) const
40847{
40848  auto res = isl::pw_multi_aff::scale_down(v);
40849  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40850}
40851
40852template <typename T1, typename T2, typename Range, typename Range2>
40853typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::scale_down(long v) const
40854{
40855  auto res = isl::pw_multi_aff::scale_down(v);
40856  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40857}
40858
40859template <typename T1, typename T2, typename Range, typename Range2>
40860typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::set_at(int pos, const typed::pw_aff<pair<T1, T2>, Anonymous> &el) const
40861{
40862  auto res = isl::pw_multi_aff::set_at(pos, el);
40863  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40864}
40865
40866template <typename T1, typename T2, typename Range, typename Range2>
40867typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::set_at(int pos, const typed::union_pw_aff<pair<T1, T2>, Anonymous> &el) const
40868{
40869  auto res = isl::pw_multi_aff::set_at(pos, el);
40870  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40871}
40872
40873template <typename T1, typename T2, typename Range, typename Range2>
40874typed::space<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::space() const
40875{
40876  auto res = isl::pw_multi_aff::space();
40877  return typed::space<pair<T1, T2>, pair<Range, Range2>>(res);
40878}
40879
40880template <typename T1, typename T2, typename Range, typename Range2>
40881typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
40882{
40883  auto res = isl::pw_multi_aff::sub(multi2);
40884  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40885}
40886
40887template <typename T1, typename T2, typename Range, typename Range2>
40888typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &multi2) const
40889{
40890  auto res = isl::pw_multi_aff::sub(multi2);
40891  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40892}
40893
40894template <typename T1, typename T2, typename Range, typename Range2>
40895typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
40896{
40897  auto res = isl::pw_multi_aff::sub(pma2);
40898  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40899}
40900
40901template <typename T1, typename T2, typename Range, typename Range2>
40902typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
40903{
40904  auto res = isl::pw_multi_aff::sub(upma2);
40905  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40906}
40907
40908template <typename T1, typename T2, typename Range, typename Range2>
40909typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
40910{
40911  auto res = isl::pw_multi_aff::sub(pma2);
40912  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40913}
40914
40915template <typename T1, typename T2, typename Range, typename Range2>
40916typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
40917{
40918  auto res = isl::pw_multi_aff::sub(pma2);
40919  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40920}
40921
40922template <typename T1, typename T2, typename Range, typename Range2>
40923typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::set<pair<T1, T2>> &set) const
40924{
40925  auto res = isl::pw_multi_aff::subtract_domain(set);
40926  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40927}
40928
40929template <typename T1, typename T2, typename Range, typename Range2>
40930typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::space<pair<T1, T2>> &space) const
40931{
40932  auto res = isl::pw_multi_aff::subtract_domain(space);
40933  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40934}
40935
40936template <typename T1, typename T2, typename Range, typename Range2>
40937typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::union_set<pair<T1, T2>> &uset) const
40938{
40939  auto res = isl::pw_multi_aff::subtract_domain(uset);
40940  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40941}
40942
40943template <typename T1, typename T2, typename Range, typename Range2>
40944typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::basic_set<pair<T1, T2>> &set) const
40945{
40946  auto res = isl::pw_multi_aff::subtract_domain(set);
40947  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40948}
40949
40950template <typename T1, typename T2, typename Range, typename Range2>
40951typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::point<pair<T1, T2>> &set) const
40952{
40953  auto res = isl::pw_multi_aff::subtract_domain(set);
40954  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40955}
40956
40957template <typename T1, typename T2, typename Range, typename Range2>
40958typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::to_multi_pw_aff() const
40959{
40960  auto res = isl::pw_multi_aff::to_multi_pw_aff();
40961  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40962}
40963
40964template <typename T1, typename T2, typename Range, typename Range2>
40965typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::to_union_pw_multi_aff() const
40966{
40967  auto res = isl::pw_multi_aff::to_union_pw_multi_aff();
40968  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40969}
40970
40971template <typename T1, typename T2, typename Range, typename Range2>
40972typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> &mpa2) const
40973{
40974  auto res = isl::pw_multi_aff::union_add(mpa2);
40975  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40976}
40977
40978template <typename T1, typename T2, typename Range, typename Range2>
40979typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &mupa2) const
40980{
40981  auto res = isl::pw_multi_aff::union_add(mupa2);
40982  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40983}
40984
40985template <typename T1, typename T2, typename Range, typename Range2>
40986typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
40987{
40988  auto res = isl::pw_multi_aff::union_add(pma2);
40989  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40990}
40991
40992template <typename T1, typename T2, typename Range, typename Range2>
40993typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
40994{
40995  auto res = isl::pw_multi_aff::union_add(upma2);
40996  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
40997}
40998
40999template <typename T1, typename T2, typename Range, typename Range2>
41000typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
41001{
41002  auto res = isl::pw_multi_aff::union_add(pma2);
41003  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
41004}
41005
41006template <typename T1, typename T2, typename Range, typename Range2>
41007typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::pw_aff<pair<T1, T2>, pair<Range, Range2>> &pma2) const
41008{
41009  auto res = isl::pw_multi_aff::union_add(pma2);
41010  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
41011}
41012
41013template <typename Domain>
41014typed::pw_multi_aff_list<Domain>::pw_multi_aff_list(const isl::ctx &ctx, int n)
41015  : isl::pw_multi_aff_list(ctx, n)
41016{
41017}
41018
41019template <typename Domain>
41020typed::pw_multi_aff_list<Domain>::pw_multi_aff_list(const typed::pw_multi_aff<Domain> &el)
41021  : isl::pw_multi_aff_list(el)
41022{
41023}
41024
41025template <typename Domain>
41026typed::pw_multi_aff_list<Domain>::pw_multi_aff_list(const isl::ctx &ctx, const std::string &str)
41027  : isl::pw_multi_aff_list(ctx, str)
41028{
41029}
41030
41031template <typename Domain>
41032typed::pw_multi_aff_list<Domain> typed::pw_multi_aff_list<Domain>::add(const typed::pw_multi_aff<Domain> &el) const
41033{
41034  auto res = isl::pw_multi_aff_list::add(el);
41035  return typed::pw_multi_aff_list<Domain>(res);
41036}
41037
41038template <typename Domain>
41039typed::pw_multi_aff_list<Domain> typed::pw_multi_aff_list<Domain>::add(const typed::multi_aff<Domain> &el) const
41040{
41041  auto res = isl::pw_multi_aff_list::add(el);
41042  return typed::pw_multi_aff_list<Domain>(res);
41043}
41044
41045template <typename Domain>
41046typed::pw_multi_aff_list<Domain> typed::pw_multi_aff_list<Domain>::add(const typed::pw_aff<Domain> &el) const
41047{
41048  auto res = isl::pw_multi_aff_list::add(el);
41049  return typed::pw_multi_aff_list<Domain>(res);
41050}
41051
41052template <typename Domain>
41053typed::pw_multi_aff<Domain> typed::pw_multi_aff_list<Domain>::at(int index) const
41054{
41055  auto res = isl::pw_multi_aff_list::at(index);
41056  return typed::pw_multi_aff<Domain>(res);
41057}
41058
41059template <typename Domain>
41060typed::pw_multi_aff_list<Domain> typed::pw_multi_aff_list<Domain>::drop(unsigned int first, unsigned int n) const
41061{
41062  auto res = isl::pw_multi_aff_list::drop(first, n);
41063  return typed::pw_multi_aff_list<Domain>(res);
41064}
41065
41066template <typename Domain>
41067void typed::pw_multi_aff_list<Domain>::foreach(const std::function<void(typed::pw_multi_aff<Domain>)> &fn) const
41068{
41069  auto lambda_fn = [&] (isl::pw_multi_aff arg0) {
41070    return fn(typed::pw_multi_aff<Domain>(arg0));
41071  };
41072  return isl::pw_multi_aff_list::foreach(lambda_fn);
41073}
41074
41075template <typename Domain>
41076void typed::pw_multi_aff_list<Domain>::foreach_scc(const std::function<bool(typed::pw_multi_aff<Domain>, typed::pw_multi_aff<Domain>)> &follows, const std::function<void(typed::pw_multi_aff_list<Domain>)> &fn) const
41077{
41078  auto lambda_follows = [&] (isl::pw_multi_aff arg0, isl::pw_multi_aff arg1) {
41079    return follows(typed::pw_multi_aff<Domain>(arg0), typed::pw_multi_aff<Domain>(arg1));
41080  };
41081  auto lambda_fn = [&] (isl::pw_multi_aff_list arg0) {
41082    return fn(typed::pw_multi_aff_list<Domain>(arg0));
41083  };
41084  return isl::pw_multi_aff_list::foreach_scc(lambda_follows, lambda_fn);
41085}
41086
41087template <typename Domain>
41088typed::pw_multi_aff_list<Domain> typed::pw_multi_aff_list<Domain>::set_at(int index, const typed::pw_multi_aff<Anonymous> &el) const
41089{
41090  auto res = isl::pw_multi_aff_list::set_at(index, el);
41091  return typed::pw_multi_aff_list<Domain>(res);
41092}
41093
41094template <typename Domain, typename Range>
41095typed::pw_multi_aff_list<Domain, Range>::pw_multi_aff_list(const isl::ctx &ctx, int n)
41096  : isl::pw_multi_aff_list(ctx, n)
41097{
41098}
41099
41100template <typename Domain, typename Range>
41101typed::pw_multi_aff_list<Domain, Range>::pw_multi_aff_list(const typed::pw_multi_aff<Domain, Range> &el)
41102  : isl::pw_multi_aff_list(el)
41103{
41104}
41105
41106template <typename Domain, typename Range>
41107typed::pw_multi_aff_list<Domain, Range>::pw_multi_aff_list(const isl::ctx &ctx, const std::string &str)
41108  : isl::pw_multi_aff_list(ctx, str)
41109{
41110}
41111
41112template <typename Domain, typename Range>
41113typed::pw_multi_aff_list<Domain, Range> typed::pw_multi_aff_list<Domain, Range>::add(const typed::pw_multi_aff<Domain, Range> &el) const
41114{
41115  auto res = isl::pw_multi_aff_list::add(el);
41116  return typed::pw_multi_aff_list<Domain, Range>(res);
41117}
41118
41119template <typename Domain, typename Range>
41120typed::pw_multi_aff_list<Domain, Range> typed::pw_multi_aff_list<Domain, Range>::add(const typed::multi_aff<Domain, Range> &el) const
41121{
41122  auto res = isl::pw_multi_aff_list::add(el);
41123  return typed::pw_multi_aff_list<Domain, Range>(res);
41124}
41125
41126template <typename Domain, typename Range>
41127typed::pw_multi_aff_list<Domain, Range> typed::pw_multi_aff_list<Domain, Range>::add(const typed::pw_aff<Domain, Range> &el) const
41128{
41129  auto res = isl::pw_multi_aff_list::add(el);
41130  return typed::pw_multi_aff_list<Domain, Range>(res);
41131}
41132
41133template <typename Domain, typename Range>
41134typed::pw_multi_aff<Domain, Range> typed::pw_multi_aff_list<Domain, Range>::at(int index) const
41135{
41136  auto res = isl::pw_multi_aff_list::at(index);
41137  return typed::pw_multi_aff<Domain, Range>(res);
41138}
41139
41140template <typename Domain, typename Range>
41141typed::pw_multi_aff_list<Domain, Range> typed::pw_multi_aff_list<Domain, Range>::drop(unsigned int first, unsigned int n) const
41142{
41143  auto res = isl::pw_multi_aff_list::drop(first, n);
41144  return typed::pw_multi_aff_list<Domain, Range>(res);
41145}
41146
41147template <typename Domain, typename Range>
41148void typed::pw_multi_aff_list<Domain, Range>::foreach(const std::function<void(typed::pw_multi_aff<Domain, Range>)> &fn) const
41149{
41150  auto lambda_fn = [&] (isl::pw_multi_aff arg0) {
41151    return fn(typed::pw_multi_aff<Domain, Range>(arg0));
41152  };
41153  return isl::pw_multi_aff_list::foreach(lambda_fn);
41154}
41155
41156template <typename Domain, typename Range>
41157void typed::pw_multi_aff_list<Domain, Range>::foreach_scc(const std::function<bool(typed::pw_multi_aff<Domain, Range>, typed::pw_multi_aff<Domain, Range>)> &follows, const std::function<void(typed::pw_multi_aff_list<Domain, Range>)> &fn) const
41158{
41159  auto lambda_follows = [&] (isl::pw_multi_aff arg0, isl::pw_multi_aff arg1) {
41160    return follows(typed::pw_multi_aff<Domain, Range>(arg0), typed::pw_multi_aff<Domain, Range>(arg1));
41161  };
41162  auto lambda_fn = [&] (isl::pw_multi_aff_list arg0) {
41163    return fn(typed::pw_multi_aff_list<Domain, Range>(arg0));
41164  };
41165  return isl::pw_multi_aff_list::foreach_scc(lambda_follows, lambda_fn);
41166}
41167
41168template <typename Domain, typename Range>
41169typed::pw_multi_aff_list<Domain, Range> typed::pw_multi_aff_list<Domain, Range>::set_at(int index, const typed::pw_multi_aff<Domain, Anonymous> &el) const
41170{
41171  auto res = isl::pw_multi_aff_list::set_at(index, el);
41172  return typed::pw_multi_aff_list<Domain, Range>(res);
41173}
41174
41175typed::set<>::set(const typed::basic_set<> &bset)
41176  : isl::set(bset)
41177{
41178}
41179
41180typed::set<>::set(const typed::point<> &pnt)
41181  : isl::set(pnt)
41182{
41183}
41184
41185typed::set<>::set(const isl::ctx &ctx, const std::string &str)
41186  : isl::set(ctx, str)
41187{
41188}
41189
41190typed::set<> typed::set<>::coalesce() const
41191{
41192  auto res = isl::set::coalesce();
41193  return typed::set<>(res);
41194}
41195
41196typed::set<> typed::set<>::detect_equalities() const
41197{
41198  auto res = isl::set::detect_equalities();
41199  return typed::set<>(res);
41200}
41201
41202typed::set<> typed::set<>::drop_unused_params() const
41203{
41204  auto res = isl::set::drop_unused_params();
41205  return typed::set<>(res);
41206}
41207
41208bool typed::set<>::every_set(const std::function<bool(typed::set<>)> &test) const
41209{
41210  auto lambda_test = [&] (isl::set arg0) {
41211    return test(typed::set<>(arg0));
41212  };
41213  return isl::set::every_set(lambda_test);
41214}
41215
41216typed::set<> typed::set<>::extract_set(const typed::space<> &space) const
41217{
41218  auto res = isl::set::extract_set(space);
41219  return typed::set<>(res);
41220}
41221
41222void typed::set<>::foreach_basic_set(const std::function<void(typed::basic_set<>)> &fn) const
41223{
41224  auto lambda_fn = [&] (isl::basic_set arg0) {
41225    return fn(typed::basic_set<>(arg0));
41226  };
41227  return isl::set::foreach_basic_set(lambda_fn);
41228}
41229
41230void typed::set<>::foreach_point(const std::function<void(typed::point<>)> &fn) const
41231{
41232  auto lambda_fn = [&] (isl::point arg0) {
41233    return fn(typed::point<>(arg0));
41234  };
41235  return isl::set::foreach_point(lambda_fn);
41236}
41237
41238void typed::set<>::foreach_set(const std::function<void(typed::set<>)> &fn) const
41239{
41240  auto lambda_fn = [&] (isl::set arg0) {
41241    return fn(typed::set<>(arg0));
41242  };
41243  return isl::set::foreach_set(lambda_fn);
41244}
41245
41246typed::set<> typed::set<>::gist(const typed::set<> &context) const
41247{
41248  auto res = isl::set::gist(context);
41249  return typed::set<>(res);
41250}
41251
41252typed::union_set<> typed::set<>::gist(const typed::union_set<> &context) const
41253{
41254  auto res = isl::set::gist(context);
41255  return typed::union_set<>(res);
41256}
41257
41258typed::set<> typed::set<>::gist(const typed::basic_set<> &context) const
41259{
41260  auto res = isl::set::gist(context);
41261  return typed::set<>(res);
41262}
41263
41264typed::set<> typed::set<>::gist(const typed::point<> &context) const
41265{
41266  auto res = isl::set::gist(context);
41267  return typed::set<>(res);
41268}
41269
41270typed::pw_aff<Anonymous> typed::set<>::indicator_function() const
41271{
41272  auto res = isl::set::indicator_function();
41273  return typed::pw_aff<Anonymous>(res);
41274}
41275
41276typed::set<> typed::set<>::intersect(const typed::set<> &set2) const
41277{
41278  auto res = isl::set::intersect(set2);
41279  return typed::set<>(res);
41280}
41281
41282typed::union_set<> typed::set<>::intersect(const typed::union_set<> &uset2) const
41283{
41284  auto res = isl::set::intersect(uset2);
41285  return typed::union_set<>(res);
41286}
41287
41288typed::set<> typed::set<>::intersect(const typed::basic_set<> &set2) const
41289{
41290  auto res = isl::set::intersect(set2);
41291  return typed::set<>(res);
41292}
41293
41294typed::set<> typed::set<>::intersect(const typed::point<> &set2) const
41295{
41296  auto res = isl::set::intersect(set2);
41297  return typed::set<>(res);
41298}
41299
41300typed::pw_aff<Anonymous> typed::set<>::param_pw_aff_on_domain(const typed::id<Anonymous> &id) const
41301{
41302  auto res = isl::set::param_pw_aff_on_domain(id);
41303  return typed::pw_aff<Anonymous>(res);
41304}
41305
41306typed::pw_aff<Anonymous> typed::set<>::param_pw_aff_on_domain(const std::string &id) const
41307{
41308  auto res = isl::set::param_pw_aff_on_domain(id);
41309  return typed::pw_aff<Anonymous>(res);
41310}
41311
41312typed::set<> typed::set<>::project_out_all_params() const
41313{
41314  auto res = isl::set::project_out_all_params();
41315  return typed::set<>(res);
41316}
41317
41318typed::set<> typed::set<>::project_out_param(const typed::id<Anonymous> &id) const
41319{
41320  auto res = isl::set::project_out_param(id);
41321  return typed::set<>(res);
41322}
41323
41324typed::set<> typed::set<>::project_out_param(const std::string &id) const
41325{
41326  auto res = isl::set::project_out_param(id);
41327  return typed::set<>(res);
41328}
41329
41330typed::set<> typed::set<>::project_out_param(const typed::id_list<Anonymous> &list) const
41331{
41332  auto res = isl::set::project_out_param(list);
41333  return typed::set<>(res);
41334}
41335
41336typed::pw_aff<Anonymous> typed::set<>::pw_aff_on_domain(const typed::val<Anonymous> &v) const
41337{
41338  auto res = isl::set::pw_aff_on_domain(v);
41339  return typed::pw_aff<Anonymous>(res);
41340}
41341
41342typed::pw_aff<Anonymous> typed::set<>::pw_aff_on_domain(long v) const
41343{
41344  auto res = isl::set::pw_aff_on_domain(v);
41345  return typed::pw_aff<Anonymous>(res);
41346}
41347
41348template <typename Domain>
41349typed::pw_multi_aff<Domain> typed::set<>::pw_multi_aff_on_domain(const typed::multi_val<Domain> &mv) const
41350{
41351  auto res = isl::set::pw_multi_aff_on_domain(mv);
41352  return typed::pw_multi_aff<Domain>(res);
41353}
41354
41355typed::set_list<> typed::set<>::set_list() const
41356{
41357  auto res = isl::set::set_list();
41358  return typed::set_list<>(res);
41359}
41360
41361typed::space<> typed::set<>::space() const
41362{
41363  auto res = isl::set::space();
41364  return typed::space<>(res);
41365}
41366
41367typed::set<> typed::set<>::subtract(const typed::set<> &set2) const
41368{
41369  auto res = isl::set::subtract(set2);
41370  return typed::set<>(res);
41371}
41372
41373typed::union_set<> typed::set<>::subtract(const typed::union_set<> &uset2) const
41374{
41375  auto res = isl::set::subtract(uset2);
41376  return typed::union_set<>(res);
41377}
41378
41379typed::set<> typed::set<>::subtract(const typed::basic_set<> &set2) const
41380{
41381  auto res = isl::set::subtract(set2);
41382  return typed::set<>(res);
41383}
41384
41385typed::set<> typed::set<>::subtract(const typed::point<> &set2) const
41386{
41387  auto res = isl::set::subtract(set2);
41388  return typed::set<>(res);
41389}
41390
41391typed::union_set<> typed::set<>::to_union_set() const
41392{
41393  auto res = isl::set::to_union_set();
41394  return typed::union_set<>(res);
41395}
41396
41397template <typename Domain>
41398typed::set<Domain> typed::set<>::unbind_params(const typed::multi_id<Domain> &tuple) const
41399{
41400  auto res = isl::set::unbind_params(tuple);
41401  return typed::set<Domain>(res);
41402}
41403
41404typed::set<> typed::set<>::unite(const typed::set<> &set2) const
41405{
41406  auto res = isl::set::unite(set2);
41407  return typed::set<>(res);
41408}
41409
41410typed::union_set<> typed::set<>::unite(const typed::union_set<> &uset2) const
41411{
41412  auto res = isl::set::unite(uset2);
41413  return typed::union_set<>(res);
41414}
41415
41416typed::set<> typed::set<>::unite(const typed::basic_set<> &set2) const
41417{
41418  auto res = isl::set::unite(set2);
41419  return typed::set<>(res);
41420}
41421
41422typed::set<> typed::set<>::unite(const typed::point<> &set2) const
41423{
41424  auto res = isl::set::unite(set2);
41425  return typed::set<>(res);
41426}
41427
41428typed::set<> typed::set<>::universe(const typed::space<> &space)
41429{
41430  auto res = isl::set::universe(space);
41431  return typed::set<>(res);
41432}
41433
41434template <typename Domain>
41435typed::set<Domain>::set(const typed::basic_set<Domain> &bset)
41436  : isl::set(bset)
41437{
41438}
41439
41440template <typename Domain>
41441typed::set<Domain>::set(const typed::point<Domain> &pnt)
41442  : isl::set(pnt)
41443{
41444}
41445
41446template <typename Domain>
41447typed::set<Domain>::set(const isl::ctx &ctx, const std::string &str)
41448  : isl::set(ctx, str)
41449{
41450}
41451
41452template <typename Domain>
41453template <typename Range>
41454typed::set<Range> typed::set<Domain>::apply(const typed::map<Domain, Range> &map) const
41455{
41456  auto res = isl::set::apply(map);
41457  return typed::set<Range>(res);
41458}
41459
41460template <typename Domain>
41461template <typename Range>
41462typed::union_set<Range> typed::set<Domain>::apply(const typed::union_map<Domain, Range> &umap) const
41463{
41464  auto res = isl::set::apply(umap);
41465  return typed::union_set<Range>(res);
41466}
41467
41468template <typename Domain>
41469template <typename Range>
41470typed::set<Range> typed::set<Domain>::apply(const typed::basic_map<Domain, Range> &map) const
41471{
41472  auto res = isl::set::apply(map);
41473  return typed::set<Range>(res);
41474}
41475
41476template <typename Domain>
41477typed::pw_multi_aff<Domain> typed::set<Domain>::as_pw_multi_aff() const
41478{
41479  auto res = isl::set::as_pw_multi_aff();
41480  return typed::pw_multi_aff<Domain>(res);
41481}
41482
41483template <typename Domain>
41484typed::set<Domain> typed::set<Domain>::as_set() const
41485{
41486  auto res = isl::set::as_set();
41487  return typed::set<Domain>(res);
41488}
41489
41490template <typename Domain>
41491typed::set<> typed::set<Domain>::bind(const typed::multi_id<Domain> &tuple) const
41492{
41493  auto res = isl::set::bind(tuple);
41494  return typed::set<>(res);
41495}
41496
41497template <typename Domain>
41498typed::set<Domain> typed::set<Domain>::coalesce() const
41499{
41500  auto res = isl::set::coalesce();
41501  return typed::set<Domain>(res);
41502}
41503
41504template <typename Domain>
41505typed::set<Domain> typed::set<Domain>::detect_equalities() const
41506{
41507  auto res = isl::set::detect_equalities();
41508  return typed::set<Domain>(res);
41509}
41510
41511template <typename Domain>
41512typed::set<Domain> typed::set<Domain>::drop_unused_params() const
41513{
41514  auto res = isl::set::drop_unused_params();
41515  return typed::set<Domain>(res);
41516}
41517
41518template <typename Domain>
41519bool typed::set<Domain>::every_set(const std::function<bool(typed::set<Domain>)> &test) const
41520{
41521  auto lambda_test = [&] (isl::set arg0) {
41522    return test(typed::set<Domain>(arg0));
41523  };
41524  return isl::set::every_set(lambda_test);
41525}
41526
41527template <typename Domain>
41528typed::set<Domain> typed::set<Domain>::extract_set(const typed::space<Domain> &space) const
41529{
41530  auto res = isl::set::extract_set(space);
41531  return typed::set<Domain>(res);
41532}
41533
41534template <typename Domain>
41535void typed::set<Domain>::foreach_basic_set(const std::function<void(typed::basic_set<Domain>)> &fn) const
41536{
41537  auto lambda_fn = [&] (isl::basic_set arg0) {
41538    return fn(typed::basic_set<Domain>(arg0));
41539  };
41540  return isl::set::foreach_basic_set(lambda_fn);
41541}
41542
41543template <typename Domain>
41544void typed::set<Domain>::foreach_point(const std::function<void(typed::point<Domain>)> &fn) const
41545{
41546  auto lambda_fn = [&] (isl::point arg0) {
41547    return fn(typed::point<Domain>(arg0));
41548  };
41549  return isl::set::foreach_point(lambda_fn);
41550}
41551
41552template <typename Domain>
41553void typed::set<Domain>::foreach_set(const std::function<void(typed::set<Domain>)> &fn) const
41554{
41555  auto lambda_fn = [&] (isl::set arg0) {
41556    return fn(typed::set<Domain>(arg0));
41557  };
41558  return isl::set::foreach_set(lambda_fn);
41559}
41560
41561template <typename Domain>
41562typed::set<Domain> typed::set<Domain>::gist(const typed::set<Domain> &context) const
41563{
41564  auto res = isl::set::gist(context);
41565  return typed::set<Domain>(res);
41566}
41567
41568template <typename Domain>
41569typed::union_set<Domain> typed::set<Domain>::gist(const typed::union_set<Domain> &context) const
41570{
41571  auto res = isl::set::gist(context);
41572  return typed::union_set<Domain>(res);
41573}
41574
41575template <typename Domain>
41576typed::set<Domain> typed::set<Domain>::gist(const typed::basic_set<Domain> &context) const
41577{
41578  auto res = isl::set::gist(context);
41579  return typed::set<Domain>(res);
41580}
41581
41582template <typename Domain>
41583typed::set<Domain> typed::set<Domain>::gist(const typed::point<Domain> &context) const
41584{
41585  auto res = isl::set::gist(context);
41586  return typed::set<Domain>(res);
41587}
41588
41589template <typename Domain>
41590typed::set<Domain> typed::set<Domain>::gist_params(const typed::set<> &context) const
41591{
41592  auto res = isl::set::gist_params(context);
41593  return typed::set<Domain>(res);
41594}
41595
41596template <typename Domain>
41597typed::set<Domain> typed::set<Domain>::gist_params(const typed::basic_set<> &context) const
41598{
41599  auto res = isl::set::gist_params(context);
41600  return typed::set<Domain>(res);
41601}
41602
41603template <typename Domain>
41604typed::set<Domain> typed::set<Domain>::gist_params(const typed::point<> &context) const
41605{
41606  auto res = isl::set::gist_params(context);
41607  return typed::set<Domain>(res);
41608}
41609
41610template <typename Domain>
41611typed::map<Domain, Domain> typed::set<Domain>::identity() const
41612{
41613  auto res = isl::set::identity();
41614  return typed::map<Domain, Domain>(res);
41615}
41616
41617template <typename Domain>
41618typed::pw_aff<Domain, Anonymous> typed::set<Domain>::indicator_function() const
41619{
41620  auto res = isl::set::indicator_function();
41621  return typed::pw_aff<Domain, Anonymous>(res);
41622}
41623
41624template <typename Domain>
41625template <typename Arg1>
41626typed::map<Arg1, Domain> typed::set<Domain>::insert_domain(const typed::space<Arg1> &domain) const
41627{
41628  auto res = isl::set::insert_domain(domain);
41629  return typed::map<Arg1, Domain>(res);
41630}
41631
41632template <typename Domain>
41633typed::set<Domain> typed::set<Domain>::intersect(const typed::set<Domain> &set2) const
41634{
41635  auto res = isl::set::intersect(set2);
41636  return typed::set<Domain>(res);
41637}
41638
41639template <typename Domain>
41640typed::union_set<Domain> typed::set<Domain>::intersect(const typed::union_set<Domain> &uset2) const
41641{
41642  auto res = isl::set::intersect(uset2);
41643  return typed::union_set<Domain>(res);
41644}
41645
41646template <typename Domain>
41647typed::set<Domain> typed::set<Domain>::intersect(const typed::basic_set<Domain> &set2) const
41648{
41649  auto res = isl::set::intersect(set2);
41650  return typed::set<Domain>(res);
41651}
41652
41653template <typename Domain>
41654typed::set<Domain> typed::set<Domain>::intersect(const typed::point<Domain> &set2) const
41655{
41656  auto res = isl::set::intersect(set2);
41657  return typed::set<Domain>(res);
41658}
41659
41660template <typename Domain>
41661typed::set<Domain> typed::set<Domain>::intersect_params(const typed::set<> &params) const
41662{
41663  auto res = isl::set::intersect_params(params);
41664  return typed::set<Domain>(res);
41665}
41666
41667template <typename Domain>
41668typed::set<Domain> typed::set<Domain>::intersect_params(const typed::basic_set<> &params) const
41669{
41670  auto res = isl::set::intersect_params(params);
41671  return typed::set<Domain>(res);
41672}
41673
41674template <typename Domain>
41675typed::set<Domain> typed::set<Domain>::intersect_params(const typed::point<> &params) const
41676{
41677  auto res = isl::set::intersect_params(params);
41678  return typed::set<Domain>(res);
41679}
41680
41681template <typename Domain>
41682typed::fixed_box<Domain> typed::set<Domain>::lattice_tile() const
41683{
41684  auto res = isl::set::lattice_tile();
41685  return typed::fixed_box<Domain>(res);
41686}
41687
41688template <typename Domain>
41689typed::set<Domain> typed::set<Domain>::lexmax() const
41690{
41691  auto res = isl::set::lexmax();
41692  return typed::set<Domain>(res);
41693}
41694
41695template <typename Domain>
41696typed::pw_multi_aff<Domain> typed::set<Domain>::lexmax_pw_multi_aff() const
41697{
41698  auto res = isl::set::lexmax_pw_multi_aff();
41699  return typed::pw_multi_aff<Domain>(res);
41700}
41701
41702template <typename Domain>
41703typed::set<Domain> typed::set<Domain>::lexmin() const
41704{
41705  auto res = isl::set::lexmin();
41706  return typed::set<Domain>(res);
41707}
41708
41709template <typename Domain>
41710typed::pw_multi_aff<Domain> typed::set<Domain>::lexmin_pw_multi_aff() const
41711{
41712  auto res = isl::set::lexmin_pw_multi_aff();
41713  return typed::pw_multi_aff<Domain>(res);
41714}
41715
41716template <typename Domain>
41717typed::set<Domain> typed::set<Domain>::lower_bound(const typed::multi_pw_aff<Domain> &lower) const
41718{
41719  auto res = isl::set::lower_bound(lower);
41720  return typed::set<Domain>(res);
41721}
41722
41723template <typename Domain>
41724typed::set<Domain> typed::set<Domain>::lower_bound(const typed::multi_val<Domain> &lower) const
41725{
41726  auto res = isl::set::lower_bound(lower);
41727  return typed::set<Domain>(res);
41728}
41729
41730template <typename Domain>
41731typed::multi_pw_aff<Domain> typed::set<Domain>::max_multi_pw_aff() const
41732{
41733  auto res = isl::set::max_multi_pw_aff();
41734  return typed::multi_pw_aff<Domain>(res);
41735}
41736
41737template <typename Domain>
41738typed::multi_pw_aff<Domain> typed::set<Domain>::min_multi_pw_aff() const
41739{
41740  auto res = isl::set::min_multi_pw_aff();
41741  return typed::multi_pw_aff<Domain>(res);
41742}
41743
41744template <typename Domain>
41745typed::pw_aff<Domain, Anonymous> typed::set<Domain>::param_pw_aff_on_domain(const typed::id<Anonymous> &id) const
41746{
41747  auto res = isl::set::param_pw_aff_on_domain(id);
41748  return typed::pw_aff<Domain, Anonymous>(res);
41749}
41750
41751template <typename Domain>
41752typed::pw_aff<Domain, Anonymous> typed::set<Domain>::param_pw_aff_on_domain(const std::string &id) const
41753{
41754  auto res = isl::set::param_pw_aff_on_domain(id);
41755  return typed::pw_aff<Domain, Anonymous>(res);
41756}
41757
41758template <typename Domain>
41759typed::set<> typed::set<Domain>::params() const
41760{
41761  auto res = isl::set::params();
41762  return typed::set<>(res);
41763}
41764
41765template <typename Domain>
41766typed::multi_val<Domain> typed::set<Domain>::plain_multi_val_if_fixed() const
41767{
41768  auto res = isl::set::plain_multi_val_if_fixed();
41769  return typed::multi_val<Domain>(res);
41770}
41771
41772template <typename Domain>
41773template <typename Domain2>
41774typed::set<Domain2> typed::set<Domain>::preimage(const typed::multi_aff<Domain2, Domain> &ma) const
41775{
41776  auto res = isl::set::preimage(ma);
41777  return typed::set<Domain2>(res);
41778}
41779
41780template <typename Domain>
41781template <typename Domain2>
41782typed::set<Domain2> typed::set<Domain>::preimage(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
41783{
41784  auto res = isl::set::preimage(mpa);
41785  return typed::set<Domain2>(res);
41786}
41787
41788template <typename Domain>
41789template <typename Domain2>
41790typed::set<Domain2> typed::set<Domain>::preimage(const typed::pw_multi_aff<Domain2, Domain> &pma) const
41791{
41792  auto res = isl::set::preimage(pma);
41793  return typed::set<Domain2>(res);
41794}
41795
41796template <typename Domain>
41797template <typename Domain2>
41798typed::union_set<Domain2> typed::set<Domain>::preimage(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
41799{
41800  auto res = isl::set::preimage(upma);
41801  return typed::union_set<Domain2>(res);
41802}
41803
41804template <typename Domain>
41805template <typename Range>
41806typed::set<pair<Domain, Range>> typed::set<Domain>::product(const typed::set<Range> &set2) const
41807{
41808  auto res = isl::set::product(set2);
41809  return typed::set<pair<Domain, Range>>(res);
41810}
41811
41812template <typename Domain>
41813template <typename Range>
41814typed::set<pair<Domain, Range>> typed::set<Domain>::product(const typed::basic_set<Range> &set2) const
41815{
41816  auto res = isl::set::product(set2);
41817  return typed::set<pair<Domain, Range>>(res);
41818}
41819
41820template <typename Domain>
41821template <typename Range>
41822typed::set<pair<Domain, Range>> typed::set<Domain>::product(const typed::point<Range> &set2) const
41823{
41824  auto res = isl::set::product(set2);
41825  return typed::set<pair<Domain, Range>>(res);
41826}
41827
41828template <typename Domain>
41829typed::set<Domain> typed::set<Domain>::project_out_all_params() const
41830{
41831  auto res = isl::set::project_out_all_params();
41832  return typed::set<Domain>(res);
41833}
41834
41835template <typename Domain>
41836typed::set<Domain> typed::set<Domain>::project_out_param(const typed::id<Anonymous> &id) const
41837{
41838  auto res = isl::set::project_out_param(id);
41839  return typed::set<Domain>(res);
41840}
41841
41842template <typename Domain>
41843typed::set<Domain> typed::set<Domain>::project_out_param(const std::string &id) const
41844{
41845  auto res = isl::set::project_out_param(id);
41846  return typed::set<Domain>(res);
41847}
41848
41849template <typename Domain>
41850typed::set<Domain> typed::set<Domain>::project_out_param(const typed::id_list<Anonymous> &list) const
41851{
41852  auto res = isl::set::project_out_param(list);
41853  return typed::set<Domain>(res);
41854}
41855
41856template <typename Domain>
41857typed::pw_aff<Domain, Anonymous> typed::set<Domain>::pw_aff_on_domain(const typed::val<Anonymous> &v) const
41858{
41859  auto res = isl::set::pw_aff_on_domain(v);
41860  return typed::pw_aff<Domain, Anonymous>(res);
41861}
41862
41863template <typename Domain>
41864typed::pw_aff<Domain, Anonymous> typed::set<Domain>::pw_aff_on_domain(long v) const
41865{
41866  auto res = isl::set::pw_aff_on_domain(v);
41867  return typed::pw_aff<Domain, Anonymous>(res);
41868}
41869
41870template <typename Domain>
41871template <typename Range>
41872typed::pw_multi_aff<Domain, Range> typed::set<Domain>::pw_multi_aff_on_domain(const typed::multi_val<Range> &mv) const
41873{
41874  auto res = isl::set::pw_multi_aff_on_domain(mv);
41875  return typed::pw_multi_aff<Domain, Range>(res);
41876}
41877
41878template <typename Domain>
41879typed::set_list<Domain> typed::set<Domain>::set_list() const
41880{
41881  auto res = isl::set::set_list();
41882  return typed::set_list<Domain>(res);
41883}
41884
41885template <typename Domain>
41886typed::fixed_box<Domain> typed::set<Domain>::simple_fixed_box_hull() const
41887{
41888  auto res = isl::set::simple_fixed_box_hull();
41889  return typed::fixed_box<Domain>(res);
41890}
41891
41892template <typename Domain>
41893typed::space<Domain> typed::set<Domain>::space() const
41894{
41895  auto res = isl::set::space();
41896  return typed::space<Domain>(res);
41897}
41898
41899template <typename Domain>
41900typed::set<Domain> typed::set<Domain>::subtract(const typed::set<Domain> &set2) const
41901{
41902  auto res = isl::set::subtract(set2);
41903  return typed::set<Domain>(res);
41904}
41905
41906template <typename Domain>
41907typed::union_set<Domain> typed::set<Domain>::subtract(const typed::union_set<Domain> &uset2) const
41908{
41909  auto res = isl::set::subtract(uset2);
41910  return typed::union_set<Domain>(res);
41911}
41912
41913template <typename Domain>
41914typed::set<Domain> typed::set<Domain>::subtract(const typed::basic_set<Domain> &set2) const
41915{
41916  auto res = isl::set::subtract(set2);
41917  return typed::set<Domain>(res);
41918}
41919
41920template <typename Domain>
41921typed::set<Domain> typed::set<Domain>::subtract(const typed::point<Domain> &set2) const
41922{
41923  auto res = isl::set::subtract(set2);
41924  return typed::set<Domain>(res);
41925}
41926
41927template <typename Domain>
41928typed::union_set<Domain> typed::set<Domain>::to_union_set() const
41929{
41930  auto res = isl::set::to_union_set();
41931  return typed::union_set<Domain>(res);
41932}
41933
41934template <typename Domain>
41935typed::map<Domain, Domain> typed::set<Domain>::translation() const
41936{
41937  auto res = isl::set::translation();
41938  return typed::map<Domain, Domain>(res);
41939}
41940
41941template <typename Domain>
41942template <typename Arg1>
41943typed::map<Arg1, Domain> typed::set<Domain>::unbind_params_insert_domain(const typed::multi_id<Arg1> &domain) const
41944{
41945  auto res = isl::set::unbind_params_insert_domain(domain);
41946  return typed::map<Arg1, Domain>(res);
41947}
41948
41949template <typename Domain>
41950typed::set<Domain> typed::set<Domain>::unite(const typed::set<Domain> &set2) const
41951{
41952  auto res = isl::set::unite(set2);
41953  return typed::set<Domain>(res);
41954}
41955
41956template <typename Domain>
41957typed::union_set<Domain> typed::set<Domain>::unite(const typed::union_set<Domain> &uset2) const
41958{
41959  auto res = isl::set::unite(uset2);
41960  return typed::union_set<Domain>(res);
41961}
41962
41963template <typename Domain>
41964typed::set<Domain> typed::set<Domain>::unite(const typed::basic_set<Domain> &set2) const
41965{
41966  auto res = isl::set::unite(set2);
41967  return typed::set<Domain>(res);
41968}
41969
41970template <typename Domain>
41971typed::set<Domain> typed::set<Domain>::unite(const typed::point<Domain> &set2) const
41972{
41973  auto res = isl::set::unite(set2);
41974  return typed::set<Domain>(res);
41975}
41976
41977template <typename Domain>
41978typed::set<Domain> typed::set<Domain>::universe(const typed::space<Domain> &space)
41979{
41980  auto res = isl::set::universe(space);
41981  return typed::set<Domain>(res);
41982}
41983
41984template <typename Domain>
41985typed::set<Domain> typed::set<Domain>::upper_bound(const typed::multi_pw_aff<Domain> &upper) const
41986{
41987  auto res = isl::set::upper_bound(upper);
41988  return typed::set<Domain>(res);
41989}
41990
41991template <typename Domain>
41992typed::set<Domain> typed::set<Domain>::upper_bound(const typed::multi_val<Domain> &upper) const
41993{
41994  auto res = isl::set::upper_bound(upper);
41995  return typed::set<Domain>(res);
41996}
41997
41998template <typename Domain, typename Range>
41999typed::set<pair<Domain, Range>>::set(const typed::basic_set<pair<Domain, Range>> &bset)
42000  : isl::set(bset)
42001{
42002}
42003
42004template <typename Domain, typename Range>
42005typed::set<pair<Domain, Range>>::set(const typed::point<pair<Domain, Range>> &pnt)
42006  : isl::set(pnt)
42007{
42008}
42009
42010template <typename Domain, typename Range>
42011typed::set<pair<Domain, Range>>::set(const isl::ctx &ctx, const std::string &str)
42012  : isl::set(ctx, str)
42013{
42014}
42015
42016template <typename Domain, typename Range>
42017template <typename Arg2>
42018typed::set<Arg2> typed::set<pair<Domain, Range>>::apply(const typed::map<pair<Domain, Range>, Arg2> &map) const
42019{
42020  auto res = isl::set::apply(map);
42021  return typed::set<Arg2>(res);
42022}
42023
42024template <typename Domain, typename Range>
42025template <typename Arg2>
42026typed::union_set<Arg2> typed::set<pair<Domain, Range>>::apply(const typed::union_map<pair<Domain, Range>, Arg2> &umap) const
42027{
42028  auto res = isl::set::apply(umap);
42029  return typed::union_set<Arg2>(res);
42030}
42031
42032template <typename Domain, typename Range>
42033template <typename Arg2>
42034typed::set<Arg2> typed::set<pair<Domain, Range>>::apply(const typed::basic_map<pair<Domain, Range>, Arg2> &map) const
42035{
42036  auto res = isl::set::apply(map);
42037  return typed::set<Arg2>(res);
42038}
42039
42040template <typename Domain, typename Range>
42041typed::pw_multi_aff<pair<Domain, Range>> typed::set<pair<Domain, Range>>::as_pw_multi_aff() const
42042{
42043  auto res = isl::set::as_pw_multi_aff();
42044  return typed::pw_multi_aff<pair<Domain, Range>>(res);
42045}
42046
42047template <typename Domain, typename Range>
42048typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::as_set() const
42049{
42050  auto res = isl::set::as_set();
42051  return typed::set<pair<Domain, Range>>(res);
42052}
42053
42054template <typename Domain, typename Range>
42055typed::set<> typed::set<pair<Domain, Range>>::bind(const typed::multi_id<pair<Domain, Range>> &tuple) const
42056{
42057  auto res = isl::set::bind(tuple);
42058  return typed::set<>(res);
42059}
42060
42061template <typename Domain, typename Range>
42062typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::coalesce() const
42063{
42064  auto res = isl::set::coalesce();
42065  return typed::set<pair<Domain, Range>>(res);
42066}
42067
42068template <typename Domain, typename Range>
42069typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::detect_equalities() const
42070{
42071  auto res = isl::set::detect_equalities();
42072  return typed::set<pair<Domain, Range>>(res);
42073}
42074
42075template <typename Domain, typename Range>
42076typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::drop_unused_params() const
42077{
42078  auto res = isl::set::drop_unused_params();
42079  return typed::set<pair<Domain, Range>>(res);
42080}
42081
42082template <typename Domain, typename Range>
42083bool typed::set<pair<Domain, Range>>::every_set(const std::function<bool(typed::set<pair<Domain, Range>>)> &test) const
42084{
42085  auto lambda_test = [&] (isl::set arg0) {
42086    return test(typed::set<pair<Domain, Range>>(arg0));
42087  };
42088  return isl::set::every_set(lambda_test);
42089}
42090
42091template <typename Domain, typename Range>
42092typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::extract_set(const typed::space<pair<Domain, Range>> &space) const
42093{
42094  auto res = isl::set::extract_set(space);
42095  return typed::set<pair<Domain, Range>>(res);
42096}
42097
42098template <typename Domain, typename Range>
42099void typed::set<pair<Domain, Range>>::foreach_basic_set(const std::function<void(typed::basic_set<pair<Domain, Range>>)> &fn) const
42100{
42101  auto lambda_fn = [&] (isl::basic_set arg0) {
42102    return fn(typed::basic_set<pair<Domain, Range>>(arg0));
42103  };
42104  return isl::set::foreach_basic_set(lambda_fn);
42105}
42106
42107template <typename Domain, typename Range>
42108void typed::set<pair<Domain, Range>>::foreach_point(const std::function<void(typed::point<pair<Domain, Range>>)> &fn) const
42109{
42110  auto lambda_fn = [&] (isl::point arg0) {
42111    return fn(typed::point<pair<Domain, Range>>(arg0));
42112  };
42113  return isl::set::foreach_point(lambda_fn);
42114}
42115
42116template <typename Domain, typename Range>
42117void typed::set<pair<Domain, Range>>::foreach_set(const std::function<void(typed::set<pair<Domain, Range>>)> &fn) const
42118{
42119  auto lambda_fn = [&] (isl::set arg0) {
42120    return fn(typed::set<pair<Domain, Range>>(arg0));
42121  };
42122  return isl::set::foreach_set(lambda_fn);
42123}
42124
42125template <typename Domain, typename Range>
42126typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::gist(const typed::set<pair<Domain, Range>> &context) const
42127{
42128  auto res = isl::set::gist(context);
42129  return typed::set<pair<Domain, Range>>(res);
42130}
42131
42132template <typename Domain, typename Range>
42133typed::union_set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::gist(const typed::union_set<pair<Domain, Range>> &context) const
42134{
42135  auto res = isl::set::gist(context);
42136  return typed::union_set<pair<Domain, Range>>(res);
42137}
42138
42139template <typename Domain, typename Range>
42140typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::gist(const typed::basic_set<pair<Domain, Range>> &context) const
42141{
42142  auto res = isl::set::gist(context);
42143  return typed::set<pair<Domain, Range>>(res);
42144}
42145
42146template <typename Domain, typename Range>
42147typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::gist(const typed::point<pair<Domain, Range>> &context) const
42148{
42149  auto res = isl::set::gist(context);
42150  return typed::set<pair<Domain, Range>>(res);
42151}
42152
42153template <typename Domain, typename Range>
42154typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::gist_params(const typed::set<> &context) const
42155{
42156  auto res = isl::set::gist_params(context);
42157  return typed::set<pair<Domain, Range>>(res);
42158}
42159
42160template <typename Domain, typename Range>
42161typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::gist_params(const typed::basic_set<> &context) const
42162{
42163  auto res = isl::set::gist_params(context);
42164  return typed::set<pair<Domain, Range>>(res);
42165}
42166
42167template <typename Domain, typename Range>
42168typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::gist_params(const typed::point<> &context) const
42169{
42170  auto res = isl::set::gist_params(context);
42171  return typed::set<pair<Domain, Range>>(res);
42172}
42173
42174template <typename Domain, typename Range>
42175typed::map<pair<Domain, Range>, pair<Domain, Range>> typed::set<pair<Domain, Range>>::identity() const
42176{
42177  auto res = isl::set::identity();
42178  return typed::map<pair<Domain, Range>, pair<Domain, Range>>(res);
42179}
42180
42181template <typename Domain, typename Range>
42182typed::pw_aff<pair<Domain, Range>, Anonymous> typed::set<pair<Domain, Range>>::indicator_function() const
42183{
42184  auto res = isl::set::indicator_function();
42185  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
42186}
42187
42188template <typename Domain, typename Range>
42189template <typename Arg2>
42190typed::map<Arg2, pair<Domain, Range>> typed::set<pair<Domain, Range>>::insert_domain(const typed::space<Arg2> &domain) const
42191{
42192  auto res = isl::set::insert_domain(domain);
42193  return typed::map<Arg2, pair<Domain, Range>>(res);
42194}
42195
42196template <typename Domain, typename Range>
42197typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::intersect(const typed::set<pair<Domain, Range>> &set2) const
42198{
42199  auto res = isl::set::intersect(set2);
42200  return typed::set<pair<Domain, Range>>(res);
42201}
42202
42203template <typename Domain, typename Range>
42204typed::union_set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::intersect(const typed::union_set<pair<Domain, Range>> &uset2) const
42205{
42206  auto res = isl::set::intersect(uset2);
42207  return typed::union_set<pair<Domain, Range>>(res);
42208}
42209
42210template <typename Domain, typename Range>
42211typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::intersect(const typed::basic_set<pair<Domain, Range>> &set2) const
42212{
42213  auto res = isl::set::intersect(set2);
42214  return typed::set<pair<Domain, Range>>(res);
42215}
42216
42217template <typename Domain, typename Range>
42218typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::intersect(const typed::point<pair<Domain, Range>> &set2) const
42219{
42220  auto res = isl::set::intersect(set2);
42221  return typed::set<pair<Domain, Range>>(res);
42222}
42223
42224template <typename Domain, typename Range>
42225typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::intersect_params(const typed::set<> &params) const
42226{
42227  auto res = isl::set::intersect_params(params);
42228  return typed::set<pair<Domain, Range>>(res);
42229}
42230
42231template <typename Domain, typename Range>
42232typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::intersect_params(const typed::basic_set<> &params) const
42233{
42234  auto res = isl::set::intersect_params(params);
42235  return typed::set<pair<Domain, Range>>(res);
42236}
42237
42238template <typename Domain, typename Range>
42239typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::intersect_params(const typed::point<> &params) const
42240{
42241  auto res = isl::set::intersect_params(params);
42242  return typed::set<pair<Domain, Range>>(res);
42243}
42244
42245template <typename Domain, typename Range>
42246typed::fixed_box<pair<Domain, Range>> typed::set<pair<Domain, Range>>::lattice_tile() const
42247{
42248  auto res = isl::set::lattice_tile();
42249  return typed::fixed_box<pair<Domain, Range>>(res);
42250}
42251
42252template <typename Domain, typename Range>
42253typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::lexmax() const
42254{
42255  auto res = isl::set::lexmax();
42256  return typed::set<pair<Domain, Range>>(res);
42257}
42258
42259template <typename Domain, typename Range>
42260typed::pw_multi_aff<pair<Domain, Range>> typed::set<pair<Domain, Range>>::lexmax_pw_multi_aff() const
42261{
42262  auto res = isl::set::lexmax_pw_multi_aff();
42263  return typed::pw_multi_aff<pair<Domain, Range>>(res);
42264}
42265
42266template <typename Domain, typename Range>
42267typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::lexmin() const
42268{
42269  auto res = isl::set::lexmin();
42270  return typed::set<pair<Domain, Range>>(res);
42271}
42272
42273template <typename Domain, typename Range>
42274typed::pw_multi_aff<pair<Domain, Range>> typed::set<pair<Domain, Range>>::lexmin_pw_multi_aff() const
42275{
42276  auto res = isl::set::lexmin_pw_multi_aff();
42277  return typed::pw_multi_aff<pair<Domain, Range>>(res);
42278}
42279
42280template <typename Domain, typename Range>
42281typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::lower_bound(const typed::multi_pw_aff<pair<Domain, Range>> &lower) const
42282{
42283  auto res = isl::set::lower_bound(lower);
42284  return typed::set<pair<Domain, Range>>(res);
42285}
42286
42287template <typename Domain, typename Range>
42288typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::lower_bound(const typed::multi_val<pair<Domain, Range>> &lower) const
42289{
42290  auto res = isl::set::lower_bound(lower);
42291  return typed::set<pair<Domain, Range>>(res);
42292}
42293
42294template <typename Domain, typename Range>
42295typed::multi_pw_aff<pair<Domain, Range>> typed::set<pair<Domain, Range>>::max_multi_pw_aff() const
42296{
42297  auto res = isl::set::max_multi_pw_aff();
42298  return typed::multi_pw_aff<pair<Domain, Range>>(res);
42299}
42300
42301template <typename Domain, typename Range>
42302typed::multi_pw_aff<pair<Domain, Range>> typed::set<pair<Domain, Range>>::min_multi_pw_aff() const
42303{
42304  auto res = isl::set::min_multi_pw_aff();
42305  return typed::multi_pw_aff<pair<Domain, Range>>(res);
42306}
42307
42308template <typename Domain, typename Range>
42309typed::pw_aff<pair<Domain, Range>, Anonymous> typed::set<pair<Domain, Range>>::param_pw_aff_on_domain(const typed::id<Anonymous> &id) const
42310{
42311  auto res = isl::set::param_pw_aff_on_domain(id);
42312  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
42313}
42314
42315template <typename Domain, typename Range>
42316typed::pw_aff<pair<Domain, Range>, Anonymous> typed::set<pair<Domain, Range>>::param_pw_aff_on_domain(const std::string &id) const
42317{
42318  auto res = isl::set::param_pw_aff_on_domain(id);
42319  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
42320}
42321
42322template <typename Domain, typename Range>
42323typed::set<> typed::set<pair<Domain, Range>>::params() const
42324{
42325  auto res = isl::set::params();
42326  return typed::set<>(res);
42327}
42328
42329template <typename Domain, typename Range>
42330typed::multi_val<pair<Domain, Range>> typed::set<pair<Domain, Range>>::plain_multi_val_if_fixed() const
42331{
42332  auto res = isl::set::plain_multi_val_if_fixed();
42333  return typed::multi_val<pair<Domain, Range>>(res);
42334}
42335
42336template <typename Domain, typename Range>
42337template <typename Domain2>
42338typed::set<Domain2> typed::set<pair<Domain, Range>>::preimage(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const
42339{
42340  auto res = isl::set::preimage(ma);
42341  return typed::set<Domain2>(res);
42342}
42343
42344template <typename Domain, typename Range>
42345template <typename Domain2>
42346typed::set<Domain2> typed::set<pair<Domain, Range>>::preimage(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const
42347{
42348  auto res = isl::set::preimage(mpa);
42349  return typed::set<Domain2>(res);
42350}
42351
42352template <typename Domain, typename Range>
42353template <typename Domain2>
42354typed::set<Domain2> typed::set<pair<Domain, Range>>::preimage(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const
42355{
42356  auto res = isl::set::preimage(pma);
42357  return typed::set<Domain2>(res);
42358}
42359
42360template <typename Domain, typename Range>
42361template <typename Domain2>
42362typed::union_set<Domain2> typed::set<pair<Domain, Range>>::preimage(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const
42363{
42364  auto res = isl::set::preimage(upma);
42365  return typed::union_set<Domain2>(res);
42366}
42367
42368template <typename Domain, typename Range>
42369template <typename Arg2>
42370typed::set<pair<pair<Domain, Range>, Arg2>> typed::set<pair<Domain, Range>>::product(const typed::set<Arg2> &set2) const
42371{
42372  auto res = isl::set::product(set2);
42373  return typed::set<pair<pair<Domain, Range>, Arg2>>(res);
42374}
42375
42376template <typename Domain, typename Range>
42377template <typename Arg2>
42378typed::set<pair<pair<Domain, Range>, Arg2>> typed::set<pair<Domain, Range>>::product(const typed::basic_set<Arg2> &set2) const
42379{
42380  auto res = isl::set::product(set2);
42381  return typed::set<pair<pair<Domain, Range>, Arg2>>(res);
42382}
42383
42384template <typename Domain, typename Range>
42385template <typename Arg2>
42386typed::set<pair<pair<Domain, Range>, Arg2>> typed::set<pair<Domain, Range>>::product(const typed::point<Arg2> &set2) const
42387{
42388  auto res = isl::set::product(set2);
42389  return typed::set<pair<pair<Domain, Range>, Arg2>>(res);
42390}
42391
42392template <typename Domain, typename Range>
42393typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::project_out_all_params() const
42394{
42395  auto res = isl::set::project_out_all_params();
42396  return typed::set<pair<Domain, Range>>(res);
42397}
42398
42399template <typename Domain, typename Range>
42400typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::project_out_param(const typed::id<Anonymous> &id) const
42401{
42402  auto res = isl::set::project_out_param(id);
42403  return typed::set<pair<Domain, Range>>(res);
42404}
42405
42406template <typename Domain, typename Range>
42407typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::project_out_param(const std::string &id) const
42408{
42409  auto res = isl::set::project_out_param(id);
42410  return typed::set<pair<Domain, Range>>(res);
42411}
42412
42413template <typename Domain, typename Range>
42414typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::project_out_param(const typed::id_list<Anonymous> &list) const
42415{
42416  auto res = isl::set::project_out_param(list);
42417  return typed::set<pair<Domain, Range>>(res);
42418}
42419
42420template <typename Domain, typename Range>
42421typed::pw_aff<pair<Domain, Range>, Anonymous> typed::set<pair<Domain, Range>>::pw_aff_on_domain(const typed::val<Anonymous> &v) const
42422{
42423  auto res = isl::set::pw_aff_on_domain(v);
42424  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
42425}
42426
42427template <typename Domain, typename Range>
42428typed::pw_aff<pair<Domain, Range>, Anonymous> typed::set<pair<Domain, Range>>::pw_aff_on_domain(long v) const
42429{
42430  auto res = isl::set::pw_aff_on_domain(v);
42431  return typed::pw_aff<pair<Domain, Range>, Anonymous>(res);
42432}
42433
42434template <typename Domain, typename Range>
42435template <typename Arg2>
42436typed::pw_multi_aff<pair<Domain, Range>, Arg2> typed::set<pair<Domain, Range>>::pw_multi_aff_on_domain(const typed::multi_val<Arg2> &mv) const
42437{
42438  auto res = isl::set::pw_multi_aff_on_domain(mv);
42439  return typed::pw_multi_aff<pair<Domain, Range>, Arg2>(res);
42440}
42441
42442template <typename Domain, typename Range>
42443typed::set_list<pair<Domain, Range>> typed::set<pair<Domain, Range>>::set_list() const
42444{
42445  auto res = isl::set::set_list();
42446  return typed::set_list<pair<Domain, Range>>(res);
42447}
42448
42449template <typename Domain, typename Range>
42450typed::fixed_box<pair<Domain, Range>> typed::set<pair<Domain, Range>>::simple_fixed_box_hull() const
42451{
42452  auto res = isl::set::simple_fixed_box_hull();
42453  return typed::fixed_box<pair<Domain, Range>>(res);
42454}
42455
42456template <typename Domain, typename Range>
42457typed::space<pair<Domain, Range>> typed::set<pair<Domain, Range>>::space() const
42458{
42459  auto res = isl::set::space();
42460  return typed::space<pair<Domain, Range>>(res);
42461}
42462
42463template <typename Domain, typename Range>
42464typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::subtract(const typed::set<pair<Domain, Range>> &set2) const
42465{
42466  auto res = isl::set::subtract(set2);
42467  return typed::set<pair<Domain, Range>>(res);
42468}
42469
42470template <typename Domain, typename Range>
42471typed::union_set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::subtract(const typed::union_set<pair<Domain, Range>> &uset2) const
42472{
42473  auto res = isl::set::subtract(uset2);
42474  return typed::union_set<pair<Domain, Range>>(res);
42475}
42476
42477template <typename Domain, typename Range>
42478typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::subtract(const typed::basic_set<pair<Domain, Range>> &set2) const
42479{
42480  auto res = isl::set::subtract(set2);
42481  return typed::set<pair<Domain, Range>>(res);
42482}
42483
42484template <typename Domain, typename Range>
42485typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::subtract(const typed::point<pair<Domain, Range>> &set2) const
42486{
42487  auto res = isl::set::subtract(set2);
42488  return typed::set<pair<Domain, Range>>(res);
42489}
42490
42491template <typename Domain, typename Range>
42492typed::union_set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::to_union_set() const
42493{
42494  auto res = isl::set::to_union_set();
42495  return typed::union_set<pair<Domain, Range>>(res);
42496}
42497
42498template <typename Domain, typename Range>
42499typed::map<pair<Domain, Range>, pair<Domain, Range>> typed::set<pair<Domain, Range>>::translation() const
42500{
42501  auto res = isl::set::translation();
42502  return typed::map<pair<Domain, Range>, pair<Domain, Range>>(res);
42503}
42504
42505template <typename Domain, typename Range>
42506template <typename Arg2>
42507typed::map<Arg2, pair<Domain, Range>> typed::set<pair<Domain, Range>>::unbind_params_insert_domain(const typed::multi_id<Arg2> &domain) const
42508{
42509  auto res = isl::set::unbind_params_insert_domain(domain);
42510  return typed::map<Arg2, pair<Domain, Range>>(res);
42511}
42512
42513template <typename Domain, typename Range>
42514typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::unite(const typed::set<pair<Domain, Range>> &set2) const
42515{
42516  auto res = isl::set::unite(set2);
42517  return typed::set<pair<Domain, Range>>(res);
42518}
42519
42520template <typename Domain, typename Range>
42521typed::union_set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::unite(const typed::union_set<pair<Domain, Range>> &uset2) const
42522{
42523  auto res = isl::set::unite(uset2);
42524  return typed::union_set<pair<Domain, Range>>(res);
42525}
42526
42527template <typename Domain, typename Range>
42528typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::unite(const typed::basic_set<pair<Domain, Range>> &set2) const
42529{
42530  auto res = isl::set::unite(set2);
42531  return typed::set<pair<Domain, Range>>(res);
42532}
42533
42534template <typename Domain, typename Range>
42535typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::unite(const typed::point<pair<Domain, Range>> &set2) const
42536{
42537  auto res = isl::set::unite(set2);
42538  return typed::set<pair<Domain, Range>>(res);
42539}
42540
42541template <typename Domain, typename Range>
42542typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::universe(const typed::space<pair<Domain, Range>> &space)
42543{
42544  auto res = isl::set::universe(space);
42545  return typed::set<pair<Domain, Range>>(res);
42546}
42547
42548template <typename Domain, typename Range>
42549typed::map<Domain, Range> typed::set<pair<Domain, Range>>::unwrap() const
42550{
42551  auto res = isl::set::unwrap();
42552  return typed::map<Domain, Range>(res);
42553}
42554
42555template <typename Domain, typename Range>
42556typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::upper_bound(const typed::multi_pw_aff<pair<Domain, Range>> &upper) const
42557{
42558  auto res = isl::set::upper_bound(upper);
42559  return typed::set<pair<Domain, Range>>(res);
42560}
42561
42562template <typename Domain, typename Range>
42563typed::set<pair<Domain, Range>> typed::set<pair<Domain, Range>>::upper_bound(const typed::multi_val<pair<Domain, Range>> &upper) const
42564{
42565  auto res = isl::set::upper_bound(upper);
42566  return typed::set<pair<Domain, Range>>(res);
42567}
42568
42569template <typename Domain, typename Range>
42570typed::set<pair<Range, Domain>> typed::set<pair<Domain, Range>>::wrapped_reverse() const
42571{
42572  auto res = isl::set::wrapped_reverse();
42573  return typed::set<pair<Range, Domain>>(res);
42574}
42575
42576typed::set_list<>::set_list(const isl::ctx &ctx, int n)
42577  : isl::set_list(ctx, n)
42578{
42579}
42580
42581typed::set_list<>::set_list(const typed::set<> &el)
42582  : isl::set_list(el)
42583{
42584}
42585
42586typed::set_list<>::set_list(const isl::ctx &ctx, const std::string &str)
42587  : isl::set_list(ctx, str)
42588{
42589}
42590
42591typed::set_list<> typed::set_list<>::add(const typed::set<> &el) const
42592{
42593  auto res = isl::set_list::add(el);
42594  return typed::set_list<>(res);
42595}
42596
42597typed::set_list<> typed::set_list<>::add(const typed::basic_set<> &el) const
42598{
42599  auto res = isl::set_list::add(el);
42600  return typed::set_list<>(res);
42601}
42602
42603typed::set_list<> typed::set_list<>::add(const typed::point<> &el) const
42604{
42605  auto res = isl::set_list::add(el);
42606  return typed::set_list<>(res);
42607}
42608
42609typed::set_list<> typed::set_list<>::drop(unsigned int first, unsigned int n) const
42610{
42611  auto res = isl::set_list::drop(first, n);
42612  return typed::set_list<>(res);
42613}
42614
42615void typed::set_list<>::foreach(const std::function<void(typed::set<>)> &fn) const
42616{
42617  auto lambda_fn = [&] (isl::set arg0) {
42618    return fn(typed::set<>(arg0));
42619  };
42620  return isl::set_list::foreach(lambda_fn);
42621}
42622
42623void typed::set_list<>::foreach_scc(const std::function<bool(typed::set<>, typed::set<>)> &follows, const std::function<void(typed::set_list<>)> &fn) const
42624{
42625  auto lambda_follows = [&] (isl::set arg0, isl::set arg1) {
42626    return follows(typed::set<>(arg0), typed::set<>(arg1));
42627  };
42628  auto lambda_fn = [&] (isl::set_list arg0) {
42629    return fn(typed::set_list<>(arg0));
42630  };
42631  return isl::set_list::foreach_scc(lambda_follows, lambda_fn);
42632}
42633
42634template <typename Domain>
42635typed::set_list<Domain>::set_list(const isl::ctx &ctx, int n)
42636  : isl::set_list(ctx, n)
42637{
42638}
42639
42640template <typename Domain>
42641typed::set_list<Domain>::set_list(const typed::set<Domain> &el)
42642  : isl::set_list(el)
42643{
42644}
42645
42646template <typename Domain>
42647typed::set_list<Domain>::set_list(const isl::ctx &ctx, const std::string &str)
42648  : isl::set_list(ctx, str)
42649{
42650}
42651
42652template <typename Domain>
42653typed::set_list<Domain> typed::set_list<Domain>::add(const typed::set<Domain> &el) const
42654{
42655  auto res = isl::set_list::add(el);
42656  return typed::set_list<Domain>(res);
42657}
42658
42659template <typename Domain>
42660typed::set_list<Domain> typed::set_list<Domain>::add(const typed::basic_set<Domain> &el) const
42661{
42662  auto res = isl::set_list::add(el);
42663  return typed::set_list<Domain>(res);
42664}
42665
42666template <typename Domain>
42667typed::set_list<Domain> typed::set_list<Domain>::add(const typed::point<Domain> &el) const
42668{
42669  auto res = isl::set_list::add(el);
42670  return typed::set_list<Domain>(res);
42671}
42672
42673template <typename Domain>
42674typed::set<Domain> typed::set_list<Domain>::at(int index) const
42675{
42676  auto res = isl::set_list::at(index);
42677  return typed::set<Domain>(res);
42678}
42679
42680template <typename Domain>
42681typed::set_list<Domain> typed::set_list<Domain>::drop(unsigned int first, unsigned int n) const
42682{
42683  auto res = isl::set_list::drop(first, n);
42684  return typed::set_list<Domain>(res);
42685}
42686
42687template <typename Domain>
42688void typed::set_list<Domain>::foreach(const std::function<void(typed::set<Domain>)> &fn) const
42689{
42690  auto lambda_fn = [&] (isl::set arg0) {
42691    return fn(typed::set<Domain>(arg0));
42692  };
42693  return isl::set_list::foreach(lambda_fn);
42694}
42695
42696template <typename Domain>
42697void typed::set_list<Domain>::foreach_scc(const std::function<bool(typed::set<Domain>, typed::set<Domain>)> &follows, const std::function<void(typed::set_list<Domain>)> &fn) const
42698{
42699  auto lambda_follows = [&] (isl::set arg0, isl::set arg1) {
42700    return follows(typed::set<Domain>(arg0), typed::set<Domain>(arg1));
42701  };
42702  auto lambda_fn = [&] (isl::set_list arg0) {
42703    return fn(typed::set_list<Domain>(arg0));
42704  };
42705  return isl::set_list::foreach_scc(lambda_follows, lambda_fn);
42706}
42707
42708template <typename Domain>
42709typed::set_list<Domain> typed::set_list<Domain>::set_at(int index, const typed::set<Anonymous> &el) const
42710{
42711  auto res = isl::set_list::set_at(index, el);
42712  return typed::set_list<Domain>(res);
42713}
42714
42715typed::space<>::space(const isl::ctx &ctx, const std::string &str)
42716  : isl::space(ctx, str)
42717{
42718}
42719
42720template <typename Domain>
42721typed::space<Domain> typed::space<>::add_named_tuple(const typed::id<Anonymous> &tuple_id, unsigned int dim) const
42722{
42723  auto res = isl::space::add_named_tuple(tuple_id, dim);
42724  return typed::space<Domain>(res);
42725}
42726
42727template <typename Domain>
42728typed::space<Domain> typed::space<>::add_named_tuple(const std::string &tuple_id, unsigned int dim) const
42729{
42730  auto res = isl::space::add_named_tuple(tuple_id, dim);
42731  return typed::space<Domain>(res);
42732}
42733
42734typed::space<> typed::space<>::add_param(const typed::id<Anonymous> &id) const
42735{
42736  auto res = isl::space::add_param(id);
42737  return typed::space<>(res);
42738}
42739
42740typed::space<> typed::space<>::add_param(const std::string &id) const
42741{
42742  auto res = isl::space::add_param(id);
42743  return typed::space<>(res);
42744}
42745
42746template <typename Domain>
42747typed::space<Domain> typed::space<>::add_unnamed_tuple(unsigned int dim) const
42748{
42749  auto res = isl::space::add_unnamed_tuple(dim);
42750  return typed::space<Domain>(res);
42751}
42752
42753typed::space<> typed::space<>::drop_all_params() const
42754{
42755  auto res = isl::space::drop_all_params();
42756  return typed::space<>(res);
42757}
42758
42759template <typename Domain>
42760typed::multi_aff<Domain> typed::space<>::multi_aff_on_domain(const typed::multi_val<Domain> &mv) const
42761{
42762  auto res = isl::space::multi_aff_on_domain(mv);
42763  return typed::multi_aff<Domain>(res);
42764}
42765
42766typed::aff<Anonymous> typed::space<>::param_aff_on_domain(const typed::id<Anonymous> &id) const
42767{
42768  auto res = isl::space::param_aff_on_domain(id);
42769  return typed::aff<Anonymous>(res);
42770}
42771
42772typed::aff<Anonymous> typed::space<>::param_aff_on_domain(const std::string &id) const
42773{
42774  auto res = isl::space::param_aff_on_domain(id);
42775  return typed::aff<Anonymous>(res);
42776}
42777
42778typed::space<> typed::space<>::unit(const isl::ctx &ctx)
42779{
42780  auto res = isl::space::unit(ctx);
42781  return typed::space<>(res);
42782}
42783
42784typed::set<> typed::space<>::universe_set() const
42785{
42786  auto res = isl::space::universe_set();
42787  return typed::set<>(res);
42788}
42789
42790template <typename Domain>
42791typed::space<Domain>::space(const isl::ctx &ctx, const std::string &str)
42792  : isl::space(ctx, str)
42793{
42794}
42795
42796template <typename Domain>
42797template <typename Range>
42798typed::space<Domain, Range> typed::space<Domain>::add_named_tuple(const typed::id<Anonymous> &tuple_id, unsigned int dim) const
42799{
42800  auto res = isl::space::add_named_tuple(tuple_id, dim);
42801  return typed::space<Domain, Range>(res);
42802}
42803
42804template <typename Domain>
42805template <typename Range>
42806typed::space<Domain, Range> typed::space<Domain>::add_named_tuple(const std::string &tuple_id, unsigned int dim) const
42807{
42808  auto res = isl::space::add_named_tuple(tuple_id, dim);
42809  return typed::space<Domain, Range>(res);
42810}
42811
42812template <typename Domain>
42813typed::space<Domain> typed::space<Domain>::add_param(const typed::id<Anonymous> &id) const
42814{
42815  auto res = isl::space::add_param(id);
42816  return typed::space<Domain>(res);
42817}
42818
42819template <typename Domain>
42820typed::space<Domain> typed::space<Domain>::add_param(const std::string &id) const
42821{
42822  auto res = isl::space::add_param(id);
42823  return typed::space<Domain>(res);
42824}
42825
42826template <typename Domain>
42827template <typename Range>
42828typed::space<Domain, Range> typed::space<Domain>::add_unnamed_tuple(unsigned int dim) const
42829{
42830  auto res = isl::space::add_unnamed_tuple(dim);
42831  return typed::space<Domain, Range>(res);
42832}
42833
42834template <typename Domain>
42835typed::space<> typed::space<Domain>::domain() const
42836{
42837  auto res = isl::space::domain();
42838  return typed::space<>(res);
42839}
42840
42841template <typename Domain>
42842typed::space<Domain> typed::space<Domain>::drop_all_params() const
42843{
42844  auto res = isl::space::drop_all_params();
42845  return typed::space<Domain>(res);
42846}
42847
42848template <typename Domain>
42849typed::multi_aff<Domain, Domain> typed::space<Domain>::identity_multi_aff_on_domain() const
42850{
42851  auto res = isl::space::identity_multi_aff_on_domain();
42852  return typed::multi_aff<Domain, Domain>(res);
42853}
42854
42855template <typename Domain>
42856typed::multi_pw_aff<Domain, Domain> typed::space<Domain>::identity_multi_pw_aff_on_domain() const
42857{
42858  auto res = isl::space::identity_multi_pw_aff_on_domain();
42859  return typed::multi_pw_aff<Domain, Domain>(res);
42860}
42861
42862template <typename Domain>
42863typed::pw_multi_aff<Domain, Domain> typed::space<Domain>::identity_pw_multi_aff_on_domain() const
42864{
42865  auto res = isl::space::identity_pw_multi_aff_on_domain();
42866  return typed::pw_multi_aff<Domain, Domain>(res);
42867}
42868
42869template <typename Domain>
42870typed::space<Domain, Domain> typed::space<Domain>::map_from_set() const
42871{
42872  auto res = isl::space::map_from_set();
42873  return typed::space<Domain, Domain>(res);
42874}
42875
42876template <typename Domain>
42877typed::multi_aff<Domain> typed::space<Domain>::multi_aff(const typed::aff_list<Anonymous> &list) const
42878{
42879  auto res = isl::space::multi_aff(list);
42880  return typed::multi_aff<Domain>(res);
42881}
42882
42883template <typename Domain>
42884template <typename Range>
42885typed::multi_aff<Domain, Range> typed::space<Domain>::multi_aff_on_domain(const typed::multi_val<Range> &mv) const
42886{
42887  auto res = isl::space::multi_aff_on_domain(mv);
42888  return typed::multi_aff<Domain, Range>(res);
42889}
42890
42891template <typename Domain>
42892typed::multi_id<Domain> typed::space<Domain>::multi_id(const typed::id_list<Anonymous> &list) const
42893{
42894  auto res = isl::space::multi_id(list);
42895  return typed::multi_id<Domain>(res);
42896}
42897
42898template <typename Domain>
42899typed::multi_pw_aff<Domain> typed::space<Domain>::multi_pw_aff(const typed::pw_aff_list<Anonymous> &list) const
42900{
42901  auto res = isl::space::multi_pw_aff(list);
42902  return typed::multi_pw_aff<Domain>(res);
42903}
42904
42905template <typename Domain>
42906typed::multi_union_pw_aff<Domain> typed::space<Domain>::multi_union_pw_aff(const typed::union_pw_aff_list<Anonymous> &list) const
42907{
42908  auto res = isl::space::multi_union_pw_aff(list);
42909  return typed::multi_union_pw_aff<Domain>(res);
42910}
42911
42912template <typename Domain>
42913template <typename Arg1>
42914typed::multi_union_pw_aff<Arg1, Domain> typed::space<Domain>::multi_union_pw_aff(const typed::union_pw_aff_list<Arg1, Anonymous> &list) const
42915{
42916  auto res = isl::space::multi_union_pw_aff(list);
42917  return typed::multi_union_pw_aff<Arg1, Domain>(res);
42918}
42919
42920template <typename Domain>
42921typed::multi_val<Domain> typed::space<Domain>::multi_val(const typed::val_list<Anonymous> &list) const
42922{
42923  auto res = isl::space::multi_val(list);
42924  return typed::multi_val<Domain>(res);
42925}
42926
42927template <typename Domain>
42928typed::aff<Domain, Anonymous> typed::space<Domain>::param_aff_on_domain(const typed::id<Anonymous> &id) const
42929{
42930  auto res = isl::space::param_aff_on_domain(id);
42931  return typed::aff<Domain, Anonymous>(res);
42932}
42933
42934template <typename Domain>
42935typed::aff<Domain, Anonymous> typed::space<Domain>::param_aff_on_domain(const std::string &id) const
42936{
42937  auto res = isl::space::param_aff_on_domain(id);
42938  return typed::aff<Domain, Anonymous>(res);
42939}
42940
42941template <typename Domain>
42942typed::space<> typed::space<Domain>::params() const
42943{
42944  auto res = isl::space::params();
42945  return typed::space<>(res);
42946}
42947
42948template <typename Domain>
42949template <typename Range>
42950typed::space<pair<Domain, Range>> typed::space<Domain>::product(const typed::space<Range> &right) const
42951{
42952  auto res = isl::space::product(right);
42953  return typed::space<pair<Domain, Range>>(res);
42954}
42955
42956template <typename Domain>
42957template <typename Domain2>
42958typed::space<Domain2> typed::space<Domain>::set_range_tuple(const typed::id<Anonymous> &id) const
42959{
42960  auto res = isl::space::set_range_tuple(id);
42961  return typed::space<Domain2>(res);
42962}
42963
42964template <typename Domain>
42965template <typename Domain2>
42966typed::space<Domain2> typed::space<Domain>::set_range_tuple(const std::string &id) const
42967{
42968  auto res = isl::space::set_range_tuple(id);
42969  return typed::space<Domain2>(res);
42970}
42971
42972template <typename Domain>
42973typed::set<Domain> typed::space<Domain>::universe_set() const
42974{
42975  auto res = isl::space::universe_set();
42976  return typed::set<Domain>(res);
42977}
42978
42979template <typename Domain>
42980typed::aff<Domain, Anonymous> typed::space<Domain>::zero_aff_on_domain() const
42981{
42982  auto res = isl::space::zero_aff_on_domain();
42983  return typed::aff<Domain, Anonymous>(res);
42984}
42985
42986template <typename Domain>
42987typed::multi_aff<Domain> typed::space<Domain>::zero_multi_aff() const
42988{
42989  auto res = isl::space::zero_multi_aff();
42990  return typed::multi_aff<Domain>(res);
42991}
42992
42993template <typename Domain>
42994typed::multi_pw_aff<Domain> typed::space<Domain>::zero_multi_pw_aff() const
42995{
42996  auto res = isl::space::zero_multi_pw_aff();
42997  return typed::multi_pw_aff<Domain>(res);
42998}
42999
43000template <typename Domain>
43001typed::multi_union_pw_aff<Domain> typed::space<Domain>::zero_multi_union_pw_aff() const
43002{
43003  auto res = isl::space::zero_multi_union_pw_aff();
43004  return typed::multi_union_pw_aff<Domain>(res);
43005}
43006
43007template <typename Domain>
43008typed::multi_val<Domain> typed::space<Domain>::zero_multi_val() const
43009{
43010  auto res = isl::space::zero_multi_val();
43011  return typed::multi_val<Domain>(res);
43012}
43013
43014template <typename Domain, typename Range>
43015typed::space<Domain, Range>::space(const isl::ctx &ctx, const std::string &str)
43016  : isl::space(ctx, str)
43017{
43018}
43019
43020template <typename Domain, typename Range>
43021typed::space<Domain, Range> typed::space<Domain, Range>::add_param(const typed::id<Anonymous> &id) const
43022{
43023  auto res = isl::space::add_param(id);
43024  return typed::space<Domain, Range>(res);
43025}
43026
43027template <typename Domain, typename Range>
43028typed::space<Domain, Range> typed::space<Domain, Range>::add_param(const std::string &id) const
43029{
43030  auto res = isl::space::add_param(id);
43031  return typed::space<Domain, Range>(res);
43032}
43033
43034template <typename Domain, typename Range>
43035typed::space<Domain> typed::space<Domain, Range>::domain() const
43036{
43037  auto res = isl::space::domain();
43038  return typed::space<Domain>(res);
43039}
43040
43041template <typename Domain, typename Range>
43042typed::multi_aff<pair<Domain, Range>, Domain> typed::space<Domain, Range>::domain_map_multi_aff() const
43043{
43044  auto res = isl::space::domain_map_multi_aff();
43045  return typed::multi_aff<pair<Domain, Range>, Domain>(res);
43046}
43047
43048template <typename Domain, typename Range>
43049typed::pw_multi_aff<pair<Domain, Range>, Domain> typed::space<Domain, Range>::domain_map_pw_multi_aff() const
43050{
43051  auto res = isl::space::domain_map_pw_multi_aff();
43052  return typed::pw_multi_aff<pair<Domain, Range>, Domain>(res);
43053}
43054
43055template <typename Domain, typename Range>
43056typed::space<Domain, Range> typed::space<Domain, Range>::drop_all_params() const
43057{
43058  auto res = isl::space::drop_all_params();
43059  return typed::space<Domain, Range>(res);
43060}
43061
43062template <typename Domain, typename Range>
43063typed::multi_aff<Domain, Range> typed::space<Domain, Range>::multi_aff(const typed::aff_list<Domain, Anonymous> &list) const
43064{
43065  auto res = isl::space::multi_aff(list);
43066  return typed::multi_aff<Domain, Range>(res);
43067}
43068
43069template <typename Domain, typename Range>
43070typed::multi_pw_aff<Domain, Range> typed::space<Domain, Range>::multi_pw_aff(const typed::pw_aff_list<Domain, Anonymous> &list) const
43071{
43072  auto res = isl::space::multi_pw_aff(list);
43073  return typed::multi_pw_aff<Domain, Range>(res);
43074}
43075
43076template <typename Domain, typename Range>
43077typed::space<> typed::space<Domain, Range>::params() const
43078{
43079  auto res = isl::space::params();
43080  return typed::space<>(res);
43081}
43082
43083template <typename Domain, typename Range>
43084template <typename Domain2, typename Range2>
43085typed::space<pair<Domain, Domain2>, pair<Range, Range2>> typed::space<Domain, Range>::product(const typed::space<Domain2, Range2> &right) const
43086{
43087  auto res = isl::space::product(right);
43088  return typed::space<pair<Domain, Domain2>, pair<Range, Range2>>(res);
43089}
43090
43091template <typename Domain, typename Range>
43092typed::space<Range> typed::space<Domain, Range>::range() const
43093{
43094  auto res = isl::space::range();
43095  return typed::space<Range>(res);
43096}
43097
43098template <typename Domain, typename Range>
43099typed::multi_aff<pair<Domain, Range>, Range> typed::space<Domain, Range>::range_map_multi_aff() const
43100{
43101  auto res = isl::space::range_map_multi_aff();
43102  return typed::multi_aff<pair<Domain, Range>, Range>(res);
43103}
43104
43105template <typename Domain, typename Range>
43106typed::pw_multi_aff<pair<Domain, Range>, Range> typed::space<Domain, Range>::range_map_pw_multi_aff() const
43107{
43108  auto res = isl::space::range_map_pw_multi_aff();
43109  return typed::pw_multi_aff<pair<Domain, Range>, Range>(res);
43110}
43111
43112template <typename Domain, typename Range>
43113typed::space<Range, Domain> typed::space<Domain, Range>::reverse() const
43114{
43115  auto res = isl::space::reverse();
43116  return typed::space<Range, Domain>(res);
43117}
43118
43119template <typename Domain, typename Range>
43120template <typename Domain2>
43121typed::space<Domain2, Range> typed::space<Domain, Range>::set_domain_tuple(const typed::id<Anonymous> &id) const
43122{
43123  auto res = isl::space::set_domain_tuple(id);
43124  return typed::space<Domain2, Range>(res);
43125}
43126
43127template <typename Domain, typename Range>
43128template <typename Domain2>
43129typed::space<Domain2, Range> typed::space<Domain, Range>::set_domain_tuple(const std::string &id) const
43130{
43131  auto res = isl::space::set_domain_tuple(id);
43132  return typed::space<Domain2, Range>(res);
43133}
43134
43135template <typename Domain, typename Range>
43136template <typename Range2>
43137typed::space<Domain, Range2> typed::space<Domain, Range>::set_range_tuple(const typed::id<Anonymous> &id) const
43138{
43139  auto res = isl::space::set_range_tuple(id);
43140  return typed::space<Domain, Range2>(res);
43141}
43142
43143template <typename Domain, typename Range>
43144template <typename Range2>
43145typed::space<Domain, Range2> typed::space<Domain, Range>::set_range_tuple(const std::string &id) const
43146{
43147  auto res = isl::space::set_range_tuple(id);
43148  return typed::space<Domain, Range2>(res);
43149}
43150
43151template <typename Domain, typename Range>
43152typed::map<Domain, Range> typed::space<Domain, Range>::universe_map() const
43153{
43154  auto res = isl::space::universe_map();
43155  return typed::map<Domain, Range>(res);
43156}
43157
43158template <typename Domain, typename Range>
43159typed::space<pair<Domain, Range>> typed::space<Domain, Range>::wrap() const
43160{
43161  auto res = isl::space::wrap();
43162  return typed::space<pair<Domain, Range>>(res);
43163}
43164
43165template <typename Domain, typename Range>
43166typed::multi_aff<Domain, Range> typed::space<Domain, Range>::zero_multi_aff() const
43167{
43168  auto res = isl::space::zero_multi_aff();
43169  return typed::multi_aff<Domain, Range>(res);
43170}
43171
43172template <typename Domain, typename Range>
43173typed::multi_pw_aff<Domain, Range> typed::space<Domain, Range>::zero_multi_pw_aff() const
43174{
43175  auto res = isl::space::zero_multi_pw_aff();
43176  return typed::multi_pw_aff<Domain, Range>(res);
43177}
43178
43179template <typename Domain, typename Range>
43180typed::multi_union_pw_aff<Domain, Range> typed::space<Domain, Range>::zero_multi_union_pw_aff() const
43181{
43182  auto res = isl::space::zero_multi_union_pw_aff();
43183  return typed::multi_union_pw_aff<Domain, Range>(res);
43184}
43185
43186template <typename Domain, typename Range>
43187typed::space<pair<Domain, Range>>::space(const isl::ctx &ctx, const std::string &str)
43188  : isl::space(ctx, str)
43189{
43190}
43191
43192template <typename Domain, typename Range>
43193template <typename Arg2>
43194typed::space<pair<Domain, Range>, Arg2> typed::space<pair<Domain, Range>>::add_named_tuple(const typed::id<Anonymous> &tuple_id, unsigned int dim) const
43195{
43196  auto res = isl::space::add_named_tuple(tuple_id, dim);
43197  return typed::space<pair<Domain, Range>, Arg2>(res);
43198}
43199
43200template <typename Domain, typename Range>
43201template <typename Arg2>
43202typed::space<pair<Domain, Range>, Arg2> typed::space<pair<Domain, Range>>::add_named_tuple(const std::string &tuple_id, unsigned int dim) const
43203{
43204  auto res = isl::space::add_named_tuple(tuple_id, dim);
43205  return typed::space<pair<Domain, Range>, Arg2>(res);
43206}
43207
43208template <typename Domain, typename Range>
43209typed::space<pair<Domain, Range>> typed::space<pair<Domain, Range>>::add_param(const typed::id<Anonymous> &id) const
43210{
43211  auto res = isl::space::add_param(id);
43212  return typed::space<pair<Domain, Range>>(res);
43213}
43214
43215template <typename Domain, typename Range>
43216typed::space<pair<Domain, Range>> typed::space<pair<Domain, Range>>::add_param(const std::string &id) const
43217{
43218  auto res = isl::space::add_param(id);
43219  return typed::space<pair<Domain, Range>>(res);
43220}
43221
43222template <typename Domain, typename Range>
43223template <typename Arg2>
43224typed::space<pair<Domain, Range>, Arg2> typed::space<pair<Domain, Range>>::add_unnamed_tuple(unsigned int dim) const
43225{
43226  auto res = isl::space::add_unnamed_tuple(dim);
43227  return typed::space<pair<Domain, Range>, Arg2>(res);
43228}
43229
43230template <typename Domain, typename Range>
43231typed::space<> typed::space<pair<Domain, Range>>::domain() const
43232{
43233  auto res = isl::space::domain();
43234  return typed::space<>(res);
43235}
43236
43237template <typename Domain, typename Range>
43238typed::space<pair<Domain, Range>> typed::space<pair<Domain, Range>>::drop_all_params() const
43239{
43240  auto res = isl::space::drop_all_params();
43241  return typed::space<pair<Domain, Range>>(res);
43242}
43243
43244template <typename Domain, typename Range>
43245typed::multi_aff<pair<Domain, Range>, pair<Domain, Range>> typed::space<pair<Domain, Range>>::identity_multi_aff_on_domain() const
43246{
43247  auto res = isl::space::identity_multi_aff_on_domain();
43248  return typed::multi_aff<pair<Domain, Range>, pair<Domain, Range>>(res);
43249}
43250
43251template <typename Domain, typename Range>
43252typed::multi_pw_aff<pair<Domain, Range>, pair<Domain, Range>> typed::space<pair<Domain, Range>>::identity_multi_pw_aff_on_domain() const
43253{
43254  auto res = isl::space::identity_multi_pw_aff_on_domain();
43255  return typed::multi_pw_aff<pair<Domain, Range>, pair<Domain, Range>>(res);
43256}
43257
43258template <typename Domain, typename Range>
43259typed::pw_multi_aff<pair<Domain, Range>, pair<Domain, Range>> typed::space<pair<Domain, Range>>::identity_pw_multi_aff_on_domain() const
43260{
43261  auto res = isl::space::identity_pw_multi_aff_on_domain();
43262  return typed::pw_multi_aff<pair<Domain, Range>, pair<Domain, Range>>(res);
43263}
43264
43265template <typename Domain, typename Range>
43266typed::space<pair<Domain, Range>, pair<Domain, Range>> typed::space<pair<Domain, Range>>::map_from_set() const
43267{
43268  auto res = isl::space::map_from_set();
43269  return typed::space<pair<Domain, Range>, pair<Domain, Range>>(res);
43270}
43271
43272template <typename Domain, typename Range>
43273typed::multi_aff<pair<Domain, Range>> typed::space<pair<Domain, Range>>::multi_aff(const typed::aff_list<Anonymous> &list) const
43274{
43275  auto res = isl::space::multi_aff(list);
43276  return typed::multi_aff<pair<Domain, Range>>(res);
43277}
43278
43279template <typename Domain, typename Range>
43280template <typename Arg2>
43281typed::multi_aff<pair<Domain, Range>, Arg2> typed::space<pair<Domain, Range>>::multi_aff_on_domain(const typed::multi_val<Arg2> &mv) const
43282{
43283  auto res = isl::space::multi_aff_on_domain(mv);
43284  return typed::multi_aff<pair<Domain, Range>, Arg2>(res);
43285}
43286
43287template <typename Domain, typename Range>
43288typed::multi_id<pair<Domain, Range>> typed::space<pair<Domain, Range>>::multi_id(const typed::id_list<Anonymous> &list) const
43289{
43290  auto res = isl::space::multi_id(list);
43291  return typed::multi_id<pair<Domain, Range>>(res);
43292}
43293
43294template <typename Domain, typename Range>
43295typed::multi_pw_aff<pair<Domain, Range>> typed::space<pair<Domain, Range>>::multi_pw_aff(const typed::pw_aff_list<Anonymous> &list) const
43296{
43297  auto res = isl::space::multi_pw_aff(list);
43298  return typed::multi_pw_aff<pair<Domain, Range>>(res);
43299}
43300
43301template <typename Domain, typename Range>
43302typed::multi_union_pw_aff<pair<Domain, Range>> typed::space<pair<Domain, Range>>::multi_union_pw_aff(const typed::union_pw_aff_list<Anonymous> &list) const
43303{
43304  auto res = isl::space::multi_union_pw_aff(list);
43305  return typed::multi_union_pw_aff<pair<Domain, Range>>(res);
43306}
43307
43308template <typename Domain, typename Range>
43309template <typename Arg2>
43310typed::multi_union_pw_aff<Arg2, pair<Domain, Range>> typed::space<pair<Domain, Range>>::multi_union_pw_aff(const typed::union_pw_aff_list<Arg2, Anonymous> &list) const
43311{
43312  auto res = isl::space::multi_union_pw_aff(list);
43313  return typed::multi_union_pw_aff<Arg2, pair<Domain, Range>>(res);
43314}
43315
43316template <typename Domain, typename Range>
43317typed::multi_val<pair<Domain, Range>> typed::space<pair<Domain, Range>>::multi_val(const typed::val_list<Anonymous> &list) const
43318{
43319  auto res = isl::space::multi_val(list);
43320  return typed::multi_val<pair<Domain, Range>>(res);
43321}
43322
43323template <typename Domain, typename Range>
43324typed::aff<pair<Domain, Range>, Anonymous> typed::space<pair<Domain, Range>>::param_aff_on_domain(const typed::id<Anonymous> &id) const
43325{
43326  auto res = isl::space::param_aff_on_domain(id);
43327  return typed::aff<pair<Domain, Range>, Anonymous>(res);
43328}
43329
43330template <typename Domain, typename Range>
43331typed::aff<pair<Domain, Range>, Anonymous> typed::space<pair<Domain, Range>>::param_aff_on_domain(const std::string &id) const
43332{
43333  auto res = isl::space::param_aff_on_domain(id);
43334  return typed::aff<pair<Domain, Range>, Anonymous>(res);
43335}
43336
43337template <typename Domain, typename Range>
43338typed::space<> typed::space<pair<Domain, Range>>::params() const
43339{
43340  auto res = isl::space::params();
43341  return typed::space<>(res);
43342}
43343
43344template <typename Domain, typename Range>
43345template <typename Arg2>
43346typed::space<pair<pair<Domain, Range>, Arg2>> typed::space<pair<Domain, Range>>::product(const typed::space<Arg2> &right) const
43347{
43348  auto res = isl::space::product(right);
43349  return typed::space<pair<pair<Domain, Range>, Arg2>>(res);
43350}
43351
43352template <typename Domain, typename Range>
43353typed::set<pair<Domain, Range>> typed::space<pair<Domain, Range>>::universe_set() const
43354{
43355  auto res = isl::space::universe_set();
43356  return typed::set<pair<Domain, Range>>(res);
43357}
43358
43359template <typename Domain, typename Range>
43360typed::space<Domain, Range> typed::space<pair<Domain, Range>>::unwrap() const
43361{
43362  auto res = isl::space::unwrap();
43363  return typed::space<Domain, Range>(res);
43364}
43365
43366template <typename Domain, typename Range>
43367typed::space<pair<Range, Domain>> typed::space<pair<Domain, Range>>::wrapped_reverse() const
43368{
43369  auto res = isl::space::wrapped_reverse();
43370  return typed::space<pair<Range, Domain>>(res);
43371}
43372
43373template <typename Domain, typename Range>
43374typed::aff<pair<Domain, Range>, Anonymous> typed::space<pair<Domain, Range>>::zero_aff_on_domain() const
43375{
43376  auto res = isl::space::zero_aff_on_domain();
43377  return typed::aff<pair<Domain, Range>, Anonymous>(res);
43378}
43379
43380template <typename Domain, typename Range>
43381typed::multi_aff<pair<Domain, Range>> typed::space<pair<Domain, Range>>::zero_multi_aff() const
43382{
43383  auto res = isl::space::zero_multi_aff();
43384  return typed::multi_aff<pair<Domain, Range>>(res);
43385}
43386
43387template <typename Domain, typename Range>
43388typed::multi_pw_aff<pair<Domain, Range>> typed::space<pair<Domain, Range>>::zero_multi_pw_aff() const
43389{
43390  auto res = isl::space::zero_multi_pw_aff();
43391  return typed::multi_pw_aff<pair<Domain, Range>>(res);
43392}
43393
43394template <typename Domain, typename Range>
43395typed::multi_union_pw_aff<pair<Domain, Range>> typed::space<pair<Domain, Range>>::zero_multi_union_pw_aff() const
43396{
43397  auto res = isl::space::zero_multi_union_pw_aff();
43398  return typed::multi_union_pw_aff<pair<Domain, Range>>(res);
43399}
43400
43401template <typename Domain, typename Range>
43402typed::multi_val<pair<Domain, Range>> typed::space<pair<Domain, Range>>::zero_multi_val() const
43403{
43404  auto res = isl::space::zero_multi_val();
43405  return typed::multi_val<pair<Domain, Range>>(res);
43406}
43407
43408template <typename Domain, typename Range, typename Range2>
43409typed::space<pair<Domain, Range>, Range2>::space(const isl::ctx &ctx, const std::string &str)
43410  : isl::space(ctx, str)
43411{
43412}
43413
43414template <typename Domain, typename Range, typename Range2>
43415typed::space<pair<Domain, Range>, Range2> typed::space<pair<Domain, Range>, Range2>::add_param(const typed::id<Anonymous> &id) const
43416{
43417  auto res = isl::space::add_param(id);
43418  return typed::space<pair<Domain, Range>, Range2>(res);
43419}
43420
43421template <typename Domain, typename Range, typename Range2>
43422typed::space<pair<Domain, Range>, Range2> typed::space<pair<Domain, Range>, Range2>::add_param(const std::string &id) const
43423{
43424  auto res = isl::space::add_param(id);
43425  return typed::space<pair<Domain, Range>, Range2>(res);
43426}
43427
43428template <typename Domain, typename Range, typename Range2>
43429typed::space<Domain, pair<Range, Range2>> typed::space<pair<Domain, Range>, Range2>::curry() const
43430{
43431  auto res = isl::space::curry();
43432  return typed::space<Domain, pair<Range, Range2>>(res);
43433}
43434
43435template <typename Domain, typename Range, typename Range2>
43436typed::space<pair<Domain, Range>> typed::space<pair<Domain, Range>, Range2>::domain() const
43437{
43438  auto res = isl::space::domain();
43439  return typed::space<pair<Domain, Range>>(res);
43440}
43441
43442template <typename Domain, typename Range, typename Range2>
43443typed::multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> typed::space<pair<Domain, Range>, Range2>::domain_map_multi_aff() const
43444{
43445  auto res = isl::space::domain_map_multi_aff();
43446  return typed::multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>>(res);
43447}
43448
43449template <typename Domain, typename Range, typename Range2>
43450typed::pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> typed::space<pair<Domain, Range>, Range2>::domain_map_pw_multi_aff() const
43451{
43452  auto res = isl::space::domain_map_pw_multi_aff();
43453  return typed::pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>>(res);
43454}
43455
43456template <typename Domain, typename Range, typename Range2>
43457typed::space<pair<Range, Domain>, Range2> typed::space<pair<Domain, Range>, Range2>::domain_reverse() const
43458{
43459  auto res = isl::space::domain_reverse();
43460  return typed::space<pair<Range, Domain>, Range2>(res);
43461}
43462
43463template <typename Domain, typename Range, typename Range2>
43464typed::space<pair<Domain, Range>, Range2> typed::space<pair<Domain, Range>, Range2>::drop_all_params() const
43465{
43466  auto res = isl::space::drop_all_params();
43467  return typed::space<pair<Domain, Range>, Range2>(res);
43468}
43469
43470template <typename Domain, typename Range, typename Range2>
43471typed::space<Anonymous, Range2> typed::space<pair<Domain, Range>, Range2>::flatten_domain() const
43472{
43473  auto res = isl::space::flatten_domain();
43474  return typed::space<Anonymous, Range2>(res);
43475}
43476
43477template <typename Domain, typename Range, typename Range2>
43478typed::multi_aff<pair<Domain, Range>, Range2> typed::space<pair<Domain, Range>, Range2>::multi_aff(const typed::aff_list<pair<Domain, Range>, Anonymous> &list) const
43479{
43480  auto res = isl::space::multi_aff(list);
43481  return typed::multi_aff<pair<Domain, Range>, Range2>(res);
43482}
43483
43484template <typename Domain, typename Range, typename Range2>
43485typed::multi_pw_aff<pair<Domain, Range>, Range2> typed::space<pair<Domain, Range>, Range2>::multi_pw_aff(const typed::pw_aff_list<pair<Domain, Range>, Anonymous> &list) const
43486{
43487  auto res = isl::space::multi_pw_aff(list);
43488  return typed::multi_pw_aff<pair<Domain, Range>, Range2>(res);
43489}
43490
43491template <typename Domain, typename Range, typename Range2>
43492typed::space<> typed::space<pair<Domain, Range>, Range2>::params() const
43493{
43494  auto res = isl::space::params();
43495  return typed::space<>(res);
43496}
43497
43498template <typename Domain, typename Range, typename Range2>
43499template <typename Domain2, typename Arg3>
43500typed::space<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> typed::space<pair<Domain, Range>, Range2>::product(const typed::space<Domain2, Arg3> &right) const
43501{
43502  auto res = isl::space::product(right);
43503  return typed::space<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>>(res);
43504}
43505
43506template <typename Domain, typename Range, typename Range2>
43507typed::space<Range2> typed::space<pair<Domain, Range>, Range2>::range() const
43508{
43509  auto res = isl::space::range();
43510  return typed::space<Range2>(res);
43511}
43512
43513template <typename Domain, typename Range, typename Range2>
43514typed::multi_aff<pair<pair<Domain, Range>, Range2>, Range2> typed::space<pair<Domain, Range>, Range2>::range_map_multi_aff() const
43515{
43516  auto res = isl::space::range_map_multi_aff();
43517  return typed::multi_aff<pair<pair<Domain, Range>, Range2>, Range2>(res);
43518}
43519
43520template <typename Domain, typename Range, typename Range2>
43521typed::pw_multi_aff<pair<pair<Domain, Range>, Range2>, Range2> typed::space<pair<Domain, Range>, Range2>::range_map_pw_multi_aff() const
43522{
43523  auto res = isl::space::range_map_pw_multi_aff();
43524  return typed::pw_multi_aff<pair<pair<Domain, Range>, Range2>, Range2>(res);
43525}
43526
43527template <typename Domain, typename Range, typename Range2>
43528typed::space<Range2, pair<Domain, Range>> typed::space<pair<Domain, Range>, Range2>::reverse() const
43529{
43530  auto res = isl::space::reverse();
43531  return typed::space<Range2, pair<Domain, Range>>(res);
43532}
43533
43534template <typename Domain, typename Range, typename Range2>
43535template <typename Arg2>
43536typed::space<pair<Domain, Range>, Arg2> typed::space<pair<Domain, Range>, Range2>::set_range_tuple(const typed::id<Anonymous> &id) const
43537{
43538  auto res = isl::space::set_range_tuple(id);
43539  return typed::space<pair<Domain, Range>, Arg2>(res);
43540}
43541
43542template <typename Domain, typename Range, typename Range2>
43543template <typename Arg2>
43544typed::space<pair<Domain, Range>, Arg2> typed::space<pair<Domain, Range>, Range2>::set_range_tuple(const std::string &id) const
43545{
43546  auto res = isl::space::set_range_tuple(id);
43547  return typed::space<pair<Domain, Range>, Arg2>(res);
43548}
43549
43550template <typename Domain, typename Range, typename Range2>
43551typed::map<pair<Domain, Range>, Range2> typed::space<pair<Domain, Range>, Range2>::universe_map() const
43552{
43553  auto res = isl::space::universe_map();
43554  return typed::map<pair<Domain, Range>, Range2>(res);
43555}
43556
43557template <typename Domain, typename Range, typename Range2>
43558typed::space<pair<pair<Domain, Range>, Range2>> typed::space<pair<Domain, Range>, Range2>::wrap() const
43559{
43560  auto res = isl::space::wrap();
43561  return typed::space<pair<pair<Domain, Range>, Range2>>(res);
43562}
43563
43564template <typename Domain, typename Range, typename Range2>
43565typed::multi_aff<pair<Domain, Range>, Range2> typed::space<pair<Domain, Range>, Range2>::zero_multi_aff() const
43566{
43567  auto res = isl::space::zero_multi_aff();
43568  return typed::multi_aff<pair<Domain, Range>, Range2>(res);
43569}
43570
43571template <typename Domain, typename Range, typename Range2>
43572typed::multi_pw_aff<pair<Domain, Range>, Range2> typed::space<pair<Domain, Range>, Range2>::zero_multi_pw_aff() const
43573{
43574  auto res = isl::space::zero_multi_pw_aff();
43575  return typed::multi_pw_aff<pair<Domain, Range>, Range2>(res);
43576}
43577
43578template <typename Domain, typename Range, typename Range2>
43579typed::multi_union_pw_aff<pair<Domain, Range>, Range2> typed::space<pair<Domain, Range>, Range2>::zero_multi_union_pw_aff() const
43580{
43581  auto res = isl::space::zero_multi_union_pw_aff();
43582  return typed::multi_union_pw_aff<pair<Domain, Range>, Range2>(res);
43583}
43584
43585template <typename Domain, typename Range, typename Range2>
43586typed::space<Domain, pair<Range, Range2>>::space(const isl::ctx &ctx, const std::string &str)
43587  : isl::space(ctx, str)
43588{
43589}
43590
43591template <typename Domain, typename Range, typename Range2>
43592typed::space<Domain, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::add_param(const typed::id<Anonymous> &id) const
43593{
43594  auto res = isl::space::add_param(id);
43595  return typed::space<Domain, pair<Range, Range2>>(res);
43596}
43597
43598template <typename Domain, typename Range, typename Range2>
43599typed::space<Domain, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::add_param(const std::string &id) const
43600{
43601  auto res = isl::space::add_param(id);
43602  return typed::space<Domain, pair<Range, Range2>>(res);
43603}
43604
43605template <typename Domain, typename Range, typename Range2>
43606typed::space<Domain> typed::space<Domain, pair<Range, Range2>>::domain() const
43607{
43608  auto res = isl::space::domain();
43609  return typed::space<Domain>(res);
43610}
43611
43612template <typename Domain, typename Range, typename Range2>
43613typed::multi_aff<pair<Domain, pair<Range, Range2>>, Domain> typed::space<Domain, pair<Range, Range2>>::domain_map_multi_aff() const
43614{
43615  auto res = isl::space::domain_map_multi_aff();
43616  return typed::multi_aff<pair<Domain, pair<Range, Range2>>, Domain>(res);
43617}
43618
43619template <typename Domain, typename Range, typename Range2>
43620typed::pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain> typed::space<Domain, pair<Range, Range2>>::domain_map_pw_multi_aff() const
43621{
43622  auto res = isl::space::domain_map_pw_multi_aff();
43623  return typed::pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain>(res);
43624}
43625
43626template <typename Domain, typename Range, typename Range2>
43627typed::space<Domain, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::drop_all_params() const
43628{
43629  auto res = isl::space::drop_all_params();
43630  return typed::space<Domain, pair<Range, Range2>>(res);
43631}
43632
43633template <typename Domain, typename Range, typename Range2>
43634typed::space<Domain, Anonymous> typed::space<Domain, pair<Range, Range2>>::flatten_range() const
43635{
43636  auto res = isl::space::flatten_range();
43637  return typed::space<Domain, Anonymous>(res);
43638}
43639
43640template <typename Domain, typename Range, typename Range2>
43641typed::multi_aff<Domain, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::multi_aff(const typed::aff_list<Domain, Anonymous> &list) const
43642{
43643  auto res = isl::space::multi_aff(list);
43644  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
43645}
43646
43647template <typename Domain, typename Range, typename Range2>
43648typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::multi_pw_aff(const typed::pw_aff_list<Domain, Anonymous> &list) const
43649{
43650  auto res = isl::space::multi_pw_aff(list);
43651  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
43652}
43653
43654template <typename Domain, typename Range, typename Range2>
43655typed::space<> typed::space<Domain, pair<Range, Range2>>::params() const
43656{
43657  auto res = isl::space::params();
43658  return typed::space<>(res);
43659}
43660
43661template <typename Domain, typename Range, typename Range2>
43662template <typename Domain2, typename Arg3>
43663typed::space<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::space<Domain, pair<Range, Range2>>::product(const typed::space<Domain2, Arg3> &right) const
43664{
43665  auto res = isl::space::product(right);
43666  return typed::space<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
43667}
43668
43669template <typename Domain, typename Range, typename Range2>
43670typed::space<pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::range() const
43671{
43672  auto res = isl::space::range();
43673  return typed::space<pair<Range, Range2>>(res);
43674}
43675
43676template <typename Domain, typename Range, typename Range2>
43677typed::multi_aff<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::range_map_multi_aff() const
43678{
43679  auto res = isl::space::range_map_multi_aff();
43680  return typed::multi_aff<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>>(res);
43681}
43682
43683template <typename Domain, typename Range, typename Range2>
43684typed::pw_multi_aff<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::range_map_pw_multi_aff() const
43685{
43686  auto res = isl::space::range_map_pw_multi_aff();
43687  return typed::pw_multi_aff<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>>(res);
43688}
43689
43690template <typename Domain, typename Range, typename Range2>
43691typed::space<Domain, pair<Range2, Range>> typed::space<Domain, pair<Range, Range2>>::range_reverse() const
43692{
43693  auto res = isl::space::range_reverse();
43694  return typed::space<Domain, pair<Range2, Range>>(res);
43695}
43696
43697template <typename Domain, typename Range, typename Range2>
43698typed::space<pair<Range, Range2>, Domain> typed::space<Domain, pair<Range, Range2>>::reverse() const
43699{
43700  auto res = isl::space::reverse();
43701  return typed::space<pair<Range, Range2>, Domain>(res);
43702}
43703
43704template <typename Domain, typename Range, typename Range2>
43705template <typename Domain2>
43706typed::space<Domain2, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::set_domain_tuple(const typed::id<Anonymous> &id) const
43707{
43708  auto res = isl::space::set_domain_tuple(id);
43709  return typed::space<Domain2, pair<Range, Range2>>(res);
43710}
43711
43712template <typename Domain, typename Range, typename Range2>
43713template <typename Domain2>
43714typed::space<Domain2, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::set_domain_tuple(const std::string &id) const
43715{
43716  auto res = isl::space::set_domain_tuple(id);
43717  return typed::space<Domain2, pair<Range, Range2>>(res);
43718}
43719
43720template <typename Domain, typename Range, typename Range2>
43721typed::space<pair<Domain, Range>, Range2> typed::space<Domain, pair<Range, Range2>>::uncurry() const
43722{
43723  auto res = isl::space::uncurry();
43724  return typed::space<pair<Domain, Range>, Range2>(res);
43725}
43726
43727template <typename Domain, typename Range, typename Range2>
43728typed::map<Domain, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::universe_map() const
43729{
43730  auto res = isl::space::universe_map();
43731  return typed::map<Domain, pair<Range, Range2>>(res);
43732}
43733
43734template <typename Domain, typename Range, typename Range2>
43735typed::space<pair<Domain, pair<Range, Range2>>> typed::space<Domain, pair<Range, Range2>>::wrap() const
43736{
43737  auto res = isl::space::wrap();
43738  return typed::space<pair<Domain, pair<Range, Range2>>>(res);
43739}
43740
43741template <typename Domain, typename Range, typename Range2>
43742typed::multi_aff<Domain, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::zero_multi_aff() const
43743{
43744  auto res = isl::space::zero_multi_aff();
43745  return typed::multi_aff<Domain, pair<Range, Range2>>(res);
43746}
43747
43748template <typename Domain, typename Range, typename Range2>
43749typed::multi_pw_aff<Domain, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::zero_multi_pw_aff() const
43750{
43751  auto res = isl::space::zero_multi_pw_aff();
43752  return typed::multi_pw_aff<Domain, pair<Range, Range2>>(res);
43753}
43754
43755template <typename Domain, typename Range, typename Range2>
43756typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::space<Domain, pair<Range, Range2>>::zero_multi_union_pw_aff() const
43757{
43758  auto res = isl::space::zero_multi_union_pw_aff();
43759  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
43760}
43761
43762template <typename T1, typename T2, typename Range, typename Range2>
43763typed::space<pair<T1, T2>, pair<Range, Range2>>::space(const isl::ctx &ctx, const std::string &str)
43764  : isl::space(ctx, str)
43765{
43766}
43767
43768template <typename T1, typename T2, typename Range, typename Range2>
43769typed::space<pair<T1, T2>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::add_param(const typed::id<Anonymous> &id) const
43770{
43771  auto res = isl::space::add_param(id);
43772  return typed::space<pair<T1, T2>, pair<Range, Range2>>(res);
43773}
43774
43775template <typename T1, typename T2, typename Range, typename Range2>
43776typed::space<pair<T1, T2>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::add_param(const std::string &id) const
43777{
43778  auto res = isl::space::add_param(id);
43779  return typed::space<pair<T1, T2>, pair<Range, Range2>>(res);
43780}
43781
43782template <typename T1, typename T2, typename Range, typename Range2>
43783typed::space<T1, pair<T2, pair<Range, Range2>>> typed::space<pair<T1, T2>, pair<Range, Range2>>::curry() const
43784{
43785  auto res = isl::space::curry();
43786  return typed::space<T1, pair<T2, pair<Range, Range2>>>(res);
43787}
43788
43789template <typename T1, typename T2, typename Range, typename Range2>
43790typed::space<pair<T1, T2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::domain() const
43791{
43792  auto res = isl::space::domain();
43793  return typed::space<pair<T1, T2>>(res);
43794}
43795
43796template <typename T1, typename T2, typename Range, typename Range2>
43797typed::multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::domain_map_multi_aff() const
43798{
43799  auto res = isl::space::domain_map_multi_aff();
43800  return typed::multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>>(res);
43801}
43802
43803template <typename T1, typename T2, typename Range, typename Range2>
43804typed::pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::domain_map_pw_multi_aff() const
43805{
43806  auto res = isl::space::domain_map_pw_multi_aff();
43807  return typed::pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>>(res);
43808}
43809
43810template <typename T1, typename T2, typename Range, typename Range2>
43811typed::space<pair<T2, T1>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::domain_reverse() const
43812{
43813  auto res = isl::space::domain_reverse();
43814  return typed::space<pair<T2, T1>, pair<Range, Range2>>(res);
43815}
43816
43817template <typename T1, typename T2, typename Range, typename Range2>
43818typed::space<pair<T1, T2>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::drop_all_params() const
43819{
43820  auto res = isl::space::drop_all_params();
43821  return typed::space<pair<T1, T2>, pair<Range, Range2>>(res);
43822}
43823
43824template <typename T1, typename T2, typename Range, typename Range2>
43825typed::space<Anonymous, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::flatten_domain() const
43826{
43827  auto res = isl::space::flatten_domain();
43828  return typed::space<Anonymous, pair<Range, Range2>>(res);
43829}
43830
43831template <typename T1, typename T2, typename Range, typename Range2>
43832typed::space<pair<T1, T2>, Anonymous> typed::space<pair<T1, T2>, pair<Range, Range2>>::flatten_range() const
43833{
43834  auto res = isl::space::flatten_range();
43835  return typed::space<pair<T1, T2>, Anonymous>(res);
43836}
43837
43838template <typename T1, typename T2, typename Range, typename Range2>
43839typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::multi_aff(const typed::aff_list<pair<T1, T2>, Anonymous> &list) const
43840{
43841  auto res = isl::space::multi_aff(list);
43842  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
43843}
43844
43845template <typename T1, typename T2, typename Range, typename Range2>
43846typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::multi_pw_aff(const typed::pw_aff_list<pair<T1, T2>, Anonymous> &list) const
43847{
43848  auto res = isl::space::multi_pw_aff(list);
43849  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
43850}
43851
43852template <typename T1, typename T2, typename Range, typename Range2>
43853typed::space<> typed::space<pair<T1, T2>, pair<Range, Range2>>::params() const
43854{
43855  auto res = isl::space::params();
43856  return typed::space<>(res);
43857}
43858
43859template <typename T1, typename T2, typename Range, typename Range2>
43860template <typename Domain2, typename Arg2>
43861typed::space<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::product(const typed::space<Domain2, Arg2> &right) const
43862{
43863  auto res = isl::space::product(right);
43864  return typed::space<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
43865}
43866
43867template <typename T1, typename T2, typename Range, typename Range2>
43868typed::space<pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::range() const
43869{
43870  auto res = isl::space::range();
43871  return typed::space<pair<Range, Range2>>(res);
43872}
43873
43874template <typename T1, typename T2, typename Range, typename Range2>
43875typed::multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::range_map_multi_aff() const
43876{
43877  auto res = isl::space::range_map_multi_aff();
43878  return typed::multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>>(res);
43879}
43880
43881template <typename T1, typename T2, typename Range, typename Range2>
43882typed::pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::range_map_pw_multi_aff() const
43883{
43884  auto res = isl::space::range_map_pw_multi_aff();
43885  return typed::pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>>(res);
43886}
43887
43888template <typename T1, typename T2, typename Range, typename Range2>
43889typed::space<pair<T1, T2>, pair<Range2, Range>> typed::space<pair<T1, T2>, pair<Range, Range2>>::range_reverse() const
43890{
43891  auto res = isl::space::range_reverse();
43892  return typed::space<pair<T1, T2>, pair<Range2, Range>>(res);
43893}
43894
43895template <typename T1, typename T2, typename Range, typename Range2>
43896typed::space<pair<Range, Range2>, pair<T1, T2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::reverse() const
43897{
43898  auto res = isl::space::reverse();
43899  return typed::space<pair<Range, Range2>, pair<T1, T2>>(res);
43900}
43901
43902template <typename T1, typename T2, typename Range, typename Range2>
43903typed::space<pair<pair<T1, T2>, Range>, Range2> typed::space<pair<T1, T2>, pair<Range, Range2>>::uncurry() const
43904{
43905  auto res = isl::space::uncurry();
43906  return typed::space<pair<pair<T1, T2>, Range>, Range2>(res);
43907}
43908
43909template <typename T1, typename T2, typename Range, typename Range2>
43910typed::map<pair<T1, T2>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::universe_map() const
43911{
43912  auto res = isl::space::universe_map();
43913  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
43914}
43915
43916template <typename T1, typename T2, typename Range, typename Range2>
43917typed::space<pair<pair<T1, T2>, pair<Range, Range2>>> typed::space<pair<T1, T2>, pair<Range, Range2>>::wrap() const
43918{
43919  auto res = isl::space::wrap();
43920  return typed::space<pair<pair<T1, T2>, pair<Range, Range2>>>(res);
43921}
43922
43923template <typename T1, typename T2, typename Range, typename Range2>
43924typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::zero_multi_aff() const
43925{
43926  auto res = isl::space::zero_multi_aff();
43927  return typed::multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
43928}
43929
43930template <typename T1, typename T2, typename Range, typename Range2>
43931typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::zero_multi_pw_aff() const
43932{
43933  auto res = isl::space::zero_multi_pw_aff();
43934  return typed::multi_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
43935}
43936
43937template <typename T1, typename T2, typename Range, typename Range2>
43938typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::space<pair<T1, T2>, pair<Range, Range2>>::zero_multi_union_pw_aff() const
43939{
43940  auto res = isl::space::zero_multi_union_pw_aff();
43941  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
43942}
43943
43944template <typename Domain, typename Range>
43945typed::union_map<Domain, Range>::union_map(const typed::basic_map<Domain, Range> &bmap)
43946  : isl::union_map(bmap)
43947{
43948}
43949
43950template <typename Domain, typename Range>
43951typed::union_map<Domain, Range>::union_map(const typed::map<Domain, Range> &map)
43952  : isl::union_map(map)
43953{
43954}
43955
43956template <typename Domain, typename Range>
43957typed::union_map<Domain, Range>::union_map(const isl::ctx &ctx, const std::string &str)
43958  : isl::union_map(ctx, str)
43959{
43960}
43961
43962template <typename Domain, typename Range>
43963template <typename Domain2>
43964typed::union_map<Domain2, Range> typed::union_map<Domain, Range>::apply_domain(const typed::union_map<Domain, Domain2> &umap2) const
43965{
43966  auto res = isl::union_map::apply_domain(umap2);
43967  return typed::union_map<Domain2, Range>(res);
43968}
43969
43970template <typename Domain, typename Range>
43971template <typename Domain2>
43972typed::union_map<Domain2, Range> typed::union_map<Domain, Range>::apply_domain(const typed::basic_map<Domain, Domain2> &umap2) const
43973{
43974  auto res = isl::union_map::apply_domain(umap2);
43975  return typed::union_map<Domain2, Range>(res);
43976}
43977
43978template <typename Domain, typename Range>
43979template <typename Domain2>
43980typed::union_map<Domain2, Range> typed::union_map<Domain, Range>::apply_domain(const typed::map<Domain, Domain2> &umap2) const
43981{
43982  auto res = isl::union_map::apply_domain(umap2);
43983  return typed::union_map<Domain2, Range>(res);
43984}
43985
43986template <typename Domain, typename Range>
43987template <typename Range2>
43988typed::union_map<Domain, Range2> typed::union_map<Domain, Range>::apply_range(const typed::union_map<Range, Range2> &umap2) const
43989{
43990  auto res = isl::union_map::apply_range(umap2);
43991  return typed::union_map<Domain, Range2>(res);
43992}
43993
43994template <typename Domain, typename Range>
43995template <typename Range2>
43996typed::union_map<Domain, Range2> typed::union_map<Domain, Range>::apply_range(const typed::basic_map<Range, Range2> &umap2) const
43997{
43998  auto res = isl::union_map::apply_range(umap2);
43999  return typed::union_map<Domain, Range2>(res);
44000}
44001
44002template <typename Domain, typename Range>
44003template <typename Range2>
44004typed::union_map<Domain, Range2> typed::union_map<Domain, Range>::apply_range(const typed::map<Range, Range2> &umap2) const
44005{
44006  auto res = isl::union_map::apply_range(umap2);
44007  return typed::union_map<Domain, Range2>(res);
44008}
44009
44010template <typename Domain, typename Range>
44011typed::map<Domain, Range> typed::union_map<Domain, Range>::as_map() const
44012{
44013  auto res = isl::union_map::as_map();
44014  return typed::map<Domain, Range>(res);
44015}
44016
44017template <typename Domain, typename Range>
44018typed::multi_union_pw_aff<Domain, Range> typed::union_map<Domain, Range>::as_multi_union_pw_aff() const
44019{
44020  auto res = isl::union_map::as_multi_union_pw_aff();
44021  return typed::multi_union_pw_aff<Domain, Range>(res);
44022}
44023
44024template <typename Domain, typename Range>
44025typed::union_pw_multi_aff<Domain, Range> typed::union_map<Domain, Range>::as_union_pw_multi_aff() const
44026{
44027  auto res = isl::union_map::as_union_pw_multi_aff();
44028  return typed::union_pw_multi_aff<Domain, Range>(res);
44029}
44030
44031template <typename Domain, typename Range>
44032typed::union_set<Domain> typed::union_map<Domain, Range>::bind_range(const typed::multi_id<Range> &tuple) const
44033{
44034  auto res = isl::union_map::bind_range(tuple);
44035  return typed::union_set<Domain>(res);
44036}
44037
44038template <typename Domain, typename Range>
44039typed::union_map<Domain, Range> typed::union_map<Domain, Range>::coalesce() const
44040{
44041  auto res = isl::union_map::coalesce();
44042  return typed::union_map<Domain, Range>(res);
44043}
44044
44045template <typename Domain, typename Range>
44046typed::union_map<Domain, Range> typed::union_map<Domain, Range>::detect_equalities() const
44047{
44048  auto res = isl::union_map::detect_equalities();
44049  return typed::union_map<Domain, Range>(res);
44050}
44051
44052template <typename Domain, typename Range>
44053typed::union_set<Domain> typed::union_map<Domain, Range>::domain() const
44054{
44055  auto res = isl::union_map::domain();
44056  return typed::union_set<Domain>(res);
44057}
44058
44059template <typename Domain, typename Range>
44060typed::union_map<pair<Domain, Range>, Domain> typed::union_map<Domain, Range>::domain_map() const
44061{
44062  auto res = isl::union_map::domain_map();
44063  return typed::union_map<pair<Domain, Range>, Domain>(res);
44064}
44065
44066template <typename Domain, typename Range>
44067typed::union_pw_multi_aff<pair<Domain, Range>, Domain> typed::union_map<Domain, Range>::domain_map_union_pw_multi_aff() const
44068{
44069  auto res = isl::union_map::domain_map_union_pw_multi_aff();
44070  return typed::union_pw_multi_aff<pair<Domain, Range>, Domain>(res);
44071}
44072
44073template <typename Domain, typename Range>
44074template <typename Domain2>
44075typed::union_map<pair<Domain, Domain2>, Range> typed::union_map<Domain, Range>::domain_product(const typed::union_map<Domain2, Range> &umap2) const
44076{
44077  auto res = isl::union_map::domain_product(umap2);
44078  return typed::union_map<pair<Domain, Domain2>, Range>(res);
44079}
44080
44081template <typename Domain, typename Range>
44082template <typename Domain2>
44083typed::union_map<pair<Domain, Domain2>, Range> typed::union_map<Domain, Range>::domain_product(const typed::basic_map<Domain2, Range> &umap2) const
44084{
44085  auto res = isl::union_map::domain_product(umap2);
44086  return typed::union_map<pair<Domain, Domain2>, Range>(res);
44087}
44088
44089template <typename Domain, typename Range>
44090template <typename Domain2>
44091typed::union_map<pair<Domain, Domain2>, Range> typed::union_map<Domain, Range>::domain_product(const typed::map<Domain2, Range> &umap2) const
44092{
44093  auto res = isl::union_map::domain_product(umap2);
44094  return typed::union_map<pair<Domain, Domain2>, Range>(res);
44095}
44096
44097template <typename Domain, typename Range>
44098typed::union_map<Domain, Range> typed::union_map<Domain, Range>::drop_unused_params() const
44099{
44100  auto res = isl::union_map::drop_unused_params();
44101  return typed::union_map<Domain, Range>(res);
44102}
44103
44104template <typename Domain, typename Range>
44105typed::union_map<Domain, Range> typed::union_map<Domain, Range>::empty(const isl::ctx &ctx)
44106{
44107  auto res = isl::union_map::empty(ctx);
44108  return typed::union_map<Domain, Range>(res);
44109}
44110
44111template <typename Domain, typename Range>
44112bool typed::union_map<Domain, Range>::every_map(const std::function<bool(typed::map<Domain, Range>)> &test) const
44113{
44114  auto lambda_test = [&] (isl::map arg0) {
44115    return test(typed::map<Domain, Range>(arg0));
44116  };
44117  return isl::union_map::every_map(lambda_test);
44118}
44119
44120template <typename Domain, typename Range>
44121typed::map<Domain, Range> typed::union_map<Domain, Range>::extract_map(const typed::space<Domain, Range> &space) const
44122{
44123  auto res = isl::union_map::extract_map(space);
44124  return typed::map<Domain, Range>(res);
44125}
44126
44127template <typename Domain, typename Range>
44128void typed::union_map<Domain, Range>::foreach_map(const std::function<void(typed::map<Domain, Range>)> &fn) const
44129{
44130  auto lambda_fn = [&] (isl::map arg0) {
44131    return fn(typed::map<Domain, Range>(arg0));
44132  };
44133  return isl::union_map::foreach_map(lambda_fn);
44134}
44135
44136template <typename Domain, typename Range>
44137typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist(const typed::union_map<Domain, Range> &context) const
44138{
44139  auto res = isl::union_map::gist(context);
44140  return typed::union_map<Domain, Range>(res);
44141}
44142
44143template <typename Domain, typename Range>
44144typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist(const typed::basic_map<Domain, Range> &context) const
44145{
44146  auto res = isl::union_map::gist(context);
44147  return typed::union_map<Domain, Range>(res);
44148}
44149
44150template <typename Domain, typename Range>
44151typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist(const typed::map<Domain, Range> &context) const
44152{
44153  auto res = isl::union_map::gist(context);
44154  return typed::union_map<Domain, Range>(res);
44155}
44156
44157template <typename Domain, typename Range>
44158typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist_domain(const typed::union_set<Domain> &uset) const
44159{
44160  auto res = isl::union_map::gist_domain(uset);
44161  return typed::union_map<Domain, Range>(res);
44162}
44163
44164template <typename Domain, typename Range>
44165typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist_domain(const typed::basic_set<Domain> &uset) const
44166{
44167  auto res = isl::union_map::gist_domain(uset);
44168  return typed::union_map<Domain, Range>(res);
44169}
44170
44171template <typename Domain, typename Range>
44172typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist_domain(const typed::point<Domain> &uset) const
44173{
44174  auto res = isl::union_map::gist_domain(uset);
44175  return typed::union_map<Domain, Range>(res);
44176}
44177
44178template <typename Domain, typename Range>
44179typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist_domain(const typed::set<Domain> &uset) const
44180{
44181  auto res = isl::union_map::gist_domain(uset);
44182  return typed::union_map<Domain, Range>(res);
44183}
44184
44185template <typename Domain, typename Range>
44186typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist_params(const typed::set<> &set) const
44187{
44188  auto res = isl::union_map::gist_params(set);
44189  return typed::union_map<Domain, Range>(res);
44190}
44191
44192template <typename Domain, typename Range>
44193typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist_params(const typed::basic_set<> &set) const
44194{
44195  auto res = isl::union_map::gist_params(set);
44196  return typed::union_map<Domain, Range>(res);
44197}
44198
44199template <typename Domain, typename Range>
44200typed::union_map<Domain, Range> typed::union_map<Domain, Range>::gist_params(const typed::point<> &set) const
44201{
44202  auto res = isl::union_map::gist_params(set);
44203  return typed::union_map<Domain, Range>(res);
44204}
44205
44206template <typename Domain, typename Range>
44207typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect(const typed::union_map<Domain, Range> &umap2) const
44208{
44209  auto res = isl::union_map::intersect(umap2);
44210  return typed::union_map<Domain, Range>(res);
44211}
44212
44213template <typename Domain, typename Range>
44214typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect(const typed::basic_map<Domain, Range> &umap2) const
44215{
44216  auto res = isl::union_map::intersect(umap2);
44217  return typed::union_map<Domain, Range>(res);
44218}
44219
44220template <typename Domain, typename Range>
44221typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect(const typed::map<Domain, Range> &umap2) const
44222{
44223  auto res = isl::union_map::intersect(umap2);
44224  return typed::union_map<Domain, Range>(res);
44225}
44226
44227template <typename Domain, typename Range>
44228typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect_domain(const typed::space<Domain> &space) const
44229{
44230  auto res = isl::union_map::intersect_domain(space);
44231  return typed::union_map<Domain, Range>(res);
44232}
44233
44234template <typename Domain, typename Range>
44235typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect_domain(const typed::union_set<Domain> &uset) const
44236{
44237  auto res = isl::union_map::intersect_domain(uset);
44238  return typed::union_map<Domain, Range>(res);
44239}
44240
44241template <typename Domain, typename Range>
44242typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect_params(const typed::set<> &set) const
44243{
44244  auto res = isl::union_map::intersect_params(set);
44245  return typed::union_map<Domain, Range>(res);
44246}
44247
44248template <typename Domain, typename Range>
44249typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect_params(const typed::basic_set<> &set) const
44250{
44251  auto res = isl::union_map::intersect_params(set);
44252  return typed::union_map<Domain, Range>(res);
44253}
44254
44255template <typename Domain, typename Range>
44256typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect_params(const typed::point<> &set) const
44257{
44258  auto res = isl::union_map::intersect_params(set);
44259  return typed::union_map<Domain, Range>(res);
44260}
44261
44262template <typename Domain, typename Range>
44263typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect_range(const typed::space<Range> &space) const
44264{
44265  auto res = isl::union_map::intersect_range(space);
44266  return typed::union_map<Domain, Range>(res);
44267}
44268
44269template <typename Domain, typename Range>
44270typed::union_map<Domain, Range> typed::union_map<Domain, Range>::intersect_range(const typed::union_set<Range> &uset) const
44271{
44272  auto res = isl::union_map::intersect_range(uset);
44273  return typed::union_map<Domain, Range>(res);
44274}
44275
44276template <typename Domain, typename Range>
44277typed::union_map<Domain, Range> typed::union_map<Domain, Range>::lexmax() const
44278{
44279  auto res = isl::union_map::lexmax();
44280  return typed::union_map<Domain, Range>(res);
44281}
44282
44283template <typename Domain, typename Range>
44284typed::union_map<Domain, Range> typed::union_map<Domain, Range>::lexmin() const
44285{
44286  auto res = isl::union_map::lexmin();
44287  return typed::union_map<Domain, Range>(res);
44288}
44289
44290template <typename Domain, typename Range>
44291typed::map_list<Domain, Range> typed::union_map<Domain, Range>::map_list() const
44292{
44293  auto res = isl::union_map::map_list();
44294  return typed::map_list<Domain, Range>(res);
44295}
44296
44297template <typename Domain, typename Range>
44298typed::set<> typed::union_map<Domain, Range>::params() const
44299{
44300  auto res = isl::union_map::params();
44301  return typed::set<>(res);
44302}
44303
44304template <typename Domain, typename Range>
44305template <typename Domain2>
44306typed::union_map<Domain2, Range> typed::union_map<Domain, Range>::preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const
44307{
44308  auto res = isl::union_map::preimage_domain(ma);
44309  return typed::union_map<Domain2, Range>(res);
44310}
44311
44312template <typename Domain, typename Range>
44313template <typename Domain2>
44314typed::union_map<Domain2, Range> typed::union_map<Domain, Range>::preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
44315{
44316  auto res = isl::union_map::preimage_domain(mpa);
44317  return typed::union_map<Domain2, Range>(res);
44318}
44319
44320template <typename Domain, typename Range>
44321template <typename Domain2>
44322typed::union_map<Domain2, Range> typed::union_map<Domain, Range>::preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const
44323{
44324  auto res = isl::union_map::preimage_domain(pma);
44325  return typed::union_map<Domain2, Range>(res);
44326}
44327
44328template <typename Domain, typename Range>
44329template <typename Domain2>
44330typed::union_map<Domain2, Range> typed::union_map<Domain, Range>::preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
44331{
44332  auto res = isl::union_map::preimage_domain(upma);
44333  return typed::union_map<Domain2, Range>(res);
44334}
44335
44336template <typename Domain, typename Range>
44337template <typename Range2>
44338typed::union_map<Domain, Range2> typed::union_map<Domain, Range>::preimage_range(const typed::multi_aff<Range2, Range> &ma) const
44339{
44340  auto res = isl::union_map::preimage_range(ma);
44341  return typed::union_map<Domain, Range2>(res);
44342}
44343
44344template <typename Domain, typename Range>
44345template <typename Range2>
44346typed::union_map<Domain, Range2> typed::union_map<Domain, Range>::preimage_range(const typed::pw_multi_aff<Range2, Range> &pma) const
44347{
44348  auto res = isl::union_map::preimage_range(pma);
44349  return typed::union_map<Domain, Range2>(res);
44350}
44351
44352template <typename Domain, typename Range>
44353template <typename Range2>
44354typed::union_map<Domain, Range2> typed::union_map<Domain, Range>::preimage_range(const typed::union_pw_multi_aff<Range2, Range> &upma) const
44355{
44356  auto res = isl::union_map::preimage_range(upma);
44357  return typed::union_map<Domain, Range2>(res);
44358}
44359
44360template <typename Domain, typename Range>
44361template <typename Domain2, typename Range2>
44362typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::union_map<Domain, Range>::product(const typed::union_map<Domain2, Range2> &umap2) const
44363{
44364  auto res = isl::union_map::product(umap2);
44365  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
44366}
44367
44368template <typename Domain, typename Range>
44369template <typename Domain2, typename Range2>
44370typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::union_map<Domain, Range>::product(const typed::basic_map<Domain2, Range2> &umap2) const
44371{
44372  auto res = isl::union_map::product(umap2);
44373  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
44374}
44375
44376template <typename Domain, typename Range>
44377template <typename Domain2, typename Range2>
44378typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::union_map<Domain, Range>::product(const typed::map<Domain2, Range2> &umap2) const
44379{
44380  auto res = isl::union_map::product(umap2);
44381  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
44382}
44383
44384template <typename Domain, typename Range>
44385typed::union_map<Domain, Range> typed::union_map<Domain, Range>::project_out_all_params() const
44386{
44387  auto res = isl::union_map::project_out_all_params();
44388  return typed::union_map<Domain, Range>(res);
44389}
44390
44391template <typename Domain, typename Range>
44392typed::union_map<Domain, Range> typed::union_map<Domain, Range>::project_out_param(const typed::id<Anonymous> &id) const
44393{
44394  auto res = isl::union_map::project_out_param(id);
44395  return typed::union_map<Domain, Range>(res);
44396}
44397
44398template <typename Domain, typename Range>
44399typed::union_map<Domain, Range> typed::union_map<Domain, Range>::project_out_param(const std::string &id) const
44400{
44401  auto res = isl::union_map::project_out_param(id);
44402  return typed::union_map<Domain, Range>(res);
44403}
44404
44405template <typename Domain, typename Range>
44406typed::union_map<Domain, Range> typed::union_map<Domain, Range>::project_out_param(const typed::id_list<Anonymous> &list) const
44407{
44408  auto res = isl::union_map::project_out_param(list);
44409  return typed::union_map<Domain, Range>(res);
44410}
44411
44412template <typename Domain, typename Range>
44413typed::union_set<Range> typed::union_map<Domain, Range>::range() const
44414{
44415  auto res = isl::union_map::range();
44416  return typed::union_set<Range>(res);
44417}
44418
44419template <typename Domain, typename Range>
44420typed::union_map<pair<Domain, Range>, Range> typed::union_map<Domain, Range>::range_map() const
44421{
44422  auto res = isl::union_map::range_map();
44423  return typed::union_map<pair<Domain, Range>, Range>(res);
44424}
44425
44426template <typename Domain, typename Range>
44427template <typename Range2>
44428typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, Range>::range_product(const typed::union_map<Domain, Range2> &umap2) const
44429{
44430  auto res = isl::union_map::range_product(umap2);
44431  return typed::union_map<Domain, pair<Range, Range2>>(res);
44432}
44433
44434template <typename Domain, typename Range>
44435template <typename Range2>
44436typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, Range>::range_product(const typed::basic_map<Domain, Range2> &umap2) const
44437{
44438  auto res = isl::union_map::range_product(umap2);
44439  return typed::union_map<Domain, pair<Range, Range2>>(res);
44440}
44441
44442template <typename Domain, typename Range>
44443template <typename Range2>
44444typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, Range>::range_product(const typed::map<Domain, Range2> &umap2) const
44445{
44446  auto res = isl::union_map::range_product(umap2);
44447  return typed::union_map<Domain, pair<Range, Range2>>(res);
44448}
44449
44450template <typename Domain, typename Range>
44451typed::union_map<Range, Domain> typed::union_map<Domain, Range>::reverse() const
44452{
44453  auto res = isl::union_map::reverse();
44454  return typed::union_map<Range, Domain>(res);
44455}
44456
44457template <typename Domain, typename Range>
44458typed::space<> typed::union_map<Domain, Range>::space() const
44459{
44460  auto res = isl::union_map::space();
44461  return typed::space<>(res);
44462}
44463
44464template <typename Domain, typename Range>
44465typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract(const typed::union_map<Domain, Range> &umap2) const
44466{
44467  auto res = isl::union_map::subtract(umap2);
44468  return typed::union_map<Domain, Range>(res);
44469}
44470
44471template <typename Domain, typename Range>
44472typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract(const typed::basic_map<Domain, Range> &umap2) const
44473{
44474  auto res = isl::union_map::subtract(umap2);
44475  return typed::union_map<Domain, Range>(res);
44476}
44477
44478template <typename Domain, typename Range>
44479typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract(const typed::map<Domain, Range> &umap2) const
44480{
44481  auto res = isl::union_map::subtract(umap2);
44482  return typed::union_map<Domain, Range>(res);
44483}
44484
44485template <typename Domain, typename Range>
44486typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract_domain(const typed::union_set<Domain> &dom) const
44487{
44488  auto res = isl::union_map::subtract_domain(dom);
44489  return typed::union_map<Domain, Range>(res);
44490}
44491
44492template <typename Domain, typename Range>
44493typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract_domain(const typed::basic_set<Domain> &dom) const
44494{
44495  auto res = isl::union_map::subtract_domain(dom);
44496  return typed::union_map<Domain, Range>(res);
44497}
44498
44499template <typename Domain, typename Range>
44500typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract_domain(const typed::point<Domain> &dom) const
44501{
44502  auto res = isl::union_map::subtract_domain(dom);
44503  return typed::union_map<Domain, Range>(res);
44504}
44505
44506template <typename Domain, typename Range>
44507typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract_domain(const typed::set<Domain> &dom) const
44508{
44509  auto res = isl::union_map::subtract_domain(dom);
44510  return typed::union_map<Domain, Range>(res);
44511}
44512
44513template <typename Domain, typename Range>
44514typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract_range(const typed::union_set<Range> &dom) const
44515{
44516  auto res = isl::union_map::subtract_range(dom);
44517  return typed::union_map<Domain, Range>(res);
44518}
44519
44520template <typename Domain, typename Range>
44521typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract_range(const typed::basic_set<Range> &dom) const
44522{
44523  auto res = isl::union_map::subtract_range(dom);
44524  return typed::union_map<Domain, Range>(res);
44525}
44526
44527template <typename Domain, typename Range>
44528typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract_range(const typed::point<Range> &dom) const
44529{
44530  auto res = isl::union_map::subtract_range(dom);
44531  return typed::union_map<Domain, Range>(res);
44532}
44533
44534template <typename Domain, typename Range>
44535typed::union_map<Domain, Range> typed::union_map<Domain, Range>::subtract_range(const typed::set<Range> &dom) const
44536{
44537  auto res = isl::union_map::subtract_range(dom);
44538  return typed::union_map<Domain, Range>(res);
44539}
44540
44541template <typename Domain, typename Range>
44542typed::union_map<Domain, Range> typed::union_map<Domain, Range>::unite(const typed::union_map<Domain, Range> &umap2) const
44543{
44544  auto res = isl::union_map::unite(umap2);
44545  return typed::union_map<Domain, Range>(res);
44546}
44547
44548template <typename Domain, typename Range>
44549typed::union_map<Domain, Range> typed::union_map<Domain, Range>::unite(const typed::basic_map<Domain, Range> &umap2) const
44550{
44551  auto res = isl::union_map::unite(umap2);
44552  return typed::union_map<Domain, Range>(res);
44553}
44554
44555template <typename Domain, typename Range>
44556typed::union_map<Domain, Range> typed::union_map<Domain, Range>::unite(const typed::map<Domain, Range> &umap2) const
44557{
44558  auto res = isl::union_map::unite(umap2);
44559  return typed::union_map<Domain, Range>(res);
44560}
44561
44562template <typename Domain, typename Range>
44563typed::union_map<Domain, Range> typed::union_map<Domain, Range>::universe() const
44564{
44565  auto res = isl::union_map::universe();
44566  return typed::union_map<Domain, Range>(res);
44567}
44568
44569template <typename Domain, typename Range>
44570typed::union_set<pair<Domain, Range>> typed::union_map<Domain, Range>::wrap() const
44571{
44572  auto res = isl::union_map::wrap();
44573  return typed::union_set<pair<Domain, Range>>(res);
44574}
44575
44576template <typename Domain, typename Range, typename Range2>
44577typed::union_map<pair<Domain, Range>, Range2>::union_map(const typed::basic_map<pair<Domain, Range>, Range2> &bmap)
44578  : isl::union_map(bmap)
44579{
44580}
44581
44582template <typename Domain, typename Range, typename Range2>
44583typed::union_map<pair<Domain, Range>, Range2>::union_map(const typed::map<pair<Domain, Range>, Range2> &map)
44584  : isl::union_map(map)
44585{
44586}
44587
44588template <typename Domain, typename Range, typename Range2>
44589typed::union_map<pair<Domain, Range>, Range2>::union_map(const isl::ctx &ctx, const std::string &str)
44590  : isl::union_map(ctx, str)
44591{
44592}
44593
44594template <typename Domain, typename Range, typename Range2>
44595template <typename Domain2>
44596typed::union_map<Domain2, Range2> typed::union_map<pair<Domain, Range>, Range2>::apply_domain(const typed::union_map<pair<Domain, Range>, Domain2> &umap2) const
44597{
44598  auto res = isl::union_map::apply_domain(umap2);
44599  return typed::union_map<Domain2, Range2>(res);
44600}
44601
44602template <typename Domain, typename Range, typename Range2>
44603template <typename Domain2>
44604typed::union_map<Domain2, Range2> typed::union_map<pair<Domain, Range>, Range2>::apply_domain(const typed::basic_map<pair<Domain, Range>, Domain2> &umap2) const
44605{
44606  auto res = isl::union_map::apply_domain(umap2);
44607  return typed::union_map<Domain2, Range2>(res);
44608}
44609
44610template <typename Domain, typename Range, typename Range2>
44611template <typename Domain2>
44612typed::union_map<Domain2, Range2> typed::union_map<pair<Domain, Range>, Range2>::apply_domain(const typed::map<pair<Domain, Range>, Domain2> &umap2) const
44613{
44614  auto res = isl::union_map::apply_domain(umap2);
44615  return typed::union_map<Domain2, Range2>(res);
44616}
44617
44618template <typename Domain, typename Range, typename Range2>
44619template <typename Arg3>
44620typed::union_map<pair<Domain, Range>, Arg3> typed::union_map<pair<Domain, Range>, Range2>::apply_range(const typed::union_map<Range2, Arg3> &umap2) const
44621{
44622  auto res = isl::union_map::apply_range(umap2);
44623  return typed::union_map<pair<Domain, Range>, Arg3>(res);
44624}
44625
44626template <typename Domain, typename Range, typename Range2>
44627template <typename Arg3>
44628typed::union_map<pair<Domain, Range>, Arg3> typed::union_map<pair<Domain, Range>, Range2>::apply_range(const typed::basic_map<Range2, Arg3> &umap2) const
44629{
44630  auto res = isl::union_map::apply_range(umap2);
44631  return typed::union_map<pair<Domain, Range>, Arg3>(res);
44632}
44633
44634template <typename Domain, typename Range, typename Range2>
44635template <typename Arg3>
44636typed::union_map<pair<Domain, Range>, Arg3> typed::union_map<pair<Domain, Range>, Range2>::apply_range(const typed::map<Range2, Arg3> &umap2) const
44637{
44638  auto res = isl::union_map::apply_range(umap2);
44639  return typed::union_map<pair<Domain, Range>, Arg3>(res);
44640}
44641
44642template <typename Domain, typename Range, typename Range2>
44643typed::map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::as_map() const
44644{
44645  auto res = isl::union_map::as_map();
44646  return typed::map<pair<Domain, Range>, Range2>(res);
44647}
44648
44649template <typename Domain, typename Range, typename Range2>
44650typed::multi_union_pw_aff<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::as_multi_union_pw_aff() const
44651{
44652  auto res = isl::union_map::as_multi_union_pw_aff();
44653  return typed::multi_union_pw_aff<pair<Domain, Range>, Range2>(res);
44654}
44655
44656template <typename Domain, typename Range, typename Range2>
44657typed::union_pw_multi_aff<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::as_union_pw_multi_aff() const
44658{
44659  auto res = isl::union_map::as_union_pw_multi_aff();
44660  return typed::union_pw_multi_aff<pair<Domain, Range>, Range2>(res);
44661}
44662
44663template <typename Domain, typename Range, typename Range2>
44664typed::union_set<pair<Domain, Range>> typed::union_map<pair<Domain, Range>, Range2>::bind_range(const typed::multi_id<Range2> &tuple) const
44665{
44666  auto res = isl::union_map::bind_range(tuple);
44667  return typed::union_set<pair<Domain, Range>>(res);
44668}
44669
44670template <typename Domain, typename Range, typename Range2>
44671typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::coalesce() const
44672{
44673  auto res = isl::union_map::coalesce();
44674  return typed::union_map<pair<Domain, Range>, Range2>(res);
44675}
44676
44677template <typename Domain, typename Range, typename Range2>
44678typed::union_map<Domain, pair<Range, Range2>> typed::union_map<pair<Domain, Range>, Range2>::curry() const
44679{
44680  auto res = isl::union_map::curry();
44681  return typed::union_map<Domain, pair<Range, Range2>>(res);
44682}
44683
44684template <typename Domain, typename Range, typename Range2>
44685typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::detect_equalities() const
44686{
44687  auto res = isl::union_map::detect_equalities();
44688  return typed::union_map<pair<Domain, Range>, Range2>(res);
44689}
44690
44691template <typename Domain, typename Range, typename Range2>
44692typed::union_set<pair<Domain, Range>> typed::union_map<pair<Domain, Range>, Range2>::domain() const
44693{
44694  auto res = isl::union_map::domain();
44695  return typed::union_set<pair<Domain, Range>>(res);
44696}
44697
44698template <typename Domain, typename Range, typename Range2>
44699typed::union_map<Domain, Range2> typed::union_map<pair<Domain, Range>, Range2>::domain_factor_domain() const
44700{
44701  auto res = isl::union_map::domain_factor_domain();
44702  return typed::union_map<Domain, Range2>(res);
44703}
44704
44705template <typename Domain, typename Range, typename Range2>
44706typed::union_map<Range, Range2> typed::union_map<pair<Domain, Range>, Range2>::domain_factor_range() const
44707{
44708  auto res = isl::union_map::domain_factor_range();
44709  return typed::union_map<Range, Range2>(res);
44710}
44711
44712template <typename Domain, typename Range, typename Range2>
44713typed::union_map<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> typed::union_map<pair<Domain, Range>, Range2>::domain_map() const
44714{
44715  auto res = isl::union_map::domain_map();
44716  return typed::union_map<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>>(res);
44717}
44718
44719template <typename Domain, typename Range, typename Range2>
44720typed::union_pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>> typed::union_map<pair<Domain, Range>, Range2>::domain_map_union_pw_multi_aff() const
44721{
44722  auto res = isl::union_map::domain_map_union_pw_multi_aff();
44723  return typed::union_pw_multi_aff<pair<pair<Domain, Range>, Range2>, pair<Domain, Range>>(res);
44724}
44725
44726template <typename Domain, typename Range, typename Range2>
44727template <typename Domain2>
44728typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> typed::union_map<pair<Domain, Range>, Range2>::domain_product(const typed::union_map<Domain2, Range2> &umap2) const
44729{
44730  auto res = isl::union_map::domain_product(umap2);
44731  return typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2>(res);
44732}
44733
44734template <typename Domain, typename Range, typename Range2>
44735template <typename Domain2>
44736typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> typed::union_map<pair<Domain, Range>, Range2>::domain_product(const typed::basic_map<Domain2, Range2> &umap2) const
44737{
44738  auto res = isl::union_map::domain_product(umap2);
44739  return typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2>(res);
44740}
44741
44742template <typename Domain, typename Range, typename Range2>
44743template <typename Domain2>
44744typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2> typed::union_map<pair<Domain, Range>, Range2>::domain_product(const typed::map<Domain2, Range2> &umap2) const
44745{
44746  auto res = isl::union_map::domain_product(umap2);
44747  return typed::union_map<pair<pair<Domain, Range>, Domain2>, Range2>(res);
44748}
44749
44750template <typename Domain, typename Range, typename Range2>
44751typed::union_map<pair<Range, Domain>, Range2> typed::union_map<pair<Domain, Range>, Range2>::domain_reverse() const
44752{
44753  auto res = isl::union_map::domain_reverse();
44754  return typed::union_map<pair<Range, Domain>, Range2>(res);
44755}
44756
44757template <typename Domain, typename Range, typename Range2>
44758typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::drop_unused_params() const
44759{
44760  auto res = isl::union_map::drop_unused_params();
44761  return typed::union_map<pair<Domain, Range>, Range2>(res);
44762}
44763
44764template <typename Domain, typename Range, typename Range2>
44765typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::empty(const isl::ctx &ctx)
44766{
44767  auto res = isl::union_map::empty(ctx);
44768  return typed::union_map<pair<Domain, Range>, Range2>(res);
44769}
44770
44771template <typename Domain, typename Range, typename Range2>
44772bool typed::union_map<pair<Domain, Range>, Range2>::every_map(const std::function<bool(typed::map<pair<Domain, Range>, Range2>)> &test) const
44773{
44774  auto lambda_test = [&] (isl::map arg0) {
44775    return test(typed::map<pair<Domain, Range>, Range2>(arg0));
44776  };
44777  return isl::union_map::every_map(lambda_test);
44778}
44779
44780template <typename Domain, typename Range, typename Range2>
44781typed::map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::extract_map(const typed::space<pair<Domain, Range>, Range2> &space) const
44782{
44783  auto res = isl::union_map::extract_map(space);
44784  return typed::map<pair<Domain, Range>, Range2>(res);
44785}
44786
44787template <typename Domain, typename Range, typename Range2>
44788void typed::union_map<pair<Domain, Range>, Range2>::foreach_map(const std::function<void(typed::map<pair<Domain, Range>, Range2>)> &fn) const
44789{
44790  auto lambda_fn = [&] (isl::map arg0) {
44791    return fn(typed::map<pair<Domain, Range>, Range2>(arg0));
44792  };
44793  return isl::union_map::foreach_map(lambda_fn);
44794}
44795
44796template <typename Domain, typename Range, typename Range2>
44797typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist(const typed::union_map<pair<Domain, Range>, Range2> &context) const
44798{
44799  auto res = isl::union_map::gist(context);
44800  return typed::union_map<pair<Domain, Range>, Range2>(res);
44801}
44802
44803template <typename Domain, typename Range, typename Range2>
44804typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist(const typed::basic_map<pair<Domain, Range>, Range2> &context) const
44805{
44806  auto res = isl::union_map::gist(context);
44807  return typed::union_map<pair<Domain, Range>, Range2>(res);
44808}
44809
44810template <typename Domain, typename Range, typename Range2>
44811typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist(const typed::map<pair<Domain, Range>, Range2> &context) const
44812{
44813  auto res = isl::union_map::gist(context);
44814  return typed::union_map<pair<Domain, Range>, Range2>(res);
44815}
44816
44817template <typename Domain, typename Range, typename Range2>
44818typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist_domain(const typed::union_set<pair<Domain, Range>> &uset) const
44819{
44820  auto res = isl::union_map::gist_domain(uset);
44821  return typed::union_map<pair<Domain, Range>, Range2>(res);
44822}
44823
44824template <typename Domain, typename Range, typename Range2>
44825typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist_domain(const typed::basic_set<pair<Domain, Range>> &uset) const
44826{
44827  auto res = isl::union_map::gist_domain(uset);
44828  return typed::union_map<pair<Domain, Range>, Range2>(res);
44829}
44830
44831template <typename Domain, typename Range, typename Range2>
44832typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist_domain(const typed::point<pair<Domain, Range>> &uset) const
44833{
44834  auto res = isl::union_map::gist_domain(uset);
44835  return typed::union_map<pair<Domain, Range>, Range2>(res);
44836}
44837
44838template <typename Domain, typename Range, typename Range2>
44839typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist_domain(const typed::set<pair<Domain, Range>> &uset) const
44840{
44841  auto res = isl::union_map::gist_domain(uset);
44842  return typed::union_map<pair<Domain, Range>, Range2>(res);
44843}
44844
44845template <typename Domain, typename Range, typename Range2>
44846typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist_params(const typed::set<> &set) const
44847{
44848  auto res = isl::union_map::gist_params(set);
44849  return typed::union_map<pair<Domain, Range>, Range2>(res);
44850}
44851
44852template <typename Domain, typename Range, typename Range2>
44853typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist_params(const typed::basic_set<> &set) const
44854{
44855  auto res = isl::union_map::gist_params(set);
44856  return typed::union_map<pair<Domain, Range>, Range2>(res);
44857}
44858
44859template <typename Domain, typename Range, typename Range2>
44860typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::gist_params(const typed::point<> &set) const
44861{
44862  auto res = isl::union_map::gist_params(set);
44863  return typed::union_map<pair<Domain, Range>, Range2>(res);
44864}
44865
44866template <typename Domain, typename Range, typename Range2>
44867typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const
44868{
44869  auto res = isl::union_map::intersect(umap2);
44870  return typed::union_map<pair<Domain, Range>, Range2>(res);
44871}
44872
44873template <typename Domain, typename Range, typename Range2>
44874typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect(const typed::basic_map<pair<Domain, Range>, Range2> &umap2) const
44875{
44876  auto res = isl::union_map::intersect(umap2);
44877  return typed::union_map<pair<Domain, Range>, Range2>(res);
44878}
44879
44880template <typename Domain, typename Range, typename Range2>
44881typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect(const typed::map<pair<Domain, Range>, Range2> &umap2) const
44882{
44883  auto res = isl::union_map::intersect(umap2);
44884  return typed::union_map<pair<Domain, Range>, Range2>(res);
44885}
44886
44887template <typename Domain, typename Range, typename Range2>
44888typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_domain(const typed::space<pair<Domain, Range>> &space) const
44889{
44890  auto res = isl::union_map::intersect_domain(space);
44891  return typed::union_map<pair<Domain, Range>, Range2>(res);
44892}
44893
44894template <typename Domain, typename Range, typename Range2>
44895typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_domain(const typed::union_set<pair<Domain, Range>> &uset) const
44896{
44897  auto res = isl::union_map::intersect_domain(uset);
44898  return typed::union_map<pair<Domain, Range>, Range2>(res);
44899}
44900
44901template <typename Domain, typename Range, typename Range2>
44902typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::union_set<Domain> &domain) const
44903{
44904  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
44905  return typed::union_map<pair<Domain, Range>, Range2>(res);
44906}
44907
44908template <typename Domain, typename Range, typename Range2>
44909typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::basic_set<Domain> &domain) const
44910{
44911  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
44912  return typed::union_map<pair<Domain, Range>, Range2>(res);
44913}
44914
44915template <typename Domain, typename Range, typename Range2>
44916typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::point<Domain> &domain) const
44917{
44918  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
44919  return typed::union_map<pair<Domain, Range>, Range2>(res);
44920}
44921
44922template <typename Domain, typename Range, typename Range2>
44923typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_domain_wrapped_domain(const typed::set<Domain> &domain) const
44924{
44925  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
44926  return typed::union_map<pair<Domain, Range>, Range2>(res);
44927}
44928
44929template <typename Domain, typename Range, typename Range2>
44930typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_params(const typed::set<> &set) const
44931{
44932  auto res = isl::union_map::intersect_params(set);
44933  return typed::union_map<pair<Domain, Range>, Range2>(res);
44934}
44935
44936template <typename Domain, typename Range, typename Range2>
44937typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_params(const typed::basic_set<> &set) const
44938{
44939  auto res = isl::union_map::intersect_params(set);
44940  return typed::union_map<pair<Domain, Range>, Range2>(res);
44941}
44942
44943template <typename Domain, typename Range, typename Range2>
44944typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_params(const typed::point<> &set) const
44945{
44946  auto res = isl::union_map::intersect_params(set);
44947  return typed::union_map<pair<Domain, Range>, Range2>(res);
44948}
44949
44950template <typename Domain, typename Range, typename Range2>
44951typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_range(const typed::space<Range2> &space) const
44952{
44953  auto res = isl::union_map::intersect_range(space);
44954  return typed::union_map<pair<Domain, Range>, Range2>(res);
44955}
44956
44957template <typename Domain, typename Range, typename Range2>
44958typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::intersect_range(const typed::union_set<Range2> &uset) const
44959{
44960  auto res = isl::union_map::intersect_range(uset);
44961  return typed::union_map<pair<Domain, Range>, Range2>(res);
44962}
44963
44964template <typename Domain, typename Range, typename Range2>
44965typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::lexmax() const
44966{
44967  auto res = isl::union_map::lexmax();
44968  return typed::union_map<pair<Domain, Range>, Range2>(res);
44969}
44970
44971template <typename Domain, typename Range, typename Range2>
44972typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::lexmin() const
44973{
44974  auto res = isl::union_map::lexmin();
44975  return typed::union_map<pair<Domain, Range>, Range2>(res);
44976}
44977
44978template <typename Domain, typename Range, typename Range2>
44979typed::map_list<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::map_list() const
44980{
44981  auto res = isl::union_map::map_list();
44982  return typed::map_list<pair<Domain, Range>, Range2>(res);
44983}
44984
44985template <typename Domain, typename Range, typename Range2>
44986typed::set<> typed::union_map<pair<Domain, Range>, Range2>::params() const
44987{
44988  auto res = isl::union_map::params();
44989  return typed::set<>(res);
44990}
44991
44992template <typename Domain, typename Range, typename Range2>
44993template <typename Domain2>
44994typed::union_map<Domain2, Range2> typed::union_map<pair<Domain, Range>, Range2>::preimage_domain(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const
44995{
44996  auto res = isl::union_map::preimage_domain(ma);
44997  return typed::union_map<Domain2, Range2>(res);
44998}
44999
45000template <typename Domain, typename Range, typename Range2>
45001template <typename Domain2>
45002typed::union_map<Domain2, Range2> typed::union_map<pair<Domain, Range>, Range2>::preimage_domain(const typed::multi_pw_aff<Domain2, pair<Domain, Range>> &mpa) const
45003{
45004  auto res = isl::union_map::preimage_domain(mpa);
45005  return typed::union_map<Domain2, Range2>(res);
45006}
45007
45008template <typename Domain, typename Range, typename Range2>
45009template <typename Domain2>
45010typed::union_map<Domain2, Range2> typed::union_map<pair<Domain, Range>, Range2>::preimage_domain(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const
45011{
45012  auto res = isl::union_map::preimage_domain(pma);
45013  return typed::union_map<Domain2, Range2>(res);
45014}
45015
45016template <typename Domain, typename Range, typename Range2>
45017template <typename Domain2>
45018typed::union_map<Domain2, Range2> typed::union_map<pair<Domain, Range>, Range2>::preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const
45019{
45020  auto res = isl::union_map::preimage_domain(upma);
45021  return typed::union_map<Domain2, Range2>(res);
45022}
45023
45024template <typename Domain, typename Range, typename Range2>
45025template <typename Arg3>
45026typed::union_map<pair<Domain, Range>, Arg3> typed::union_map<pair<Domain, Range>, Range2>::preimage_range(const typed::multi_aff<Arg3, Range2> &ma) const
45027{
45028  auto res = isl::union_map::preimage_range(ma);
45029  return typed::union_map<pair<Domain, Range>, Arg3>(res);
45030}
45031
45032template <typename Domain, typename Range, typename Range2>
45033template <typename Arg3>
45034typed::union_map<pair<Domain, Range>, Arg3> typed::union_map<pair<Domain, Range>, Range2>::preimage_range(const typed::pw_multi_aff<Arg3, Range2> &pma) const
45035{
45036  auto res = isl::union_map::preimage_range(pma);
45037  return typed::union_map<pair<Domain, Range>, Arg3>(res);
45038}
45039
45040template <typename Domain, typename Range, typename Range2>
45041template <typename Arg3>
45042typed::union_map<pair<Domain, Range>, Arg3> typed::union_map<pair<Domain, Range>, Range2>::preimage_range(const typed::union_pw_multi_aff<Arg3, Range2> &upma) const
45043{
45044  auto res = isl::union_map::preimage_range(upma);
45045  return typed::union_map<pair<Domain, Range>, Arg3>(res);
45046}
45047
45048template <typename Domain, typename Range, typename Range2>
45049template <typename Domain2, typename Arg3>
45050typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> typed::union_map<pair<Domain, Range>, Range2>::product(const typed::union_map<Domain2, Arg3> &umap2) const
45051{
45052  auto res = isl::union_map::product(umap2);
45053  return typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>>(res);
45054}
45055
45056template <typename Domain, typename Range, typename Range2>
45057template <typename Domain2, typename Arg3>
45058typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> typed::union_map<pair<Domain, Range>, Range2>::product(const typed::basic_map<Domain2, Arg3> &umap2) const
45059{
45060  auto res = isl::union_map::product(umap2);
45061  return typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>>(res);
45062}
45063
45064template <typename Domain, typename Range, typename Range2>
45065template <typename Domain2, typename Arg3>
45066typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>> typed::union_map<pair<Domain, Range>, Range2>::product(const typed::map<Domain2, Arg3> &umap2) const
45067{
45068  auto res = isl::union_map::product(umap2);
45069  return typed::union_map<pair<pair<Domain, Range>, Domain2>, pair<Range2, Arg3>>(res);
45070}
45071
45072template <typename Domain, typename Range, typename Range2>
45073typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::project_out_all_params() const
45074{
45075  auto res = isl::union_map::project_out_all_params();
45076  return typed::union_map<pair<Domain, Range>, Range2>(res);
45077}
45078
45079template <typename Domain, typename Range, typename Range2>
45080typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::project_out_param(const typed::id<Anonymous> &id) const
45081{
45082  auto res = isl::union_map::project_out_param(id);
45083  return typed::union_map<pair<Domain, Range>, Range2>(res);
45084}
45085
45086template <typename Domain, typename Range, typename Range2>
45087typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::project_out_param(const std::string &id) const
45088{
45089  auto res = isl::union_map::project_out_param(id);
45090  return typed::union_map<pair<Domain, Range>, Range2>(res);
45091}
45092
45093template <typename Domain, typename Range, typename Range2>
45094typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::project_out_param(const typed::id_list<Anonymous> &list) const
45095{
45096  auto res = isl::union_map::project_out_param(list);
45097  return typed::union_map<pair<Domain, Range>, Range2>(res);
45098}
45099
45100template <typename Domain, typename Range, typename Range2>
45101typed::union_set<Range2> typed::union_map<pair<Domain, Range>, Range2>::range() const
45102{
45103  auto res = isl::union_map::range();
45104  return typed::union_set<Range2>(res);
45105}
45106
45107template <typename Domain, typename Range, typename Range2>
45108typed::union_map<pair<pair<Domain, Range>, Range2>, Range2> typed::union_map<pair<Domain, Range>, Range2>::range_map() const
45109{
45110  auto res = isl::union_map::range_map();
45111  return typed::union_map<pair<pair<Domain, Range>, Range2>, Range2>(res);
45112}
45113
45114template <typename Domain, typename Range, typename Range2>
45115template <typename Arg3>
45116typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> typed::union_map<pair<Domain, Range>, Range2>::range_product(const typed::union_map<pair<Domain, Range>, Arg3> &umap2) const
45117{
45118  auto res = isl::union_map::range_product(umap2);
45119  return typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>>(res);
45120}
45121
45122template <typename Domain, typename Range, typename Range2>
45123template <typename Arg3>
45124typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> typed::union_map<pair<Domain, Range>, Range2>::range_product(const typed::basic_map<pair<Domain, Range>, Arg3> &umap2) const
45125{
45126  auto res = isl::union_map::range_product(umap2);
45127  return typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>>(res);
45128}
45129
45130template <typename Domain, typename Range, typename Range2>
45131template <typename Arg3>
45132typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>> typed::union_map<pair<Domain, Range>, Range2>::range_product(const typed::map<pair<Domain, Range>, Arg3> &umap2) const
45133{
45134  auto res = isl::union_map::range_product(umap2);
45135  return typed::union_map<pair<Domain, Range>, pair<Range2, Arg3>>(res);
45136}
45137
45138template <typename Domain, typename Range, typename Range2>
45139typed::union_map<Range2, pair<Domain, Range>> typed::union_map<pair<Domain, Range>, Range2>::reverse() const
45140{
45141  auto res = isl::union_map::reverse();
45142  return typed::union_map<Range2, pair<Domain, Range>>(res);
45143}
45144
45145template <typename Domain, typename Range, typename Range2>
45146typed::space<> typed::union_map<pair<Domain, Range>, Range2>::space() const
45147{
45148  auto res = isl::union_map::space();
45149  return typed::space<>(res);
45150}
45151
45152template <typename Domain, typename Range, typename Range2>
45153typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const
45154{
45155  auto res = isl::union_map::subtract(umap2);
45156  return typed::union_map<pair<Domain, Range>, Range2>(res);
45157}
45158
45159template <typename Domain, typename Range, typename Range2>
45160typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract(const typed::basic_map<pair<Domain, Range>, Range2> &umap2) const
45161{
45162  auto res = isl::union_map::subtract(umap2);
45163  return typed::union_map<pair<Domain, Range>, Range2>(res);
45164}
45165
45166template <typename Domain, typename Range, typename Range2>
45167typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract(const typed::map<pair<Domain, Range>, Range2> &umap2) const
45168{
45169  auto res = isl::union_map::subtract(umap2);
45170  return typed::union_map<pair<Domain, Range>, Range2>(res);
45171}
45172
45173template <typename Domain, typename Range, typename Range2>
45174typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract_domain(const typed::union_set<pair<Domain, Range>> &dom) const
45175{
45176  auto res = isl::union_map::subtract_domain(dom);
45177  return typed::union_map<pair<Domain, Range>, Range2>(res);
45178}
45179
45180template <typename Domain, typename Range, typename Range2>
45181typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract_domain(const typed::basic_set<pair<Domain, Range>> &dom) const
45182{
45183  auto res = isl::union_map::subtract_domain(dom);
45184  return typed::union_map<pair<Domain, Range>, Range2>(res);
45185}
45186
45187template <typename Domain, typename Range, typename Range2>
45188typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract_domain(const typed::point<pair<Domain, Range>> &dom) const
45189{
45190  auto res = isl::union_map::subtract_domain(dom);
45191  return typed::union_map<pair<Domain, Range>, Range2>(res);
45192}
45193
45194template <typename Domain, typename Range, typename Range2>
45195typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract_domain(const typed::set<pair<Domain, Range>> &dom) const
45196{
45197  auto res = isl::union_map::subtract_domain(dom);
45198  return typed::union_map<pair<Domain, Range>, Range2>(res);
45199}
45200
45201template <typename Domain, typename Range, typename Range2>
45202typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract_range(const typed::union_set<Range2> &dom) const
45203{
45204  auto res = isl::union_map::subtract_range(dom);
45205  return typed::union_map<pair<Domain, Range>, Range2>(res);
45206}
45207
45208template <typename Domain, typename Range, typename Range2>
45209typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract_range(const typed::basic_set<Range2> &dom) const
45210{
45211  auto res = isl::union_map::subtract_range(dom);
45212  return typed::union_map<pair<Domain, Range>, Range2>(res);
45213}
45214
45215template <typename Domain, typename Range, typename Range2>
45216typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract_range(const typed::point<Range2> &dom) const
45217{
45218  auto res = isl::union_map::subtract_range(dom);
45219  return typed::union_map<pair<Domain, Range>, Range2>(res);
45220}
45221
45222template <typename Domain, typename Range, typename Range2>
45223typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::subtract_range(const typed::set<Range2> &dom) const
45224{
45225  auto res = isl::union_map::subtract_range(dom);
45226  return typed::union_map<pair<Domain, Range>, Range2>(res);
45227}
45228
45229template <typename Domain, typename Range, typename Range2>
45230typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::unite(const typed::union_map<pair<Domain, Range>, Range2> &umap2) const
45231{
45232  auto res = isl::union_map::unite(umap2);
45233  return typed::union_map<pair<Domain, Range>, Range2>(res);
45234}
45235
45236template <typename Domain, typename Range, typename Range2>
45237typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::unite(const typed::basic_map<pair<Domain, Range>, Range2> &umap2) const
45238{
45239  auto res = isl::union_map::unite(umap2);
45240  return typed::union_map<pair<Domain, Range>, Range2>(res);
45241}
45242
45243template <typename Domain, typename Range, typename Range2>
45244typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::unite(const typed::map<pair<Domain, Range>, Range2> &umap2) const
45245{
45246  auto res = isl::union_map::unite(umap2);
45247  return typed::union_map<pair<Domain, Range>, Range2>(res);
45248}
45249
45250template <typename Domain, typename Range, typename Range2>
45251typed::union_map<pair<Domain, Range>, Range2> typed::union_map<pair<Domain, Range>, Range2>::universe() const
45252{
45253  auto res = isl::union_map::universe();
45254  return typed::union_map<pair<Domain, Range>, Range2>(res);
45255}
45256
45257template <typename Domain, typename Range, typename Range2>
45258typed::union_set<pair<pair<Domain, Range>, Range2>> typed::union_map<pair<Domain, Range>, Range2>::wrap() const
45259{
45260  auto res = isl::union_map::wrap();
45261  return typed::union_set<pair<pair<Domain, Range>, Range2>>(res);
45262}
45263
45264template <typename Domain>
45265typed::union_map<Domain, Domain>::union_map(const typed::basic_map<Domain, Domain> &bmap)
45266  : isl::union_map(bmap)
45267{
45268}
45269
45270template <typename Domain>
45271typed::union_map<Domain, Domain>::union_map(const typed::map<Domain, Domain> &map)
45272  : isl::union_map(map)
45273{
45274}
45275
45276template <typename Domain>
45277typed::union_map<Domain, Domain>::union_map(const isl::ctx &ctx, const std::string &str)
45278  : isl::union_map(ctx, str)
45279{
45280}
45281
45282template <typename Domain>
45283template <typename Domain2>
45284typed::union_map<Domain2, Domain> typed::union_map<Domain, Domain>::apply_domain(const typed::union_map<Domain, Domain2> &umap2) const
45285{
45286  auto res = isl::union_map::apply_domain(umap2);
45287  return typed::union_map<Domain2, Domain>(res);
45288}
45289
45290template <typename Domain>
45291template <typename Domain2>
45292typed::union_map<Domain2, Domain> typed::union_map<Domain, Domain>::apply_domain(const typed::basic_map<Domain, Domain2> &umap2) const
45293{
45294  auto res = isl::union_map::apply_domain(umap2);
45295  return typed::union_map<Domain2, Domain>(res);
45296}
45297
45298template <typename Domain>
45299template <typename Domain2>
45300typed::union_map<Domain2, Domain> typed::union_map<Domain, Domain>::apply_domain(const typed::map<Domain, Domain2> &umap2) const
45301{
45302  auto res = isl::union_map::apply_domain(umap2);
45303  return typed::union_map<Domain2, Domain>(res);
45304}
45305
45306template <typename Domain>
45307template <typename Range2>
45308typed::union_map<Domain, Range2> typed::union_map<Domain, Domain>::apply_range(const typed::union_map<Domain, Range2> &umap2) const
45309{
45310  auto res = isl::union_map::apply_range(umap2);
45311  return typed::union_map<Domain, Range2>(res);
45312}
45313
45314template <typename Domain>
45315template <typename Range2>
45316typed::union_map<Domain, Range2> typed::union_map<Domain, Domain>::apply_range(const typed::basic_map<Domain, Range2> &umap2) const
45317{
45318  auto res = isl::union_map::apply_range(umap2);
45319  return typed::union_map<Domain, Range2>(res);
45320}
45321
45322template <typename Domain>
45323template <typename Range2>
45324typed::union_map<Domain, Range2> typed::union_map<Domain, Domain>::apply_range(const typed::map<Domain, Range2> &umap2) const
45325{
45326  auto res = isl::union_map::apply_range(umap2);
45327  return typed::union_map<Domain, Range2>(res);
45328}
45329
45330template <typename Domain>
45331typed::map<Domain, Domain> typed::union_map<Domain, Domain>::as_map() const
45332{
45333  auto res = isl::union_map::as_map();
45334  return typed::map<Domain, Domain>(res);
45335}
45336
45337template <typename Domain>
45338typed::multi_union_pw_aff<Domain, Domain> typed::union_map<Domain, Domain>::as_multi_union_pw_aff() const
45339{
45340  auto res = isl::union_map::as_multi_union_pw_aff();
45341  return typed::multi_union_pw_aff<Domain, Domain>(res);
45342}
45343
45344template <typename Domain>
45345typed::union_pw_multi_aff<Domain, Domain> typed::union_map<Domain, Domain>::as_union_pw_multi_aff() const
45346{
45347  auto res = isl::union_map::as_union_pw_multi_aff();
45348  return typed::union_pw_multi_aff<Domain, Domain>(res);
45349}
45350
45351template <typename Domain>
45352typed::union_set<Domain> typed::union_map<Domain, Domain>::bind_range(const typed::multi_id<Domain> &tuple) const
45353{
45354  auto res = isl::union_map::bind_range(tuple);
45355  return typed::union_set<Domain>(res);
45356}
45357
45358template <typename Domain>
45359typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::coalesce() const
45360{
45361  auto res = isl::union_map::coalesce();
45362  return typed::union_map<Domain, Domain>(res);
45363}
45364
45365template <typename Domain>
45366typed::union_set<Domain> typed::union_map<Domain, Domain>::deltas() const
45367{
45368  auto res = isl::union_map::deltas();
45369  return typed::union_set<Domain>(res);
45370}
45371
45372template <typename Domain>
45373typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::detect_equalities() const
45374{
45375  auto res = isl::union_map::detect_equalities();
45376  return typed::union_map<Domain, Domain>(res);
45377}
45378
45379template <typename Domain>
45380typed::union_set<Domain> typed::union_map<Domain, Domain>::domain() const
45381{
45382  auto res = isl::union_map::domain();
45383  return typed::union_set<Domain>(res);
45384}
45385
45386template <typename Domain>
45387typed::union_map<pair<Domain, Domain>, Domain> typed::union_map<Domain, Domain>::domain_map() const
45388{
45389  auto res = isl::union_map::domain_map();
45390  return typed::union_map<pair<Domain, Domain>, Domain>(res);
45391}
45392
45393template <typename Domain>
45394typed::union_pw_multi_aff<pair<Domain, Domain>, Domain> typed::union_map<Domain, Domain>::domain_map_union_pw_multi_aff() const
45395{
45396  auto res = isl::union_map::domain_map_union_pw_multi_aff();
45397  return typed::union_pw_multi_aff<pair<Domain, Domain>, Domain>(res);
45398}
45399
45400template <typename Domain>
45401template <typename Domain2>
45402typed::union_map<pair<Domain, Domain2>, Domain> typed::union_map<Domain, Domain>::domain_product(const typed::union_map<Domain2, Domain> &umap2) const
45403{
45404  auto res = isl::union_map::domain_product(umap2);
45405  return typed::union_map<pair<Domain, Domain2>, Domain>(res);
45406}
45407
45408template <typename Domain>
45409template <typename Domain2>
45410typed::union_map<pair<Domain, Domain2>, Domain> typed::union_map<Domain, Domain>::domain_product(const typed::basic_map<Domain2, Domain> &umap2) const
45411{
45412  auto res = isl::union_map::domain_product(umap2);
45413  return typed::union_map<pair<Domain, Domain2>, Domain>(res);
45414}
45415
45416template <typename Domain>
45417template <typename Domain2>
45418typed::union_map<pair<Domain, Domain2>, Domain> typed::union_map<Domain, Domain>::domain_product(const typed::map<Domain2, Domain> &umap2) const
45419{
45420  auto res = isl::union_map::domain_product(umap2);
45421  return typed::union_map<pair<Domain, Domain2>, Domain>(res);
45422}
45423
45424template <typename Domain>
45425typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::drop_unused_params() const
45426{
45427  auto res = isl::union_map::drop_unused_params();
45428  return typed::union_map<Domain, Domain>(res);
45429}
45430
45431template <typename Domain>
45432typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::empty(const isl::ctx &ctx)
45433{
45434  auto res = isl::union_map::empty(ctx);
45435  return typed::union_map<Domain, Domain>(res);
45436}
45437
45438template <typename Domain>
45439template <typename Range>
45440typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::eq_at(const typed::multi_union_pw_aff<Domain, Range> &mupa) const
45441{
45442  auto res = isl::union_map::eq_at(mupa);
45443  return typed::union_map<Domain, Domain>(res);
45444}
45445
45446template <typename Domain>
45447template <typename Range>
45448typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::eq_at(const typed::multi_pw_aff<Domain, Range> &mupa) const
45449{
45450  auto res = isl::union_map::eq_at(mupa);
45451  return typed::union_map<Domain, Domain>(res);
45452}
45453
45454template <typename Domain>
45455typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::eq_at(const typed::union_pw_aff<Domain, Anonymous> &mupa) const
45456{
45457  auto res = isl::union_map::eq_at(mupa);
45458  return typed::union_map<Domain, Domain>(res);
45459}
45460
45461template <typename Domain>
45462bool typed::union_map<Domain, Domain>::every_map(const std::function<bool(typed::map<Domain, Domain>)> &test) const
45463{
45464  auto lambda_test = [&] (isl::map arg0) {
45465    return test(typed::map<Domain, Domain>(arg0));
45466  };
45467  return isl::union_map::every_map(lambda_test);
45468}
45469
45470template <typename Domain>
45471typed::map<Domain, Domain> typed::union_map<Domain, Domain>::extract_map(const typed::space<Domain, Domain> &space) const
45472{
45473  auto res = isl::union_map::extract_map(space);
45474  return typed::map<Domain, Domain>(res);
45475}
45476
45477template <typename Domain>
45478void typed::union_map<Domain, Domain>::foreach_map(const std::function<void(typed::map<Domain, Domain>)> &fn) const
45479{
45480  auto lambda_fn = [&] (isl::map arg0) {
45481    return fn(typed::map<Domain, Domain>(arg0));
45482  };
45483  return isl::union_map::foreach_map(lambda_fn);
45484}
45485
45486template <typename Domain>
45487typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist(const typed::union_map<Domain, Domain> &context) const
45488{
45489  auto res = isl::union_map::gist(context);
45490  return typed::union_map<Domain, Domain>(res);
45491}
45492
45493template <typename Domain>
45494typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist(const typed::basic_map<Domain, Domain> &context) const
45495{
45496  auto res = isl::union_map::gist(context);
45497  return typed::union_map<Domain, Domain>(res);
45498}
45499
45500template <typename Domain>
45501typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist(const typed::map<Domain, Domain> &context) const
45502{
45503  auto res = isl::union_map::gist(context);
45504  return typed::union_map<Domain, Domain>(res);
45505}
45506
45507template <typename Domain>
45508typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist_domain(const typed::union_set<Domain> &uset) const
45509{
45510  auto res = isl::union_map::gist_domain(uset);
45511  return typed::union_map<Domain, Domain>(res);
45512}
45513
45514template <typename Domain>
45515typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist_domain(const typed::basic_set<Domain> &uset) const
45516{
45517  auto res = isl::union_map::gist_domain(uset);
45518  return typed::union_map<Domain, Domain>(res);
45519}
45520
45521template <typename Domain>
45522typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist_domain(const typed::point<Domain> &uset) const
45523{
45524  auto res = isl::union_map::gist_domain(uset);
45525  return typed::union_map<Domain, Domain>(res);
45526}
45527
45528template <typename Domain>
45529typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist_domain(const typed::set<Domain> &uset) const
45530{
45531  auto res = isl::union_map::gist_domain(uset);
45532  return typed::union_map<Domain, Domain>(res);
45533}
45534
45535template <typename Domain>
45536typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist_params(const typed::set<> &set) const
45537{
45538  auto res = isl::union_map::gist_params(set);
45539  return typed::union_map<Domain, Domain>(res);
45540}
45541
45542template <typename Domain>
45543typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist_params(const typed::basic_set<> &set) const
45544{
45545  auto res = isl::union_map::gist_params(set);
45546  return typed::union_map<Domain, Domain>(res);
45547}
45548
45549template <typename Domain>
45550typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::gist_params(const typed::point<> &set) const
45551{
45552  auto res = isl::union_map::gist_params(set);
45553  return typed::union_map<Domain, Domain>(res);
45554}
45555
45556template <typename Domain>
45557typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect(const typed::union_map<Domain, Domain> &umap2) const
45558{
45559  auto res = isl::union_map::intersect(umap2);
45560  return typed::union_map<Domain, Domain>(res);
45561}
45562
45563template <typename Domain>
45564typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect(const typed::basic_map<Domain, Domain> &umap2) const
45565{
45566  auto res = isl::union_map::intersect(umap2);
45567  return typed::union_map<Domain, Domain>(res);
45568}
45569
45570template <typename Domain>
45571typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect(const typed::map<Domain, Domain> &umap2) const
45572{
45573  auto res = isl::union_map::intersect(umap2);
45574  return typed::union_map<Domain, Domain>(res);
45575}
45576
45577template <typename Domain>
45578typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect_domain(const typed::space<Domain> &space) const
45579{
45580  auto res = isl::union_map::intersect_domain(space);
45581  return typed::union_map<Domain, Domain>(res);
45582}
45583
45584template <typename Domain>
45585typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect_domain(const typed::union_set<Domain> &uset) const
45586{
45587  auto res = isl::union_map::intersect_domain(uset);
45588  return typed::union_map<Domain, Domain>(res);
45589}
45590
45591template <typename Domain>
45592typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect_params(const typed::set<> &set) const
45593{
45594  auto res = isl::union_map::intersect_params(set);
45595  return typed::union_map<Domain, Domain>(res);
45596}
45597
45598template <typename Domain>
45599typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect_params(const typed::basic_set<> &set) const
45600{
45601  auto res = isl::union_map::intersect_params(set);
45602  return typed::union_map<Domain, Domain>(res);
45603}
45604
45605template <typename Domain>
45606typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect_params(const typed::point<> &set) const
45607{
45608  auto res = isl::union_map::intersect_params(set);
45609  return typed::union_map<Domain, Domain>(res);
45610}
45611
45612template <typename Domain>
45613typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect_range(const typed::space<Domain> &space) const
45614{
45615  auto res = isl::union_map::intersect_range(space);
45616  return typed::union_map<Domain, Domain>(res);
45617}
45618
45619template <typename Domain>
45620typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::intersect_range(const typed::union_set<Domain> &uset) const
45621{
45622  auto res = isl::union_map::intersect_range(uset);
45623  return typed::union_map<Domain, Domain>(res);
45624}
45625
45626template <typename Domain>
45627typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::lexmax() const
45628{
45629  auto res = isl::union_map::lexmax();
45630  return typed::union_map<Domain, Domain>(res);
45631}
45632
45633template <typename Domain>
45634typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::lexmin() const
45635{
45636  auto res = isl::union_map::lexmin();
45637  return typed::union_map<Domain, Domain>(res);
45638}
45639
45640template <typename Domain>
45641typed::map_list<Domain, Domain> typed::union_map<Domain, Domain>::map_list() const
45642{
45643  auto res = isl::union_map::map_list();
45644  return typed::map_list<Domain, Domain>(res);
45645}
45646
45647template <typename Domain>
45648typed::set<> typed::union_map<Domain, Domain>::params() const
45649{
45650  auto res = isl::union_map::params();
45651  return typed::set<>(res);
45652}
45653
45654template <typename Domain>
45655template <typename Domain2>
45656typed::union_map<Domain2, Domain> typed::union_map<Domain, Domain>::preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const
45657{
45658  auto res = isl::union_map::preimage_domain(ma);
45659  return typed::union_map<Domain2, Domain>(res);
45660}
45661
45662template <typename Domain>
45663template <typename Domain2>
45664typed::union_map<Domain2, Domain> typed::union_map<Domain, Domain>::preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
45665{
45666  auto res = isl::union_map::preimage_domain(mpa);
45667  return typed::union_map<Domain2, Domain>(res);
45668}
45669
45670template <typename Domain>
45671template <typename Domain2>
45672typed::union_map<Domain2, Domain> typed::union_map<Domain, Domain>::preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const
45673{
45674  auto res = isl::union_map::preimage_domain(pma);
45675  return typed::union_map<Domain2, Domain>(res);
45676}
45677
45678template <typename Domain>
45679template <typename Domain2>
45680typed::union_map<Domain2, Domain> typed::union_map<Domain, Domain>::preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
45681{
45682  auto res = isl::union_map::preimage_domain(upma);
45683  return typed::union_map<Domain2, Domain>(res);
45684}
45685
45686template <typename Domain>
45687template <typename Range2>
45688typed::union_map<Domain, Range2> typed::union_map<Domain, Domain>::preimage_range(const typed::multi_aff<Range2, Domain> &ma) const
45689{
45690  auto res = isl::union_map::preimage_range(ma);
45691  return typed::union_map<Domain, Range2>(res);
45692}
45693
45694template <typename Domain>
45695template <typename Range2>
45696typed::union_map<Domain, Range2> typed::union_map<Domain, Domain>::preimage_range(const typed::pw_multi_aff<Range2, Domain> &pma) const
45697{
45698  auto res = isl::union_map::preimage_range(pma);
45699  return typed::union_map<Domain, Range2>(res);
45700}
45701
45702template <typename Domain>
45703template <typename Range2>
45704typed::union_map<Domain, Range2> typed::union_map<Domain, Domain>::preimage_range(const typed::union_pw_multi_aff<Range2, Domain> &upma) const
45705{
45706  auto res = isl::union_map::preimage_range(upma);
45707  return typed::union_map<Domain, Range2>(res);
45708}
45709
45710template <typename Domain>
45711template <typename Domain2, typename Range2>
45712typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> typed::union_map<Domain, Domain>::product(const typed::union_map<Domain2, Range2> &umap2) const
45713{
45714  auto res = isl::union_map::product(umap2);
45715  return typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>>(res);
45716}
45717
45718template <typename Domain>
45719template <typename Domain2, typename Range2>
45720typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> typed::union_map<Domain, Domain>::product(const typed::basic_map<Domain2, Range2> &umap2) const
45721{
45722  auto res = isl::union_map::product(umap2);
45723  return typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>>(res);
45724}
45725
45726template <typename Domain>
45727template <typename Domain2, typename Range2>
45728typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>> typed::union_map<Domain, Domain>::product(const typed::map<Domain2, Range2> &umap2) const
45729{
45730  auto res = isl::union_map::product(umap2);
45731  return typed::union_map<pair<Domain, Domain2>, pair<Domain, Range2>>(res);
45732}
45733
45734template <typename Domain>
45735typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::project_out_all_params() const
45736{
45737  auto res = isl::union_map::project_out_all_params();
45738  return typed::union_map<Domain, Domain>(res);
45739}
45740
45741template <typename Domain>
45742typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::project_out_param(const typed::id<Anonymous> &id) const
45743{
45744  auto res = isl::union_map::project_out_param(id);
45745  return typed::union_map<Domain, Domain>(res);
45746}
45747
45748template <typename Domain>
45749typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::project_out_param(const std::string &id) const
45750{
45751  auto res = isl::union_map::project_out_param(id);
45752  return typed::union_map<Domain, Domain>(res);
45753}
45754
45755template <typename Domain>
45756typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::project_out_param(const typed::id_list<Anonymous> &list) const
45757{
45758  auto res = isl::union_map::project_out_param(list);
45759  return typed::union_map<Domain, Domain>(res);
45760}
45761
45762template <typename Domain>
45763typed::union_set<Domain> typed::union_map<Domain, Domain>::range() const
45764{
45765  auto res = isl::union_map::range();
45766  return typed::union_set<Domain>(res);
45767}
45768
45769template <typename Domain>
45770typed::union_map<pair<Domain, Domain>, Domain> typed::union_map<Domain, Domain>::range_map() const
45771{
45772  auto res = isl::union_map::range_map();
45773  return typed::union_map<pair<Domain, Domain>, Domain>(res);
45774}
45775
45776template <typename Domain>
45777template <typename Range2>
45778typed::union_map<Domain, pair<Domain, Range2>> typed::union_map<Domain, Domain>::range_product(const typed::union_map<Domain, Range2> &umap2) const
45779{
45780  auto res = isl::union_map::range_product(umap2);
45781  return typed::union_map<Domain, pair<Domain, Range2>>(res);
45782}
45783
45784template <typename Domain>
45785template <typename Range2>
45786typed::union_map<Domain, pair<Domain, Range2>> typed::union_map<Domain, Domain>::range_product(const typed::basic_map<Domain, Range2> &umap2) const
45787{
45788  auto res = isl::union_map::range_product(umap2);
45789  return typed::union_map<Domain, pair<Domain, Range2>>(res);
45790}
45791
45792template <typename Domain>
45793template <typename Range2>
45794typed::union_map<Domain, pair<Domain, Range2>> typed::union_map<Domain, Domain>::range_product(const typed::map<Domain, Range2> &umap2) const
45795{
45796  auto res = isl::union_map::range_product(umap2);
45797  return typed::union_map<Domain, pair<Domain, Range2>>(res);
45798}
45799
45800template <typename Domain>
45801typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::reverse() const
45802{
45803  auto res = isl::union_map::reverse();
45804  return typed::union_map<Domain, Domain>(res);
45805}
45806
45807template <typename Domain>
45808typed::space<> typed::union_map<Domain, Domain>::space() const
45809{
45810  auto res = isl::union_map::space();
45811  return typed::space<>(res);
45812}
45813
45814template <typename Domain>
45815typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract(const typed::union_map<Domain, Domain> &umap2) const
45816{
45817  auto res = isl::union_map::subtract(umap2);
45818  return typed::union_map<Domain, Domain>(res);
45819}
45820
45821template <typename Domain>
45822typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract(const typed::basic_map<Domain, Domain> &umap2) const
45823{
45824  auto res = isl::union_map::subtract(umap2);
45825  return typed::union_map<Domain, Domain>(res);
45826}
45827
45828template <typename Domain>
45829typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract(const typed::map<Domain, Domain> &umap2) const
45830{
45831  auto res = isl::union_map::subtract(umap2);
45832  return typed::union_map<Domain, Domain>(res);
45833}
45834
45835template <typename Domain>
45836typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract_domain(const typed::union_set<Domain> &dom) const
45837{
45838  auto res = isl::union_map::subtract_domain(dom);
45839  return typed::union_map<Domain, Domain>(res);
45840}
45841
45842template <typename Domain>
45843typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract_domain(const typed::basic_set<Domain> &dom) const
45844{
45845  auto res = isl::union_map::subtract_domain(dom);
45846  return typed::union_map<Domain, Domain>(res);
45847}
45848
45849template <typename Domain>
45850typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract_domain(const typed::point<Domain> &dom) const
45851{
45852  auto res = isl::union_map::subtract_domain(dom);
45853  return typed::union_map<Domain, Domain>(res);
45854}
45855
45856template <typename Domain>
45857typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract_domain(const typed::set<Domain> &dom) const
45858{
45859  auto res = isl::union_map::subtract_domain(dom);
45860  return typed::union_map<Domain, Domain>(res);
45861}
45862
45863template <typename Domain>
45864typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract_range(const typed::union_set<Domain> &dom) const
45865{
45866  auto res = isl::union_map::subtract_range(dom);
45867  return typed::union_map<Domain, Domain>(res);
45868}
45869
45870template <typename Domain>
45871typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract_range(const typed::basic_set<Domain> &dom) const
45872{
45873  auto res = isl::union_map::subtract_range(dom);
45874  return typed::union_map<Domain, Domain>(res);
45875}
45876
45877template <typename Domain>
45878typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract_range(const typed::point<Domain> &dom) const
45879{
45880  auto res = isl::union_map::subtract_range(dom);
45881  return typed::union_map<Domain, Domain>(res);
45882}
45883
45884template <typename Domain>
45885typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::subtract_range(const typed::set<Domain> &dom) const
45886{
45887  auto res = isl::union_map::subtract_range(dom);
45888  return typed::union_map<Domain, Domain>(res);
45889}
45890
45891template <typename Domain>
45892typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::unite(const typed::union_map<Domain, Domain> &umap2) const
45893{
45894  auto res = isl::union_map::unite(umap2);
45895  return typed::union_map<Domain, Domain>(res);
45896}
45897
45898template <typename Domain>
45899typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::unite(const typed::basic_map<Domain, Domain> &umap2) const
45900{
45901  auto res = isl::union_map::unite(umap2);
45902  return typed::union_map<Domain, Domain>(res);
45903}
45904
45905template <typename Domain>
45906typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::unite(const typed::map<Domain, Domain> &umap2) const
45907{
45908  auto res = isl::union_map::unite(umap2);
45909  return typed::union_map<Domain, Domain>(res);
45910}
45911
45912template <typename Domain>
45913typed::union_map<Domain, Domain> typed::union_map<Domain, Domain>::universe() const
45914{
45915  auto res = isl::union_map::universe();
45916  return typed::union_map<Domain, Domain>(res);
45917}
45918
45919template <typename Domain>
45920typed::union_set<pair<Domain, Domain>> typed::union_map<Domain, Domain>::wrap() const
45921{
45922  auto res = isl::union_map::wrap();
45923  return typed::union_set<pair<Domain, Domain>>(res);
45924}
45925
45926template <typename Domain, typename Range, typename Range2>
45927typed::union_map<Domain, pair<Range, Range2>>::union_map(const typed::basic_map<Domain, pair<Range, Range2>> &bmap)
45928  : isl::union_map(bmap)
45929{
45930}
45931
45932template <typename Domain, typename Range, typename Range2>
45933typed::union_map<Domain, pair<Range, Range2>>::union_map(const typed::map<Domain, pair<Range, Range2>> &map)
45934  : isl::union_map(map)
45935{
45936}
45937
45938template <typename Domain, typename Range, typename Range2>
45939typed::union_map<Domain, pair<Range, Range2>>::union_map(const isl::ctx &ctx, const std::string &str)
45940  : isl::union_map(ctx, str)
45941{
45942}
45943
45944template <typename Domain, typename Range, typename Range2>
45945template <typename Domain2>
45946typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::apply_domain(const typed::union_map<Domain, Domain2> &umap2) const
45947{
45948  auto res = isl::union_map::apply_domain(umap2);
45949  return typed::union_map<Domain2, pair<Range, Range2>>(res);
45950}
45951
45952template <typename Domain, typename Range, typename Range2>
45953template <typename Domain2>
45954typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::apply_domain(const typed::basic_map<Domain, Domain2> &umap2) const
45955{
45956  auto res = isl::union_map::apply_domain(umap2);
45957  return typed::union_map<Domain2, pair<Range, Range2>>(res);
45958}
45959
45960template <typename Domain, typename Range, typename Range2>
45961template <typename Domain2>
45962typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::apply_domain(const typed::map<Domain, Domain2> &umap2) const
45963{
45964  auto res = isl::union_map::apply_domain(umap2);
45965  return typed::union_map<Domain2, pair<Range, Range2>>(res);
45966}
45967
45968template <typename Domain, typename Range, typename Range2>
45969template <typename Arg3>
45970typed::union_map<Domain, Arg3> typed::union_map<Domain, pair<Range, Range2>>::apply_range(const typed::union_map<pair<Range, Range2>, Arg3> &umap2) const
45971{
45972  auto res = isl::union_map::apply_range(umap2);
45973  return typed::union_map<Domain, Arg3>(res);
45974}
45975
45976template <typename Domain, typename Range, typename Range2>
45977template <typename Arg3>
45978typed::union_map<Domain, Arg3> typed::union_map<Domain, pair<Range, Range2>>::apply_range(const typed::basic_map<pair<Range, Range2>, Arg3> &umap2) const
45979{
45980  auto res = isl::union_map::apply_range(umap2);
45981  return typed::union_map<Domain, Arg3>(res);
45982}
45983
45984template <typename Domain, typename Range, typename Range2>
45985template <typename Arg3>
45986typed::union_map<Domain, Arg3> typed::union_map<Domain, pair<Range, Range2>>::apply_range(const typed::map<pair<Range, Range2>, Arg3> &umap2) const
45987{
45988  auto res = isl::union_map::apply_range(umap2);
45989  return typed::union_map<Domain, Arg3>(res);
45990}
45991
45992template <typename Domain, typename Range, typename Range2>
45993typed::map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::as_map() const
45994{
45995  auto res = isl::union_map::as_map();
45996  return typed::map<Domain, pair<Range, Range2>>(res);
45997}
45998
45999template <typename Domain, typename Range, typename Range2>
46000typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::as_multi_union_pw_aff() const
46001{
46002  auto res = isl::union_map::as_multi_union_pw_aff();
46003  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
46004}
46005
46006template <typename Domain, typename Range, typename Range2>
46007typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::as_union_pw_multi_aff() const
46008{
46009  auto res = isl::union_map::as_union_pw_multi_aff();
46010  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
46011}
46012
46013template <typename Domain, typename Range, typename Range2>
46014typed::union_set<Domain> typed::union_map<Domain, pair<Range, Range2>>::bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const
46015{
46016  auto res = isl::union_map::bind_range(tuple);
46017  return typed::union_set<Domain>(res);
46018}
46019
46020template <typename Domain, typename Range, typename Range2>
46021typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::coalesce() const
46022{
46023  auto res = isl::union_map::coalesce();
46024  return typed::union_map<Domain, pair<Range, Range2>>(res);
46025}
46026
46027template <typename Domain, typename Range, typename Range2>
46028typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::detect_equalities() const
46029{
46030  auto res = isl::union_map::detect_equalities();
46031  return typed::union_map<Domain, pair<Range, Range2>>(res);
46032}
46033
46034template <typename Domain, typename Range, typename Range2>
46035typed::union_set<Domain> typed::union_map<Domain, pair<Range, Range2>>::domain() const
46036{
46037  auto res = isl::union_map::domain();
46038  return typed::union_set<Domain>(res);
46039}
46040
46041template <typename Domain, typename Range, typename Range2>
46042typed::union_map<pair<Domain, pair<Range, Range2>>, Domain> typed::union_map<Domain, pair<Range, Range2>>::domain_map() const
46043{
46044  auto res = isl::union_map::domain_map();
46045  return typed::union_map<pair<Domain, pair<Range, Range2>>, Domain>(res);
46046}
46047
46048template <typename Domain, typename Range, typename Range2>
46049typed::union_pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain> typed::union_map<Domain, pair<Range, Range2>>::domain_map_union_pw_multi_aff() const
46050{
46051  auto res = isl::union_map::domain_map_union_pw_multi_aff();
46052  return typed::union_pw_multi_aff<pair<Domain, pair<Range, Range2>>, Domain>(res);
46053}
46054
46055template <typename Domain, typename Range, typename Range2>
46056template <typename Domain2>
46057typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const
46058{
46059  auto res = isl::union_map::domain_product(umap2);
46060  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
46061}
46062
46063template <typename Domain, typename Range, typename Range2>
46064template <typename Domain2>
46065typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::domain_product(const typed::basic_map<Domain2, pair<Range, Range2>> &umap2) const
46066{
46067  auto res = isl::union_map::domain_product(umap2);
46068  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
46069}
46070
46071template <typename Domain, typename Range, typename Range2>
46072template <typename Domain2>
46073typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::domain_product(const typed::map<Domain2, pair<Range, Range2>> &umap2) const
46074{
46075  auto res = isl::union_map::domain_product(umap2);
46076  return typed::union_map<pair<Domain, Domain2>, pair<Range, Range2>>(res);
46077}
46078
46079template <typename Domain, typename Range, typename Range2>
46080typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::drop_unused_params() const
46081{
46082  auto res = isl::union_map::drop_unused_params();
46083  return typed::union_map<Domain, pair<Range, Range2>>(res);
46084}
46085
46086template <typename Domain, typename Range, typename Range2>
46087typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::empty(const isl::ctx &ctx)
46088{
46089  auto res = isl::union_map::empty(ctx);
46090  return typed::union_map<Domain, pair<Range, Range2>>(res);
46091}
46092
46093template <typename Domain, typename Range, typename Range2>
46094bool typed::union_map<Domain, pair<Range, Range2>>::every_map(const std::function<bool(typed::map<Domain, pair<Range, Range2>>)> &test) const
46095{
46096  auto lambda_test = [&] (isl::map arg0) {
46097    return test(typed::map<Domain, pair<Range, Range2>>(arg0));
46098  };
46099  return isl::union_map::every_map(lambda_test);
46100}
46101
46102template <typename Domain, typename Range, typename Range2>
46103typed::map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::extract_map(const typed::space<Domain, pair<Range, Range2>> &space) const
46104{
46105  auto res = isl::union_map::extract_map(space);
46106  return typed::map<Domain, pair<Range, Range2>>(res);
46107}
46108
46109template <typename Domain, typename Range, typename Range2>
46110void typed::union_map<Domain, pair<Range, Range2>>::foreach_map(const std::function<void(typed::map<Domain, pair<Range, Range2>>)> &fn) const
46111{
46112  auto lambda_fn = [&] (isl::map arg0) {
46113    return fn(typed::map<Domain, pair<Range, Range2>>(arg0));
46114  };
46115  return isl::union_map::foreach_map(lambda_fn);
46116}
46117
46118template <typename Domain, typename Range, typename Range2>
46119typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist(const typed::union_map<Domain, pair<Range, Range2>> &context) const
46120{
46121  auto res = isl::union_map::gist(context);
46122  return typed::union_map<Domain, pair<Range, Range2>>(res);
46123}
46124
46125template <typename Domain, typename Range, typename Range2>
46126typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist(const typed::basic_map<Domain, pair<Range, Range2>> &context) const
46127{
46128  auto res = isl::union_map::gist(context);
46129  return typed::union_map<Domain, pair<Range, Range2>>(res);
46130}
46131
46132template <typename Domain, typename Range, typename Range2>
46133typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist(const typed::map<Domain, pair<Range, Range2>> &context) const
46134{
46135  auto res = isl::union_map::gist(context);
46136  return typed::union_map<Domain, pair<Range, Range2>>(res);
46137}
46138
46139template <typename Domain, typename Range, typename Range2>
46140typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist_domain(const typed::union_set<Domain> &uset) const
46141{
46142  auto res = isl::union_map::gist_domain(uset);
46143  return typed::union_map<Domain, pair<Range, Range2>>(res);
46144}
46145
46146template <typename Domain, typename Range, typename Range2>
46147typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist_domain(const typed::basic_set<Domain> &uset) const
46148{
46149  auto res = isl::union_map::gist_domain(uset);
46150  return typed::union_map<Domain, pair<Range, Range2>>(res);
46151}
46152
46153template <typename Domain, typename Range, typename Range2>
46154typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist_domain(const typed::point<Domain> &uset) const
46155{
46156  auto res = isl::union_map::gist_domain(uset);
46157  return typed::union_map<Domain, pair<Range, Range2>>(res);
46158}
46159
46160template <typename Domain, typename Range, typename Range2>
46161typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist_domain(const typed::set<Domain> &uset) const
46162{
46163  auto res = isl::union_map::gist_domain(uset);
46164  return typed::union_map<Domain, pair<Range, Range2>>(res);
46165}
46166
46167template <typename Domain, typename Range, typename Range2>
46168typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist_params(const typed::set<> &set) const
46169{
46170  auto res = isl::union_map::gist_params(set);
46171  return typed::union_map<Domain, pair<Range, Range2>>(res);
46172}
46173
46174template <typename Domain, typename Range, typename Range2>
46175typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist_params(const typed::basic_set<> &set) const
46176{
46177  auto res = isl::union_map::gist_params(set);
46178  return typed::union_map<Domain, pair<Range, Range2>>(res);
46179}
46180
46181template <typename Domain, typename Range, typename Range2>
46182typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::gist_params(const typed::point<> &set) const
46183{
46184  auto res = isl::union_map::gist_params(set);
46185  return typed::union_map<Domain, pair<Range, Range2>>(res);
46186}
46187
46188template <typename Domain, typename Range, typename Range2>
46189typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const
46190{
46191  auto res = isl::union_map::intersect(umap2);
46192  return typed::union_map<Domain, pair<Range, Range2>>(res);
46193}
46194
46195template <typename Domain, typename Range, typename Range2>
46196typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect(const typed::basic_map<Domain, pair<Range, Range2>> &umap2) const
46197{
46198  auto res = isl::union_map::intersect(umap2);
46199  return typed::union_map<Domain, pair<Range, Range2>>(res);
46200}
46201
46202template <typename Domain, typename Range, typename Range2>
46203typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect(const typed::map<Domain, pair<Range, Range2>> &umap2) const
46204{
46205  auto res = isl::union_map::intersect(umap2);
46206  return typed::union_map<Domain, pair<Range, Range2>>(res);
46207}
46208
46209template <typename Domain, typename Range, typename Range2>
46210typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_domain(const typed::space<Domain> &space) const
46211{
46212  auto res = isl::union_map::intersect_domain(space);
46213  return typed::union_map<Domain, pair<Range, Range2>>(res);
46214}
46215
46216template <typename Domain, typename Range, typename Range2>
46217typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_domain(const typed::union_set<Domain> &uset) const
46218{
46219  auto res = isl::union_map::intersect_domain(uset);
46220  return typed::union_map<Domain, pair<Range, Range2>>(res);
46221}
46222
46223template <typename Domain, typename Range, typename Range2>
46224typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_params(const typed::set<> &set) const
46225{
46226  auto res = isl::union_map::intersect_params(set);
46227  return typed::union_map<Domain, pair<Range, Range2>>(res);
46228}
46229
46230template <typename Domain, typename Range, typename Range2>
46231typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_params(const typed::basic_set<> &set) const
46232{
46233  auto res = isl::union_map::intersect_params(set);
46234  return typed::union_map<Domain, pair<Range, Range2>>(res);
46235}
46236
46237template <typename Domain, typename Range, typename Range2>
46238typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_params(const typed::point<> &set) const
46239{
46240  auto res = isl::union_map::intersect_params(set);
46241  return typed::union_map<Domain, pair<Range, Range2>>(res);
46242}
46243
46244template <typename Domain, typename Range, typename Range2>
46245typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_range(const typed::space<pair<Range, Range2>> &space) const
46246{
46247  auto res = isl::union_map::intersect_range(space);
46248  return typed::union_map<Domain, pair<Range, Range2>>(res);
46249}
46250
46251template <typename Domain, typename Range, typename Range2>
46252typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const
46253{
46254  auto res = isl::union_map::intersect_range(uset);
46255  return typed::union_map<Domain, pair<Range, Range2>>(res);
46256}
46257
46258template <typename Domain, typename Range, typename Range2>
46259typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const
46260{
46261  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
46262  return typed::union_map<Domain, pair<Range, Range2>>(res);
46263}
46264
46265template <typename Domain, typename Range, typename Range2>
46266typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::basic_set<Range> &domain) const
46267{
46268  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
46269  return typed::union_map<Domain, pair<Range, Range2>>(res);
46270}
46271
46272template <typename Domain, typename Range, typename Range2>
46273typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::point<Range> &domain) const
46274{
46275  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
46276  return typed::union_map<Domain, pair<Range, Range2>>(res);
46277}
46278
46279template <typename Domain, typename Range, typename Range2>
46280typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::set<Range> &domain) const
46281{
46282  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
46283  return typed::union_map<Domain, pair<Range, Range2>>(res);
46284}
46285
46286template <typename Domain, typename Range, typename Range2>
46287typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::lexmax() const
46288{
46289  auto res = isl::union_map::lexmax();
46290  return typed::union_map<Domain, pair<Range, Range2>>(res);
46291}
46292
46293template <typename Domain, typename Range, typename Range2>
46294typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::lexmin() const
46295{
46296  auto res = isl::union_map::lexmin();
46297  return typed::union_map<Domain, pair<Range, Range2>>(res);
46298}
46299
46300template <typename Domain, typename Range, typename Range2>
46301typed::map_list<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::map_list() const
46302{
46303  auto res = isl::union_map::map_list();
46304  return typed::map_list<Domain, pair<Range, Range2>>(res);
46305}
46306
46307template <typename Domain, typename Range, typename Range2>
46308typed::set<> typed::union_map<Domain, pair<Range, Range2>>::params() const
46309{
46310  auto res = isl::union_map::params();
46311  return typed::set<>(res);
46312}
46313
46314template <typename Domain, typename Range, typename Range2>
46315template <typename Domain2>
46316typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::preimage_domain(const typed::multi_aff<Domain2, Domain> &ma) const
46317{
46318  auto res = isl::union_map::preimage_domain(ma);
46319  return typed::union_map<Domain2, pair<Range, Range2>>(res);
46320}
46321
46322template <typename Domain, typename Range, typename Range2>
46323template <typename Domain2>
46324typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::preimage_domain(const typed::multi_pw_aff<Domain2, Domain> &mpa) const
46325{
46326  auto res = isl::union_map::preimage_domain(mpa);
46327  return typed::union_map<Domain2, pair<Range, Range2>>(res);
46328}
46329
46330template <typename Domain, typename Range, typename Range2>
46331template <typename Domain2>
46332typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::preimage_domain(const typed::pw_multi_aff<Domain2, Domain> &pma) const
46333{
46334  auto res = isl::union_map::preimage_domain(pma);
46335  return typed::union_map<Domain2, pair<Range, Range2>>(res);
46336}
46337
46338template <typename Domain, typename Range, typename Range2>
46339template <typename Domain2>
46340typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::preimage_domain(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
46341{
46342  auto res = isl::union_map::preimage_domain(upma);
46343  return typed::union_map<Domain2, pair<Range, Range2>>(res);
46344}
46345
46346template <typename Domain, typename Range, typename Range2>
46347template <typename Arg3>
46348typed::union_map<Domain, Arg3> typed::union_map<Domain, pair<Range, Range2>>::preimage_range(const typed::multi_aff<Arg3, pair<Range, Range2>> &ma) const
46349{
46350  auto res = isl::union_map::preimage_range(ma);
46351  return typed::union_map<Domain, Arg3>(res);
46352}
46353
46354template <typename Domain, typename Range, typename Range2>
46355template <typename Arg3>
46356typed::union_map<Domain, Arg3> typed::union_map<Domain, pair<Range, Range2>>::preimage_range(const typed::pw_multi_aff<Arg3, pair<Range, Range2>> &pma) const
46357{
46358  auto res = isl::union_map::preimage_range(pma);
46359  return typed::union_map<Domain, Arg3>(res);
46360}
46361
46362template <typename Domain, typename Range, typename Range2>
46363template <typename Arg3>
46364typed::union_map<Domain, Arg3> typed::union_map<Domain, pair<Range, Range2>>::preimage_range(const typed::union_pw_multi_aff<Arg3, pair<Range, Range2>> &upma) const
46365{
46366  auto res = isl::union_map::preimage_range(upma);
46367  return typed::union_map<Domain, Arg3>(res);
46368}
46369
46370template <typename Domain, typename Range, typename Range2>
46371template <typename Domain2, typename Arg3>
46372typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::union_map<Domain, pair<Range, Range2>>::product(const typed::union_map<Domain2, Arg3> &umap2) const
46373{
46374  auto res = isl::union_map::product(umap2);
46375  return typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
46376}
46377
46378template <typename Domain, typename Range, typename Range2>
46379template <typename Domain2, typename Arg3>
46380typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::union_map<Domain, pair<Range, Range2>>::product(const typed::basic_map<Domain2, Arg3> &umap2) const
46381{
46382  auto res = isl::union_map::product(umap2);
46383  return typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
46384}
46385
46386template <typename Domain, typename Range, typename Range2>
46387template <typename Domain2, typename Arg3>
46388typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>> typed::union_map<Domain, pair<Range, Range2>>::product(const typed::map<Domain2, Arg3> &umap2) const
46389{
46390  auto res = isl::union_map::product(umap2);
46391  return typed::union_map<pair<Domain, Domain2>, pair<pair<Range, Range2>, Arg3>>(res);
46392}
46393
46394template <typename Domain, typename Range, typename Range2>
46395typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::project_out_all_params() const
46396{
46397  auto res = isl::union_map::project_out_all_params();
46398  return typed::union_map<Domain, pair<Range, Range2>>(res);
46399}
46400
46401template <typename Domain, typename Range, typename Range2>
46402typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::project_out_param(const typed::id<Anonymous> &id) const
46403{
46404  auto res = isl::union_map::project_out_param(id);
46405  return typed::union_map<Domain, pair<Range, Range2>>(res);
46406}
46407
46408template <typename Domain, typename Range, typename Range2>
46409typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::project_out_param(const std::string &id) const
46410{
46411  auto res = isl::union_map::project_out_param(id);
46412  return typed::union_map<Domain, pair<Range, Range2>>(res);
46413}
46414
46415template <typename Domain, typename Range, typename Range2>
46416typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::project_out_param(const typed::id_list<Anonymous> &list) const
46417{
46418  auto res = isl::union_map::project_out_param(list);
46419  return typed::union_map<Domain, pair<Range, Range2>>(res);
46420}
46421
46422template <typename Domain, typename Range, typename Range2>
46423typed::union_set<pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::range() const
46424{
46425  auto res = isl::union_map::range();
46426  return typed::union_set<pair<Range, Range2>>(res);
46427}
46428
46429template <typename Domain, typename Range, typename Range2>
46430typed::union_map<Domain, Range> typed::union_map<Domain, pair<Range, Range2>>::range_factor_domain() const
46431{
46432  auto res = isl::union_map::range_factor_domain();
46433  return typed::union_map<Domain, Range>(res);
46434}
46435
46436template <typename Domain, typename Range, typename Range2>
46437typed::union_map<Domain, Range2> typed::union_map<Domain, pair<Range, Range2>>::range_factor_range() const
46438{
46439  auto res = isl::union_map::range_factor_range();
46440  return typed::union_map<Domain, Range2>(res);
46441}
46442
46443template <typename Domain, typename Range, typename Range2>
46444typed::union_map<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::range_map() const
46445{
46446  auto res = isl::union_map::range_map();
46447  return typed::union_map<pair<Domain, pair<Range, Range2>>, pair<Range, Range2>>(res);
46448}
46449
46450template <typename Domain, typename Range, typename Range2>
46451template <typename Arg3>
46452typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> typed::union_map<Domain, pair<Range, Range2>>::range_product(const typed::union_map<Domain, Arg3> &umap2) const
46453{
46454  auto res = isl::union_map::range_product(umap2);
46455  return typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>>(res);
46456}
46457
46458template <typename Domain, typename Range, typename Range2>
46459template <typename Arg3>
46460typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> typed::union_map<Domain, pair<Range, Range2>>::range_product(const typed::basic_map<Domain, Arg3> &umap2) const
46461{
46462  auto res = isl::union_map::range_product(umap2);
46463  return typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>>(res);
46464}
46465
46466template <typename Domain, typename Range, typename Range2>
46467template <typename Arg3>
46468typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>> typed::union_map<Domain, pair<Range, Range2>>::range_product(const typed::map<Domain, Arg3> &umap2) const
46469{
46470  auto res = isl::union_map::range_product(umap2);
46471  return typed::union_map<Domain, pair<pair<Range, Range2>, Arg3>>(res);
46472}
46473
46474template <typename Domain, typename Range, typename Range2>
46475typed::union_map<Domain, pair<Range2, Range>> typed::union_map<Domain, pair<Range, Range2>>::range_reverse() const
46476{
46477  auto res = isl::union_map::range_reverse();
46478  return typed::union_map<Domain, pair<Range2, Range>>(res);
46479}
46480
46481template <typename Domain, typename Range, typename Range2>
46482typed::union_map<pair<Range, Range2>, Domain> typed::union_map<Domain, pair<Range, Range2>>::reverse() const
46483{
46484  auto res = isl::union_map::reverse();
46485  return typed::union_map<pair<Range, Range2>, Domain>(res);
46486}
46487
46488template <typename Domain, typename Range, typename Range2>
46489typed::space<> typed::union_map<Domain, pair<Range, Range2>>::space() const
46490{
46491  auto res = isl::union_map::space();
46492  return typed::space<>(res);
46493}
46494
46495template <typename Domain, typename Range, typename Range2>
46496typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const
46497{
46498  auto res = isl::union_map::subtract(umap2);
46499  return typed::union_map<Domain, pair<Range, Range2>>(res);
46500}
46501
46502template <typename Domain, typename Range, typename Range2>
46503typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract(const typed::basic_map<Domain, pair<Range, Range2>> &umap2) const
46504{
46505  auto res = isl::union_map::subtract(umap2);
46506  return typed::union_map<Domain, pair<Range, Range2>>(res);
46507}
46508
46509template <typename Domain, typename Range, typename Range2>
46510typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract(const typed::map<Domain, pair<Range, Range2>> &umap2) const
46511{
46512  auto res = isl::union_map::subtract(umap2);
46513  return typed::union_map<Domain, pair<Range, Range2>>(res);
46514}
46515
46516template <typename Domain, typename Range, typename Range2>
46517typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract_domain(const typed::union_set<Domain> &dom) const
46518{
46519  auto res = isl::union_map::subtract_domain(dom);
46520  return typed::union_map<Domain, pair<Range, Range2>>(res);
46521}
46522
46523template <typename Domain, typename Range, typename Range2>
46524typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract_domain(const typed::basic_set<Domain> &dom) const
46525{
46526  auto res = isl::union_map::subtract_domain(dom);
46527  return typed::union_map<Domain, pair<Range, Range2>>(res);
46528}
46529
46530template <typename Domain, typename Range, typename Range2>
46531typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract_domain(const typed::point<Domain> &dom) const
46532{
46533  auto res = isl::union_map::subtract_domain(dom);
46534  return typed::union_map<Domain, pair<Range, Range2>>(res);
46535}
46536
46537template <typename Domain, typename Range, typename Range2>
46538typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract_domain(const typed::set<Domain> &dom) const
46539{
46540  auto res = isl::union_map::subtract_domain(dom);
46541  return typed::union_map<Domain, pair<Range, Range2>>(res);
46542}
46543
46544template <typename Domain, typename Range, typename Range2>
46545typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const
46546{
46547  auto res = isl::union_map::subtract_range(dom);
46548  return typed::union_map<Domain, pair<Range, Range2>>(res);
46549}
46550
46551template <typename Domain, typename Range, typename Range2>
46552typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract_range(const typed::basic_set<pair<Range, Range2>> &dom) const
46553{
46554  auto res = isl::union_map::subtract_range(dom);
46555  return typed::union_map<Domain, pair<Range, Range2>>(res);
46556}
46557
46558template <typename Domain, typename Range, typename Range2>
46559typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract_range(const typed::point<pair<Range, Range2>> &dom) const
46560{
46561  auto res = isl::union_map::subtract_range(dom);
46562  return typed::union_map<Domain, pair<Range, Range2>>(res);
46563}
46564
46565template <typename Domain, typename Range, typename Range2>
46566typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::subtract_range(const typed::set<pair<Range, Range2>> &dom) const
46567{
46568  auto res = isl::union_map::subtract_range(dom);
46569  return typed::union_map<Domain, pair<Range, Range2>>(res);
46570}
46571
46572template <typename Domain, typename Range, typename Range2>
46573typed::union_map<pair<Domain, Range>, Range2> typed::union_map<Domain, pair<Range, Range2>>::uncurry() const
46574{
46575  auto res = isl::union_map::uncurry();
46576  return typed::union_map<pair<Domain, Range>, Range2>(res);
46577}
46578
46579template <typename Domain, typename Range, typename Range2>
46580typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::unite(const typed::union_map<Domain, pair<Range, Range2>> &umap2) const
46581{
46582  auto res = isl::union_map::unite(umap2);
46583  return typed::union_map<Domain, pair<Range, Range2>>(res);
46584}
46585
46586template <typename Domain, typename Range, typename Range2>
46587typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::unite(const typed::basic_map<Domain, pair<Range, Range2>> &umap2) const
46588{
46589  auto res = isl::union_map::unite(umap2);
46590  return typed::union_map<Domain, pair<Range, Range2>>(res);
46591}
46592
46593template <typename Domain, typename Range, typename Range2>
46594typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::unite(const typed::map<Domain, pair<Range, Range2>> &umap2) const
46595{
46596  auto res = isl::union_map::unite(umap2);
46597  return typed::union_map<Domain, pair<Range, Range2>>(res);
46598}
46599
46600template <typename Domain, typename Range, typename Range2>
46601typed::union_map<Domain, pair<Range, Range2>> typed::union_map<Domain, pair<Range, Range2>>::universe() const
46602{
46603  auto res = isl::union_map::universe();
46604  return typed::union_map<Domain, pair<Range, Range2>>(res);
46605}
46606
46607template <typename Domain, typename Range, typename Range2>
46608typed::union_set<pair<Domain, pair<Range, Range2>>> typed::union_map<Domain, pair<Range, Range2>>::wrap() const
46609{
46610  auto res = isl::union_map::wrap();
46611  return typed::union_set<pair<Domain, pair<Range, Range2>>>(res);
46612}
46613
46614template <typename T1, typename T2>
46615typed::union_map<pair<T1, T2>, pair<T1, T2>>::union_map(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &bmap)
46616  : isl::union_map(bmap)
46617{
46618}
46619
46620template <typename T1, typename T2>
46621typed::union_map<pair<T1, T2>, pair<T1, T2>>::union_map(const typed::map<pair<T1, T2>, pair<T1, T2>> &map)
46622  : isl::union_map(map)
46623{
46624}
46625
46626template <typename T1, typename T2>
46627typed::union_map<pair<T1, T2>, pair<T1, T2>>::union_map(const isl::ctx &ctx, const std::string &str)
46628  : isl::union_map(ctx, str)
46629{
46630}
46631
46632template <typename T1, typename T2>
46633template <typename Domain2>
46634typed::union_map<Domain2, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const
46635{
46636  auto res = isl::union_map::apply_domain(umap2);
46637  return typed::union_map<Domain2, pair<T1, T2>>(res);
46638}
46639
46640template <typename T1, typename T2>
46641template <typename Domain2>
46642typed::union_map<Domain2, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &umap2) const
46643{
46644  auto res = isl::union_map::apply_domain(umap2);
46645  return typed::union_map<Domain2, pair<T1, T2>>(res);
46646}
46647
46648template <typename T1, typename T2>
46649template <typename Domain2>
46650typed::union_map<Domain2, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::apply_domain(const typed::map<pair<T1, T2>, Domain2> &umap2) const
46651{
46652  auto res = isl::union_map::apply_domain(umap2);
46653  return typed::union_map<Domain2, pair<T1, T2>>(res);
46654}
46655
46656template <typename T1, typename T2>
46657template <typename Range2>
46658typed::union_map<pair<T1, T2>, Range2> typed::union_map<pair<T1, T2>, pair<T1, T2>>::apply_range(const typed::union_map<pair<T1, T2>, Range2> &umap2) const
46659{
46660  auto res = isl::union_map::apply_range(umap2);
46661  return typed::union_map<pair<T1, T2>, Range2>(res);
46662}
46663
46664template <typename T1, typename T2>
46665template <typename Range2>
46666typed::union_map<pair<T1, T2>, Range2> typed::union_map<pair<T1, T2>, pair<T1, T2>>::apply_range(const typed::basic_map<pair<T1, T2>, Range2> &umap2) const
46667{
46668  auto res = isl::union_map::apply_range(umap2);
46669  return typed::union_map<pair<T1, T2>, Range2>(res);
46670}
46671
46672template <typename T1, typename T2>
46673template <typename Range2>
46674typed::union_map<pair<T1, T2>, Range2> typed::union_map<pair<T1, T2>, pair<T1, T2>>::apply_range(const typed::map<pair<T1, T2>, Range2> &umap2) const
46675{
46676  auto res = isl::union_map::apply_range(umap2);
46677  return typed::union_map<pair<T1, T2>, Range2>(res);
46678}
46679
46680template <typename T1, typename T2>
46681typed::map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::as_map() const
46682{
46683  auto res = isl::union_map::as_map();
46684  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
46685}
46686
46687template <typename T1, typename T2>
46688typed::multi_union_pw_aff<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::as_multi_union_pw_aff() const
46689{
46690  auto res = isl::union_map::as_multi_union_pw_aff();
46691  return typed::multi_union_pw_aff<pair<T1, T2>, pair<T1, T2>>(res);
46692}
46693
46694template <typename T1, typename T2>
46695typed::union_pw_multi_aff<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::as_union_pw_multi_aff() const
46696{
46697  auto res = isl::union_map::as_union_pw_multi_aff();
46698  return typed::union_pw_multi_aff<pair<T1, T2>, pair<T1, T2>>(res);
46699}
46700
46701template <typename T1, typename T2>
46702typed::union_set<pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::bind_range(const typed::multi_id<pair<T1, T2>> &tuple) const
46703{
46704  auto res = isl::union_map::bind_range(tuple);
46705  return typed::union_set<pair<T1, T2>>(res);
46706}
46707
46708template <typename T1, typename T2>
46709typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::coalesce() const
46710{
46711  auto res = isl::union_map::coalesce();
46712  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46713}
46714
46715template <typename T1, typename T2>
46716typed::union_map<T1, pair<T2, pair<T1, T2>>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::curry() const
46717{
46718  auto res = isl::union_map::curry();
46719  return typed::union_map<T1, pair<T2, pair<T1, T2>>>(res);
46720}
46721
46722template <typename T1, typename T2>
46723typed::union_set<pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::deltas() const
46724{
46725  auto res = isl::union_map::deltas();
46726  return typed::union_set<pair<T1, T2>>(res);
46727}
46728
46729template <typename T1, typename T2>
46730typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::detect_equalities() const
46731{
46732  auto res = isl::union_map::detect_equalities();
46733  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46734}
46735
46736template <typename T1, typename T2>
46737typed::union_set<pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::domain() const
46738{
46739  auto res = isl::union_map::domain();
46740  return typed::union_set<pair<T1, T2>>(res);
46741}
46742
46743template <typename T1, typename T2>
46744typed::union_map<T1, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::domain_factor_domain() const
46745{
46746  auto res = isl::union_map::domain_factor_domain();
46747  return typed::union_map<T1, pair<T1, T2>>(res);
46748}
46749
46750template <typename T1, typename T2>
46751typed::union_map<T2, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::domain_factor_range() const
46752{
46753  auto res = isl::union_map::domain_factor_range();
46754  return typed::union_map<T2, pair<T1, T2>>(res);
46755}
46756
46757template <typename T1, typename T2>
46758typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::domain_map() const
46759{
46760  auto res = isl::union_map::domain_map();
46761  return typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>>(res);
46762}
46763
46764template <typename T1, typename T2>
46765typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::domain_map_union_pw_multi_aff() const
46766{
46767  auto res = isl::union_map::domain_map_union_pw_multi_aff();
46768  return typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>>(res);
46769}
46770
46771template <typename T1, typename T2>
46772template <typename Domain2>
46773typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::domain_product(const typed::union_map<Domain2, pair<T1, T2>> &umap2) const
46774{
46775  auto res = isl::union_map::domain_product(umap2);
46776  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>>(res);
46777}
46778
46779template <typename T1, typename T2>
46780template <typename Domain2>
46781typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::domain_product(const typed::basic_map<Domain2, pair<T1, T2>> &umap2) const
46782{
46783  auto res = isl::union_map::domain_product(umap2);
46784  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>>(res);
46785}
46786
46787template <typename T1, typename T2>
46788template <typename Domain2>
46789typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::domain_product(const typed::map<Domain2, pair<T1, T2>> &umap2) const
46790{
46791  auto res = isl::union_map::domain_product(umap2);
46792  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<T1, T2>>(res);
46793}
46794
46795template <typename T1, typename T2>
46796typed::union_map<pair<T2, T1>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::domain_reverse() const
46797{
46798  auto res = isl::union_map::domain_reverse();
46799  return typed::union_map<pair<T2, T1>, pair<T1, T2>>(res);
46800}
46801
46802template <typename T1, typename T2>
46803typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::drop_unused_params() const
46804{
46805  auto res = isl::union_map::drop_unused_params();
46806  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46807}
46808
46809template <typename T1, typename T2>
46810typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::empty(const isl::ctx &ctx)
46811{
46812  auto res = isl::union_map::empty(ctx);
46813  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46814}
46815
46816template <typename T1, typename T2>
46817template <typename Range>
46818typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::multi_union_pw_aff<pair<T1, T2>, Range> &mupa) const
46819{
46820  auto res = isl::union_map::eq_at(mupa);
46821  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46822}
46823
46824template <typename T1, typename T2>
46825template <typename Range>
46826typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::multi_pw_aff<pair<T1, T2>, Range> &mupa) const
46827{
46828  auto res = isl::union_map::eq_at(mupa);
46829  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46830}
46831
46832template <typename T1, typename T2>
46833typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::eq_at(const typed::union_pw_aff<pair<T1, T2>, Anonymous> &mupa) const
46834{
46835  auto res = isl::union_map::eq_at(mupa);
46836  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46837}
46838
46839template <typename T1, typename T2>
46840bool typed::union_map<pair<T1, T2>, pair<T1, T2>>::every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<T1, T2>>)> &test) const
46841{
46842  auto lambda_test = [&] (isl::map arg0) {
46843    return test(typed::map<pair<T1, T2>, pair<T1, T2>>(arg0));
46844  };
46845  return isl::union_map::every_map(lambda_test);
46846}
46847
46848template <typename T1, typename T2>
46849typed::map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::extract_map(const typed::space<pair<T1, T2>, pair<T1, T2>> &space) const
46850{
46851  auto res = isl::union_map::extract_map(space);
46852  return typed::map<pair<T1, T2>, pair<T1, T2>>(res);
46853}
46854
46855template <typename T1, typename T2>
46856void typed::union_map<pair<T1, T2>, pair<T1, T2>>::foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<T1, T2>>)> &fn) const
46857{
46858  auto lambda_fn = [&] (isl::map arg0) {
46859    return fn(typed::map<pair<T1, T2>, pair<T1, T2>>(arg0));
46860  };
46861  return isl::union_map::foreach_map(lambda_fn);
46862}
46863
46864template <typename T1, typename T2>
46865typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &context) const
46866{
46867  auto res = isl::union_map::gist(context);
46868  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46869}
46870
46871template <typename T1, typename T2>
46872typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &context) const
46873{
46874  auto res = isl::union_map::gist(context);
46875  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46876}
46877
46878template <typename T1, typename T2>
46879typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist(const typed::map<pair<T1, T2>, pair<T1, T2>> &context) const
46880{
46881  auto res = isl::union_map::gist(context);
46882  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46883}
46884
46885template <typename T1, typename T2>
46886typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::union_set<pair<T1, T2>> &uset) const
46887{
46888  auto res = isl::union_map::gist_domain(uset);
46889  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46890}
46891
46892template <typename T1, typename T2>
46893typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::basic_set<pair<T1, T2>> &uset) const
46894{
46895  auto res = isl::union_map::gist_domain(uset);
46896  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46897}
46898
46899template <typename T1, typename T2>
46900typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::point<pair<T1, T2>> &uset) const
46901{
46902  auto res = isl::union_map::gist_domain(uset);
46903  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46904}
46905
46906template <typename T1, typename T2>
46907typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist_domain(const typed::set<pair<T1, T2>> &uset) const
46908{
46909  auto res = isl::union_map::gist_domain(uset);
46910  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46911}
46912
46913template <typename T1, typename T2>
46914typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist_params(const typed::set<> &set) const
46915{
46916  auto res = isl::union_map::gist_params(set);
46917  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46918}
46919
46920template <typename T1, typename T2>
46921typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist_params(const typed::basic_set<> &set) const
46922{
46923  auto res = isl::union_map::gist_params(set);
46924  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46925}
46926
46927template <typename T1, typename T2>
46928typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::gist_params(const typed::point<> &set) const
46929{
46930  auto res = isl::union_map::gist_params(set);
46931  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46932}
46933
46934template <typename T1, typename T2>
46935typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
46936{
46937  auto res = isl::union_map::intersect(umap2);
46938  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46939}
46940
46941template <typename T1, typename T2>
46942typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
46943{
46944  auto res = isl::union_map::intersect(umap2);
46945  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46946}
46947
46948template <typename T1, typename T2>
46949typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect(const typed::map<pair<T1, T2>, pair<T1, T2>> &umap2) const
46950{
46951  auto res = isl::union_map::intersect(umap2);
46952  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46953}
46954
46955template <typename T1, typename T2>
46956typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::space<pair<T1, T2>> &space) const
46957{
46958  auto res = isl::union_map::intersect_domain(space);
46959  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46960}
46961
46962template <typename T1, typename T2>
46963typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const
46964{
46965  auto res = isl::union_map::intersect_domain(uset);
46966  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46967}
46968
46969template <typename T1, typename T2>
46970typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const
46971{
46972  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
46973  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46974}
46975
46976template <typename T1, typename T2>
46977typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::basic_set<T1> &domain) const
46978{
46979  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
46980  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46981}
46982
46983template <typename T1, typename T2>
46984typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::point<T1> &domain) const
46985{
46986  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
46987  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46988}
46989
46990template <typename T1, typename T2>
46991typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_domain_wrapped_domain(const typed::set<T1> &domain) const
46992{
46993  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
46994  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
46995}
46996
46997template <typename T1, typename T2>
46998typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_params(const typed::set<> &set) const
46999{
47000  auto res = isl::union_map::intersect_params(set);
47001  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47002}
47003
47004template <typename T1, typename T2>
47005typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_params(const typed::basic_set<> &set) const
47006{
47007  auto res = isl::union_map::intersect_params(set);
47008  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47009}
47010
47011template <typename T1, typename T2>
47012typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_params(const typed::point<> &set) const
47013{
47014  auto res = isl::union_map::intersect_params(set);
47015  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47016}
47017
47018template <typename T1, typename T2>
47019typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::space<pair<T1, T2>> &space) const
47020{
47021  auto res = isl::union_map::intersect_range(space);
47022  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47023}
47024
47025template <typename T1, typename T2>
47026typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_range(const typed::union_set<pair<T1, T2>> &uset) const
47027{
47028  auto res = isl::union_map::intersect_range(uset);
47029  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47030}
47031
47032template <typename T1, typename T2>
47033typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::union_set<T1> &domain) const
47034{
47035  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
47036  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47037}
47038
47039template <typename T1, typename T2>
47040typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::basic_set<T1> &domain) const
47041{
47042  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
47043  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47044}
47045
47046template <typename T1, typename T2>
47047typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::point<T1> &domain) const
47048{
47049  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
47050  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47051}
47052
47053template <typename T1, typename T2>
47054typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::intersect_range_wrapped_domain(const typed::set<T1> &domain) const
47055{
47056  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
47057  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47058}
47059
47060template <typename T1, typename T2>
47061typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::lexmax() const
47062{
47063  auto res = isl::union_map::lexmax();
47064  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47065}
47066
47067template <typename T1, typename T2>
47068typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::lexmin() const
47069{
47070  auto res = isl::union_map::lexmin();
47071  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47072}
47073
47074template <typename T1, typename T2>
47075typed::map_list<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::map_list() const
47076{
47077  auto res = isl::union_map::map_list();
47078  return typed::map_list<pair<T1, T2>, pair<T1, T2>>(res);
47079}
47080
47081template <typename T1, typename T2>
47082typed::set<> typed::union_map<pair<T1, T2>, pair<T1, T2>>::params() const
47083{
47084  auto res = isl::union_map::params();
47085  return typed::set<>(res);
47086}
47087
47088template <typename T1, typename T2>
47089template <typename Domain2>
47090typed::union_map<Domain2, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const
47091{
47092  auto res = isl::union_map::preimage_domain(ma);
47093  return typed::union_map<Domain2, pair<T1, T2>>(res);
47094}
47095
47096template <typename T1, typename T2>
47097template <typename Domain2>
47098typed::union_map<Domain2, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const
47099{
47100  auto res = isl::union_map::preimage_domain(mpa);
47101  return typed::union_map<Domain2, pair<T1, T2>>(res);
47102}
47103
47104template <typename T1, typename T2>
47105template <typename Domain2>
47106typed::union_map<Domain2, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const
47107{
47108  auto res = isl::union_map::preimage_domain(pma);
47109  return typed::union_map<Domain2, pair<T1, T2>>(res);
47110}
47111
47112template <typename T1, typename T2>
47113template <typename Domain2>
47114typed::union_map<Domain2, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const
47115{
47116  auto res = isl::union_map::preimage_domain(upma);
47117  return typed::union_map<Domain2, pair<T1, T2>>(res);
47118}
47119
47120template <typename T1, typename T2>
47121template <typename Range2>
47122typed::union_map<pair<T1, T2>, Range2> typed::union_map<pair<T1, T2>, pair<T1, T2>>::preimage_range(const typed::multi_aff<Range2, pair<T1, T2>> &ma) const
47123{
47124  auto res = isl::union_map::preimage_range(ma);
47125  return typed::union_map<pair<T1, T2>, Range2>(res);
47126}
47127
47128template <typename T1, typename T2>
47129template <typename Range2>
47130typed::union_map<pair<T1, T2>, Range2> typed::union_map<pair<T1, T2>, pair<T1, T2>>::preimage_range(const typed::pw_multi_aff<Range2, pair<T1, T2>> &pma) const
47131{
47132  auto res = isl::union_map::preimage_range(pma);
47133  return typed::union_map<pair<T1, T2>, Range2>(res);
47134}
47135
47136template <typename T1, typename T2>
47137template <typename Range2>
47138typed::union_map<pair<T1, T2>, Range2> typed::union_map<pair<T1, T2>, pair<T1, T2>>::preimage_range(const typed::union_pw_multi_aff<Range2, pair<T1, T2>> &upma) const
47139{
47140  auto res = isl::union_map::preimage_range(upma);
47141  return typed::union_map<pair<T1, T2>, Range2>(res);
47142}
47143
47144template <typename T1, typename T2>
47145template <typename Domain2, typename Range2>
47146typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::product(const typed::union_map<Domain2, Range2> &umap2) const
47147{
47148  auto res = isl::union_map::product(umap2);
47149  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>>(res);
47150}
47151
47152template <typename T1, typename T2>
47153template <typename Domain2, typename Range2>
47154typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::product(const typed::basic_map<Domain2, Range2> &umap2) const
47155{
47156  auto res = isl::union_map::product(umap2);
47157  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>>(res);
47158}
47159
47160template <typename T1, typename T2>
47161template <typename Domain2, typename Range2>
47162typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::product(const typed::map<Domain2, Range2> &umap2) const
47163{
47164  auto res = isl::union_map::product(umap2);
47165  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<T1, T2>, Range2>>(res);
47166}
47167
47168template <typename T1, typename T2>
47169typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::project_out_all_params() const
47170{
47171  auto res = isl::union_map::project_out_all_params();
47172  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47173}
47174
47175template <typename T1, typename T2>
47176typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::project_out_param(const typed::id<Anonymous> &id) const
47177{
47178  auto res = isl::union_map::project_out_param(id);
47179  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47180}
47181
47182template <typename T1, typename T2>
47183typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::project_out_param(const std::string &id) const
47184{
47185  auto res = isl::union_map::project_out_param(id);
47186  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47187}
47188
47189template <typename T1, typename T2>
47190typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::project_out_param(const typed::id_list<Anonymous> &list) const
47191{
47192  auto res = isl::union_map::project_out_param(list);
47193  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47194}
47195
47196template <typename T1, typename T2>
47197typed::union_set<pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::range() const
47198{
47199  auto res = isl::union_map::range();
47200  return typed::union_set<pair<T1, T2>>(res);
47201}
47202
47203template <typename T1, typename T2>
47204typed::union_map<pair<T1, T2>, T1> typed::union_map<pair<T1, T2>, pair<T1, T2>>::range_factor_domain() const
47205{
47206  auto res = isl::union_map::range_factor_domain();
47207  return typed::union_map<pair<T1, T2>, T1>(res);
47208}
47209
47210template <typename T1, typename T2>
47211typed::union_map<pair<T1, T2>, T2> typed::union_map<pair<T1, T2>, pair<T1, T2>>::range_factor_range() const
47212{
47213  auto res = isl::union_map::range_factor_range();
47214  return typed::union_map<pair<T1, T2>, T2>(res);
47215}
47216
47217template <typename T1, typename T2>
47218typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::range_map() const
47219{
47220  auto res = isl::union_map::range_map();
47221  return typed::union_map<pair<pair<T1, T2>, pair<T1, T2>>, pair<T1, T2>>(res);
47222}
47223
47224template <typename T1, typename T2>
47225template <typename Range2>
47226typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::range_product(const typed::union_map<pair<T1, T2>, Range2> &umap2) const
47227{
47228  auto res = isl::union_map::range_product(umap2);
47229  return typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>>(res);
47230}
47231
47232template <typename T1, typename T2>
47233template <typename Range2>
47234typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::range_product(const typed::basic_map<pair<T1, T2>, Range2> &umap2) const
47235{
47236  auto res = isl::union_map::range_product(umap2);
47237  return typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>>(res);
47238}
47239
47240template <typename T1, typename T2>
47241template <typename Range2>
47242typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::range_product(const typed::map<pair<T1, T2>, Range2> &umap2) const
47243{
47244  auto res = isl::union_map::range_product(umap2);
47245  return typed::union_map<pair<T1, T2>, pair<pair<T1, T2>, Range2>>(res);
47246}
47247
47248template <typename T1, typename T2>
47249typed::union_map<pair<T1, T2>, pair<T2, T1>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::range_reverse() const
47250{
47251  auto res = isl::union_map::range_reverse();
47252  return typed::union_map<pair<T1, T2>, pair<T2, T1>>(res);
47253}
47254
47255template <typename T1, typename T2>
47256typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::reverse() const
47257{
47258  auto res = isl::union_map::reverse();
47259  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47260}
47261
47262template <typename T1, typename T2>
47263typed::space<> typed::union_map<pair<T1, T2>, pair<T1, T2>>::space() const
47264{
47265  auto res = isl::union_map::space();
47266  return typed::space<>(res);
47267}
47268
47269template <typename T1, typename T2>
47270typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
47271{
47272  auto res = isl::union_map::subtract(umap2);
47273  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47274}
47275
47276template <typename T1, typename T2>
47277typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
47278{
47279  auto res = isl::union_map::subtract(umap2);
47280  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47281}
47282
47283template <typename T1, typename T2>
47284typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract(const typed::map<pair<T1, T2>, pair<T1, T2>> &umap2) const
47285{
47286  auto res = isl::union_map::subtract(umap2);
47287  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47288}
47289
47290template <typename T1, typename T2>
47291typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const
47292{
47293  auto res = isl::union_map::subtract_domain(dom);
47294  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47295}
47296
47297template <typename T1, typename T2>
47298typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract_domain(const typed::basic_set<pair<T1, T2>> &dom) const
47299{
47300  auto res = isl::union_map::subtract_domain(dom);
47301  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47302}
47303
47304template <typename T1, typename T2>
47305typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract_domain(const typed::point<pair<T1, T2>> &dom) const
47306{
47307  auto res = isl::union_map::subtract_domain(dom);
47308  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47309}
47310
47311template <typename T1, typename T2>
47312typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract_domain(const typed::set<pair<T1, T2>> &dom) const
47313{
47314  auto res = isl::union_map::subtract_domain(dom);
47315  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47316}
47317
47318template <typename T1, typename T2>
47319typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract_range(const typed::union_set<pair<T1, T2>> &dom) const
47320{
47321  auto res = isl::union_map::subtract_range(dom);
47322  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47323}
47324
47325template <typename T1, typename T2>
47326typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract_range(const typed::basic_set<pair<T1, T2>> &dom) const
47327{
47328  auto res = isl::union_map::subtract_range(dom);
47329  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47330}
47331
47332template <typename T1, typename T2>
47333typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract_range(const typed::point<pair<T1, T2>> &dom) const
47334{
47335  auto res = isl::union_map::subtract_range(dom);
47336  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47337}
47338
47339template <typename T1, typename T2>
47340typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::subtract_range(const typed::set<pair<T1, T2>> &dom) const
47341{
47342  auto res = isl::union_map::subtract_range(dom);
47343  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47344}
47345
47346template <typename T1, typename T2>
47347typed::union_map<pair<pair<T1, T2>, T1>, T2> typed::union_map<pair<T1, T2>, pair<T1, T2>>::uncurry() const
47348{
47349  auto res = isl::union_map::uncurry();
47350  return typed::union_map<pair<pair<T1, T2>, T1>, T2>(res);
47351}
47352
47353template <typename T1, typename T2>
47354typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::unite(const typed::union_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
47355{
47356  auto res = isl::union_map::unite(umap2);
47357  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47358}
47359
47360template <typename T1, typename T2>
47361typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::unite(const typed::basic_map<pair<T1, T2>, pair<T1, T2>> &umap2) const
47362{
47363  auto res = isl::union_map::unite(umap2);
47364  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47365}
47366
47367template <typename T1, typename T2>
47368typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::unite(const typed::map<pair<T1, T2>, pair<T1, T2>> &umap2) const
47369{
47370  auto res = isl::union_map::unite(umap2);
47371  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47372}
47373
47374template <typename T1, typename T2>
47375typed::union_map<pair<T1, T2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::universe() const
47376{
47377  auto res = isl::union_map::universe();
47378  return typed::union_map<pair<T1, T2>, pair<T1, T2>>(res);
47379}
47380
47381template <typename T1, typename T2>
47382typed::union_set<pair<pair<T1, T2>, pair<T1, T2>>> typed::union_map<pair<T1, T2>, pair<T1, T2>>::wrap() const
47383{
47384  auto res = isl::union_map::wrap();
47385  return typed::union_set<pair<pair<T1, T2>, pair<T1, T2>>>(res);
47386}
47387
47388template <typename T1, typename T2, typename Range, typename Range2>
47389typed::union_map<pair<T1, T2>, pair<Range, Range2>>::union_map(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &bmap)
47390  : isl::union_map(bmap)
47391{
47392}
47393
47394template <typename T1, typename T2, typename Range, typename Range2>
47395typed::union_map<pair<T1, T2>, pair<Range, Range2>>::union_map(const typed::map<pair<T1, T2>, pair<Range, Range2>> &map)
47396  : isl::union_map(map)
47397{
47398}
47399
47400template <typename T1, typename T2, typename Range, typename Range2>
47401typed::union_map<pair<T1, T2>, pair<Range, Range2>>::union_map(const isl::ctx &ctx, const std::string &str)
47402  : isl::union_map(ctx, str)
47403{
47404}
47405
47406template <typename T1, typename T2, typename Range, typename Range2>
47407template <typename Domain2>
47408typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::apply_domain(const typed::union_map<pair<T1, T2>, Domain2> &umap2) const
47409{
47410  auto res = isl::union_map::apply_domain(umap2);
47411  return typed::union_map<Domain2, pair<Range, Range2>>(res);
47412}
47413
47414template <typename T1, typename T2, typename Range, typename Range2>
47415template <typename Domain2>
47416typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::apply_domain(const typed::basic_map<pair<T1, T2>, Domain2> &umap2) const
47417{
47418  auto res = isl::union_map::apply_domain(umap2);
47419  return typed::union_map<Domain2, pair<Range, Range2>>(res);
47420}
47421
47422template <typename T1, typename T2, typename Range, typename Range2>
47423template <typename Domain2>
47424typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::apply_domain(const typed::map<pair<T1, T2>, Domain2> &umap2) const
47425{
47426  auto res = isl::union_map::apply_domain(umap2);
47427  return typed::union_map<Domain2, pair<Range, Range2>>(res);
47428}
47429
47430template <typename T1, typename T2, typename Range, typename Range2>
47431template <typename Arg2>
47432typed::union_map<pair<T1, T2>, Arg2> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::apply_range(const typed::union_map<pair<Range, Range2>, Arg2> &umap2) const
47433{
47434  auto res = isl::union_map::apply_range(umap2);
47435  return typed::union_map<pair<T1, T2>, Arg2>(res);
47436}
47437
47438template <typename T1, typename T2, typename Range, typename Range2>
47439template <typename Arg2>
47440typed::union_map<pair<T1, T2>, Arg2> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::apply_range(const typed::basic_map<pair<Range, Range2>, Arg2> &umap2) const
47441{
47442  auto res = isl::union_map::apply_range(umap2);
47443  return typed::union_map<pair<T1, T2>, Arg2>(res);
47444}
47445
47446template <typename T1, typename T2, typename Range, typename Range2>
47447template <typename Arg2>
47448typed::union_map<pair<T1, T2>, Arg2> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::apply_range(const typed::map<pair<Range, Range2>, Arg2> &umap2) const
47449{
47450  auto res = isl::union_map::apply_range(umap2);
47451  return typed::union_map<pair<T1, T2>, Arg2>(res);
47452}
47453
47454template <typename T1, typename T2, typename Range, typename Range2>
47455typed::map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::as_map() const
47456{
47457  auto res = isl::union_map::as_map();
47458  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
47459}
47460
47461template <typename T1, typename T2, typename Range, typename Range2>
47462typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::as_multi_union_pw_aff() const
47463{
47464  auto res = isl::union_map::as_multi_union_pw_aff();
47465  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
47466}
47467
47468template <typename T1, typename T2, typename Range, typename Range2>
47469typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::as_union_pw_multi_aff() const
47470{
47471  auto res = isl::union_map::as_union_pw_multi_aff();
47472  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
47473}
47474
47475template <typename T1, typename T2, typename Range, typename Range2>
47476typed::union_set<pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::bind_range(const typed::multi_id<pair<Range, Range2>> &tuple) const
47477{
47478  auto res = isl::union_map::bind_range(tuple);
47479  return typed::union_set<pair<T1, T2>>(res);
47480}
47481
47482template <typename T1, typename T2, typename Range, typename Range2>
47483typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::coalesce() const
47484{
47485  auto res = isl::union_map::coalesce();
47486  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47487}
47488
47489template <typename T1, typename T2, typename Range, typename Range2>
47490typed::union_map<T1, pair<T2, pair<Range, Range2>>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::curry() const
47491{
47492  auto res = isl::union_map::curry();
47493  return typed::union_map<T1, pair<T2, pair<Range, Range2>>>(res);
47494}
47495
47496template <typename T1, typename T2, typename Range, typename Range2>
47497typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::detect_equalities() const
47498{
47499  auto res = isl::union_map::detect_equalities();
47500  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47501}
47502
47503template <typename T1, typename T2, typename Range, typename Range2>
47504typed::union_set<pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::domain() const
47505{
47506  auto res = isl::union_map::domain();
47507  return typed::union_set<pair<T1, T2>>(res);
47508}
47509
47510template <typename T1, typename T2, typename Range, typename Range2>
47511typed::union_map<T1, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::domain_factor_domain() const
47512{
47513  auto res = isl::union_map::domain_factor_domain();
47514  return typed::union_map<T1, pair<Range, Range2>>(res);
47515}
47516
47517template <typename T1, typename T2, typename Range, typename Range2>
47518typed::union_map<T2, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::domain_factor_range() const
47519{
47520  auto res = isl::union_map::domain_factor_range();
47521  return typed::union_map<T2, pair<Range, Range2>>(res);
47522}
47523
47524template <typename T1, typename T2, typename Range, typename Range2>
47525typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::domain_map() const
47526{
47527  auto res = isl::union_map::domain_map();
47528  return typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>>(res);
47529}
47530
47531template <typename T1, typename T2, typename Range, typename Range2>
47532typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::domain_map_union_pw_multi_aff() const
47533{
47534  auto res = isl::union_map::domain_map_union_pw_multi_aff();
47535  return typed::union_pw_multi_aff<pair<pair<T1, T2>, pair<Range, Range2>>, pair<T1, T2>>(res);
47536}
47537
47538template <typename T1, typename T2, typename Range, typename Range2>
47539template <typename Domain2>
47540typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::domain_product(const typed::union_map<Domain2, pair<Range, Range2>> &umap2) const
47541{
47542  auto res = isl::union_map::domain_product(umap2);
47543  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>>(res);
47544}
47545
47546template <typename T1, typename T2, typename Range, typename Range2>
47547template <typename Domain2>
47548typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::domain_product(const typed::basic_map<Domain2, pair<Range, Range2>> &umap2) const
47549{
47550  auto res = isl::union_map::domain_product(umap2);
47551  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>>(res);
47552}
47553
47554template <typename T1, typename T2, typename Range, typename Range2>
47555template <typename Domain2>
47556typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::domain_product(const typed::map<Domain2, pair<Range, Range2>> &umap2) const
47557{
47558  auto res = isl::union_map::domain_product(umap2);
47559  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<Range, Range2>>(res);
47560}
47561
47562template <typename T1, typename T2, typename Range, typename Range2>
47563typed::union_map<pair<T2, T1>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::domain_reverse() const
47564{
47565  auto res = isl::union_map::domain_reverse();
47566  return typed::union_map<pair<T2, T1>, pair<Range, Range2>>(res);
47567}
47568
47569template <typename T1, typename T2, typename Range, typename Range2>
47570typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::drop_unused_params() const
47571{
47572  auto res = isl::union_map::drop_unused_params();
47573  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47574}
47575
47576template <typename T1, typename T2, typename Range, typename Range2>
47577typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::empty(const isl::ctx &ctx)
47578{
47579  auto res = isl::union_map::empty(ctx);
47580  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47581}
47582
47583template <typename T1, typename T2, typename Range, typename Range2>
47584bool typed::union_map<pair<T1, T2>, pair<Range, Range2>>::every_map(const std::function<bool(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &test) const
47585{
47586  auto lambda_test = [&] (isl::map arg0) {
47587    return test(typed::map<pair<T1, T2>, pair<Range, Range2>>(arg0));
47588  };
47589  return isl::union_map::every_map(lambda_test);
47590}
47591
47592template <typename T1, typename T2, typename Range, typename Range2>
47593typed::map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::extract_map(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const
47594{
47595  auto res = isl::union_map::extract_map(space);
47596  return typed::map<pair<T1, T2>, pair<Range, Range2>>(res);
47597}
47598
47599template <typename T1, typename T2, typename Range, typename Range2>
47600void typed::union_map<pair<T1, T2>, pair<Range, Range2>>::foreach_map(const std::function<void(typed::map<pair<T1, T2>, pair<Range, Range2>>)> &fn) const
47601{
47602  auto lambda_fn = [&] (isl::map arg0) {
47603    return fn(typed::map<pair<T1, T2>, pair<Range, Range2>>(arg0));
47604  };
47605  return isl::union_map::foreach_map(lambda_fn);
47606}
47607
47608template <typename T1, typename T2, typename Range, typename Range2>
47609typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &context) const
47610{
47611  auto res = isl::union_map::gist(context);
47612  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47613}
47614
47615template <typename T1, typename T2, typename Range, typename Range2>
47616typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &context) const
47617{
47618  auto res = isl::union_map::gist(context);
47619  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47620}
47621
47622template <typename T1, typename T2, typename Range, typename Range2>
47623typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::map<pair<T1, T2>, pair<Range, Range2>> &context) const
47624{
47625  auto res = isl::union_map::gist(context);
47626  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47627}
47628
47629template <typename T1, typename T2, typename Range, typename Range2>
47630typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::union_set<pair<T1, T2>> &uset) const
47631{
47632  auto res = isl::union_map::gist_domain(uset);
47633  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47634}
47635
47636template <typename T1, typename T2, typename Range, typename Range2>
47637typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::basic_set<pair<T1, T2>> &uset) const
47638{
47639  auto res = isl::union_map::gist_domain(uset);
47640  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47641}
47642
47643template <typename T1, typename T2, typename Range, typename Range2>
47644typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::point<pair<T1, T2>> &uset) const
47645{
47646  auto res = isl::union_map::gist_domain(uset);
47647  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47648}
47649
47650template <typename T1, typename T2, typename Range, typename Range2>
47651typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist_domain(const typed::set<pair<T1, T2>> &uset) const
47652{
47653  auto res = isl::union_map::gist_domain(uset);
47654  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47655}
47656
47657template <typename T1, typename T2, typename Range, typename Range2>
47658typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::set<> &set) const
47659{
47660  auto res = isl::union_map::gist_params(set);
47661  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47662}
47663
47664template <typename T1, typename T2, typename Range, typename Range2>
47665typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::basic_set<> &set) const
47666{
47667  auto res = isl::union_map::gist_params(set);
47668  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47669}
47670
47671template <typename T1, typename T2, typename Range, typename Range2>
47672typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::gist_params(const typed::point<> &set) const
47673{
47674  auto res = isl::union_map::gist_params(set);
47675  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47676}
47677
47678template <typename T1, typename T2, typename Range, typename Range2>
47679typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
47680{
47681  auto res = isl::union_map::intersect(umap2);
47682  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47683}
47684
47685template <typename T1, typename T2, typename Range, typename Range2>
47686typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
47687{
47688  auto res = isl::union_map::intersect(umap2);
47689  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47690}
47691
47692template <typename T1, typename T2, typename Range, typename Range2>
47693typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect(const typed::map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
47694{
47695  auto res = isl::union_map::intersect(umap2);
47696  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47697}
47698
47699template <typename T1, typename T2, typename Range, typename Range2>
47700typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::space<pair<T1, T2>> &space) const
47701{
47702  auto res = isl::union_map::intersect_domain(space);
47703  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47704}
47705
47706template <typename T1, typename T2, typename Range, typename Range2>
47707typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const
47708{
47709  auto res = isl::union_map::intersect_domain(uset);
47710  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47711}
47712
47713template <typename T1, typename T2, typename Range, typename Range2>
47714typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::union_set<T1> &domain) const
47715{
47716  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
47717  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47718}
47719
47720template <typename T1, typename T2, typename Range, typename Range2>
47721typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::basic_set<T1> &domain) const
47722{
47723  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
47724  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47725}
47726
47727template <typename T1, typename T2, typename Range, typename Range2>
47728typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::point<T1> &domain) const
47729{
47730  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
47731  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47732}
47733
47734template <typename T1, typename T2, typename Range, typename Range2>
47735typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::set<T1> &domain) const
47736{
47737  auto res = isl::union_map::intersect_domain_wrapped_domain(domain);
47738  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47739}
47740
47741template <typename T1, typename T2, typename Range, typename Range2>
47742typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::set<> &set) const
47743{
47744  auto res = isl::union_map::intersect_params(set);
47745  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47746}
47747
47748template <typename T1, typename T2, typename Range, typename Range2>
47749typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::basic_set<> &set) const
47750{
47751  auto res = isl::union_map::intersect_params(set);
47752  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47753}
47754
47755template <typename T1, typename T2, typename Range, typename Range2>
47756typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::point<> &set) const
47757{
47758  auto res = isl::union_map::intersect_params(set);
47759  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47760}
47761
47762template <typename T1, typename T2, typename Range, typename Range2>
47763typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::space<pair<Range, Range2>> &space) const
47764{
47765  auto res = isl::union_map::intersect_range(space);
47766  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47767}
47768
47769template <typename T1, typename T2, typename Range, typename Range2>
47770typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range(const typed::union_set<pair<Range, Range2>> &uset) const
47771{
47772  auto res = isl::union_map::intersect_range(uset);
47773  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47774}
47775
47776template <typename T1, typename T2, typename Range, typename Range2>
47777typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::union_set<Range> &domain) const
47778{
47779  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
47780  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47781}
47782
47783template <typename T1, typename T2, typename Range, typename Range2>
47784typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::basic_set<Range> &domain) const
47785{
47786  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
47787  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47788}
47789
47790template <typename T1, typename T2, typename Range, typename Range2>
47791typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::point<Range> &domain) const
47792{
47793  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
47794  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47795}
47796
47797template <typename T1, typename T2, typename Range, typename Range2>
47798typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::intersect_range_wrapped_domain(const typed::set<Range> &domain) const
47799{
47800  auto res = isl::union_map::intersect_range_wrapped_domain(domain);
47801  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47802}
47803
47804template <typename T1, typename T2, typename Range, typename Range2>
47805typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::lexmax() const
47806{
47807  auto res = isl::union_map::lexmax();
47808  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47809}
47810
47811template <typename T1, typename T2, typename Range, typename Range2>
47812typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::lexmin() const
47813{
47814  auto res = isl::union_map::lexmin();
47815  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47816}
47817
47818template <typename T1, typename T2, typename Range, typename Range2>
47819typed::map_list<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::map_list() const
47820{
47821  auto res = isl::union_map::map_list();
47822  return typed::map_list<pair<T1, T2>, pair<Range, Range2>>(res);
47823}
47824
47825template <typename T1, typename T2, typename Range, typename Range2>
47826typed::set<> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::params() const
47827{
47828  auto res = isl::union_map::params();
47829  return typed::set<>(res);
47830}
47831
47832template <typename T1, typename T2, typename Range, typename Range2>
47833template <typename Domain2>
47834typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::multi_aff<Domain2, pair<T1, T2>> &ma) const
47835{
47836  auto res = isl::union_map::preimage_domain(ma);
47837  return typed::union_map<Domain2, pair<Range, Range2>>(res);
47838}
47839
47840template <typename T1, typename T2, typename Range, typename Range2>
47841template <typename Domain2>
47842typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::multi_pw_aff<Domain2, pair<T1, T2>> &mpa) const
47843{
47844  auto res = isl::union_map::preimage_domain(mpa);
47845  return typed::union_map<Domain2, pair<Range, Range2>>(res);
47846}
47847
47848template <typename T1, typename T2, typename Range, typename Range2>
47849template <typename Domain2>
47850typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &pma) const
47851{
47852  auto res = isl::union_map::preimage_domain(pma);
47853  return typed::union_map<Domain2, pair<Range, Range2>>(res);
47854}
47855
47856template <typename T1, typename T2, typename Range, typename Range2>
47857template <typename Domain2>
47858typed::union_map<Domain2, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::preimage_domain(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma) const
47859{
47860  auto res = isl::union_map::preimage_domain(upma);
47861  return typed::union_map<Domain2, pair<Range, Range2>>(res);
47862}
47863
47864template <typename T1, typename T2, typename Range, typename Range2>
47865template <typename Arg2>
47866typed::union_map<pair<T1, T2>, Arg2> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::preimage_range(const typed::multi_aff<Arg2, pair<Range, Range2>> &ma) const
47867{
47868  auto res = isl::union_map::preimage_range(ma);
47869  return typed::union_map<pair<T1, T2>, Arg2>(res);
47870}
47871
47872template <typename T1, typename T2, typename Range, typename Range2>
47873template <typename Arg2>
47874typed::union_map<pair<T1, T2>, Arg2> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::preimage_range(const typed::pw_multi_aff<Arg2, pair<Range, Range2>> &pma) const
47875{
47876  auto res = isl::union_map::preimage_range(pma);
47877  return typed::union_map<pair<T1, T2>, Arg2>(res);
47878}
47879
47880template <typename T1, typename T2, typename Range, typename Range2>
47881template <typename Arg2>
47882typed::union_map<pair<T1, T2>, Arg2> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::preimage_range(const typed::union_pw_multi_aff<Arg2, pair<Range, Range2>> &upma) const
47883{
47884  auto res = isl::union_map::preimage_range(upma);
47885  return typed::union_map<pair<T1, T2>, Arg2>(res);
47886}
47887
47888template <typename T1, typename T2, typename Range, typename Range2>
47889template <typename Domain2, typename Arg2>
47890typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::product(const typed::union_map<Domain2, Arg2> &umap2) const
47891{
47892  auto res = isl::union_map::product(umap2);
47893  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
47894}
47895
47896template <typename T1, typename T2, typename Range, typename Range2>
47897template <typename Domain2, typename Arg2>
47898typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::product(const typed::basic_map<Domain2, Arg2> &umap2) const
47899{
47900  auto res = isl::union_map::product(umap2);
47901  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
47902}
47903
47904template <typename T1, typename T2, typename Range, typename Range2>
47905template <typename Domain2, typename Arg2>
47906typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::product(const typed::map<Domain2, Arg2> &umap2) const
47907{
47908  auto res = isl::union_map::product(umap2);
47909  return typed::union_map<pair<pair<T1, T2>, Domain2>, pair<pair<Range, Range2>, Arg2>>(res);
47910}
47911
47912template <typename T1, typename T2, typename Range, typename Range2>
47913typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::project_out_all_params() const
47914{
47915  auto res = isl::union_map::project_out_all_params();
47916  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47917}
47918
47919template <typename T1, typename T2, typename Range, typename Range2>
47920typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::project_out_param(const typed::id<Anonymous> &id) const
47921{
47922  auto res = isl::union_map::project_out_param(id);
47923  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47924}
47925
47926template <typename T1, typename T2, typename Range, typename Range2>
47927typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::project_out_param(const std::string &id) const
47928{
47929  auto res = isl::union_map::project_out_param(id);
47930  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47931}
47932
47933template <typename T1, typename T2, typename Range, typename Range2>
47934typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::project_out_param(const typed::id_list<Anonymous> &list) const
47935{
47936  auto res = isl::union_map::project_out_param(list);
47937  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
47938}
47939
47940template <typename T1, typename T2, typename Range, typename Range2>
47941typed::union_set<pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::range() const
47942{
47943  auto res = isl::union_map::range();
47944  return typed::union_set<pair<Range, Range2>>(res);
47945}
47946
47947template <typename T1, typename T2, typename Range, typename Range2>
47948typed::union_map<pair<T1, T2>, Range> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::range_factor_domain() const
47949{
47950  auto res = isl::union_map::range_factor_domain();
47951  return typed::union_map<pair<T1, T2>, Range>(res);
47952}
47953
47954template <typename T1, typename T2, typename Range, typename Range2>
47955typed::union_map<pair<T1, T2>, Range2> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::range_factor_range() const
47956{
47957  auto res = isl::union_map::range_factor_range();
47958  return typed::union_map<pair<T1, T2>, Range2>(res);
47959}
47960
47961template <typename T1, typename T2, typename Range, typename Range2>
47962typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::range_map() const
47963{
47964  auto res = isl::union_map::range_map();
47965  return typed::union_map<pair<pair<T1, T2>, pair<Range, Range2>>, pair<Range, Range2>>(res);
47966}
47967
47968template <typename T1, typename T2, typename Range, typename Range2>
47969template <typename Arg2>
47970typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::union_map<pair<T1, T2>, Arg2> &umap2) const
47971{
47972  auto res = isl::union_map::range_product(umap2);
47973  return typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
47974}
47975
47976template <typename T1, typename T2, typename Range, typename Range2>
47977template <typename Arg2>
47978typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::basic_map<pair<T1, T2>, Arg2> &umap2) const
47979{
47980  auto res = isl::union_map::range_product(umap2);
47981  return typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
47982}
47983
47984template <typename T1, typename T2, typename Range, typename Range2>
47985template <typename Arg2>
47986typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::map<pair<T1, T2>, Arg2> &umap2) const
47987{
47988  auto res = isl::union_map::range_product(umap2);
47989  return typed::union_map<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
47990}
47991
47992template <typename T1, typename T2, typename Range, typename Range2>
47993typed::union_map<pair<T1, T2>, pair<Range2, Range>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::range_reverse() const
47994{
47995  auto res = isl::union_map::range_reverse();
47996  return typed::union_map<pair<T1, T2>, pair<Range2, Range>>(res);
47997}
47998
47999template <typename T1, typename T2, typename Range, typename Range2>
48000typed::union_map<pair<Range, Range2>, pair<T1, T2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::reverse() const
48001{
48002  auto res = isl::union_map::reverse();
48003  return typed::union_map<pair<Range, Range2>, pair<T1, T2>>(res);
48004}
48005
48006template <typename T1, typename T2, typename Range, typename Range2>
48007typed::space<> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::space() const
48008{
48009  auto res = isl::union_map::space();
48010  return typed::space<>(res);
48011}
48012
48013template <typename T1, typename T2, typename Range, typename Range2>
48014typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
48015{
48016  auto res = isl::union_map::subtract(umap2);
48017  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48018}
48019
48020template <typename T1, typename T2, typename Range, typename Range2>
48021typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
48022{
48023  auto res = isl::union_map::subtract(umap2);
48024  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48025}
48026
48027template <typename T1, typename T2, typename Range, typename Range2>
48028typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract(const typed::map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
48029{
48030  auto res = isl::union_map::subtract(umap2);
48031  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48032}
48033
48034template <typename T1, typename T2, typename Range, typename Range2>
48035typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::union_set<pair<T1, T2>> &dom) const
48036{
48037  auto res = isl::union_map::subtract_domain(dom);
48038  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48039}
48040
48041template <typename T1, typename T2, typename Range, typename Range2>
48042typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::basic_set<pair<T1, T2>> &dom) const
48043{
48044  auto res = isl::union_map::subtract_domain(dom);
48045  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48046}
48047
48048template <typename T1, typename T2, typename Range, typename Range2>
48049typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::point<pair<T1, T2>> &dom) const
48050{
48051  auto res = isl::union_map::subtract_domain(dom);
48052  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48053}
48054
48055template <typename T1, typename T2, typename Range, typename Range2>
48056typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::set<pair<T1, T2>> &dom) const
48057{
48058  auto res = isl::union_map::subtract_domain(dom);
48059  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48060}
48061
48062template <typename T1, typename T2, typename Range, typename Range2>
48063typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract_range(const typed::union_set<pair<Range, Range2>> &dom) const
48064{
48065  auto res = isl::union_map::subtract_range(dom);
48066  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48067}
48068
48069template <typename T1, typename T2, typename Range, typename Range2>
48070typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract_range(const typed::basic_set<pair<Range, Range2>> &dom) const
48071{
48072  auto res = isl::union_map::subtract_range(dom);
48073  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48074}
48075
48076template <typename T1, typename T2, typename Range, typename Range2>
48077typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract_range(const typed::point<pair<Range, Range2>> &dom) const
48078{
48079  auto res = isl::union_map::subtract_range(dom);
48080  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48081}
48082
48083template <typename T1, typename T2, typename Range, typename Range2>
48084typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::subtract_range(const typed::set<pair<Range, Range2>> &dom) const
48085{
48086  auto res = isl::union_map::subtract_range(dom);
48087  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48088}
48089
48090template <typename T1, typename T2, typename Range, typename Range2>
48091typed::union_map<pair<pair<T1, T2>, Range>, Range2> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::uncurry() const
48092{
48093  auto res = isl::union_map::uncurry();
48094  return typed::union_map<pair<pair<T1, T2>, Range>, Range2>(res);
48095}
48096
48097template <typename T1, typename T2, typename Range, typename Range2>
48098typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::unite(const typed::union_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
48099{
48100  auto res = isl::union_map::unite(umap2);
48101  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48102}
48103
48104template <typename T1, typename T2, typename Range, typename Range2>
48105typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::unite(const typed::basic_map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
48106{
48107  auto res = isl::union_map::unite(umap2);
48108  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48109}
48110
48111template <typename T1, typename T2, typename Range, typename Range2>
48112typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::unite(const typed::map<pair<T1, T2>, pair<Range, Range2>> &umap2) const
48113{
48114  auto res = isl::union_map::unite(umap2);
48115  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48116}
48117
48118template <typename T1, typename T2, typename Range, typename Range2>
48119typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::universe() const
48120{
48121  auto res = isl::union_map::universe();
48122  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
48123}
48124
48125template <typename T1, typename T2, typename Range, typename Range2>
48126typed::union_set<pair<pair<T1, T2>, pair<Range, Range2>>> typed::union_map<pair<T1, T2>, pair<Range, Range2>>::wrap() const
48127{
48128  auto res = isl::union_map::wrap();
48129  return typed::union_set<pair<pair<T1, T2>, pair<Range, Range2>>>(res);
48130}
48131
48132typed::union_pw_aff<Anonymous>::union_pw_aff(const typed::aff<Anonymous> &aff)
48133  : isl::union_pw_aff(aff)
48134{
48135}
48136
48137typed::union_pw_aff<Anonymous>::union_pw_aff(const typed::pw_aff<Anonymous> &pa)
48138  : isl::union_pw_aff(pa)
48139{
48140}
48141
48142typed::union_pw_aff<Anonymous>::union_pw_aff(const isl::ctx &ctx, const std::string &str)
48143  : isl::union_pw_aff(ctx, str)
48144{
48145}
48146
48147typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::add(const typed::multi_union_pw_aff<Anonymous> &multi2) const
48148{
48149  auto res = isl::union_pw_aff::add(multi2);
48150  return typed::multi_union_pw_aff<Anonymous>(res);
48151}
48152
48153typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::add(const typed::union_pw_aff<Anonymous> &upa2) const
48154{
48155  auto res = isl::union_pw_aff::add(upa2);
48156  return typed::union_pw_aff<Anonymous>(res);
48157}
48158
48159typed::union_pw_multi_aff<Anonymous> typed::union_pw_aff<Anonymous>::add(const typed::union_pw_multi_aff<Anonymous> &upma2) const
48160{
48161  auto res = isl::union_pw_aff::add(upma2);
48162  return typed::union_pw_multi_aff<Anonymous>(res);
48163}
48164
48165typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::add(const typed::aff<Anonymous> &upa2) const
48166{
48167  auto res = isl::union_pw_aff::add(upa2);
48168  return typed::union_pw_aff<Anonymous>(res);
48169}
48170
48171typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::add(const typed::pw_aff<Anonymous> &upa2) const
48172{
48173  auto res = isl::union_pw_aff::add(upa2);
48174  return typed::union_pw_aff<Anonymous>(res);
48175}
48176
48177template <typename Range>
48178typed::union_pw_multi_aff<Range> typed::union_pw_aff<Anonymous>::apply(const typed::union_pw_multi_aff<Anonymous, Range> &upma2) const
48179{
48180  auto res = isl::union_pw_aff::apply(upma2);
48181  return typed::union_pw_multi_aff<Range>(res);
48182}
48183
48184typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::as_multi_union_pw_aff() const
48185{
48186  auto res = isl::union_pw_aff::as_multi_union_pw_aff();
48187  return typed::multi_union_pw_aff<Anonymous>(res);
48188}
48189
48190typed::pw_multi_aff<Anonymous> typed::union_pw_aff<Anonymous>::as_pw_multi_aff() const
48191{
48192  auto res = isl::union_pw_aff::as_pw_multi_aff();
48193  return typed::pw_multi_aff<Anonymous>(res);
48194}
48195
48196typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::at(int pos) const
48197{
48198  auto res = isl::union_pw_aff::at(pos);
48199  return typed::union_pw_aff<Anonymous>(res);
48200}
48201
48202typed::union_set<> typed::union_pw_aff<Anonymous>::bind(const typed::multi_id<Anonymous> &tuple) const
48203{
48204  auto res = isl::union_pw_aff::bind(tuple);
48205  return typed::union_set<>(res);
48206}
48207
48208typed::union_set<> typed::union_pw_aff<Anonymous>::bind(const typed::id<Anonymous> &id) const
48209{
48210  auto res = isl::union_pw_aff::bind(id);
48211  return typed::union_set<>(res);
48212}
48213
48214typed::union_set<> typed::union_pw_aff<Anonymous>::bind(const std::string &id) const
48215{
48216  auto res = isl::union_pw_aff::bind(id);
48217  return typed::union_set<>(res);
48218}
48219
48220typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::coalesce() const
48221{
48222  auto res = isl::union_pw_aff::coalesce();
48223  return typed::union_pw_aff<Anonymous>(res);
48224}
48225
48226typed::union_set<> typed::union_pw_aff<Anonymous>::domain() const
48227{
48228  auto res = isl::union_pw_aff::domain();
48229  return typed::union_set<>(res);
48230}
48231
48232typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::drop_unused_params() const
48233{
48234  auto res = isl::union_pw_aff::drop_unused_params();
48235  return typed::union_pw_aff<Anonymous>(res);
48236}
48237
48238typed::pw_multi_aff<Anonymous> typed::union_pw_aff<Anonymous>::extract_pw_multi_aff(const typed::space<Anonymous> &space) const
48239{
48240  auto res = isl::union_pw_aff::extract_pw_multi_aff(space);
48241  return typed::pw_multi_aff<Anonymous>(res);
48242}
48243
48244typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::gist(const typed::union_set<> &context) const
48245{
48246  auto res = isl::union_pw_aff::gist(context);
48247  return typed::union_pw_aff<Anonymous>(res);
48248}
48249
48250typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::gist(const typed::basic_set<> &context) const
48251{
48252  auto res = isl::union_pw_aff::gist(context);
48253  return typed::union_pw_aff<Anonymous>(res);
48254}
48255
48256typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::gist(const typed::point<> &context) const
48257{
48258  auto res = isl::union_pw_aff::gist(context);
48259  return typed::union_pw_aff<Anonymous>(res);
48260}
48261
48262typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::gist(const typed::set<> &context) const
48263{
48264  auto res = isl::union_pw_aff::gist(context);
48265  return typed::union_pw_aff<Anonymous>(res);
48266}
48267
48268typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::gist_params(const typed::set<> &context) const
48269{
48270  auto res = isl::union_pw_aff::gist_params(context);
48271  return typed::multi_union_pw_aff<Anonymous>(res);
48272}
48273
48274typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::intersect_params(const typed::set<> &set) const
48275{
48276  auto res = isl::union_pw_aff::intersect_params(set);
48277  return typed::union_pw_aff<Anonymous>(res);
48278}
48279
48280typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::intersect_params(const typed::basic_set<> &set) const
48281{
48282  auto res = isl::union_pw_aff::intersect_params(set);
48283  return typed::union_pw_aff<Anonymous>(res);
48284}
48285
48286typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::intersect_params(const typed::point<> &set) const
48287{
48288  auto res = isl::union_pw_aff::intersect_params(set);
48289  return typed::union_pw_aff<Anonymous>(res);
48290}
48291
48292typed::union_pw_aff_list<Anonymous> typed::union_pw_aff<Anonymous>::list() const
48293{
48294  auto res = isl::union_pw_aff::list();
48295  return typed::union_pw_aff_list<Anonymous>(res);
48296}
48297
48298typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::neg() const
48299{
48300  auto res = isl::union_pw_aff::neg();
48301  return typed::multi_union_pw_aff<Anonymous>(res);
48302}
48303
48304typed::pw_multi_aff_list<Anonymous> typed::union_pw_aff<Anonymous>::pw_multi_aff_list() const
48305{
48306  auto res = isl::union_pw_aff::pw_multi_aff_list();
48307  return typed::pw_multi_aff_list<Anonymous>(res);
48308}
48309
48310typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::scale(const typed::multi_val<Anonymous> &mv) const
48311{
48312  auto res = isl::union_pw_aff::scale(mv);
48313  return typed::multi_union_pw_aff<Anonymous>(res);
48314}
48315
48316typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::scale(const typed::val<Anonymous> &v) const
48317{
48318  auto res = isl::union_pw_aff::scale(v);
48319  return typed::multi_union_pw_aff<Anonymous>(res);
48320}
48321
48322typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::scale(long v) const
48323{
48324  auto res = isl::union_pw_aff::scale(v);
48325  return typed::multi_union_pw_aff<Anonymous>(res);
48326}
48327
48328typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::scale_down(const typed::multi_val<Anonymous> &mv) const
48329{
48330  auto res = isl::union_pw_aff::scale_down(mv);
48331  return typed::multi_union_pw_aff<Anonymous>(res);
48332}
48333
48334typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::scale_down(const typed::val<Anonymous> &v) const
48335{
48336  auto res = isl::union_pw_aff::scale_down(v);
48337  return typed::multi_union_pw_aff<Anonymous>(res);
48338}
48339
48340typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::scale_down(long v) const
48341{
48342  auto res = isl::union_pw_aff::scale_down(v);
48343  return typed::multi_union_pw_aff<Anonymous>(res);
48344}
48345
48346typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::set_at(int pos, const typed::union_pw_aff<Anonymous> &el) const
48347{
48348  auto res = isl::union_pw_aff::set_at(pos, el);
48349  return typed::multi_union_pw_aff<Anonymous>(res);
48350}
48351
48352template <typename Domain2>
48353typed::multi_union_pw_aff<Domain2> typed::union_pw_aff<Anonymous>::set_range_tuple(const typed::id<Anonymous> &id) const
48354{
48355  auto res = isl::union_pw_aff::set_range_tuple(id);
48356  return typed::multi_union_pw_aff<Domain2>(res);
48357}
48358
48359template <typename Domain2>
48360typed::multi_union_pw_aff<Domain2> typed::union_pw_aff<Anonymous>::set_range_tuple(const std::string &id) const
48361{
48362  auto res = isl::union_pw_aff::set_range_tuple(id);
48363  return typed::multi_union_pw_aff<Domain2>(res);
48364}
48365
48366typed::space<> typed::union_pw_aff<Anonymous>::space() const
48367{
48368  auto res = isl::union_pw_aff::space();
48369  return typed::space<>(res);
48370}
48371
48372typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::sub(const typed::multi_union_pw_aff<Anonymous> &multi2) const
48373{
48374  auto res = isl::union_pw_aff::sub(multi2);
48375  return typed::multi_union_pw_aff<Anonymous>(res);
48376}
48377
48378typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::sub(const typed::union_pw_aff<Anonymous> &upa2) const
48379{
48380  auto res = isl::union_pw_aff::sub(upa2);
48381  return typed::union_pw_aff<Anonymous>(res);
48382}
48383
48384typed::union_pw_multi_aff<Anonymous> typed::union_pw_aff<Anonymous>::sub(const typed::union_pw_multi_aff<Anonymous> &upma2) const
48385{
48386  auto res = isl::union_pw_aff::sub(upma2);
48387  return typed::union_pw_multi_aff<Anonymous>(res);
48388}
48389
48390typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::sub(const typed::aff<Anonymous> &upa2) const
48391{
48392  auto res = isl::union_pw_aff::sub(upa2);
48393  return typed::union_pw_aff<Anonymous>(res);
48394}
48395
48396typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::sub(const typed::pw_aff<Anonymous> &upa2) const
48397{
48398  auto res = isl::union_pw_aff::sub(upa2);
48399  return typed::union_pw_aff<Anonymous>(res);
48400}
48401
48402typed::multi_union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::union_add(const typed::multi_union_pw_aff<Anonymous> &mupa2) const
48403{
48404  auto res = isl::union_pw_aff::union_add(mupa2);
48405  return typed::multi_union_pw_aff<Anonymous>(res);
48406}
48407
48408typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::union_add(const typed::union_pw_aff<Anonymous> &upa2) const
48409{
48410  auto res = isl::union_pw_aff::union_add(upa2);
48411  return typed::union_pw_aff<Anonymous>(res);
48412}
48413
48414typed::union_pw_multi_aff<Anonymous> typed::union_pw_aff<Anonymous>::union_add(const typed::union_pw_multi_aff<Anonymous> &upma2) const
48415{
48416  auto res = isl::union_pw_aff::union_add(upma2);
48417  return typed::union_pw_multi_aff<Anonymous>(res);
48418}
48419
48420typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::union_add(const typed::aff<Anonymous> &upa2) const
48421{
48422  auto res = isl::union_pw_aff::union_add(upa2);
48423  return typed::union_pw_aff<Anonymous>(res);
48424}
48425
48426typed::union_pw_aff<Anonymous> typed::union_pw_aff<Anonymous>::union_add(const typed::pw_aff<Anonymous> &upa2) const
48427{
48428  auto res = isl::union_pw_aff::union_add(upa2);
48429  return typed::union_pw_aff<Anonymous>(res);
48430}
48431
48432template <typename Domain>
48433typed::union_pw_aff<Domain, Anonymous>::union_pw_aff(const typed::aff<Domain, Anonymous> &aff)
48434  : isl::union_pw_aff(aff)
48435{
48436}
48437
48438template <typename Domain>
48439typed::union_pw_aff<Domain, Anonymous>::union_pw_aff(const typed::pw_aff<Domain, Anonymous> &pa)
48440  : isl::union_pw_aff(pa)
48441{
48442}
48443
48444template <typename Domain>
48445typed::union_pw_aff<Domain, Anonymous>::union_pw_aff(const isl::ctx &ctx, const std::string &str)
48446  : isl::union_pw_aff(ctx, str)
48447{
48448}
48449
48450template <typename Domain>
48451typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::add(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const
48452{
48453  auto res = isl::union_pw_aff::add(multi2);
48454  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48455}
48456
48457template <typename Domain>
48458typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const
48459{
48460  auto res = isl::union_pw_aff::add(upa2);
48461  return typed::union_pw_aff<Domain, Anonymous>(res);
48462}
48463
48464template <typename Domain>
48465typed::union_pw_multi_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const
48466{
48467  auto res = isl::union_pw_aff::add(upma2);
48468  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
48469}
48470
48471template <typename Domain>
48472typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::add(const typed::aff<Domain, Anonymous> &upa2) const
48473{
48474  auto res = isl::union_pw_aff::add(upa2);
48475  return typed::union_pw_aff<Domain, Anonymous>(res);
48476}
48477
48478template <typename Domain>
48479typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::add(const typed::pw_aff<Domain, Anonymous> &upa2) const
48480{
48481  auto res = isl::union_pw_aff::add(upa2);
48482  return typed::union_pw_aff<Domain, Anonymous>(res);
48483}
48484
48485template <typename Domain>
48486template <typename Range2>
48487typed::union_pw_multi_aff<Domain, Range2> typed::union_pw_aff<Domain, Anonymous>::apply(const typed::union_pw_multi_aff<Anonymous, Range2> &upma2) const
48488{
48489  auto res = isl::union_pw_aff::apply(upma2);
48490  return typed::union_pw_multi_aff<Domain, Range2>(res);
48491}
48492
48493template <typename Domain>
48494typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::as_multi_union_pw_aff() const
48495{
48496  auto res = isl::union_pw_aff::as_multi_union_pw_aff();
48497  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48498}
48499
48500template <typename Domain>
48501typed::pw_multi_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::as_pw_multi_aff() const
48502{
48503  auto res = isl::union_pw_aff::as_pw_multi_aff();
48504  return typed::pw_multi_aff<Domain, Anonymous>(res);
48505}
48506
48507template <typename Domain>
48508typed::union_map<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::as_union_map() const
48509{
48510  auto res = isl::union_pw_aff::as_union_map();
48511  return typed::union_map<Domain, Anonymous>(res);
48512}
48513
48514template <typename Domain>
48515typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::at(int pos) const
48516{
48517  auto res = isl::union_pw_aff::at(pos);
48518  return typed::union_pw_aff<Domain, Anonymous>(res);
48519}
48520
48521template <typename Domain>
48522typed::union_set<Domain> typed::union_pw_aff<Domain, Anonymous>::bind(const typed::multi_id<Anonymous> &tuple) const
48523{
48524  auto res = isl::union_pw_aff::bind(tuple);
48525  return typed::union_set<Domain>(res);
48526}
48527
48528template <typename Domain>
48529typed::union_set<Domain> typed::union_pw_aff<Domain, Anonymous>::bind(const typed::id<Anonymous> &id) const
48530{
48531  auto res = isl::union_pw_aff::bind(id);
48532  return typed::union_set<Domain>(res);
48533}
48534
48535template <typename Domain>
48536typed::union_set<Domain> typed::union_pw_aff<Domain, Anonymous>::bind(const std::string &id) const
48537{
48538  auto res = isl::union_pw_aff::bind(id);
48539  return typed::union_set<Domain>(res);
48540}
48541
48542template <typename Domain>
48543typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::coalesce() const
48544{
48545  auto res = isl::union_pw_aff::coalesce();
48546  return typed::union_pw_aff<Domain, Anonymous>(res);
48547}
48548
48549template <typename Domain>
48550typed::union_set<Domain> typed::union_pw_aff<Domain, Anonymous>::domain() const
48551{
48552  auto res = isl::union_pw_aff::domain();
48553  return typed::union_set<Domain>(res);
48554}
48555
48556template <typename Domain>
48557typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::drop_unused_params() const
48558{
48559  auto res = isl::union_pw_aff::drop_unused_params();
48560  return typed::union_pw_aff<Domain, Anonymous>(res);
48561}
48562
48563template <typename Domain>
48564typed::pw_multi_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::extract_pw_multi_aff(const typed::space<Domain, Anonymous> &space) const
48565{
48566  auto res = isl::union_pw_aff::extract_pw_multi_aff(space);
48567  return typed::pw_multi_aff<Domain, Anonymous>(res);
48568}
48569
48570template <typename Domain>
48571typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::gist(const typed::union_set<Domain> &context) const
48572{
48573  auto res = isl::union_pw_aff::gist(context);
48574  return typed::union_pw_aff<Domain, Anonymous>(res);
48575}
48576
48577template <typename Domain>
48578typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::gist(const typed::basic_set<Domain> &context) const
48579{
48580  auto res = isl::union_pw_aff::gist(context);
48581  return typed::union_pw_aff<Domain, Anonymous>(res);
48582}
48583
48584template <typename Domain>
48585typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::gist(const typed::point<Domain> &context) const
48586{
48587  auto res = isl::union_pw_aff::gist(context);
48588  return typed::union_pw_aff<Domain, Anonymous>(res);
48589}
48590
48591template <typename Domain>
48592typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::gist(const typed::set<Domain> &context) const
48593{
48594  auto res = isl::union_pw_aff::gist(context);
48595  return typed::union_pw_aff<Domain, Anonymous>(res);
48596}
48597
48598template <typename Domain>
48599typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::gist_params(const typed::set<> &context) const
48600{
48601  auto res = isl::union_pw_aff::gist_params(context);
48602  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48603}
48604
48605template <typename Domain>
48606typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::intersect_domain(const typed::space<Domain> &space) const
48607{
48608  auto res = isl::union_pw_aff::intersect_domain(space);
48609  return typed::union_pw_aff<Domain, Anonymous>(res);
48610}
48611
48612template <typename Domain>
48613typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::intersect_domain(const typed::union_set<Domain> &uset) const
48614{
48615  auto res = isl::union_pw_aff::intersect_domain(uset);
48616  return typed::union_pw_aff<Domain, Anonymous>(res);
48617}
48618
48619template <typename Domain>
48620typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::intersect_params(const typed::set<> &set) const
48621{
48622  auto res = isl::union_pw_aff::intersect_params(set);
48623  return typed::union_pw_aff<Domain, Anonymous>(res);
48624}
48625
48626template <typename Domain>
48627typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::intersect_params(const typed::basic_set<> &set) const
48628{
48629  auto res = isl::union_pw_aff::intersect_params(set);
48630  return typed::union_pw_aff<Domain, Anonymous>(res);
48631}
48632
48633template <typename Domain>
48634typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::intersect_params(const typed::point<> &set) const
48635{
48636  auto res = isl::union_pw_aff::intersect_params(set);
48637  return typed::union_pw_aff<Domain, Anonymous>(res);
48638}
48639
48640template <typename Domain>
48641typed::union_pw_aff_list<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::list() const
48642{
48643  auto res = isl::union_pw_aff::list();
48644  return typed::union_pw_aff_list<Domain, Anonymous>(res);
48645}
48646
48647template <typename Domain>
48648typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::neg() const
48649{
48650  auto res = isl::union_pw_aff::neg();
48651  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48652}
48653
48654template <typename Domain>
48655template <typename Domain2>
48656typed::union_pw_aff<Domain2, Anonymous> typed::union_pw_aff<Domain, Anonymous>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
48657{
48658  auto res = isl::union_pw_aff::pullback(upma);
48659  return typed::union_pw_aff<Domain2, Anonymous>(res);
48660}
48661
48662template <typename Domain>
48663typed::union_pw_aff<Anonymous> typed::union_pw_aff<Domain, Anonymous>::pullback(const typed::union_pw_multi_aff<Domain> &upma) const
48664{
48665  auto res = isl::union_pw_aff::pullback(upma);
48666  return typed::union_pw_aff<Anonymous>(res);
48667}
48668
48669template <typename Domain>
48670template <typename Domain2>
48671typed::union_pw_aff<Domain2, Anonymous> typed::union_pw_aff<Domain, Anonymous>::pullback(const typed::multi_aff<Domain2, Domain> &upma) const
48672{
48673  auto res = isl::union_pw_aff::pullback(upma);
48674  return typed::union_pw_aff<Domain2, Anonymous>(res);
48675}
48676
48677template <typename Domain>
48678typed::union_pw_aff<Anonymous> typed::union_pw_aff<Domain, Anonymous>::pullback(const typed::multi_aff<Domain> &upma) const
48679{
48680  auto res = isl::union_pw_aff::pullback(upma);
48681  return typed::union_pw_aff<Anonymous>(res);
48682}
48683
48684template <typename Domain>
48685template <typename Domain2>
48686typed::union_pw_aff<Domain2, Anonymous> typed::union_pw_aff<Domain, Anonymous>::pullback(const typed::pw_multi_aff<Domain2, Domain> &upma) const
48687{
48688  auto res = isl::union_pw_aff::pullback(upma);
48689  return typed::union_pw_aff<Domain2, Anonymous>(res);
48690}
48691
48692template <typename Domain>
48693typed::union_pw_aff<Anonymous> typed::union_pw_aff<Domain, Anonymous>::pullback(const typed::pw_multi_aff<Domain> &upma) const
48694{
48695  auto res = isl::union_pw_aff::pullback(upma);
48696  return typed::union_pw_aff<Anonymous>(res);
48697}
48698
48699template <typename Domain>
48700template <typename Domain2>
48701typed::union_pw_aff<Domain2, Anonymous> typed::union_pw_aff<Domain, Anonymous>::pullback(const typed::union_pw_aff<Domain2, Domain> &upma) const
48702{
48703  auto res = isl::union_pw_aff::pullback(upma);
48704  return typed::union_pw_aff<Domain2, Anonymous>(res);
48705}
48706
48707template <typename Domain>
48708typed::union_pw_aff<Anonymous> typed::union_pw_aff<Domain, Anonymous>::pullback(const typed::union_pw_aff<Domain> &upma) const
48709{
48710  auto res = isl::union_pw_aff::pullback(upma);
48711  return typed::union_pw_aff<Anonymous>(res);
48712}
48713
48714template <typename Domain>
48715typed::pw_multi_aff_list<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::pw_multi_aff_list() const
48716{
48717  auto res = isl::union_pw_aff::pw_multi_aff_list();
48718  return typed::pw_multi_aff_list<Domain, Anonymous>(res);
48719}
48720
48721template <typename Domain>
48722template <typename Range2>
48723typed::multi_union_pw_aff<Domain, pair<Anonymous, Range2>> typed::union_pw_aff<Domain, Anonymous>::range_product(const typed::multi_union_pw_aff<Domain, Range2> &multi2) const
48724{
48725  auto res = isl::union_pw_aff::range_product(multi2);
48726  return typed::multi_union_pw_aff<Domain, pair<Anonymous, Range2>>(res);
48727}
48728
48729template <typename Domain>
48730template <typename Range2>
48731typed::union_pw_multi_aff<Domain, pair<Anonymous, Range2>> typed::union_pw_aff<Domain, Anonymous>::range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const
48732{
48733  auto res = isl::union_pw_aff::range_product(upma2);
48734  return typed::union_pw_multi_aff<Domain, pair<Anonymous, Range2>>(res);
48735}
48736
48737template <typename Domain>
48738typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::scale(const typed::multi_val<Anonymous> &mv) const
48739{
48740  auto res = isl::union_pw_aff::scale(mv);
48741  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48742}
48743
48744template <typename Domain>
48745typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::scale(const typed::val<Anonymous> &v) const
48746{
48747  auto res = isl::union_pw_aff::scale(v);
48748  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48749}
48750
48751template <typename Domain>
48752typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::scale(long v) const
48753{
48754  auto res = isl::union_pw_aff::scale(v);
48755  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48756}
48757
48758template <typename Domain>
48759typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::scale_down(const typed::multi_val<Anonymous> &mv) const
48760{
48761  auto res = isl::union_pw_aff::scale_down(mv);
48762  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48763}
48764
48765template <typename Domain>
48766typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::scale_down(const typed::val<Anonymous> &v) const
48767{
48768  auto res = isl::union_pw_aff::scale_down(v);
48769  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48770}
48771
48772template <typename Domain>
48773typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::scale_down(long v) const
48774{
48775  auto res = isl::union_pw_aff::scale_down(v);
48776  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48777}
48778
48779template <typename Domain>
48780typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::set_at(int pos, const typed::union_pw_aff<Domain, Anonymous> &el) const
48781{
48782  auto res = isl::union_pw_aff::set_at(pos, el);
48783  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48784}
48785
48786template <typename Domain>
48787template <typename Range2>
48788typed::multi_union_pw_aff<Domain, Range2> typed::union_pw_aff<Domain, Anonymous>::set_range_tuple(const typed::id<Anonymous> &id) const
48789{
48790  auto res = isl::union_pw_aff::set_range_tuple(id);
48791  return typed::multi_union_pw_aff<Domain, Range2>(res);
48792}
48793
48794template <typename Domain>
48795template <typename Range2>
48796typed::multi_union_pw_aff<Domain, Range2> typed::union_pw_aff<Domain, Anonymous>::set_range_tuple(const std::string &id) const
48797{
48798  auto res = isl::union_pw_aff::set_range_tuple(id);
48799  return typed::multi_union_pw_aff<Domain, Range2>(res);
48800}
48801
48802template <typename Domain>
48803typed::space<> typed::union_pw_aff<Domain, Anonymous>::space() const
48804{
48805  auto res = isl::union_pw_aff::space();
48806  return typed::space<>(res);
48807}
48808
48809template <typename Domain>
48810typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::sub(const typed::multi_union_pw_aff<Domain, Anonymous> &multi2) const
48811{
48812  auto res = isl::union_pw_aff::sub(multi2);
48813  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48814}
48815
48816template <typename Domain>
48817typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::sub(const typed::union_pw_aff<Domain, Anonymous> &upa2) const
48818{
48819  auto res = isl::union_pw_aff::sub(upa2);
48820  return typed::union_pw_aff<Domain, Anonymous>(res);
48821}
48822
48823template <typename Domain>
48824typed::union_pw_multi_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::sub(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const
48825{
48826  auto res = isl::union_pw_aff::sub(upma2);
48827  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
48828}
48829
48830template <typename Domain>
48831typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::sub(const typed::aff<Domain, Anonymous> &upa2) const
48832{
48833  auto res = isl::union_pw_aff::sub(upa2);
48834  return typed::union_pw_aff<Domain, Anonymous>(res);
48835}
48836
48837template <typename Domain>
48838typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::sub(const typed::pw_aff<Domain, Anonymous> &upa2) const
48839{
48840  auto res = isl::union_pw_aff::sub(upa2);
48841  return typed::union_pw_aff<Domain, Anonymous>(res);
48842}
48843
48844template <typename Domain>
48845typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::subtract_domain(const typed::space<Domain> &space) const
48846{
48847  auto res = isl::union_pw_aff::subtract_domain(space);
48848  return typed::union_pw_aff<Domain, Anonymous>(res);
48849}
48850
48851template <typename Domain>
48852typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::subtract_domain(const typed::union_set<Domain> &uset) const
48853{
48854  auto res = isl::union_pw_aff::subtract_domain(uset);
48855  return typed::union_pw_aff<Domain, Anonymous>(res);
48856}
48857
48858template <typename Domain>
48859typed::multi_union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::union_add(const typed::multi_union_pw_aff<Domain, Anonymous> &mupa2) const
48860{
48861  auto res = isl::union_pw_aff::union_add(mupa2);
48862  return typed::multi_union_pw_aff<Domain, Anonymous>(res);
48863}
48864
48865template <typename Domain>
48866typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::union_add(const typed::union_pw_aff<Domain, Anonymous> &upa2) const
48867{
48868  auto res = isl::union_pw_aff::union_add(upa2);
48869  return typed::union_pw_aff<Domain, Anonymous>(res);
48870}
48871
48872template <typename Domain>
48873typed::union_pw_multi_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::union_add(const typed::union_pw_multi_aff<Domain, Anonymous> &upma2) const
48874{
48875  auto res = isl::union_pw_aff::union_add(upma2);
48876  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
48877}
48878
48879template <typename Domain>
48880typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::union_add(const typed::aff<Domain, Anonymous> &upa2) const
48881{
48882  auto res = isl::union_pw_aff::union_add(upa2);
48883  return typed::union_pw_aff<Domain, Anonymous>(res);
48884}
48885
48886template <typename Domain>
48887typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff<Domain, Anonymous>::union_add(const typed::pw_aff<Domain, Anonymous> &upa2) const
48888{
48889  auto res = isl::union_pw_aff::union_add(upa2);
48890  return typed::union_pw_aff<Domain, Anonymous>(res);
48891}
48892
48893template <typename Domain, typename Domain2>
48894typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::union_pw_aff(const typed::aff<pair<Domain, Domain2>, Anonymous> &aff)
48895  : isl::union_pw_aff(aff)
48896{
48897}
48898
48899template <typename Domain, typename Domain2>
48900typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::union_pw_aff(const typed::pw_aff<pair<Domain, Domain2>, Anonymous> &pa)
48901  : isl::union_pw_aff(pa)
48902{
48903}
48904
48905template <typename Domain, typename Domain2>
48906typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::union_pw_aff(const isl::ctx &ctx, const std::string &str)
48907  : isl::union_pw_aff(ctx, str)
48908{
48909}
48910
48911template <typename Domain, typename Domain2>
48912typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::add(const typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> &multi2) const
48913{
48914  auto res = isl::union_pw_aff::add(multi2);
48915  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
48916}
48917
48918template <typename Domain, typename Domain2>
48919typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::add(const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const
48920{
48921  auto res = isl::union_pw_aff::add(upa2);
48922  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
48923}
48924
48925template <typename Domain, typename Domain2>
48926typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::add(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> &upma2) const
48927{
48928  auto res = isl::union_pw_aff::add(upma2);
48929  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous>(res);
48930}
48931
48932template <typename Domain, typename Domain2>
48933typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::add(const typed::aff<pair<Domain, Domain2>, Anonymous> &upa2) const
48934{
48935  auto res = isl::union_pw_aff::add(upa2);
48936  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
48937}
48938
48939template <typename Domain, typename Domain2>
48940typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::add(const typed::pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const
48941{
48942  auto res = isl::union_pw_aff::add(upa2);
48943  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
48944}
48945
48946template <typename Domain, typename Domain2>
48947template <typename Range2>
48948typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::apply(const typed::union_pw_multi_aff<Anonymous, Range2> &upma2) const
48949{
48950  auto res = isl::union_pw_aff::apply(upma2);
48951  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2>(res);
48952}
48953
48954template <typename Domain, typename Domain2>
48955typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::as_multi_union_pw_aff() const
48956{
48957  auto res = isl::union_pw_aff::as_multi_union_pw_aff();
48958  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
48959}
48960
48961template <typename Domain, typename Domain2>
48962typed::pw_multi_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::as_pw_multi_aff() const
48963{
48964  auto res = isl::union_pw_aff::as_pw_multi_aff();
48965  return typed::pw_multi_aff<pair<Domain, Domain2>, Anonymous>(res);
48966}
48967
48968template <typename Domain, typename Domain2>
48969typed::union_map<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::as_union_map() const
48970{
48971  auto res = isl::union_pw_aff::as_union_map();
48972  return typed::union_map<pair<Domain, Domain2>, Anonymous>(res);
48973}
48974
48975template <typename Domain, typename Domain2>
48976typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::at(int pos) const
48977{
48978  auto res = isl::union_pw_aff::at(pos);
48979  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
48980}
48981
48982template <typename Domain, typename Domain2>
48983typed::union_set<pair<Domain, Domain2>> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::bind(const typed::multi_id<Anonymous> &tuple) const
48984{
48985  auto res = isl::union_pw_aff::bind(tuple);
48986  return typed::union_set<pair<Domain, Domain2>>(res);
48987}
48988
48989template <typename Domain, typename Domain2>
48990typed::union_set<pair<Domain, Domain2>> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::bind(const typed::id<Anonymous> &id) const
48991{
48992  auto res = isl::union_pw_aff::bind(id);
48993  return typed::union_set<pair<Domain, Domain2>>(res);
48994}
48995
48996template <typename Domain, typename Domain2>
48997typed::union_set<pair<Domain, Domain2>> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::bind(const std::string &id) const
48998{
48999  auto res = isl::union_pw_aff::bind(id);
49000  return typed::union_set<pair<Domain, Domain2>>(res);
49001}
49002
49003template <typename Domain, typename Domain2>
49004typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::coalesce() const
49005{
49006  auto res = isl::union_pw_aff::coalesce();
49007  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49008}
49009
49010template <typename Domain, typename Domain2>
49011typed::union_set<pair<Domain, Domain2>> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::domain() const
49012{
49013  auto res = isl::union_pw_aff::domain();
49014  return typed::union_set<pair<Domain, Domain2>>(res);
49015}
49016
49017template <typename Domain, typename Domain2>
49018typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::drop_unused_params() const
49019{
49020  auto res = isl::union_pw_aff::drop_unused_params();
49021  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49022}
49023
49024template <typename Domain, typename Domain2>
49025typed::pw_multi_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::extract_pw_multi_aff(const typed::space<pair<Domain, Domain2>, Anonymous> &space) const
49026{
49027  auto res = isl::union_pw_aff::extract_pw_multi_aff(space);
49028  return typed::pw_multi_aff<pair<Domain, Domain2>, Anonymous>(res);
49029}
49030
49031template <typename Domain, typename Domain2>
49032typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::gist(const typed::union_set<pair<Domain, Domain2>> &context) const
49033{
49034  auto res = isl::union_pw_aff::gist(context);
49035  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49036}
49037
49038template <typename Domain, typename Domain2>
49039typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::gist(const typed::basic_set<pair<Domain, Domain2>> &context) const
49040{
49041  auto res = isl::union_pw_aff::gist(context);
49042  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49043}
49044
49045template <typename Domain, typename Domain2>
49046typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::gist(const typed::point<pair<Domain, Domain2>> &context) const
49047{
49048  auto res = isl::union_pw_aff::gist(context);
49049  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49050}
49051
49052template <typename Domain, typename Domain2>
49053typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::gist(const typed::set<pair<Domain, Domain2>> &context) const
49054{
49055  auto res = isl::union_pw_aff::gist(context);
49056  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49057}
49058
49059template <typename Domain, typename Domain2>
49060typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::gist_params(const typed::set<> &context) const
49061{
49062  auto res = isl::union_pw_aff::gist_params(context);
49063  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49064}
49065
49066template <typename Domain, typename Domain2>
49067typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::intersect_domain(const typed::space<pair<Domain, Domain2>> &space) const
49068{
49069  auto res = isl::union_pw_aff::intersect_domain(space);
49070  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49071}
49072
49073template <typename Domain, typename Domain2>
49074typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::intersect_domain(const typed::union_set<pair<Domain, Domain2>> &uset) const
49075{
49076  auto res = isl::union_pw_aff::intersect_domain(uset);
49077  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49078}
49079
49080template <typename Domain, typename Domain2>
49081typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::intersect_domain_wrapped_domain(const typed::union_set<Domain> &uset) const
49082{
49083  auto res = isl::union_pw_aff::intersect_domain_wrapped_domain(uset);
49084  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49085}
49086
49087template <typename Domain, typename Domain2>
49088typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::intersect_domain_wrapped_domain(const typed::basic_set<Domain> &uset) const
49089{
49090  auto res = isl::union_pw_aff::intersect_domain_wrapped_domain(uset);
49091  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49092}
49093
49094template <typename Domain, typename Domain2>
49095typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::intersect_domain_wrapped_domain(const typed::point<Domain> &uset) const
49096{
49097  auto res = isl::union_pw_aff::intersect_domain_wrapped_domain(uset);
49098  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49099}
49100
49101template <typename Domain, typename Domain2>
49102typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::intersect_domain_wrapped_domain(const typed::set<Domain> &uset) const
49103{
49104  auto res = isl::union_pw_aff::intersect_domain_wrapped_domain(uset);
49105  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49106}
49107
49108template <typename Domain, typename Domain2>
49109typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::intersect_params(const typed::set<> &set) const
49110{
49111  auto res = isl::union_pw_aff::intersect_params(set);
49112  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49113}
49114
49115template <typename Domain, typename Domain2>
49116typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::intersect_params(const typed::basic_set<> &set) const
49117{
49118  auto res = isl::union_pw_aff::intersect_params(set);
49119  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49120}
49121
49122template <typename Domain, typename Domain2>
49123typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::intersect_params(const typed::point<> &set) const
49124{
49125  auto res = isl::union_pw_aff::intersect_params(set);
49126  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49127}
49128
49129template <typename Domain, typename Domain2>
49130typed::union_pw_aff_list<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::list() const
49131{
49132  auto res = isl::union_pw_aff::list();
49133  return typed::union_pw_aff_list<pair<Domain, Domain2>, Anonymous>(res);
49134}
49135
49136template <typename Domain, typename Domain2>
49137typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::neg() const
49138{
49139  auto res = isl::union_pw_aff::neg();
49140  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49141}
49142
49143template <typename Domain, typename Domain2>
49144template <typename Domain3>
49145typed::union_pw_multi_aff<pair<Domain3, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain> &upma2) const
49146{
49147  auto res = isl::union_pw_aff::preimage_domain_wrapped_domain(upma2);
49148  return typed::union_pw_multi_aff<pair<Domain3, Domain2>, Anonymous>(res);
49149}
49150
49151template <typename Domain, typename Domain2>
49152template <typename Arg2>
49153typed::union_pw_aff<Arg2, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::pullback(const typed::union_pw_multi_aff<Arg2, pair<Domain, Domain2>> &upma) const
49154{
49155  auto res = isl::union_pw_aff::pullback(upma);
49156  return typed::union_pw_aff<Arg2, Anonymous>(res);
49157}
49158
49159template <typename Domain, typename Domain2>
49160typed::union_pw_aff<Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::pullback(const typed::union_pw_multi_aff<pair<Domain, Domain2>> &upma) const
49161{
49162  auto res = isl::union_pw_aff::pullback(upma);
49163  return typed::union_pw_aff<Anonymous>(res);
49164}
49165
49166template <typename Domain, typename Domain2>
49167template <typename Arg2>
49168typed::union_pw_aff<Arg2, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::pullback(const typed::multi_aff<Arg2, pair<Domain, Domain2>> &upma) const
49169{
49170  auto res = isl::union_pw_aff::pullback(upma);
49171  return typed::union_pw_aff<Arg2, Anonymous>(res);
49172}
49173
49174template <typename Domain, typename Domain2>
49175typed::union_pw_aff<Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::pullback(const typed::multi_aff<pair<Domain, Domain2>> &upma) const
49176{
49177  auto res = isl::union_pw_aff::pullback(upma);
49178  return typed::union_pw_aff<Anonymous>(res);
49179}
49180
49181template <typename Domain, typename Domain2>
49182template <typename Arg2>
49183typed::union_pw_aff<Arg2, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::pullback(const typed::pw_multi_aff<Arg2, pair<Domain, Domain2>> &upma) const
49184{
49185  auto res = isl::union_pw_aff::pullback(upma);
49186  return typed::union_pw_aff<Arg2, Anonymous>(res);
49187}
49188
49189template <typename Domain, typename Domain2>
49190typed::union_pw_aff<Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::pullback(const typed::pw_multi_aff<pair<Domain, Domain2>> &upma) const
49191{
49192  auto res = isl::union_pw_aff::pullback(upma);
49193  return typed::union_pw_aff<Anonymous>(res);
49194}
49195
49196template <typename Domain, typename Domain2>
49197template <typename Arg2>
49198typed::union_pw_aff<Arg2, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::pullback(const typed::union_pw_aff<Arg2, pair<Domain, Domain2>> &upma) const
49199{
49200  auto res = isl::union_pw_aff::pullback(upma);
49201  return typed::union_pw_aff<Arg2, Anonymous>(res);
49202}
49203
49204template <typename Domain, typename Domain2>
49205typed::union_pw_aff<Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::pullback(const typed::union_pw_aff<pair<Domain, Domain2>> &upma) const
49206{
49207  auto res = isl::union_pw_aff::pullback(upma);
49208  return typed::union_pw_aff<Anonymous>(res);
49209}
49210
49211template <typename Domain, typename Domain2>
49212typed::pw_multi_aff_list<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::pw_multi_aff_list() const
49213{
49214  auto res = isl::union_pw_aff::pw_multi_aff_list();
49215  return typed::pw_multi_aff_list<pair<Domain, Domain2>, Anonymous>(res);
49216}
49217
49218template <typename Domain, typename Domain2>
49219template <typename Range2>
49220typed::multi_union_pw_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::range_product(const typed::multi_union_pw_aff<pair<Domain, Domain2>, Range2> &multi2) const
49221{
49222  auto res = isl::union_pw_aff::range_product(multi2);
49223  return typed::multi_union_pw_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>>(res);
49224}
49225
49226template <typename Domain, typename Domain2>
49227template <typename Range2>
49228typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::range_product(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> &upma2) const
49229{
49230  auto res = isl::union_pw_aff::range_product(upma2);
49231  return typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Anonymous, Range2>>(res);
49232}
49233
49234template <typename Domain, typename Domain2>
49235typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::scale(const typed::multi_val<Anonymous> &mv) const
49236{
49237  auto res = isl::union_pw_aff::scale(mv);
49238  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49239}
49240
49241template <typename Domain, typename Domain2>
49242typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::scale(const typed::val<Anonymous> &v) const
49243{
49244  auto res = isl::union_pw_aff::scale(v);
49245  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49246}
49247
49248template <typename Domain, typename Domain2>
49249typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::scale(long v) const
49250{
49251  auto res = isl::union_pw_aff::scale(v);
49252  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49253}
49254
49255template <typename Domain, typename Domain2>
49256typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::scale_down(const typed::multi_val<Anonymous> &mv) const
49257{
49258  auto res = isl::union_pw_aff::scale_down(mv);
49259  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49260}
49261
49262template <typename Domain, typename Domain2>
49263typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::scale_down(const typed::val<Anonymous> &v) const
49264{
49265  auto res = isl::union_pw_aff::scale_down(v);
49266  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49267}
49268
49269template <typename Domain, typename Domain2>
49270typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::scale_down(long v) const
49271{
49272  auto res = isl::union_pw_aff::scale_down(v);
49273  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49274}
49275
49276template <typename Domain, typename Domain2>
49277typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::set_at(int pos, const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &el) const
49278{
49279  auto res = isl::union_pw_aff::set_at(pos, el);
49280  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49281}
49282
49283template <typename Domain, typename Domain2>
49284template <typename Range2>
49285typed::multi_union_pw_aff<pair<Domain, Domain2>, Range2> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::set_range_tuple(const typed::id<Anonymous> &id) const
49286{
49287  auto res = isl::union_pw_aff::set_range_tuple(id);
49288  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Range2>(res);
49289}
49290
49291template <typename Domain, typename Domain2>
49292template <typename Range2>
49293typed::multi_union_pw_aff<pair<Domain, Domain2>, Range2> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::set_range_tuple(const std::string &id) const
49294{
49295  auto res = isl::union_pw_aff::set_range_tuple(id);
49296  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Range2>(res);
49297}
49298
49299template <typename Domain, typename Domain2>
49300typed::space<> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::space() const
49301{
49302  auto res = isl::union_pw_aff::space();
49303  return typed::space<>(res);
49304}
49305
49306template <typename Domain, typename Domain2>
49307typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::sub(const typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> &multi2) const
49308{
49309  auto res = isl::union_pw_aff::sub(multi2);
49310  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49311}
49312
49313template <typename Domain, typename Domain2>
49314typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::sub(const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const
49315{
49316  auto res = isl::union_pw_aff::sub(upa2);
49317  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49318}
49319
49320template <typename Domain, typename Domain2>
49321typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::sub(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> &upma2) const
49322{
49323  auto res = isl::union_pw_aff::sub(upma2);
49324  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous>(res);
49325}
49326
49327template <typename Domain, typename Domain2>
49328typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::sub(const typed::aff<pair<Domain, Domain2>, Anonymous> &upa2) const
49329{
49330  auto res = isl::union_pw_aff::sub(upa2);
49331  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49332}
49333
49334template <typename Domain, typename Domain2>
49335typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::sub(const typed::pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const
49336{
49337  auto res = isl::union_pw_aff::sub(upa2);
49338  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49339}
49340
49341template <typename Domain, typename Domain2>
49342typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::subtract_domain(const typed::space<pair<Domain, Domain2>> &space) const
49343{
49344  auto res = isl::union_pw_aff::subtract_domain(space);
49345  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49346}
49347
49348template <typename Domain, typename Domain2>
49349typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::subtract_domain(const typed::union_set<pair<Domain, Domain2>> &uset) const
49350{
49351  auto res = isl::union_pw_aff::subtract_domain(uset);
49352  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49353}
49354
49355template <typename Domain, typename Domain2>
49356typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::union_add(const typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous> &mupa2) const
49357{
49358  auto res = isl::union_pw_aff::union_add(mupa2);
49359  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49360}
49361
49362template <typename Domain, typename Domain2>
49363typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::union_add(const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const
49364{
49365  auto res = isl::union_pw_aff::union_add(upa2);
49366  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49367}
49368
49369template <typename Domain, typename Domain2>
49370typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::union_add(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> &upma2) const
49371{
49372  auto res = isl::union_pw_aff::union_add(upma2);
49373  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous>(res);
49374}
49375
49376template <typename Domain, typename Domain2>
49377typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::union_add(const typed::aff<pair<Domain, Domain2>, Anonymous> &upa2) const
49378{
49379  auto res = isl::union_pw_aff::union_add(upa2);
49380  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49381}
49382
49383template <typename Domain, typename Domain2>
49384typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>::union_add(const typed::pw_aff<pair<Domain, Domain2>, Anonymous> &upa2) const
49385{
49386  auto res = isl::union_pw_aff::union_add(upa2);
49387  return typed::union_pw_aff<pair<Domain, Domain2>, Anonymous>(res);
49388}
49389
49390typed::union_pw_aff_list<Anonymous>::union_pw_aff_list(const isl::ctx &ctx, int n)
49391  : isl::union_pw_aff_list(ctx, n)
49392{
49393}
49394
49395typed::union_pw_aff_list<Anonymous>::union_pw_aff_list(const typed::union_pw_aff<Anonymous> &el)
49396  : isl::union_pw_aff_list(el)
49397{
49398}
49399
49400typed::union_pw_aff_list<Anonymous>::union_pw_aff_list(const isl::ctx &ctx, const std::string &str)
49401  : isl::union_pw_aff_list(ctx, str)
49402{
49403}
49404
49405typed::union_pw_aff_list<Anonymous> typed::union_pw_aff_list<Anonymous>::add(const typed::union_pw_aff<Anonymous> &el) const
49406{
49407  auto res = isl::union_pw_aff_list::add(el);
49408  return typed::union_pw_aff_list<Anonymous>(res);
49409}
49410
49411typed::union_pw_aff_list<Anonymous> typed::union_pw_aff_list<Anonymous>::add(const typed::aff<Anonymous> &el) const
49412{
49413  auto res = isl::union_pw_aff_list::add(el);
49414  return typed::union_pw_aff_list<Anonymous>(res);
49415}
49416
49417typed::union_pw_aff_list<Anonymous> typed::union_pw_aff_list<Anonymous>::add(const typed::pw_aff<Anonymous> &el) const
49418{
49419  auto res = isl::union_pw_aff_list::add(el);
49420  return typed::union_pw_aff_list<Anonymous>(res);
49421}
49422
49423typed::union_pw_aff<Anonymous> typed::union_pw_aff_list<Anonymous>::at(int index) const
49424{
49425  auto res = isl::union_pw_aff_list::at(index);
49426  return typed::union_pw_aff<Anonymous>(res);
49427}
49428
49429typed::union_pw_aff_list<Anonymous> typed::union_pw_aff_list<Anonymous>::drop(unsigned int first, unsigned int n) const
49430{
49431  auto res = isl::union_pw_aff_list::drop(first, n);
49432  return typed::union_pw_aff_list<Anonymous>(res);
49433}
49434
49435void typed::union_pw_aff_list<Anonymous>::foreach(const std::function<void(typed::union_pw_aff<Anonymous>)> &fn) const
49436{
49437  auto lambda_fn = [&] (isl::union_pw_aff arg0) {
49438    return fn(typed::union_pw_aff<Anonymous>(arg0));
49439  };
49440  return isl::union_pw_aff_list::foreach(lambda_fn);
49441}
49442
49443void typed::union_pw_aff_list<Anonymous>::foreach_scc(const std::function<bool(typed::union_pw_aff<Anonymous>, typed::union_pw_aff<Anonymous>)> &follows, const std::function<void(typed::union_pw_aff_list<Anonymous>)> &fn) const
49444{
49445  auto lambda_follows = [&] (isl::union_pw_aff arg0, isl::union_pw_aff arg1) {
49446    return follows(typed::union_pw_aff<Anonymous>(arg0), typed::union_pw_aff<Anonymous>(arg1));
49447  };
49448  auto lambda_fn = [&] (isl::union_pw_aff_list arg0) {
49449    return fn(typed::union_pw_aff_list<Anonymous>(arg0));
49450  };
49451  return isl::union_pw_aff_list::foreach_scc(lambda_follows, lambda_fn);
49452}
49453
49454typed::union_pw_aff_list<Anonymous> typed::union_pw_aff_list<Anonymous>::set_at(int index, const typed::union_pw_aff<Anonymous> &el) const
49455{
49456  auto res = isl::union_pw_aff_list::set_at(index, el);
49457  return typed::union_pw_aff_list<Anonymous>(res);
49458}
49459
49460template <typename Domain>
49461typed::union_pw_aff_list<Domain, Anonymous>::union_pw_aff_list(const isl::ctx &ctx, int n)
49462  : isl::union_pw_aff_list(ctx, n)
49463{
49464}
49465
49466template <typename Domain>
49467typed::union_pw_aff_list<Domain, Anonymous>::union_pw_aff_list(const typed::union_pw_aff<Domain, Anonymous> &el)
49468  : isl::union_pw_aff_list(el)
49469{
49470}
49471
49472template <typename Domain>
49473typed::union_pw_aff_list<Domain, Anonymous>::union_pw_aff_list(const isl::ctx &ctx, const std::string &str)
49474  : isl::union_pw_aff_list(ctx, str)
49475{
49476}
49477
49478template <typename Domain>
49479typed::union_pw_aff_list<Domain, Anonymous> typed::union_pw_aff_list<Domain, Anonymous>::add(const typed::union_pw_aff<Domain, Anonymous> &el) const
49480{
49481  auto res = isl::union_pw_aff_list::add(el);
49482  return typed::union_pw_aff_list<Domain, Anonymous>(res);
49483}
49484
49485template <typename Domain>
49486typed::union_pw_aff_list<Domain, Anonymous> typed::union_pw_aff_list<Domain, Anonymous>::add(const typed::aff<Domain, Anonymous> &el) const
49487{
49488  auto res = isl::union_pw_aff_list::add(el);
49489  return typed::union_pw_aff_list<Domain, Anonymous>(res);
49490}
49491
49492template <typename Domain>
49493typed::union_pw_aff_list<Domain, Anonymous> typed::union_pw_aff_list<Domain, Anonymous>::add(const typed::pw_aff<Domain, Anonymous> &el) const
49494{
49495  auto res = isl::union_pw_aff_list::add(el);
49496  return typed::union_pw_aff_list<Domain, Anonymous>(res);
49497}
49498
49499template <typename Domain>
49500typed::union_pw_aff<Domain, Anonymous> typed::union_pw_aff_list<Domain, Anonymous>::at(int index) const
49501{
49502  auto res = isl::union_pw_aff_list::at(index);
49503  return typed::union_pw_aff<Domain, Anonymous>(res);
49504}
49505
49506template <typename Domain>
49507typed::union_pw_aff_list<Domain, Anonymous> typed::union_pw_aff_list<Domain, Anonymous>::drop(unsigned int first, unsigned int n) const
49508{
49509  auto res = isl::union_pw_aff_list::drop(first, n);
49510  return typed::union_pw_aff_list<Domain, Anonymous>(res);
49511}
49512
49513template <typename Domain>
49514void typed::union_pw_aff_list<Domain, Anonymous>::foreach(const std::function<void(typed::union_pw_aff<Domain, Anonymous>)> &fn) const
49515{
49516  auto lambda_fn = [&] (isl::union_pw_aff arg0) {
49517    return fn(typed::union_pw_aff<Domain, Anonymous>(arg0));
49518  };
49519  return isl::union_pw_aff_list::foreach(lambda_fn);
49520}
49521
49522template <typename Domain>
49523void typed::union_pw_aff_list<Domain, Anonymous>::foreach_scc(const std::function<bool(typed::union_pw_aff<Domain, Anonymous>, typed::union_pw_aff<Domain, Anonymous>)> &follows, const std::function<void(typed::union_pw_aff_list<Domain, Anonymous>)> &fn) const
49524{
49525  auto lambda_follows = [&] (isl::union_pw_aff arg0, isl::union_pw_aff arg1) {
49526    return follows(typed::union_pw_aff<Domain, Anonymous>(arg0), typed::union_pw_aff<Domain, Anonymous>(arg1));
49527  };
49528  auto lambda_fn = [&] (isl::union_pw_aff_list arg0) {
49529    return fn(typed::union_pw_aff_list<Domain, Anonymous>(arg0));
49530  };
49531  return isl::union_pw_aff_list::foreach_scc(lambda_follows, lambda_fn);
49532}
49533
49534template <typename Domain>
49535typed::union_pw_aff_list<Domain, Anonymous> typed::union_pw_aff_list<Domain, Anonymous>::set_at(int index, const typed::union_pw_aff<Domain, Anonymous> &el) const
49536{
49537  auto res = isl::union_pw_aff_list::set_at(index, el);
49538  return typed::union_pw_aff_list<Domain, Anonymous>(res);
49539}
49540
49541template <typename Domain>
49542typed::union_pw_multi_aff<Domain>::union_pw_multi_aff(const typed::multi_aff<Domain> &ma)
49543  : isl::union_pw_multi_aff(ma)
49544{
49545}
49546
49547template <typename Domain>
49548typed::union_pw_multi_aff<Domain>::union_pw_multi_aff(const typed::pw_multi_aff<Domain> &pma)
49549  : isl::union_pw_multi_aff(pma)
49550{
49551}
49552
49553template <typename Domain>
49554typed::union_pw_multi_aff<Domain>::union_pw_multi_aff(const typed::union_pw_aff<Domain> &upa)
49555  : isl::union_pw_multi_aff(upa)
49556{
49557}
49558
49559template <typename Domain>
49560typed::union_pw_multi_aff<Domain>::union_pw_multi_aff(const isl::ctx &ctx, const std::string &str)
49561  : isl::union_pw_multi_aff(ctx, str)
49562{
49563}
49564
49565template <typename Domain>
49566typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::add(const typed::union_pw_multi_aff<Domain> &upma2) const
49567{
49568  auto res = isl::union_pw_multi_aff::add(upma2);
49569  return typed::union_pw_multi_aff<Domain>(res);
49570}
49571
49572template <typename Domain>
49573typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::add(const typed::multi_aff<Domain> &upma2) const
49574{
49575  auto res = isl::union_pw_multi_aff::add(upma2);
49576  return typed::union_pw_multi_aff<Domain>(res);
49577}
49578
49579template <typename Domain>
49580typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::add(const typed::pw_multi_aff<Domain> &upma2) const
49581{
49582  auto res = isl::union_pw_multi_aff::add(upma2);
49583  return typed::union_pw_multi_aff<Domain>(res);
49584}
49585
49586template <typename Domain>
49587typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::add(const typed::union_pw_aff<Domain> &upma2) const
49588{
49589  auto res = isl::union_pw_multi_aff::add(upma2);
49590  return typed::union_pw_multi_aff<Domain>(res);
49591}
49592
49593template <typename Domain>
49594template <typename Range>
49595typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<Domain>::apply(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
49596{
49597  auto res = isl::union_pw_multi_aff::apply(upma2);
49598  return typed::union_pw_multi_aff<Range>(res);
49599}
49600
49601template <typename Domain>
49602template <typename Range>
49603typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<Domain>::apply(const typed::multi_aff<Domain, Range> &upma2) const
49604{
49605  auto res = isl::union_pw_multi_aff::apply(upma2);
49606  return typed::union_pw_multi_aff<Range>(res);
49607}
49608
49609template <typename Domain>
49610template <typename Range>
49611typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<Domain>::apply(const typed::pw_multi_aff<Domain, Range> &upma2) const
49612{
49613  auto res = isl::union_pw_multi_aff::apply(upma2);
49614  return typed::union_pw_multi_aff<Range>(res);
49615}
49616
49617template <typename Domain>
49618typed::union_pw_multi_aff<Anonymous> typed::union_pw_multi_aff<Domain>::apply(const typed::union_pw_aff<Domain, Anonymous> &upma2) const
49619{
49620  auto res = isl::union_pw_multi_aff::apply(upma2);
49621  return typed::union_pw_multi_aff<Anonymous>(res);
49622}
49623
49624template <typename Domain>
49625typed::multi_union_pw_aff<Domain> typed::union_pw_multi_aff<Domain>::as_multi_union_pw_aff() const
49626{
49627  auto res = isl::union_pw_multi_aff::as_multi_union_pw_aff();
49628  return typed::multi_union_pw_aff<Domain>(res);
49629}
49630
49631template <typename Domain>
49632typed::pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::as_pw_multi_aff() const
49633{
49634  auto res = isl::union_pw_multi_aff::as_pw_multi_aff();
49635  return typed::pw_multi_aff<Domain>(res);
49636}
49637
49638template <typename Domain>
49639typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::coalesce() const
49640{
49641  auto res = isl::union_pw_multi_aff::coalesce();
49642  return typed::union_pw_multi_aff<Domain>(res);
49643}
49644
49645template <typename Domain>
49646typed::union_set<> typed::union_pw_multi_aff<Domain>::domain() const
49647{
49648  auto res = isl::union_pw_multi_aff::domain();
49649  return typed::union_set<>(res);
49650}
49651
49652template <typename Domain>
49653typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::drop_unused_params() const
49654{
49655  auto res = isl::union_pw_multi_aff::drop_unused_params();
49656  return typed::union_pw_multi_aff<Domain>(res);
49657}
49658
49659template <typename Domain>
49660typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::empty(const isl::ctx &ctx)
49661{
49662  auto res = isl::union_pw_multi_aff::empty(ctx);
49663  return typed::union_pw_multi_aff<Domain>(res);
49664}
49665
49666template <typename Domain>
49667typed::pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::extract_pw_multi_aff(const typed::space<Domain> &space) const
49668{
49669  auto res = isl::union_pw_multi_aff::extract_pw_multi_aff(space);
49670  return typed::pw_multi_aff<Domain>(res);
49671}
49672
49673template <typename Domain>
49674typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::gist(const typed::union_set<> &context) const
49675{
49676  auto res = isl::union_pw_multi_aff::gist(context);
49677  return typed::union_pw_multi_aff<Domain>(res);
49678}
49679
49680template <typename Domain>
49681typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::gist(const typed::basic_set<> &context) const
49682{
49683  auto res = isl::union_pw_multi_aff::gist(context);
49684  return typed::union_pw_multi_aff<Domain>(res);
49685}
49686
49687template <typename Domain>
49688typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::gist(const typed::point<> &context) const
49689{
49690  auto res = isl::union_pw_multi_aff::gist(context);
49691  return typed::union_pw_multi_aff<Domain>(res);
49692}
49693
49694template <typename Domain>
49695typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::gist(const typed::set<> &context) const
49696{
49697  auto res = isl::union_pw_multi_aff::gist(context);
49698  return typed::union_pw_multi_aff<Domain>(res);
49699}
49700
49701template <typename Domain>
49702typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::intersect_params(const typed::set<> &set) const
49703{
49704  auto res = isl::union_pw_multi_aff::intersect_params(set);
49705  return typed::union_pw_multi_aff<Domain>(res);
49706}
49707
49708template <typename Domain>
49709typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::intersect_params(const typed::basic_set<> &set) const
49710{
49711  auto res = isl::union_pw_multi_aff::intersect_params(set);
49712  return typed::union_pw_multi_aff<Domain>(res);
49713}
49714
49715template <typename Domain>
49716typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::intersect_params(const typed::point<> &set) const
49717{
49718  auto res = isl::union_pw_multi_aff::intersect_params(set);
49719  return typed::union_pw_multi_aff<Domain>(res);
49720}
49721
49722template <typename Domain>
49723typed::pw_multi_aff_list<Domain> typed::union_pw_multi_aff<Domain>::pw_multi_aff_list() const
49724{
49725  auto res = isl::union_pw_multi_aff::pw_multi_aff_list();
49726  return typed::pw_multi_aff_list<Domain>(res);
49727}
49728
49729template <typename Domain>
49730typed::space<> typed::union_pw_multi_aff<Domain>::space() const
49731{
49732  auto res = isl::union_pw_multi_aff::space();
49733  return typed::space<>(res);
49734}
49735
49736template <typename Domain>
49737typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::sub(const typed::union_pw_multi_aff<Domain> &upma2) const
49738{
49739  auto res = isl::union_pw_multi_aff::sub(upma2);
49740  return typed::union_pw_multi_aff<Domain>(res);
49741}
49742
49743template <typename Domain>
49744typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::sub(const typed::multi_aff<Domain> &upma2) const
49745{
49746  auto res = isl::union_pw_multi_aff::sub(upma2);
49747  return typed::union_pw_multi_aff<Domain>(res);
49748}
49749
49750template <typename Domain>
49751typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::sub(const typed::pw_multi_aff<Domain> &upma2) const
49752{
49753  auto res = isl::union_pw_multi_aff::sub(upma2);
49754  return typed::union_pw_multi_aff<Domain>(res);
49755}
49756
49757template <typename Domain>
49758typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::sub(const typed::union_pw_aff<Domain> &upma2) const
49759{
49760  auto res = isl::union_pw_multi_aff::sub(upma2);
49761  return typed::union_pw_multi_aff<Domain>(res);
49762}
49763
49764template <typename Domain>
49765typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::union_add(const typed::union_pw_multi_aff<Domain> &upma2) const
49766{
49767  auto res = isl::union_pw_multi_aff::union_add(upma2);
49768  return typed::union_pw_multi_aff<Domain>(res);
49769}
49770
49771template <typename Domain>
49772typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::union_add(const typed::multi_aff<Domain> &upma2) const
49773{
49774  auto res = isl::union_pw_multi_aff::union_add(upma2);
49775  return typed::union_pw_multi_aff<Domain>(res);
49776}
49777
49778template <typename Domain>
49779typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::union_add(const typed::pw_multi_aff<Domain> &upma2) const
49780{
49781  auto res = isl::union_pw_multi_aff::union_add(upma2);
49782  return typed::union_pw_multi_aff<Domain>(res);
49783}
49784
49785template <typename Domain>
49786typed::union_pw_multi_aff<Domain> typed::union_pw_multi_aff<Domain>::union_add(const typed::union_pw_aff<Domain> &upma2) const
49787{
49788  auto res = isl::union_pw_multi_aff::union_add(upma2);
49789  return typed::union_pw_multi_aff<Domain>(res);
49790}
49791
49792template <typename Domain, typename Range>
49793typed::union_pw_multi_aff<Domain, Range>::union_pw_multi_aff(const typed::multi_aff<Domain, Range> &ma)
49794  : isl::union_pw_multi_aff(ma)
49795{
49796}
49797
49798template <typename Domain, typename Range>
49799typed::union_pw_multi_aff<Domain, Range>::union_pw_multi_aff(const typed::pw_multi_aff<Domain, Range> &pma)
49800  : isl::union_pw_multi_aff(pma)
49801{
49802}
49803
49804template <typename Domain, typename Range>
49805typed::union_pw_multi_aff<Domain, Range>::union_pw_multi_aff(const typed::union_pw_aff<Domain, Range> &upa)
49806  : isl::union_pw_multi_aff(upa)
49807{
49808}
49809
49810template <typename Domain, typename Range>
49811typed::union_pw_multi_aff<Domain, Range>::union_pw_multi_aff(const isl::ctx &ctx, const std::string &str)
49812  : isl::union_pw_multi_aff(ctx, str)
49813{
49814}
49815
49816template <typename Domain, typename Range>
49817typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
49818{
49819  auto res = isl::union_pw_multi_aff::add(upma2);
49820  return typed::union_pw_multi_aff<Domain, Range>(res);
49821}
49822
49823template <typename Domain, typename Range>
49824typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::add(const typed::multi_aff<Domain, Range> &upma2) const
49825{
49826  auto res = isl::union_pw_multi_aff::add(upma2);
49827  return typed::union_pw_multi_aff<Domain, Range>(res);
49828}
49829
49830template <typename Domain, typename Range>
49831typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::add(const typed::pw_multi_aff<Domain, Range> &upma2) const
49832{
49833  auto res = isl::union_pw_multi_aff::add(upma2);
49834  return typed::union_pw_multi_aff<Domain, Range>(res);
49835}
49836
49837template <typename Domain, typename Range>
49838typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::add(const typed::union_pw_aff<Domain, Range> &upma2) const
49839{
49840  auto res = isl::union_pw_multi_aff::add(upma2);
49841  return typed::union_pw_multi_aff<Domain, Range>(res);
49842}
49843
49844template <typename Domain, typename Range>
49845template <typename Range2>
49846typed::union_pw_multi_aff<Domain, Range2> typed::union_pw_multi_aff<Domain, Range>::apply(const typed::union_pw_multi_aff<Range, Range2> &upma2) const
49847{
49848  auto res = isl::union_pw_multi_aff::apply(upma2);
49849  return typed::union_pw_multi_aff<Domain, Range2>(res);
49850}
49851
49852template <typename Domain, typename Range>
49853template <typename Range2>
49854typed::union_pw_multi_aff<Domain, Range2> typed::union_pw_multi_aff<Domain, Range>::apply(const typed::multi_aff<Range, Range2> &upma2) const
49855{
49856  auto res = isl::union_pw_multi_aff::apply(upma2);
49857  return typed::union_pw_multi_aff<Domain, Range2>(res);
49858}
49859
49860template <typename Domain, typename Range>
49861template <typename Range2>
49862typed::union_pw_multi_aff<Domain, Range2> typed::union_pw_multi_aff<Domain, Range>::apply(const typed::pw_multi_aff<Range, Range2> &upma2) const
49863{
49864  auto res = isl::union_pw_multi_aff::apply(upma2);
49865  return typed::union_pw_multi_aff<Domain, Range2>(res);
49866}
49867
49868template <typename Domain, typename Range>
49869typed::union_pw_multi_aff<Domain, Anonymous> typed::union_pw_multi_aff<Domain, Range>::apply(const typed::union_pw_aff<Range, Anonymous> &upma2) const
49870{
49871  auto res = isl::union_pw_multi_aff::apply(upma2);
49872  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
49873}
49874
49875template <typename Domain, typename Range>
49876typed::multi_union_pw_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::as_multi_union_pw_aff() const
49877{
49878  auto res = isl::union_pw_multi_aff::as_multi_union_pw_aff();
49879  return typed::multi_union_pw_aff<Domain, Range>(res);
49880}
49881
49882template <typename Domain, typename Range>
49883typed::pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::as_pw_multi_aff() const
49884{
49885  auto res = isl::union_pw_multi_aff::as_pw_multi_aff();
49886  return typed::pw_multi_aff<Domain, Range>(res);
49887}
49888
49889template <typename Domain, typename Range>
49890typed::union_map<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::as_union_map() const
49891{
49892  auto res = isl::union_pw_multi_aff::as_union_map();
49893  return typed::union_map<Domain, Range>(res);
49894}
49895
49896template <typename Domain, typename Range>
49897typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::coalesce() const
49898{
49899  auto res = isl::union_pw_multi_aff::coalesce();
49900  return typed::union_pw_multi_aff<Domain, Range>(res);
49901}
49902
49903template <typename Domain, typename Range>
49904typed::union_set<Domain> typed::union_pw_multi_aff<Domain, Range>::domain() const
49905{
49906  auto res = isl::union_pw_multi_aff::domain();
49907  return typed::union_set<Domain>(res);
49908}
49909
49910template <typename Domain, typename Range>
49911typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::drop_unused_params() const
49912{
49913  auto res = isl::union_pw_multi_aff::drop_unused_params();
49914  return typed::union_pw_multi_aff<Domain, Range>(res);
49915}
49916
49917template <typename Domain, typename Range>
49918typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::empty(const isl::ctx &ctx)
49919{
49920  auto res = isl::union_pw_multi_aff::empty(ctx);
49921  return typed::union_pw_multi_aff<Domain, Range>(res);
49922}
49923
49924template <typename Domain, typename Range>
49925typed::pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::extract_pw_multi_aff(const typed::space<Domain, Range> &space) const
49926{
49927  auto res = isl::union_pw_multi_aff::extract_pw_multi_aff(space);
49928  return typed::pw_multi_aff<Domain, Range>(res);
49929}
49930
49931template <typename Domain, typename Range>
49932typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::gist(const typed::union_set<Domain> &context) const
49933{
49934  auto res = isl::union_pw_multi_aff::gist(context);
49935  return typed::union_pw_multi_aff<Domain, Range>(res);
49936}
49937
49938template <typename Domain, typename Range>
49939typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::gist(const typed::basic_set<Domain> &context) const
49940{
49941  auto res = isl::union_pw_multi_aff::gist(context);
49942  return typed::union_pw_multi_aff<Domain, Range>(res);
49943}
49944
49945template <typename Domain, typename Range>
49946typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::gist(const typed::point<Domain> &context) const
49947{
49948  auto res = isl::union_pw_multi_aff::gist(context);
49949  return typed::union_pw_multi_aff<Domain, Range>(res);
49950}
49951
49952template <typename Domain, typename Range>
49953typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::gist(const typed::set<Domain> &context) const
49954{
49955  auto res = isl::union_pw_multi_aff::gist(context);
49956  return typed::union_pw_multi_aff<Domain, Range>(res);
49957}
49958
49959template <typename Domain, typename Range>
49960typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::intersect_domain(const typed::space<Domain> &space) const
49961{
49962  auto res = isl::union_pw_multi_aff::intersect_domain(space);
49963  return typed::union_pw_multi_aff<Domain, Range>(res);
49964}
49965
49966template <typename Domain, typename Range>
49967typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::intersect_domain(const typed::union_set<Domain> &uset) const
49968{
49969  auto res = isl::union_pw_multi_aff::intersect_domain(uset);
49970  return typed::union_pw_multi_aff<Domain, Range>(res);
49971}
49972
49973template <typename Domain, typename Range>
49974typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::intersect_params(const typed::set<> &set) const
49975{
49976  auto res = isl::union_pw_multi_aff::intersect_params(set);
49977  return typed::union_pw_multi_aff<Domain, Range>(res);
49978}
49979
49980template <typename Domain, typename Range>
49981typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::intersect_params(const typed::basic_set<> &set) const
49982{
49983  auto res = isl::union_pw_multi_aff::intersect_params(set);
49984  return typed::union_pw_multi_aff<Domain, Range>(res);
49985}
49986
49987template <typename Domain, typename Range>
49988typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::intersect_params(const typed::point<> &set) const
49989{
49990  auto res = isl::union_pw_multi_aff::intersect_params(set);
49991  return typed::union_pw_multi_aff<Domain, Range>(res);
49992}
49993
49994template <typename Domain, typename Range>
49995template <typename Domain2>
49996typed::union_pw_multi_aff<Domain2, Range> typed::union_pw_multi_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const
49997{
49998  auto res = isl::union_pw_multi_aff::pullback(upma2);
49999  return typed::union_pw_multi_aff<Domain2, Range>(res);
50000}
50001
50002template <typename Domain, typename Range>
50003typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<Domain, Range>::pullback(const typed::union_pw_multi_aff<Domain> &upma2) const
50004{
50005  auto res = isl::union_pw_multi_aff::pullback(upma2);
50006  return typed::union_pw_multi_aff<Range>(res);
50007}
50008
50009template <typename Domain, typename Range>
50010template <typename Domain2>
50011typed::union_pw_multi_aff<Domain2, Range> typed::union_pw_multi_aff<Domain, Range>::pullback(const typed::multi_aff<Domain2, Domain> &upma2) const
50012{
50013  auto res = isl::union_pw_multi_aff::pullback(upma2);
50014  return typed::union_pw_multi_aff<Domain2, Range>(res);
50015}
50016
50017template <typename Domain, typename Range>
50018typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<Domain, Range>::pullback(const typed::multi_aff<Domain> &upma2) const
50019{
50020  auto res = isl::union_pw_multi_aff::pullback(upma2);
50021  return typed::union_pw_multi_aff<Range>(res);
50022}
50023
50024template <typename Domain, typename Range>
50025template <typename Domain2>
50026typed::union_pw_multi_aff<Domain2, Range> typed::union_pw_multi_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain2, Domain> &upma2) const
50027{
50028  auto res = isl::union_pw_multi_aff::pullback(upma2);
50029  return typed::union_pw_multi_aff<Domain2, Range>(res);
50030}
50031
50032template <typename Domain, typename Range>
50033typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<Domain, Range>::pullback(const typed::pw_multi_aff<Domain> &upma2) const
50034{
50035  auto res = isl::union_pw_multi_aff::pullback(upma2);
50036  return typed::union_pw_multi_aff<Range>(res);
50037}
50038
50039template <typename Domain, typename Range>
50040template <typename Domain2>
50041typed::union_pw_multi_aff<Domain2, Range> typed::union_pw_multi_aff<Domain, Range>::pullback(const typed::union_pw_aff<Domain2, Domain> &upma2) const
50042{
50043  auto res = isl::union_pw_multi_aff::pullback(upma2);
50044  return typed::union_pw_multi_aff<Domain2, Range>(res);
50045}
50046
50047template <typename Domain, typename Range>
50048typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<Domain, Range>::pullback(const typed::union_pw_aff<Domain> &upma2) const
50049{
50050  auto res = isl::union_pw_multi_aff::pullback(upma2);
50051  return typed::union_pw_multi_aff<Range>(res);
50052}
50053
50054template <typename Domain, typename Range>
50055typed::pw_multi_aff_list<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::pw_multi_aff_list() const
50056{
50057  auto res = isl::union_pw_multi_aff::pw_multi_aff_list();
50058  return typed::pw_multi_aff_list<Domain, Range>(res);
50059}
50060
50061template <typename Domain, typename Range>
50062template <typename Range2>
50063typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, Range>::range_product(const typed::union_pw_multi_aff<Domain, Range2> &upma2) const
50064{
50065  auto res = isl::union_pw_multi_aff::range_product(upma2);
50066  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50067}
50068
50069template <typename Domain, typename Range>
50070template <typename Range2>
50071typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, Range>::range_product(const typed::multi_aff<Domain, Range2> &upma2) const
50072{
50073  auto res = isl::union_pw_multi_aff::range_product(upma2);
50074  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50075}
50076
50077template <typename Domain, typename Range>
50078template <typename Range2>
50079typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, Range>::range_product(const typed::pw_multi_aff<Domain, Range2> &upma2) const
50080{
50081  auto res = isl::union_pw_multi_aff::range_product(upma2);
50082  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50083}
50084
50085template <typename Domain, typename Range>
50086typed::union_pw_multi_aff<Domain, pair<Range, Anonymous>> typed::union_pw_multi_aff<Domain, Range>::range_product(const typed::union_pw_aff<Domain, Anonymous> &upma2) const
50087{
50088  auto res = isl::union_pw_multi_aff::range_product(upma2);
50089  return typed::union_pw_multi_aff<Domain, pair<Range, Anonymous>>(res);
50090}
50091
50092template <typename Domain, typename Range>
50093typed::space<> typed::union_pw_multi_aff<Domain, Range>::space() const
50094{
50095  auto res = isl::union_pw_multi_aff::space();
50096  return typed::space<>(res);
50097}
50098
50099template <typename Domain, typename Range>
50100typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::sub(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
50101{
50102  auto res = isl::union_pw_multi_aff::sub(upma2);
50103  return typed::union_pw_multi_aff<Domain, Range>(res);
50104}
50105
50106template <typename Domain, typename Range>
50107typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::sub(const typed::multi_aff<Domain, Range> &upma2) const
50108{
50109  auto res = isl::union_pw_multi_aff::sub(upma2);
50110  return typed::union_pw_multi_aff<Domain, Range>(res);
50111}
50112
50113template <typename Domain, typename Range>
50114typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::sub(const typed::pw_multi_aff<Domain, Range> &upma2) const
50115{
50116  auto res = isl::union_pw_multi_aff::sub(upma2);
50117  return typed::union_pw_multi_aff<Domain, Range>(res);
50118}
50119
50120template <typename Domain, typename Range>
50121typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::sub(const typed::union_pw_aff<Domain, Range> &upma2) const
50122{
50123  auto res = isl::union_pw_multi_aff::sub(upma2);
50124  return typed::union_pw_multi_aff<Domain, Range>(res);
50125}
50126
50127template <typename Domain, typename Range>
50128typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::subtract_domain(const typed::space<Domain> &space) const
50129{
50130  auto res = isl::union_pw_multi_aff::subtract_domain(space);
50131  return typed::union_pw_multi_aff<Domain, Range>(res);
50132}
50133
50134template <typename Domain, typename Range>
50135typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::subtract_domain(const typed::union_set<Domain> &uset) const
50136{
50137  auto res = isl::union_pw_multi_aff::subtract_domain(uset);
50138  return typed::union_pw_multi_aff<Domain, Range>(res);
50139}
50140
50141template <typename Domain, typename Range>
50142typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::union_add(const typed::union_pw_multi_aff<Domain, Range> &upma2) const
50143{
50144  auto res = isl::union_pw_multi_aff::union_add(upma2);
50145  return typed::union_pw_multi_aff<Domain, Range>(res);
50146}
50147
50148template <typename Domain, typename Range>
50149typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::union_add(const typed::multi_aff<Domain, Range> &upma2) const
50150{
50151  auto res = isl::union_pw_multi_aff::union_add(upma2);
50152  return typed::union_pw_multi_aff<Domain, Range>(res);
50153}
50154
50155template <typename Domain, typename Range>
50156typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::union_add(const typed::pw_multi_aff<Domain, Range> &upma2) const
50157{
50158  auto res = isl::union_pw_multi_aff::union_add(upma2);
50159  return typed::union_pw_multi_aff<Domain, Range>(res);
50160}
50161
50162template <typename Domain, typename Range>
50163typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, Range>::union_add(const typed::union_pw_aff<Domain, Range> &upma2) const
50164{
50165  auto res = isl::union_pw_multi_aff::union_add(upma2);
50166  return typed::union_pw_multi_aff<Domain, Range>(res);
50167}
50168
50169template <typename Domain, typename Domain2, typename Range>
50170typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::union_pw_multi_aff(const typed::multi_aff<pair<Domain, Domain2>, Range> &ma)
50171  : isl::union_pw_multi_aff(ma)
50172{
50173}
50174
50175template <typename Domain, typename Domain2, typename Range>
50176typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::union_pw_multi_aff(const typed::pw_multi_aff<pair<Domain, Domain2>, Range> &pma)
50177  : isl::union_pw_multi_aff(pma)
50178{
50179}
50180
50181template <typename Domain, typename Domain2, typename Range>
50182typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::union_pw_multi_aff(const typed::union_pw_aff<pair<Domain, Domain2>, Range> &upa)
50183  : isl::union_pw_multi_aff(upa)
50184{
50185}
50186
50187template <typename Domain, typename Domain2, typename Range>
50188typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::union_pw_multi_aff(const isl::ctx &ctx, const std::string &str)
50189  : isl::union_pw_multi_aff(ctx, str)
50190{
50191}
50192
50193template <typename Domain, typename Domain2, typename Range>
50194typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::add(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const
50195{
50196  auto res = isl::union_pw_multi_aff::add(upma2);
50197  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50198}
50199
50200template <typename Domain, typename Domain2, typename Range>
50201typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::add(const typed::multi_aff<pair<Domain, Domain2>, Range> &upma2) const
50202{
50203  auto res = isl::union_pw_multi_aff::add(upma2);
50204  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50205}
50206
50207template <typename Domain, typename Domain2, typename Range>
50208typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::add(const typed::pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const
50209{
50210  auto res = isl::union_pw_multi_aff::add(upma2);
50211  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50212}
50213
50214template <typename Domain, typename Domain2, typename Range>
50215typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::add(const typed::union_pw_aff<pair<Domain, Domain2>, Range> &upma2) const
50216{
50217  auto res = isl::union_pw_multi_aff::add(upma2);
50218  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50219}
50220
50221template <typename Domain, typename Domain2, typename Range>
50222template <typename Range2>
50223typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::apply(const typed::union_pw_multi_aff<Range, Range2> &upma2) const
50224{
50225  auto res = isl::union_pw_multi_aff::apply(upma2);
50226  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2>(res);
50227}
50228
50229template <typename Domain, typename Domain2, typename Range>
50230template <typename Range2>
50231typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::apply(const typed::multi_aff<Range, Range2> &upma2) const
50232{
50233  auto res = isl::union_pw_multi_aff::apply(upma2);
50234  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2>(res);
50235}
50236
50237template <typename Domain, typename Domain2, typename Range>
50238template <typename Range2>
50239typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::apply(const typed::pw_multi_aff<Range, Range2> &upma2) const
50240{
50241  auto res = isl::union_pw_multi_aff::apply(upma2);
50242  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2>(res);
50243}
50244
50245template <typename Domain, typename Domain2, typename Range>
50246typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::apply(const typed::union_pw_aff<Range, Anonymous> &upma2) const
50247{
50248  auto res = isl::union_pw_multi_aff::apply(upma2);
50249  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Anonymous>(res);
50250}
50251
50252template <typename Domain, typename Domain2, typename Range>
50253typed::multi_union_pw_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::as_multi_union_pw_aff() const
50254{
50255  auto res = isl::union_pw_multi_aff::as_multi_union_pw_aff();
50256  return typed::multi_union_pw_aff<pair<Domain, Domain2>, Range>(res);
50257}
50258
50259template <typename Domain, typename Domain2, typename Range>
50260typed::pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::as_pw_multi_aff() const
50261{
50262  auto res = isl::union_pw_multi_aff::as_pw_multi_aff();
50263  return typed::pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50264}
50265
50266template <typename Domain, typename Domain2, typename Range>
50267typed::union_map<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::as_union_map() const
50268{
50269  auto res = isl::union_pw_multi_aff::as_union_map();
50270  return typed::union_map<pair<Domain, Domain2>, Range>(res);
50271}
50272
50273template <typename Domain, typename Domain2, typename Range>
50274typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::coalesce() const
50275{
50276  auto res = isl::union_pw_multi_aff::coalesce();
50277  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50278}
50279
50280template <typename Domain, typename Domain2, typename Range>
50281typed::union_set<pair<Domain, Domain2>> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::domain() const
50282{
50283  auto res = isl::union_pw_multi_aff::domain();
50284  return typed::union_set<pair<Domain, Domain2>>(res);
50285}
50286
50287template <typename Domain, typename Domain2, typename Range>
50288typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::drop_unused_params() const
50289{
50290  auto res = isl::union_pw_multi_aff::drop_unused_params();
50291  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50292}
50293
50294template <typename Domain, typename Domain2, typename Range>
50295typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::empty(const isl::ctx &ctx)
50296{
50297  auto res = isl::union_pw_multi_aff::empty(ctx);
50298  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50299}
50300
50301template <typename Domain, typename Domain2, typename Range>
50302typed::pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::extract_pw_multi_aff(const typed::space<pair<Domain, Domain2>, Range> &space) const
50303{
50304  auto res = isl::union_pw_multi_aff::extract_pw_multi_aff(space);
50305  return typed::pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50306}
50307
50308template <typename Domain, typename Domain2, typename Range>
50309typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::gist(const typed::union_set<pair<Domain, Domain2>> &context) const
50310{
50311  auto res = isl::union_pw_multi_aff::gist(context);
50312  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50313}
50314
50315template <typename Domain, typename Domain2, typename Range>
50316typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::gist(const typed::basic_set<pair<Domain, Domain2>> &context) const
50317{
50318  auto res = isl::union_pw_multi_aff::gist(context);
50319  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50320}
50321
50322template <typename Domain, typename Domain2, typename Range>
50323typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::gist(const typed::point<pair<Domain, Domain2>> &context) const
50324{
50325  auto res = isl::union_pw_multi_aff::gist(context);
50326  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50327}
50328
50329template <typename Domain, typename Domain2, typename Range>
50330typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::gist(const typed::set<pair<Domain, Domain2>> &context) const
50331{
50332  auto res = isl::union_pw_multi_aff::gist(context);
50333  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50334}
50335
50336template <typename Domain, typename Domain2, typename Range>
50337typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::intersect_domain(const typed::space<pair<Domain, Domain2>> &space) const
50338{
50339  auto res = isl::union_pw_multi_aff::intersect_domain(space);
50340  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50341}
50342
50343template <typename Domain, typename Domain2, typename Range>
50344typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::intersect_domain(const typed::union_set<pair<Domain, Domain2>> &uset) const
50345{
50346  auto res = isl::union_pw_multi_aff::intersect_domain(uset);
50347  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50348}
50349
50350template <typename Domain, typename Domain2, typename Range>
50351typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::intersect_domain_wrapped_domain(const typed::union_set<Domain> &uset) const
50352{
50353  auto res = isl::union_pw_multi_aff::intersect_domain_wrapped_domain(uset);
50354  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50355}
50356
50357template <typename Domain, typename Domain2, typename Range>
50358typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::intersect_domain_wrapped_domain(const typed::basic_set<Domain> &uset) const
50359{
50360  auto res = isl::union_pw_multi_aff::intersect_domain_wrapped_domain(uset);
50361  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50362}
50363
50364template <typename Domain, typename Domain2, typename Range>
50365typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::intersect_domain_wrapped_domain(const typed::point<Domain> &uset) const
50366{
50367  auto res = isl::union_pw_multi_aff::intersect_domain_wrapped_domain(uset);
50368  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50369}
50370
50371template <typename Domain, typename Domain2, typename Range>
50372typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::intersect_domain_wrapped_domain(const typed::set<Domain> &uset) const
50373{
50374  auto res = isl::union_pw_multi_aff::intersect_domain_wrapped_domain(uset);
50375  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50376}
50377
50378template <typename Domain, typename Domain2, typename Range>
50379typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::intersect_params(const typed::set<> &set) const
50380{
50381  auto res = isl::union_pw_multi_aff::intersect_params(set);
50382  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50383}
50384
50385template <typename Domain, typename Domain2, typename Range>
50386typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::intersect_params(const typed::basic_set<> &set) const
50387{
50388  auto res = isl::union_pw_multi_aff::intersect_params(set);
50389  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50390}
50391
50392template <typename Domain, typename Domain2, typename Range>
50393typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::intersect_params(const typed::point<> &set) const
50394{
50395  auto res = isl::union_pw_multi_aff::intersect_params(set);
50396  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50397}
50398
50399template <typename Domain, typename Domain2, typename Range>
50400template <typename Domain3>
50401typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, Domain> &upma2) const
50402{
50403  auto res = isl::union_pw_multi_aff::preimage_domain_wrapped_domain(upma2);
50404  return typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range>(res);
50405}
50406
50407template <typename Domain, typename Domain2, typename Range>
50408template <typename Domain3>
50409typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::preimage_domain_wrapped_domain(const typed::multi_aff<Domain3, Domain> &upma2) const
50410{
50411  auto res = isl::union_pw_multi_aff::preimage_domain_wrapped_domain(upma2);
50412  return typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range>(res);
50413}
50414
50415template <typename Domain, typename Domain2, typename Range>
50416template <typename Domain3>
50417typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, Domain> &upma2) const
50418{
50419  auto res = isl::union_pw_multi_aff::preimage_domain_wrapped_domain(upma2);
50420  return typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range>(res);
50421}
50422
50423template <typename Domain, typename Domain2, typename Range>
50424template <typename Domain3>
50425typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::preimage_domain_wrapped_domain(const typed::union_pw_aff<Domain3, Domain> &upma2) const
50426{
50427  auto res = isl::union_pw_multi_aff::preimage_domain_wrapped_domain(upma2);
50428  return typed::union_pw_multi_aff<pair<Domain3, Domain2>, Range>(res);
50429}
50430
50431template <typename Domain, typename Domain2, typename Range>
50432template <typename Arg3>
50433typed::union_pw_multi_aff<Arg3, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::pullback(const typed::union_pw_multi_aff<Arg3, pair<Domain, Domain2>> &upma2) const
50434{
50435  auto res = isl::union_pw_multi_aff::pullback(upma2);
50436  return typed::union_pw_multi_aff<Arg3, Range>(res);
50437}
50438
50439template <typename Domain, typename Domain2, typename Range>
50440typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::pullback(const typed::union_pw_multi_aff<pair<Domain, Domain2>> &upma2) const
50441{
50442  auto res = isl::union_pw_multi_aff::pullback(upma2);
50443  return typed::union_pw_multi_aff<Range>(res);
50444}
50445
50446template <typename Domain, typename Domain2, typename Range>
50447template <typename Arg3>
50448typed::union_pw_multi_aff<Arg3, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::pullback(const typed::multi_aff<Arg3, pair<Domain, Domain2>> &upma2) const
50449{
50450  auto res = isl::union_pw_multi_aff::pullback(upma2);
50451  return typed::union_pw_multi_aff<Arg3, Range>(res);
50452}
50453
50454template <typename Domain, typename Domain2, typename Range>
50455typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::pullback(const typed::multi_aff<pair<Domain, Domain2>> &upma2) const
50456{
50457  auto res = isl::union_pw_multi_aff::pullback(upma2);
50458  return typed::union_pw_multi_aff<Range>(res);
50459}
50460
50461template <typename Domain, typename Domain2, typename Range>
50462template <typename Arg3>
50463typed::union_pw_multi_aff<Arg3, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::pullback(const typed::pw_multi_aff<Arg3, pair<Domain, Domain2>> &upma2) const
50464{
50465  auto res = isl::union_pw_multi_aff::pullback(upma2);
50466  return typed::union_pw_multi_aff<Arg3, Range>(res);
50467}
50468
50469template <typename Domain, typename Domain2, typename Range>
50470typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::pullback(const typed::pw_multi_aff<pair<Domain, Domain2>> &upma2) const
50471{
50472  auto res = isl::union_pw_multi_aff::pullback(upma2);
50473  return typed::union_pw_multi_aff<Range>(res);
50474}
50475
50476template <typename Domain, typename Domain2, typename Range>
50477template <typename Arg3>
50478typed::union_pw_multi_aff<Arg3, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::pullback(const typed::union_pw_aff<Arg3, pair<Domain, Domain2>> &upma2) const
50479{
50480  auto res = isl::union_pw_multi_aff::pullback(upma2);
50481  return typed::union_pw_multi_aff<Arg3, Range>(res);
50482}
50483
50484template <typename Domain, typename Domain2, typename Range>
50485typed::union_pw_multi_aff<Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::pullback(const typed::union_pw_aff<pair<Domain, Domain2>> &upma2) const
50486{
50487  auto res = isl::union_pw_multi_aff::pullback(upma2);
50488  return typed::union_pw_multi_aff<Range>(res);
50489}
50490
50491template <typename Domain, typename Domain2, typename Range>
50492typed::pw_multi_aff_list<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::pw_multi_aff_list() const
50493{
50494  auto res = isl::union_pw_multi_aff::pw_multi_aff_list();
50495  return typed::pw_multi_aff_list<pair<Domain, Domain2>, Range>(res);
50496}
50497
50498template <typename Domain, typename Domain2, typename Range>
50499template <typename Range2>
50500typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::range_product(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range2> &upma2) const
50501{
50502  auto res = isl::union_pw_multi_aff::range_product(upma2);
50503  return typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
50504}
50505
50506template <typename Domain, typename Domain2, typename Range>
50507template <typename Range2>
50508typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::range_product(const typed::multi_aff<pair<Domain, Domain2>, Range2> &upma2) const
50509{
50510  auto res = isl::union_pw_multi_aff::range_product(upma2);
50511  return typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
50512}
50513
50514template <typename Domain, typename Domain2, typename Range>
50515template <typename Range2>
50516typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::range_product(const typed::pw_multi_aff<pair<Domain, Domain2>, Range2> &upma2) const
50517{
50518  auto res = isl::union_pw_multi_aff::range_product(upma2);
50519  return typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Range2>>(res);
50520}
50521
50522template <typename Domain, typename Domain2, typename Range>
50523typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Anonymous>> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::range_product(const typed::union_pw_aff<pair<Domain, Domain2>, Anonymous> &upma2) const
50524{
50525  auto res = isl::union_pw_multi_aff::range_product(upma2);
50526  return typed::union_pw_multi_aff<pair<Domain, Domain2>, pair<Range, Anonymous>>(res);
50527}
50528
50529template <typename Domain, typename Domain2, typename Range>
50530typed::space<> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::space() const
50531{
50532  auto res = isl::union_pw_multi_aff::space();
50533  return typed::space<>(res);
50534}
50535
50536template <typename Domain, typename Domain2, typename Range>
50537typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::sub(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const
50538{
50539  auto res = isl::union_pw_multi_aff::sub(upma2);
50540  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50541}
50542
50543template <typename Domain, typename Domain2, typename Range>
50544typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::sub(const typed::multi_aff<pair<Domain, Domain2>, Range> &upma2) const
50545{
50546  auto res = isl::union_pw_multi_aff::sub(upma2);
50547  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50548}
50549
50550template <typename Domain, typename Domain2, typename Range>
50551typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::sub(const typed::pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const
50552{
50553  auto res = isl::union_pw_multi_aff::sub(upma2);
50554  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50555}
50556
50557template <typename Domain, typename Domain2, typename Range>
50558typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::sub(const typed::union_pw_aff<pair<Domain, Domain2>, Range> &upma2) const
50559{
50560  auto res = isl::union_pw_multi_aff::sub(upma2);
50561  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50562}
50563
50564template <typename Domain, typename Domain2, typename Range>
50565typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::subtract_domain(const typed::space<pair<Domain, Domain2>> &space) const
50566{
50567  auto res = isl::union_pw_multi_aff::subtract_domain(space);
50568  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50569}
50570
50571template <typename Domain, typename Domain2, typename Range>
50572typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::subtract_domain(const typed::union_set<pair<Domain, Domain2>> &uset) const
50573{
50574  auto res = isl::union_pw_multi_aff::subtract_domain(uset);
50575  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50576}
50577
50578template <typename Domain, typename Domain2, typename Range>
50579typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::union_add(const typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const
50580{
50581  auto res = isl::union_pw_multi_aff::union_add(upma2);
50582  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50583}
50584
50585template <typename Domain, typename Domain2, typename Range>
50586typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::union_add(const typed::multi_aff<pair<Domain, Domain2>, Range> &upma2) const
50587{
50588  auto res = isl::union_pw_multi_aff::union_add(upma2);
50589  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50590}
50591
50592template <typename Domain, typename Domain2, typename Range>
50593typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::union_add(const typed::pw_multi_aff<pair<Domain, Domain2>, Range> &upma2) const
50594{
50595  auto res = isl::union_pw_multi_aff::union_add(upma2);
50596  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50597}
50598
50599template <typename Domain, typename Domain2, typename Range>
50600typed::union_pw_multi_aff<pair<Domain, Domain2>, Range> typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>::union_add(const typed::union_pw_aff<pair<Domain, Domain2>, Range> &upma2) const
50601{
50602  auto res = isl::union_pw_multi_aff::union_add(upma2);
50603  return typed::union_pw_multi_aff<pair<Domain, Domain2>, Range>(res);
50604}
50605
50606template <typename Domain, typename Range, typename Range2>
50607typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::union_pw_multi_aff(const typed::multi_aff<Domain, pair<Range, Range2>> &ma)
50608  : isl::union_pw_multi_aff(ma)
50609{
50610}
50611
50612template <typename Domain, typename Range, typename Range2>
50613typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::union_pw_multi_aff(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &pma)
50614  : isl::union_pw_multi_aff(pma)
50615{
50616}
50617
50618template <typename Domain, typename Range, typename Range2>
50619typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::union_pw_multi_aff(const typed::union_pw_aff<Domain, pair<Range, Range2>> &upa)
50620  : isl::union_pw_multi_aff(upa)
50621{
50622}
50623
50624template <typename Domain, typename Range, typename Range2>
50625typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::union_pw_multi_aff(const isl::ctx &ctx, const std::string &str)
50626  : isl::union_pw_multi_aff(ctx, str)
50627{
50628}
50629
50630template <typename Domain, typename Range, typename Range2>
50631typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
50632{
50633  auto res = isl::union_pw_multi_aff::add(upma2);
50634  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50635}
50636
50637template <typename Domain, typename Range, typename Range2>
50638typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::multi_aff<Domain, pair<Range, Range2>> &upma2) const
50639{
50640  auto res = isl::union_pw_multi_aff::add(upma2);
50641  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50642}
50643
50644template <typename Domain, typename Range, typename Range2>
50645typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
50646{
50647  auto res = isl::union_pw_multi_aff::add(upma2);
50648  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50649}
50650
50651template <typename Domain, typename Range, typename Range2>
50652typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::add(const typed::union_pw_aff<Domain, pair<Range, Range2>> &upma2) const
50653{
50654  auto res = isl::union_pw_multi_aff::add(upma2);
50655  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50656}
50657
50658template <typename Domain, typename Range, typename Range2>
50659template <typename Arg3>
50660typed::union_pw_multi_aff<Domain, Arg3> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg3> &upma2) const
50661{
50662  auto res = isl::union_pw_multi_aff::apply(upma2);
50663  return typed::union_pw_multi_aff<Domain, Arg3>(res);
50664}
50665
50666template <typename Domain, typename Range, typename Range2>
50667template <typename Arg3>
50668typed::union_pw_multi_aff<Domain, Arg3> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::apply(const typed::multi_aff<pair<Range, Range2>, Arg3> &upma2) const
50669{
50670  auto res = isl::union_pw_multi_aff::apply(upma2);
50671  return typed::union_pw_multi_aff<Domain, Arg3>(res);
50672}
50673
50674template <typename Domain, typename Range, typename Range2>
50675template <typename Arg3>
50676typed::union_pw_multi_aff<Domain, Arg3> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::apply(const typed::pw_multi_aff<pair<Range, Range2>, Arg3> &upma2) const
50677{
50678  auto res = isl::union_pw_multi_aff::apply(upma2);
50679  return typed::union_pw_multi_aff<Domain, Arg3>(res);
50680}
50681
50682template <typename Domain, typename Range, typename Range2>
50683typed::union_pw_multi_aff<Domain, Anonymous> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::apply(const typed::union_pw_aff<pair<Range, Range2>, Anonymous> &upma2) const
50684{
50685  auto res = isl::union_pw_multi_aff::apply(upma2);
50686  return typed::union_pw_multi_aff<Domain, Anonymous>(res);
50687}
50688
50689template <typename Domain, typename Range, typename Range2>
50690typed::multi_union_pw_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::as_multi_union_pw_aff() const
50691{
50692  auto res = isl::union_pw_multi_aff::as_multi_union_pw_aff();
50693  return typed::multi_union_pw_aff<Domain, pair<Range, Range2>>(res);
50694}
50695
50696template <typename Domain, typename Range, typename Range2>
50697typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::as_pw_multi_aff() const
50698{
50699  auto res = isl::union_pw_multi_aff::as_pw_multi_aff();
50700  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
50701}
50702
50703template <typename Domain, typename Range, typename Range2>
50704typed::union_map<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::as_union_map() const
50705{
50706  auto res = isl::union_pw_multi_aff::as_union_map();
50707  return typed::union_map<Domain, pair<Range, Range2>>(res);
50708}
50709
50710template <typename Domain, typename Range, typename Range2>
50711typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::coalesce() const
50712{
50713  auto res = isl::union_pw_multi_aff::coalesce();
50714  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50715}
50716
50717template <typename Domain, typename Range, typename Range2>
50718typed::union_set<Domain> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::domain() const
50719{
50720  auto res = isl::union_pw_multi_aff::domain();
50721  return typed::union_set<Domain>(res);
50722}
50723
50724template <typename Domain, typename Range, typename Range2>
50725typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::drop_unused_params() const
50726{
50727  auto res = isl::union_pw_multi_aff::drop_unused_params();
50728  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50729}
50730
50731template <typename Domain, typename Range, typename Range2>
50732typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::empty(const isl::ctx &ctx)
50733{
50734  auto res = isl::union_pw_multi_aff::empty(ctx);
50735  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50736}
50737
50738template <typename Domain, typename Range, typename Range2>
50739typed::pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::extract_pw_multi_aff(const typed::space<Domain, pair<Range, Range2>> &space) const
50740{
50741  auto res = isl::union_pw_multi_aff::extract_pw_multi_aff(space);
50742  return typed::pw_multi_aff<Domain, pair<Range, Range2>>(res);
50743}
50744
50745template <typename Domain, typename Range, typename Range2>
50746typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::gist(const typed::union_set<Domain> &context) const
50747{
50748  auto res = isl::union_pw_multi_aff::gist(context);
50749  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50750}
50751
50752template <typename Domain, typename Range, typename Range2>
50753typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::gist(const typed::basic_set<Domain> &context) const
50754{
50755  auto res = isl::union_pw_multi_aff::gist(context);
50756  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50757}
50758
50759template <typename Domain, typename Range, typename Range2>
50760typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::gist(const typed::point<Domain> &context) const
50761{
50762  auto res = isl::union_pw_multi_aff::gist(context);
50763  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50764}
50765
50766template <typename Domain, typename Range, typename Range2>
50767typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::gist(const typed::set<Domain> &context) const
50768{
50769  auto res = isl::union_pw_multi_aff::gist(context);
50770  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50771}
50772
50773template <typename Domain, typename Range, typename Range2>
50774typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::space<Domain> &space) const
50775{
50776  auto res = isl::union_pw_multi_aff::intersect_domain(space);
50777  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50778}
50779
50780template <typename Domain, typename Range, typename Range2>
50781typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::intersect_domain(const typed::union_set<Domain> &uset) const
50782{
50783  auto res = isl::union_pw_multi_aff::intersect_domain(uset);
50784  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50785}
50786
50787template <typename Domain, typename Range, typename Range2>
50788typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::intersect_params(const typed::set<> &set) const
50789{
50790  auto res = isl::union_pw_multi_aff::intersect_params(set);
50791  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50792}
50793
50794template <typename Domain, typename Range, typename Range2>
50795typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::intersect_params(const typed::basic_set<> &set) const
50796{
50797  auto res = isl::union_pw_multi_aff::intersect_params(set);
50798  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50799}
50800
50801template <typename Domain, typename Range, typename Range2>
50802typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::intersect_params(const typed::point<> &set) const
50803{
50804  auto res = isl::union_pw_multi_aff::intersect_params(set);
50805  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50806}
50807
50808template <typename Domain, typename Range, typename Range2>
50809template <typename Domain2>
50810typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<Domain2, Domain> &upma2) const
50811{
50812  auto res = isl::union_pw_multi_aff::pullback(upma2);
50813  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
50814}
50815
50816template <typename Domain, typename Range, typename Range2>
50817typed::union_pw_multi_aff<pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<Domain> &upma2) const
50818{
50819  auto res = isl::union_pw_multi_aff::pullback(upma2);
50820  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
50821}
50822
50823template <typename Domain, typename Range, typename Range2>
50824template <typename Domain2>
50825typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_aff<Domain2, Domain> &upma2) const
50826{
50827  auto res = isl::union_pw_multi_aff::pullback(upma2);
50828  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
50829}
50830
50831template <typename Domain, typename Range, typename Range2>
50832typed::union_pw_multi_aff<pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::multi_aff<Domain> &upma2) const
50833{
50834  auto res = isl::union_pw_multi_aff::pullback(upma2);
50835  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
50836}
50837
50838template <typename Domain, typename Range, typename Range2>
50839template <typename Domain2>
50840typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<Domain2, Domain> &upma2) const
50841{
50842  auto res = isl::union_pw_multi_aff::pullback(upma2);
50843  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
50844}
50845
50846template <typename Domain, typename Range, typename Range2>
50847typed::union_pw_multi_aff<pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<Domain> &upma2) const
50848{
50849  auto res = isl::union_pw_multi_aff::pullback(upma2);
50850  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
50851}
50852
50853template <typename Domain, typename Range, typename Range2>
50854template <typename Domain2>
50855typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::union_pw_aff<Domain2, Domain> &upma2) const
50856{
50857  auto res = isl::union_pw_multi_aff::pullback(upma2);
50858  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
50859}
50860
50861template <typename Domain, typename Range, typename Range2>
50862typed::union_pw_multi_aff<pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::pullback(const typed::union_pw_aff<Domain> &upma2) const
50863{
50864  auto res = isl::union_pw_multi_aff::pullback(upma2);
50865  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
50866}
50867
50868template <typename Domain, typename Range, typename Range2>
50869typed::pw_multi_aff_list<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::pw_multi_aff_list() const
50870{
50871  auto res = isl::union_pw_multi_aff::pw_multi_aff_list();
50872  return typed::pw_multi_aff_list<Domain, pair<Range, Range2>>(res);
50873}
50874
50875template <typename Domain, typename Range, typename Range2>
50876typed::union_pw_multi_aff<Domain, Range> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::range_factor_domain() const
50877{
50878  auto res = isl::union_pw_multi_aff::range_factor_domain();
50879  return typed::union_pw_multi_aff<Domain, Range>(res);
50880}
50881
50882template <typename Domain, typename Range, typename Range2>
50883typed::union_pw_multi_aff<Domain, Range2> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::range_factor_range() const
50884{
50885  auto res = isl::union_pw_multi_aff::range_factor_range();
50886  return typed::union_pw_multi_aff<Domain, Range2>(res);
50887}
50888
50889template <typename Domain, typename Range, typename Range2>
50890template <typename Arg3>
50891typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::union_pw_multi_aff<Domain, Arg3> &upma2) const
50892{
50893  auto res = isl::union_pw_multi_aff::range_product(upma2);
50894  return typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
50895}
50896
50897template <typename Domain, typename Range, typename Range2>
50898template <typename Arg3>
50899typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::multi_aff<Domain, Arg3> &upma2) const
50900{
50901  auto res = isl::union_pw_multi_aff::range_product(upma2);
50902  return typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
50903}
50904
50905template <typename Domain, typename Range, typename Range2>
50906template <typename Arg3>
50907typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::pw_multi_aff<Domain, Arg3> &upma2) const
50908{
50909  auto res = isl::union_pw_multi_aff::range_product(upma2);
50910  return typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Arg3>>(res);
50911}
50912
50913template <typename Domain, typename Range, typename Range2>
50914typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Anonymous>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::range_product(const typed::union_pw_aff<Domain, Anonymous> &upma2) const
50915{
50916  auto res = isl::union_pw_multi_aff::range_product(upma2);
50917  return typed::union_pw_multi_aff<Domain, pair<pair<Range, Range2>, Anonymous>>(res);
50918}
50919
50920template <typename Domain, typename Range, typename Range2>
50921typed::space<> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::space() const
50922{
50923  auto res = isl::union_pw_multi_aff::space();
50924  return typed::space<>(res);
50925}
50926
50927template <typename Domain, typename Range, typename Range2>
50928typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
50929{
50930  auto res = isl::union_pw_multi_aff::sub(upma2);
50931  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50932}
50933
50934template <typename Domain, typename Range, typename Range2>
50935typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::multi_aff<Domain, pair<Range, Range2>> &upma2) const
50936{
50937  auto res = isl::union_pw_multi_aff::sub(upma2);
50938  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50939}
50940
50941template <typename Domain, typename Range, typename Range2>
50942typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
50943{
50944  auto res = isl::union_pw_multi_aff::sub(upma2);
50945  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50946}
50947
50948template <typename Domain, typename Range, typename Range2>
50949typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::sub(const typed::union_pw_aff<Domain, pair<Range, Range2>> &upma2) const
50950{
50951  auto res = isl::union_pw_multi_aff::sub(upma2);
50952  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50953}
50954
50955template <typename Domain, typename Range, typename Range2>
50956typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::space<Domain> &space) const
50957{
50958  auto res = isl::union_pw_multi_aff::subtract_domain(space);
50959  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50960}
50961
50962template <typename Domain, typename Range, typename Range2>
50963typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::subtract_domain(const typed::union_set<Domain> &uset) const
50964{
50965  auto res = isl::union_pw_multi_aff::subtract_domain(uset);
50966  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50967}
50968
50969template <typename Domain, typename Range, typename Range2>
50970typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::union_pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
50971{
50972  auto res = isl::union_pw_multi_aff::union_add(upma2);
50973  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50974}
50975
50976template <typename Domain, typename Range, typename Range2>
50977typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::multi_aff<Domain, pair<Range, Range2>> &upma2) const
50978{
50979  auto res = isl::union_pw_multi_aff::union_add(upma2);
50980  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50981}
50982
50983template <typename Domain, typename Range, typename Range2>
50984typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::pw_multi_aff<Domain, pair<Range, Range2>> &upma2) const
50985{
50986  auto res = isl::union_pw_multi_aff::union_add(upma2);
50987  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50988}
50989
50990template <typename Domain, typename Range, typename Range2>
50991typed::union_pw_multi_aff<Domain, pair<Range, Range2>> typed::union_pw_multi_aff<Domain, pair<Range, Range2>>::union_add(const typed::union_pw_aff<Domain, pair<Range, Range2>> &upma2) const
50992{
50993  auto res = isl::union_pw_multi_aff::union_add(upma2);
50994  return typed::union_pw_multi_aff<Domain, pair<Range, Range2>>(res);
50995}
50996
50997template <typename T1, typename T2, typename Range, typename Range2>
50998typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_pw_multi_aff(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &ma)
50999  : isl::union_pw_multi_aff(ma)
51000{
51001}
51002
51003template <typename T1, typename T2, typename Range, typename Range2>
51004typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_pw_multi_aff(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &pma)
51005  : isl::union_pw_multi_aff(pma)
51006{
51007}
51008
51009template <typename T1, typename T2, typename Range, typename Range2>
51010typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_pw_multi_aff(const typed::union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upa)
51011  : isl::union_pw_multi_aff(upa)
51012{
51013}
51014
51015template <typename T1, typename T2, typename Range, typename Range2>
51016typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_pw_multi_aff(const isl::ctx &ctx, const std::string &str)
51017  : isl::union_pw_multi_aff(ctx, str)
51018{
51019}
51020
51021template <typename T1, typename T2, typename Range, typename Range2>
51022typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51023{
51024  auto res = isl::union_pw_multi_aff::add(upma2);
51025  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51026}
51027
51028template <typename T1, typename T2, typename Range, typename Range2>
51029typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51030{
51031  auto res = isl::union_pw_multi_aff::add(upma2);
51032  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51033}
51034
51035template <typename T1, typename T2, typename Range, typename Range2>
51036typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51037{
51038  auto res = isl::union_pw_multi_aff::add(upma2);
51039  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51040}
51041
51042template <typename T1, typename T2, typename Range, typename Range2>
51043typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::add(const typed::union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51044{
51045  auto res = isl::union_pw_multi_aff::add(upma2);
51046  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51047}
51048
51049template <typename T1, typename T2, typename Range, typename Range2>
51050template <typename Arg2>
51051typed::union_pw_multi_aff<pair<T1, T2>, Arg2> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::apply(const typed::union_pw_multi_aff<pair<Range, Range2>, Arg2> &upma2) const
51052{
51053  auto res = isl::union_pw_multi_aff::apply(upma2);
51054  return typed::union_pw_multi_aff<pair<T1, T2>, Arg2>(res);
51055}
51056
51057template <typename T1, typename T2, typename Range, typename Range2>
51058template <typename Arg2>
51059typed::union_pw_multi_aff<pair<T1, T2>, Arg2> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::apply(const typed::multi_aff<pair<Range, Range2>, Arg2> &upma2) const
51060{
51061  auto res = isl::union_pw_multi_aff::apply(upma2);
51062  return typed::union_pw_multi_aff<pair<T1, T2>, Arg2>(res);
51063}
51064
51065template <typename T1, typename T2, typename Range, typename Range2>
51066template <typename Arg2>
51067typed::union_pw_multi_aff<pair<T1, T2>, Arg2> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::apply(const typed::pw_multi_aff<pair<Range, Range2>, Arg2> &upma2) const
51068{
51069  auto res = isl::union_pw_multi_aff::apply(upma2);
51070  return typed::union_pw_multi_aff<pair<T1, T2>, Arg2>(res);
51071}
51072
51073template <typename T1, typename T2, typename Range, typename Range2>
51074typed::union_pw_multi_aff<pair<T1, T2>, Anonymous> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::apply(const typed::union_pw_aff<pair<Range, Range2>, Anonymous> &upma2) const
51075{
51076  auto res = isl::union_pw_multi_aff::apply(upma2);
51077  return typed::union_pw_multi_aff<pair<T1, T2>, Anonymous>(res);
51078}
51079
51080template <typename T1, typename T2, typename Range, typename Range2>
51081typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_multi_union_pw_aff() const
51082{
51083  auto res = isl::union_pw_multi_aff::as_multi_union_pw_aff();
51084  return typed::multi_union_pw_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51085}
51086
51087template <typename T1, typename T2, typename Range, typename Range2>
51088typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_pw_multi_aff() const
51089{
51090  auto res = isl::union_pw_multi_aff::as_pw_multi_aff();
51091  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51092}
51093
51094template <typename T1, typename T2, typename Range, typename Range2>
51095typed::union_map<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::as_union_map() const
51096{
51097  auto res = isl::union_pw_multi_aff::as_union_map();
51098  return typed::union_map<pair<T1, T2>, pair<Range, Range2>>(res);
51099}
51100
51101template <typename T1, typename T2, typename Range, typename Range2>
51102typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::coalesce() const
51103{
51104  auto res = isl::union_pw_multi_aff::coalesce();
51105  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51106}
51107
51108template <typename T1, typename T2, typename Range, typename Range2>
51109typed::union_set<pair<T1, T2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::domain() const
51110{
51111  auto res = isl::union_pw_multi_aff::domain();
51112  return typed::union_set<pair<T1, T2>>(res);
51113}
51114
51115template <typename T1, typename T2, typename Range, typename Range2>
51116typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::drop_unused_params() const
51117{
51118  auto res = isl::union_pw_multi_aff::drop_unused_params();
51119  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51120}
51121
51122template <typename T1, typename T2, typename Range, typename Range2>
51123typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::empty(const isl::ctx &ctx)
51124{
51125  auto res = isl::union_pw_multi_aff::empty(ctx);
51126  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51127}
51128
51129template <typename T1, typename T2, typename Range, typename Range2>
51130typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::extract_pw_multi_aff(const typed::space<pair<T1, T2>, pair<Range, Range2>> &space) const
51131{
51132  auto res = isl::union_pw_multi_aff::extract_pw_multi_aff(space);
51133  return typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51134}
51135
51136template <typename T1, typename T2, typename Range, typename Range2>
51137typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::union_set<pair<T1, T2>> &context) const
51138{
51139  auto res = isl::union_pw_multi_aff::gist(context);
51140  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51141}
51142
51143template <typename T1, typename T2, typename Range, typename Range2>
51144typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::basic_set<pair<T1, T2>> &context) const
51145{
51146  auto res = isl::union_pw_multi_aff::gist(context);
51147  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51148}
51149
51150template <typename T1, typename T2, typename Range, typename Range2>
51151typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::point<pair<T1, T2>> &context) const
51152{
51153  auto res = isl::union_pw_multi_aff::gist(context);
51154  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51155}
51156
51157template <typename T1, typename T2, typename Range, typename Range2>
51158typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::gist(const typed::set<pair<T1, T2>> &context) const
51159{
51160  auto res = isl::union_pw_multi_aff::gist(context);
51161  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51162}
51163
51164template <typename T1, typename T2, typename Range, typename Range2>
51165typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::space<pair<T1, T2>> &space) const
51166{
51167  auto res = isl::union_pw_multi_aff::intersect_domain(space);
51168  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51169}
51170
51171template <typename T1, typename T2, typename Range, typename Range2>
51172typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain(const typed::union_set<pair<T1, T2>> &uset) const
51173{
51174  auto res = isl::union_pw_multi_aff::intersect_domain(uset);
51175  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51176}
51177
51178template <typename T1, typename T2, typename Range, typename Range2>
51179typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::union_set<T1> &uset) const
51180{
51181  auto res = isl::union_pw_multi_aff::intersect_domain_wrapped_domain(uset);
51182  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51183}
51184
51185template <typename T1, typename T2, typename Range, typename Range2>
51186typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::basic_set<T1> &uset) const
51187{
51188  auto res = isl::union_pw_multi_aff::intersect_domain_wrapped_domain(uset);
51189  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51190}
51191
51192template <typename T1, typename T2, typename Range, typename Range2>
51193typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::point<T1> &uset) const
51194{
51195  auto res = isl::union_pw_multi_aff::intersect_domain_wrapped_domain(uset);
51196  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51197}
51198
51199template <typename T1, typename T2, typename Range, typename Range2>
51200typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_domain_wrapped_domain(const typed::set<T1> &uset) const
51201{
51202  auto res = isl::union_pw_multi_aff::intersect_domain_wrapped_domain(uset);
51203  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51204}
51205
51206template <typename T1, typename T2, typename Range, typename Range2>
51207typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::set<> &set) const
51208{
51209  auto res = isl::union_pw_multi_aff::intersect_params(set);
51210  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51211}
51212
51213template <typename T1, typename T2, typename Range, typename Range2>
51214typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::basic_set<> &set) const
51215{
51216  auto res = isl::union_pw_multi_aff::intersect_params(set);
51217  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51218}
51219
51220template <typename T1, typename T2, typename Range, typename Range2>
51221typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::intersect_params(const typed::point<> &set) const
51222{
51223  auto res = isl::union_pw_multi_aff::intersect_params(set);
51224  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51225}
51226
51227template <typename T1, typename T2, typename Range, typename Range2>
51228template <typename Domain3>
51229typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::union_pw_multi_aff<Domain3, T1> &upma2) const
51230{
51231  auto res = isl::union_pw_multi_aff::preimage_domain_wrapped_domain(upma2);
51232  return typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
51233}
51234
51235template <typename T1, typename T2, typename Range, typename Range2>
51236template <typename Domain3>
51237typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::multi_aff<Domain3, T1> &upma2) const
51238{
51239  auto res = isl::union_pw_multi_aff::preimage_domain_wrapped_domain(upma2);
51240  return typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
51241}
51242
51243template <typename T1, typename T2, typename Range, typename Range2>
51244template <typename Domain3>
51245typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::pw_multi_aff<Domain3, T1> &upma2) const
51246{
51247  auto res = isl::union_pw_multi_aff::preimage_domain_wrapped_domain(upma2);
51248  return typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
51249}
51250
51251template <typename T1, typename T2, typename Range, typename Range2>
51252template <typename Domain3>
51253typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::preimage_domain_wrapped_domain(const typed::union_pw_aff<Domain3, T1> &upma2) const
51254{
51255  auto res = isl::union_pw_multi_aff::preimage_domain_wrapped_domain(upma2);
51256  return typed::union_pw_multi_aff<pair<Domain3, T2>, pair<Range, Range2>>(res);
51257}
51258
51259template <typename T1, typename T2, typename Range, typename Range2>
51260template <typename Domain2>
51261typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<Domain2, pair<T1, T2>> &upma2) const
51262{
51263  auto res = isl::union_pw_multi_aff::pullback(upma2);
51264  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
51265}
51266
51267template <typename T1, typename T2, typename Range, typename Range2>
51268typed::union_pw_multi_aff<pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::union_pw_multi_aff<pair<T1, T2>> &upma2) const
51269{
51270  auto res = isl::union_pw_multi_aff::pullback(upma2);
51271  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
51272}
51273
51274template <typename T1, typename T2, typename Range, typename Range2>
51275template <typename Domain2>
51276typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_aff<Domain2, pair<T1, T2>> &upma2) const
51277{
51278  auto res = isl::union_pw_multi_aff::pullback(upma2);
51279  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
51280}
51281
51282template <typename T1, typename T2, typename Range, typename Range2>
51283typed::union_pw_multi_aff<pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::multi_aff<pair<T1, T2>> &upma2) const
51284{
51285  auto res = isl::union_pw_multi_aff::pullback(upma2);
51286  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
51287}
51288
51289template <typename T1, typename T2, typename Range, typename Range2>
51290template <typename Domain2>
51291typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<Domain2, pair<T1, T2>> &upma2) const
51292{
51293  auto res = isl::union_pw_multi_aff::pullback(upma2);
51294  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
51295}
51296
51297template <typename T1, typename T2, typename Range, typename Range2>
51298typed::union_pw_multi_aff<pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::pw_multi_aff<pair<T1, T2>> &upma2) const
51299{
51300  auto res = isl::union_pw_multi_aff::pullback(upma2);
51301  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
51302}
51303
51304template <typename T1, typename T2, typename Range, typename Range2>
51305template <typename Domain2>
51306typed::union_pw_multi_aff<Domain2, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::union_pw_aff<Domain2, pair<T1, T2>> &upma2) const
51307{
51308  auto res = isl::union_pw_multi_aff::pullback(upma2);
51309  return typed::union_pw_multi_aff<Domain2, pair<Range, Range2>>(res);
51310}
51311
51312template <typename T1, typename T2, typename Range, typename Range2>
51313typed::union_pw_multi_aff<pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pullback(const typed::union_pw_aff<pair<T1, T2>> &upma2) const
51314{
51315  auto res = isl::union_pw_multi_aff::pullback(upma2);
51316  return typed::union_pw_multi_aff<pair<Range, Range2>>(res);
51317}
51318
51319template <typename T1, typename T2, typename Range, typename Range2>
51320typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::pw_multi_aff_list() const
51321{
51322  auto res = isl::union_pw_multi_aff::pw_multi_aff_list();
51323  return typed::pw_multi_aff_list<pair<T1, T2>, pair<Range, Range2>>(res);
51324}
51325
51326template <typename T1, typename T2, typename Range, typename Range2>
51327typed::union_pw_multi_aff<pair<T1, T2>, Range> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_factor_domain() const
51328{
51329  auto res = isl::union_pw_multi_aff::range_factor_domain();
51330  return typed::union_pw_multi_aff<pair<T1, T2>, Range>(res);
51331}
51332
51333template <typename T1, typename T2, typename Range, typename Range2>
51334typed::union_pw_multi_aff<pair<T1, T2>, Range2> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_factor_range() const
51335{
51336  auto res = isl::union_pw_multi_aff::range_factor_range();
51337  return typed::union_pw_multi_aff<pair<T1, T2>, Range2>(res);
51338}
51339
51340template <typename T1, typename T2, typename Range, typename Range2>
51341template <typename Arg2>
51342typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::union_pw_multi_aff<pair<T1, T2>, Arg2> &upma2) const
51343{
51344  auto res = isl::union_pw_multi_aff::range_product(upma2);
51345  return typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
51346}
51347
51348template <typename T1, typename T2, typename Range, typename Range2>
51349template <typename Arg2>
51350typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::multi_aff<pair<T1, T2>, Arg2> &upma2) const
51351{
51352  auto res = isl::union_pw_multi_aff::range_product(upma2);
51353  return typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
51354}
51355
51356template <typename T1, typename T2, typename Range, typename Range2>
51357template <typename Arg2>
51358typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::pw_multi_aff<pair<T1, T2>, Arg2> &upma2) const
51359{
51360  auto res = isl::union_pw_multi_aff::range_product(upma2);
51361  return typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Arg2>>(res);
51362}
51363
51364template <typename T1, typename T2, typename Range, typename Range2>
51365typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Anonymous>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::range_product(const typed::union_pw_aff<pair<T1, T2>, Anonymous> &upma2) const
51366{
51367  auto res = isl::union_pw_multi_aff::range_product(upma2);
51368  return typed::union_pw_multi_aff<pair<T1, T2>, pair<pair<Range, Range2>, Anonymous>>(res);
51369}
51370
51371template <typename T1, typename T2, typename Range, typename Range2>
51372typed::space<> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::space() const
51373{
51374  auto res = isl::union_pw_multi_aff::space();
51375  return typed::space<>(res);
51376}
51377
51378template <typename T1, typename T2, typename Range, typename Range2>
51379typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51380{
51381  auto res = isl::union_pw_multi_aff::sub(upma2);
51382  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51383}
51384
51385template <typename T1, typename T2, typename Range, typename Range2>
51386typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51387{
51388  auto res = isl::union_pw_multi_aff::sub(upma2);
51389  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51390}
51391
51392template <typename T1, typename T2, typename Range, typename Range2>
51393typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51394{
51395  auto res = isl::union_pw_multi_aff::sub(upma2);
51396  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51397}
51398
51399template <typename T1, typename T2, typename Range, typename Range2>
51400typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::sub(const typed::union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51401{
51402  auto res = isl::union_pw_multi_aff::sub(upma2);
51403  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51404}
51405
51406template <typename T1, typename T2, typename Range, typename Range2>
51407typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::space<pair<T1, T2>> &space) const
51408{
51409  auto res = isl::union_pw_multi_aff::subtract_domain(space);
51410  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51411}
51412
51413template <typename T1, typename T2, typename Range, typename Range2>
51414typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::subtract_domain(const typed::union_set<pair<T1, T2>> &uset) const
51415{
51416  auto res = isl::union_pw_multi_aff::subtract_domain(uset);
51417  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51418}
51419
51420template <typename T1, typename T2, typename Range, typename Range2>
51421typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51422{
51423  auto res = isl::union_pw_multi_aff::union_add(upma2);
51424  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51425}
51426
51427template <typename T1, typename T2, typename Range, typename Range2>
51428typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51429{
51430  auto res = isl::union_pw_multi_aff::union_add(upma2);
51431  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51432}
51433
51434template <typename T1, typename T2, typename Range, typename Range2>
51435typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51436{
51437  auto res = isl::union_pw_multi_aff::union_add(upma2);
51438  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51439}
51440
51441template <typename T1, typename T2, typename Range, typename Range2>
51442typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>> typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>::union_add(const typed::union_pw_aff<pair<T1, T2>, pair<Range, Range2>> &upma2) const
51443{
51444  auto res = isl::union_pw_multi_aff::union_add(upma2);
51445  return typed::union_pw_multi_aff<pair<T1, T2>, pair<Range, Range2>>(res);
51446}
51447
51448typed::union_set<>::union_set(const typed::basic_set<> &bset)
51449  : isl::union_set(bset)
51450{
51451}
51452
51453typed::union_set<>::union_set(const typed::point<> &pnt)
51454  : isl::union_set(pnt)
51455{
51456}
51457
51458typed::union_set<>::union_set(const typed::set<> &set)
51459  : isl::union_set(set)
51460{
51461}
51462
51463typed::union_set<>::union_set(const isl::ctx &ctx, const std::string &str)
51464  : isl::union_set(ctx, str)
51465{
51466}
51467
51468typed::union_set<> typed::union_set<>::coalesce() const
51469{
51470  auto res = isl::union_set::coalesce();
51471  return typed::union_set<>(res);
51472}
51473
51474typed::union_set<> typed::union_set<>::detect_equalities() const
51475{
51476  auto res = isl::union_set::detect_equalities();
51477  return typed::union_set<>(res);
51478}
51479
51480typed::union_set<> typed::union_set<>::drop_unused_params() const
51481{
51482  auto res = isl::union_set::drop_unused_params();
51483  return typed::union_set<>(res);
51484}
51485
51486typed::union_set<> typed::union_set<>::empty(const isl::ctx &ctx)
51487{
51488  auto res = isl::union_set::empty(ctx);
51489  return typed::union_set<>(res);
51490}
51491
51492bool typed::union_set<>::every_set(const std::function<bool(typed::set<>)> &test) const
51493{
51494  auto lambda_test = [&] (isl::set arg0) {
51495    return test(typed::set<>(arg0));
51496  };
51497  return isl::union_set::every_set(lambda_test);
51498}
51499
51500typed::set<> typed::union_set<>::extract_set(const typed::space<> &space) const
51501{
51502  auto res = isl::union_set::extract_set(space);
51503  return typed::set<>(res);
51504}
51505
51506void typed::union_set<>::foreach_point(const std::function<void(typed::point<>)> &fn) const
51507{
51508  auto lambda_fn = [&] (isl::point arg0) {
51509    return fn(typed::point<>(arg0));
51510  };
51511  return isl::union_set::foreach_point(lambda_fn);
51512}
51513
51514void typed::union_set<>::foreach_set(const std::function<void(typed::set<>)> &fn) const
51515{
51516  auto lambda_fn = [&] (isl::set arg0) {
51517    return fn(typed::set<>(arg0));
51518  };
51519  return isl::union_set::foreach_set(lambda_fn);
51520}
51521
51522typed::union_set<> typed::union_set<>::gist(const typed::union_set<> &context) const
51523{
51524  auto res = isl::union_set::gist(context);
51525  return typed::union_set<>(res);
51526}
51527
51528typed::union_set<> typed::union_set<>::gist(const typed::basic_set<> &context) const
51529{
51530  auto res = isl::union_set::gist(context);
51531  return typed::union_set<>(res);
51532}
51533
51534typed::union_set<> typed::union_set<>::gist(const typed::point<> &context) const
51535{
51536  auto res = isl::union_set::gist(context);
51537  return typed::union_set<>(res);
51538}
51539
51540typed::union_set<> typed::union_set<>::gist(const typed::set<> &context) const
51541{
51542  auto res = isl::union_set::gist(context);
51543  return typed::union_set<>(res);
51544}
51545
51546typed::union_set<> typed::union_set<>::intersect(const typed::union_set<> &uset2) const
51547{
51548  auto res = isl::union_set::intersect(uset2);
51549  return typed::union_set<>(res);
51550}
51551
51552typed::union_set<> typed::union_set<>::intersect(const typed::basic_set<> &uset2) const
51553{
51554  auto res = isl::union_set::intersect(uset2);
51555  return typed::union_set<>(res);
51556}
51557
51558typed::union_set<> typed::union_set<>::intersect(const typed::point<> &uset2) const
51559{
51560  auto res = isl::union_set::intersect(uset2);
51561  return typed::union_set<>(res);
51562}
51563
51564typed::union_set<> typed::union_set<>::intersect(const typed::set<> &uset2) const
51565{
51566  auto res = isl::union_set::intersect(uset2);
51567  return typed::union_set<>(res);
51568}
51569
51570typed::union_set<> typed::union_set<>::project_out_all_params() const
51571{
51572  auto res = isl::union_set::project_out_all_params();
51573  return typed::union_set<>(res);
51574}
51575
51576typed::set_list<> typed::union_set<>::set_list() const
51577{
51578  auto res = isl::union_set::set_list();
51579  return typed::set_list<>(res);
51580}
51581
51582typed::space<> typed::union_set<>::space() const
51583{
51584  auto res = isl::union_set::space();
51585  return typed::space<>(res);
51586}
51587
51588typed::union_set<> typed::union_set<>::subtract(const typed::union_set<> &uset2) const
51589{
51590  auto res = isl::union_set::subtract(uset2);
51591  return typed::union_set<>(res);
51592}
51593
51594typed::union_set<> typed::union_set<>::subtract(const typed::basic_set<> &uset2) const
51595{
51596  auto res = isl::union_set::subtract(uset2);
51597  return typed::union_set<>(res);
51598}
51599
51600typed::union_set<> typed::union_set<>::subtract(const typed::point<> &uset2) const
51601{
51602  auto res = isl::union_set::subtract(uset2);
51603  return typed::union_set<>(res);
51604}
51605
51606typed::union_set<> typed::union_set<>::subtract(const typed::set<> &uset2) const
51607{
51608  auto res = isl::union_set::subtract(uset2);
51609  return typed::union_set<>(res);
51610}
51611
51612typed::union_set<> typed::union_set<>::unite(const typed::union_set<> &uset2) const
51613{
51614  auto res = isl::union_set::unite(uset2);
51615  return typed::union_set<>(res);
51616}
51617
51618typed::union_set<> typed::union_set<>::unite(const typed::basic_set<> &uset2) const
51619{
51620  auto res = isl::union_set::unite(uset2);
51621  return typed::union_set<>(res);
51622}
51623
51624typed::union_set<> typed::union_set<>::unite(const typed::point<> &uset2) const
51625{
51626  auto res = isl::union_set::unite(uset2);
51627  return typed::union_set<>(res);
51628}
51629
51630typed::union_set<> typed::union_set<>::unite(const typed::set<> &uset2) const
51631{
51632  auto res = isl::union_set::unite(uset2);
51633  return typed::union_set<>(res);
51634}
51635
51636typed::union_set<> typed::union_set<>::universe() const
51637{
51638  auto res = isl::union_set::universe();
51639  return typed::union_set<>(res);
51640}
51641
51642template <typename Domain>
51643typed::union_set<Domain>::union_set(const typed::basic_set<Domain> &bset)
51644  : isl::union_set(bset)
51645{
51646}
51647
51648template <typename Domain>
51649typed::union_set<Domain>::union_set(const typed::point<Domain> &pnt)
51650  : isl::union_set(pnt)
51651{
51652}
51653
51654template <typename Domain>
51655typed::union_set<Domain>::union_set(const typed::set<Domain> &set)
51656  : isl::union_set(set)
51657{
51658}
51659
51660template <typename Domain>
51661typed::union_set<Domain>::union_set(const isl::ctx &ctx, const std::string &str)
51662  : isl::union_set(ctx, str)
51663{
51664}
51665
51666template <typename Domain>
51667template <typename Range>
51668typed::union_set<Range> typed::union_set<Domain>::apply(const typed::union_map<Domain, Range> &umap) const
51669{
51670  auto res = isl::union_set::apply(umap);
51671  return typed::union_set<Range>(res);
51672}
51673
51674template <typename Domain>
51675template <typename Range>
51676typed::union_set<Range> typed::union_set<Domain>::apply(const typed::basic_map<Domain, Range> &umap) const
51677{
51678  auto res = isl::union_set::apply(umap);
51679  return typed::union_set<Range>(res);
51680}
51681
51682template <typename Domain>
51683template <typename Range>
51684typed::union_set<Range> typed::union_set<Domain>::apply(const typed::map<Domain, Range> &umap) const
51685{
51686  auto res = isl::union_set::apply(umap);
51687  return typed::union_set<Range>(res);
51688}
51689
51690template <typename Domain>
51691typed::set<Domain> typed::union_set<Domain>::as_set() const
51692{
51693  auto res = isl::union_set::as_set();
51694  return typed::set<Domain>(res);
51695}
51696
51697template <typename Domain>
51698typed::union_set<Domain> typed::union_set<Domain>::coalesce() const
51699{
51700  auto res = isl::union_set::coalesce();
51701  return typed::union_set<Domain>(res);
51702}
51703
51704template <typename Domain>
51705typed::union_set<Domain> typed::union_set<Domain>::detect_equalities() const
51706{
51707  auto res = isl::union_set::detect_equalities();
51708  return typed::union_set<Domain>(res);
51709}
51710
51711template <typename Domain>
51712typed::union_set<Domain> typed::union_set<Domain>::drop_unused_params() const
51713{
51714  auto res = isl::union_set::drop_unused_params();
51715  return typed::union_set<Domain>(res);
51716}
51717
51718template <typename Domain>
51719typed::union_set<Domain> typed::union_set<Domain>::empty(const isl::ctx &ctx)
51720{
51721  auto res = isl::union_set::empty(ctx);
51722  return typed::union_set<Domain>(res);
51723}
51724
51725template <typename Domain>
51726bool typed::union_set<Domain>::every_set(const std::function<bool(typed::set<Domain>)> &test) const
51727{
51728  auto lambda_test = [&] (isl::set arg0) {
51729    return test(typed::set<Domain>(arg0));
51730  };
51731  return isl::union_set::every_set(lambda_test);
51732}
51733
51734template <typename Domain>
51735typed::set<Domain> typed::union_set<Domain>::extract_set(const typed::space<Domain> &space) const
51736{
51737  auto res = isl::union_set::extract_set(space);
51738  return typed::set<Domain>(res);
51739}
51740
51741template <typename Domain>
51742void typed::union_set<Domain>::foreach_point(const std::function<void(typed::point<Domain>)> &fn) const
51743{
51744  auto lambda_fn = [&] (isl::point arg0) {
51745    return fn(typed::point<Domain>(arg0));
51746  };
51747  return isl::union_set::foreach_point(lambda_fn);
51748}
51749
51750template <typename Domain>
51751void typed::union_set<Domain>::foreach_set(const std::function<void(typed::set<Domain>)> &fn) const
51752{
51753  auto lambda_fn = [&] (isl::set arg0) {
51754    return fn(typed::set<Domain>(arg0));
51755  };
51756  return isl::union_set::foreach_set(lambda_fn);
51757}
51758
51759template <typename Domain>
51760typed::union_set<Domain> typed::union_set<Domain>::gist(const typed::union_set<Domain> &context) const
51761{
51762  auto res = isl::union_set::gist(context);
51763  return typed::union_set<Domain>(res);
51764}
51765
51766template <typename Domain>
51767typed::union_set<Domain> typed::union_set<Domain>::gist(const typed::basic_set<Domain> &context) const
51768{
51769  auto res = isl::union_set::gist(context);
51770  return typed::union_set<Domain>(res);
51771}
51772
51773template <typename Domain>
51774typed::union_set<Domain> typed::union_set<Domain>::gist(const typed::point<Domain> &context) const
51775{
51776  auto res = isl::union_set::gist(context);
51777  return typed::union_set<Domain>(res);
51778}
51779
51780template <typename Domain>
51781typed::union_set<Domain> typed::union_set<Domain>::gist(const typed::set<Domain> &context) const
51782{
51783  auto res = isl::union_set::gist(context);
51784  return typed::union_set<Domain>(res);
51785}
51786
51787template <typename Domain>
51788typed::union_set<Domain> typed::union_set<Domain>::gist_params(const typed::set<> &set) const
51789{
51790  auto res = isl::union_set::gist_params(set);
51791  return typed::union_set<Domain>(res);
51792}
51793
51794template <typename Domain>
51795typed::union_set<Domain> typed::union_set<Domain>::gist_params(const typed::basic_set<> &set) const
51796{
51797  auto res = isl::union_set::gist_params(set);
51798  return typed::union_set<Domain>(res);
51799}
51800
51801template <typename Domain>
51802typed::union_set<Domain> typed::union_set<Domain>::gist_params(const typed::point<> &set) const
51803{
51804  auto res = isl::union_set::gist_params(set);
51805  return typed::union_set<Domain>(res);
51806}
51807
51808template <typename Domain>
51809typed::union_map<Domain, Domain> typed::union_set<Domain>::identity() const
51810{
51811  auto res = isl::union_set::identity();
51812  return typed::union_map<Domain, Domain>(res);
51813}
51814
51815template <typename Domain>
51816typed::union_set<Domain> typed::union_set<Domain>::intersect(const typed::union_set<Domain> &uset2) const
51817{
51818  auto res = isl::union_set::intersect(uset2);
51819  return typed::union_set<Domain>(res);
51820}
51821
51822template <typename Domain>
51823typed::union_set<Domain> typed::union_set<Domain>::intersect(const typed::basic_set<Domain> &uset2) const
51824{
51825  auto res = isl::union_set::intersect(uset2);
51826  return typed::union_set<Domain>(res);
51827}
51828
51829template <typename Domain>
51830typed::union_set<Domain> typed::union_set<Domain>::intersect(const typed::point<Domain> &uset2) const
51831{
51832  auto res = isl::union_set::intersect(uset2);
51833  return typed::union_set<Domain>(res);
51834}
51835
51836template <typename Domain>
51837typed::union_set<Domain> typed::union_set<Domain>::intersect(const typed::set<Domain> &uset2) const
51838{
51839  auto res = isl::union_set::intersect(uset2);
51840  return typed::union_set<Domain>(res);
51841}
51842
51843template <typename Domain>
51844typed::union_set<Domain> typed::union_set<Domain>::intersect_params(const typed::set<> &set) const
51845{
51846  auto res = isl::union_set::intersect_params(set);
51847  return typed::union_set<Domain>(res);
51848}
51849
51850template <typename Domain>
51851typed::union_set<Domain> typed::union_set<Domain>::intersect_params(const typed::basic_set<> &set) const
51852{
51853  auto res = isl::union_set::intersect_params(set);
51854  return typed::union_set<Domain>(res);
51855}
51856
51857template <typename Domain>
51858typed::union_set<Domain> typed::union_set<Domain>::intersect_params(const typed::point<> &set) const
51859{
51860  auto res = isl::union_set::intersect_params(set);
51861  return typed::union_set<Domain>(res);
51862}
51863
51864template <typename Domain>
51865typed::union_set<Domain> typed::union_set<Domain>::lexmax() const
51866{
51867  auto res = isl::union_set::lexmax();
51868  return typed::union_set<Domain>(res);
51869}
51870
51871template <typename Domain>
51872typed::union_set<Domain> typed::union_set<Domain>::lexmin() const
51873{
51874  auto res = isl::union_set::lexmin();
51875  return typed::union_set<Domain>(res);
51876}
51877
51878template <typename Domain>
51879typed::set<> typed::union_set<Domain>::params() const
51880{
51881  auto res = isl::union_set::params();
51882  return typed::set<>(res);
51883}
51884
51885template <typename Domain>
51886template <typename Domain2>
51887typed::union_set<Domain2> typed::union_set<Domain>::preimage(const typed::multi_aff<Domain2, Domain> &ma) const
51888{
51889  auto res = isl::union_set::preimage(ma);
51890  return typed::union_set<Domain2>(res);
51891}
51892
51893template <typename Domain>
51894template <typename Domain2>
51895typed::union_set<Domain2> typed::union_set<Domain>::preimage(const typed::pw_multi_aff<Domain2, Domain> &pma) const
51896{
51897  auto res = isl::union_set::preimage(pma);
51898  return typed::union_set<Domain2>(res);
51899}
51900
51901template <typename Domain>
51902template <typename Domain2>
51903typed::union_set<Domain2> typed::union_set<Domain>::preimage(const typed::union_pw_multi_aff<Domain2, Domain> &upma) const
51904{
51905  auto res = isl::union_set::preimage(upma);
51906  return typed::union_set<Domain2>(res);
51907}
51908
51909template <typename Domain>
51910typed::union_set<Domain> typed::union_set<Domain>::project_out_all_params() const
51911{
51912  auto res = isl::union_set::project_out_all_params();
51913  return typed::union_set<Domain>(res);
51914}
51915
51916template <typename Domain>
51917typed::set_list<Domain> typed::union_set<Domain>::set_list() const
51918{
51919  auto res = isl::union_set::set_list();
51920  return typed::set_list<Domain>(res);
51921}
51922
51923template <typename Domain>
51924typed::space<> typed::union_set<Domain>::space() const
51925{
51926  auto res = isl::union_set::space();
51927  return typed::space<>(res);
51928}
51929
51930template <typename Domain>
51931typed::union_set<Domain> typed::union_set<Domain>::subtract(const typed::union_set<Domain> &uset2) const
51932{
51933  auto res = isl::union_set::subtract(uset2);
51934  return typed::union_set<Domain>(res);
51935}
51936
51937template <typename Domain>
51938typed::union_set<Domain> typed::union_set<Domain>::subtract(const typed::basic_set<Domain> &uset2) const
51939{
51940  auto res = isl::union_set::subtract(uset2);
51941  return typed::union_set<Domain>(res);
51942}
51943
51944template <typename Domain>
51945typed::union_set<Domain> typed::union_set<Domain>::subtract(const typed::point<Domain> &uset2) const
51946{
51947  auto res = isl::union_set::subtract(uset2);
51948  return typed::union_set<Domain>(res);
51949}
51950
51951template <typename Domain>
51952typed::union_set<Domain> typed::union_set<Domain>::subtract(const typed::set<Domain> &uset2) const
51953{
51954  auto res = isl::union_set::subtract(uset2);
51955  return typed::union_set<Domain>(res);
51956}
51957
51958template <typename Domain>
51959typed::union_set<Domain> typed::union_set<Domain>::unite(const typed::union_set<Domain> &uset2) const
51960{
51961  auto res = isl::union_set::unite(uset2);
51962  return typed::union_set<Domain>(res);
51963}
51964
51965template <typename Domain>
51966typed::union_set<Domain> typed::union_set<Domain>::unite(const typed::basic_set<Domain> &uset2) const
51967{
51968  auto res = isl::union_set::unite(uset2);
51969  return typed::union_set<Domain>(res);
51970}
51971
51972template <typename Domain>
51973typed::union_set<Domain> typed::union_set<Domain>::unite(const typed::point<Domain> &uset2) const
51974{
51975  auto res = isl::union_set::unite(uset2);
51976  return typed::union_set<Domain>(res);
51977}
51978
51979template <typename Domain>
51980typed::union_set<Domain> typed::union_set<Domain>::unite(const typed::set<Domain> &uset2) const
51981{
51982  auto res = isl::union_set::unite(uset2);
51983  return typed::union_set<Domain>(res);
51984}
51985
51986template <typename Domain>
51987typed::union_set<Domain> typed::union_set<Domain>::universe() const
51988{
51989  auto res = isl::union_set::universe();
51990  return typed::union_set<Domain>(res);
51991}
51992
51993template <typename Domain, typename Range>
51994typed::union_set<pair<Domain, Range>>::union_set(const typed::basic_set<pair<Domain, Range>> &bset)
51995  : isl::union_set(bset)
51996{
51997}
51998
51999template <typename Domain, typename Range>
52000typed::union_set<pair<Domain, Range>>::union_set(const typed::point<pair<Domain, Range>> &pnt)
52001  : isl::union_set(pnt)
52002{
52003}
52004
52005template <typename Domain, typename Range>
52006typed::union_set<pair<Domain, Range>>::union_set(const typed::set<pair<Domain, Range>> &set)
52007  : isl::union_set(set)
52008{
52009}
52010
52011template <typename Domain, typename Range>
52012typed::union_set<pair<Domain, Range>>::union_set(const isl::ctx &ctx, const std::string &str)
52013  : isl::union_set(ctx, str)
52014{
52015}
52016
52017template <typename Domain, typename Range>
52018template <typename Arg2>
52019typed::union_set<Arg2> typed::union_set<pair<Domain, Range>>::apply(const typed::union_map<pair<Domain, Range>, Arg2> &umap) const
52020{
52021  auto res = isl::union_set::apply(umap);
52022  return typed::union_set<Arg2>(res);
52023}
52024
52025template <typename Domain, typename Range>
52026template <typename Arg2>
52027typed::union_set<Arg2> typed::union_set<pair<Domain, Range>>::apply(const typed::basic_map<pair<Domain, Range>, Arg2> &umap) const
52028{
52029  auto res = isl::union_set::apply(umap);
52030  return typed::union_set<Arg2>(res);
52031}
52032
52033template <typename Domain, typename Range>
52034template <typename Arg2>
52035typed::union_set<Arg2> typed::union_set<pair<Domain, Range>>::apply(const typed::map<pair<Domain, Range>, Arg2> &umap) const
52036{
52037  auto res = isl::union_set::apply(umap);
52038  return typed::union_set<Arg2>(res);
52039}
52040
52041template <typename Domain, typename Range>
52042typed::set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::as_set() const
52043{
52044  auto res = isl::union_set::as_set();
52045  return typed::set<pair<Domain, Range>>(res);
52046}
52047
52048template <typename Domain, typename Range>
52049typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::coalesce() const
52050{
52051  auto res = isl::union_set::coalesce();
52052  return typed::union_set<pair<Domain, Range>>(res);
52053}
52054
52055template <typename Domain, typename Range>
52056typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::detect_equalities() const
52057{
52058  auto res = isl::union_set::detect_equalities();
52059  return typed::union_set<pair<Domain, Range>>(res);
52060}
52061
52062template <typename Domain, typename Range>
52063typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::drop_unused_params() const
52064{
52065  auto res = isl::union_set::drop_unused_params();
52066  return typed::union_set<pair<Domain, Range>>(res);
52067}
52068
52069template <typename Domain, typename Range>
52070typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::empty(const isl::ctx &ctx)
52071{
52072  auto res = isl::union_set::empty(ctx);
52073  return typed::union_set<pair<Domain, Range>>(res);
52074}
52075
52076template <typename Domain, typename Range>
52077bool typed::union_set<pair<Domain, Range>>::every_set(const std::function<bool(typed::set<pair<Domain, Range>>)> &test) const
52078{
52079  auto lambda_test = [&] (isl::set arg0) {
52080    return test(typed::set<pair<Domain, Range>>(arg0));
52081  };
52082  return isl::union_set::every_set(lambda_test);
52083}
52084
52085template <typename Domain, typename Range>
52086typed::set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::extract_set(const typed::space<pair<Domain, Range>> &space) const
52087{
52088  auto res = isl::union_set::extract_set(space);
52089  return typed::set<pair<Domain, Range>>(res);
52090}
52091
52092template <typename Domain, typename Range>
52093void typed::union_set<pair<Domain, Range>>::foreach_point(const std::function<void(typed::point<pair<Domain, Range>>)> &fn) const
52094{
52095  auto lambda_fn = [&] (isl::point arg0) {
52096    return fn(typed::point<pair<Domain, Range>>(arg0));
52097  };
52098  return isl::union_set::foreach_point(lambda_fn);
52099}
52100
52101template <typename Domain, typename Range>
52102void typed::union_set<pair<Domain, Range>>::foreach_set(const std::function<void(typed::set<pair<Domain, Range>>)> &fn) const
52103{
52104  auto lambda_fn = [&] (isl::set arg0) {
52105    return fn(typed::set<pair<Domain, Range>>(arg0));
52106  };
52107  return isl::union_set::foreach_set(lambda_fn);
52108}
52109
52110template <typename Domain, typename Range>
52111typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::gist(const typed::union_set<pair<Domain, Range>> &context) const
52112{
52113  auto res = isl::union_set::gist(context);
52114  return typed::union_set<pair<Domain, Range>>(res);
52115}
52116
52117template <typename Domain, typename Range>
52118typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::gist(const typed::basic_set<pair<Domain, Range>> &context) const
52119{
52120  auto res = isl::union_set::gist(context);
52121  return typed::union_set<pair<Domain, Range>>(res);
52122}
52123
52124template <typename Domain, typename Range>
52125typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::gist(const typed::point<pair<Domain, Range>> &context) const
52126{
52127  auto res = isl::union_set::gist(context);
52128  return typed::union_set<pair<Domain, Range>>(res);
52129}
52130
52131template <typename Domain, typename Range>
52132typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::gist(const typed::set<pair<Domain, Range>> &context) const
52133{
52134  auto res = isl::union_set::gist(context);
52135  return typed::union_set<pair<Domain, Range>>(res);
52136}
52137
52138template <typename Domain, typename Range>
52139typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::gist_params(const typed::set<> &set) const
52140{
52141  auto res = isl::union_set::gist_params(set);
52142  return typed::union_set<pair<Domain, Range>>(res);
52143}
52144
52145template <typename Domain, typename Range>
52146typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::gist_params(const typed::basic_set<> &set) const
52147{
52148  auto res = isl::union_set::gist_params(set);
52149  return typed::union_set<pair<Domain, Range>>(res);
52150}
52151
52152template <typename Domain, typename Range>
52153typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::gist_params(const typed::point<> &set) const
52154{
52155  auto res = isl::union_set::gist_params(set);
52156  return typed::union_set<pair<Domain, Range>>(res);
52157}
52158
52159template <typename Domain, typename Range>
52160typed::union_map<pair<Domain, Range>, pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::identity() const
52161{
52162  auto res = isl::union_set::identity();
52163  return typed::union_map<pair<Domain, Range>, pair<Domain, Range>>(res);
52164}
52165
52166template <typename Domain, typename Range>
52167typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::intersect(const typed::union_set<pair<Domain, Range>> &uset2) const
52168{
52169  auto res = isl::union_set::intersect(uset2);
52170  return typed::union_set<pair<Domain, Range>>(res);
52171}
52172
52173template <typename Domain, typename Range>
52174typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::intersect(const typed::basic_set<pair<Domain, Range>> &uset2) const
52175{
52176  auto res = isl::union_set::intersect(uset2);
52177  return typed::union_set<pair<Domain, Range>>(res);
52178}
52179
52180template <typename Domain, typename Range>
52181typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::intersect(const typed::point<pair<Domain, Range>> &uset2) const
52182{
52183  auto res = isl::union_set::intersect(uset2);
52184  return typed::union_set<pair<Domain, Range>>(res);
52185}
52186
52187template <typename Domain, typename Range>
52188typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::intersect(const typed::set<pair<Domain, Range>> &uset2) const
52189{
52190  auto res = isl::union_set::intersect(uset2);
52191  return typed::union_set<pair<Domain, Range>>(res);
52192}
52193
52194template <typename Domain, typename Range>
52195typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::intersect_params(const typed::set<> &set) const
52196{
52197  auto res = isl::union_set::intersect_params(set);
52198  return typed::union_set<pair<Domain, Range>>(res);
52199}
52200
52201template <typename Domain, typename Range>
52202typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::intersect_params(const typed::basic_set<> &set) const
52203{
52204  auto res = isl::union_set::intersect_params(set);
52205  return typed::union_set<pair<Domain, Range>>(res);
52206}
52207
52208template <typename Domain, typename Range>
52209typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::intersect_params(const typed::point<> &set) const
52210{
52211  auto res = isl::union_set::intersect_params(set);
52212  return typed::union_set<pair<Domain, Range>>(res);
52213}
52214
52215template <typename Domain, typename Range>
52216typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::lexmax() const
52217{
52218  auto res = isl::union_set::lexmax();
52219  return typed::union_set<pair<Domain, Range>>(res);
52220}
52221
52222template <typename Domain, typename Range>
52223typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::lexmin() const
52224{
52225  auto res = isl::union_set::lexmin();
52226  return typed::union_set<pair<Domain, Range>>(res);
52227}
52228
52229template <typename Domain, typename Range>
52230typed::set<> typed::union_set<pair<Domain, Range>>::params() const
52231{
52232  auto res = isl::union_set::params();
52233  return typed::set<>(res);
52234}
52235
52236template <typename Domain, typename Range>
52237template <typename Domain2>
52238typed::union_set<Domain2> typed::union_set<pair<Domain, Range>>::preimage(const typed::multi_aff<Domain2, pair<Domain, Range>> &ma) const
52239{
52240  auto res = isl::union_set::preimage(ma);
52241  return typed::union_set<Domain2>(res);
52242}
52243
52244template <typename Domain, typename Range>
52245template <typename Domain2>
52246typed::union_set<Domain2> typed::union_set<pair<Domain, Range>>::preimage(const typed::pw_multi_aff<Domain2, pair<Domain, Range>> &pma) const
52247{
52248  auto res = isl::union_set::preimage(pma);
52249  return typed::union_set<Domain2>(res);
52250}
52251
52252template <typename Domain, typename Range>
52253template <typename Domain2>
52254typed::union_set<Domain2> typed::union_set<pair<Domain, Range>>::preimage(const typed::union_pw_multi_aff<Domain2, pair<Domain, Range>> &upma) const
52255{
52256  auto res = isl::union_set::preimage(upma);
52257  return typed::union_set<Domain2>(res);
52258}
52259
52260template <typename Domain, typename Range>
52261typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::project_out_all_params() const
52262{
52263  auto res = isl::union_set::project_out_all_params();
52264  return typed::union_set<pair<Domain, Range>>(res);
52265}
52266
52267template <typename Domain, typename Range>
52268typed::set_list<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::set_list() const
52269{
52270  auto res = isl::union_set::set_list();
52271  return typed::set_list<pair<Domain, Range>>(res);
52272}
52273
52274template <typename Domain, typename Range>
52275typed::space<> typed::union_set<pair<Domain, Range>>::space() const
52276{
52277  auto res = isl::union_set::space();
52278  return typed::space<>(res);
52279}
52280
52281template <typename Domain, typename Range>
52282typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::subtract(const typed::union_set<pair<Domain, Range>> &uset2) const
52283{
52284  auto res = isl::union_set::subtract(uset2);
52285  return typed::union_set<pair<Domain, Range>>(res);
52286}
52287
52288template <typename Domain, typename Range>
52289typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::subtract(const typed::basic_set<pair<Domain, Range>> &uset2) const
52290{
52291  auto res = isl::union_set::subtract(uset2);
52292  return typed::union_set<pair<Domain, Range>>(res);
52293}
52294
52295template <typename Domain, typename Range>
52296typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::subtract(const typed::point<pair<Domain, Range>> &uset2) const
52297{
52298  auto res = isl::union_set::subtract(uset2);
52299  return typed::union_set<pair<Domain, Range>>(res);
52300}
52301
52302template <typename Domain, typename Range>
52303typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::subtract(const typed::set<pair<Domain, Range>> &uset2) const
52304{
52305  auto res = isl::union_set::subtract(uset2);
52306  return typed::union_set<pair<Domain, Range>>(res);
52307}
52308
52309template <typename Domain, typename Range>
52310typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::unite(const typed::union_set<pair<Domain, Range>> &uset2) const
52311{
52312  auto res = isl::union_set::unite(uset2);
52313  return typed::union_set<pair<Domain, Range>>(res);
52314}
52315
52316template <typename Domain, typename Range>
52317typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::unite(const typed::basic_set<pair<Domain, Range>> &uset2) const
52318{
52319  auto res = isl::union_set::unite(uset2);
52320  return typed::union_set<pair<Domain, Range>>(res);
52321}
52322
52323template <typename Domain, typename Range>
52324typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::unite(const typed::point<pair<Domain, Range>> &uset2) const
52325{
52326  auto res = isl::union_set::unite(uset2);
52327  return typed::union_set<pair<Domain, Range>>(res);
52328}
52329
52330template <typename Domain, typename Range>
52331typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::unite(const typed::set<pair<Domain, Range>> &uset2) const
52332{
52333  auto res = isl::union_set::unite(uset2);
52334  return typed::union_set<pair<Domain, Range>>(res);
52335}
52336
52337template <typename Domain, typename Range>
52338typed::union_set<pair<Domain, Range>> typed::union_set<pair<Domain, Range>>::universe() const
52339{
52340  auto res = isl::union_set::universe();
52341  return typed::union_set<pair<Domain, Range>>(res);
52342}
52343
52344template <typename Domain, typename Range>
52345typed::union_map<Domain, Range> typed::union_set<pair<Domain, Range>>::unwrap() const
52346{
52347  auto res = isl::union_set::unwrap();
52348  return typed::union_map<Domain, Range>(res);
52349}
52350
52351typed::union_set_list<>::union_set_list(const isl::ctx &ctx, int n)
52352  : isl::union_set_list(ctx, n)
52353{
52354}
52355
52356typed::union_set_list<>::union_set_list(const typed::union_set<> &el)
52357  : isl::union_set_list(el)
52358{
52359}
52360
52361typed::union_set_list<>::union_set_list(const isl::ctx &ctx, const std::string &str)
52362  : isl::union_set_list(ctx, str)
52363{
52364}
52365
52366typed::union_set_list<> typed::union_set_list<>::add(const typed::union_set<> &el) const
52367{
52368  auto res = isl::union_set_list::add(el);
52369  return typed::union_set_list<>(res);
52370}
52371
52372typed::union_set_list<> typed::union_set_list<>::add(const typed::basic_set<> &el) const
52373{
52374  auto res = isl::union_set_list::add(el);
52375  return typed::union_set_list<>(res);
52376}
52377
52378typed::union_set_list<> typed::union_set_list<>::add(const typed::point<> &el) const
52379{
52380  auto res = isl::union_set_list::add(el);
52381  return typed::union_set_list<>(res);
52382}
52383
52384typed::union_set_list<> typed::union_set_list<>::add(const typed::set<> &el) const
52385{
52386  auto res = isl::union_set_list::add(el);
52387  return typed::union_set_list<>(res);
52388}
52389
52390typed::union_set_list<> typed::union_set_list<>::drop(unsigned int first, unsigned int n) const
52391{
52392  auto res = isl::union_set_list::drop(first, n);
52393  return typed::union_set_list<>(res);
52394}
52395
52396void typed::union_set_list<>::foreach(const std::function<void(typed::union_set<>)> &fn) const
52397{
52398  auto lambda_fn = [&] (isl::union_set arg0) {
52399    return fn(typed::union_set<>(arg0));
52400  };
52401  return isl::union_set_list::foreach(lambda_fn);
52402}
52403
52404void typed::union_set_list<>::foreach_scc(const std::function<bool(typed::union_set<>, typed::union_set<>)> &follows, const std::function<void(typed::union_set_list<>)> &fn) const
52405{
52406  auto lambda_follows = [&] (isl::union_set arg0, isl::union_set arg1) {
52407    return follows(typed::union_set<>(arg0), typed::union_set<>(arg1));
52408  };
52409  auto lambda_fn = [&] (isl::union_set_list arg0) {
52410    return fn(typed::union_set_list<>(arg0));
52411  };
52412  return isl::union_set_list::foreach_scc(lambda_follows, lambda_fn);
52413}
52414
52415template <typename Domain>
52416typed::union_set_list<Domain>::union_set_list(const isl::ctx &ctx, int n)
52417  : isl::union_set_list(ctx, n)
52418{
52419}
52420
52421template <typename Domain>
52422typed::union_set_list<Domain>::union_set_list(const typed::union_set<Domain> &el)
52423  : isl::union_set_list(el)
52424{
52425}
52426
52427template <typename Domain>
52428typed::union_set_list<Domain>::union_set_list(const isl::ctx &ctx, const std::string &str)
52429  : isl::union_set_list(ctx, str)
52430{
52431}
52432
52433template <typename Domain>
52434typed::union_set_list<Domain> typed::union_set_list<Domain>::add(const typed::union_set<Domain> &el) const
52435{
52436  auto res = isl::union_set_list::add(el);
52437  return typed::union_set_list<Domain>(res);
52438}
52439
52440template <typename Domain>
52441typed::union_set_list<Domain> typed::union_set_list<Domain>::add(const typed::basic_set<Domain> &el) const
52442{
52443  auto res = isl::union_set_list::add(el);
52444  return typed::union_set_list<Domain>(res);
52445}
52446
52447template <typename Domain>
52448typed::union_set_list<Domain> typed::union_set_list<Domain>::add(const typed::point<Domain> &el) const
52449{
52450  auto res = isl::union_set_list::add(el);
52451  return typed::union_set_list<Domain>(res);
52452}
52453
52454template <typename Domain>
52455typed::union_set_list<Domain> typed::union_set_list<Domain>::add(const typed::set<Domain> &el) const
52456{
52457  auto res = isl::union_set_list::add(el);
52458  return typed::union_set_list<Domain>(res);
52459}
52460
52461template <typename Domain>
52462typed::union_set<Domain> typed::union_set_list<Domain>::at(int index) const
52463{
52464  auto res = isl::union_set_list::at(index);
52465  return typed::union_set<Domain>(res);
52466}
52467
52468template <typename Domain>
52469typed::union_set_list<Domain> typed::union_set_list<Domain>::drop(unsigned int first, unsigned int n) const
52470{
52471  auto res = isl::union_set_list::drop(first, n);
52472  return typed::union_set_list<Domain>(res);
52473}
52474
52475template <typename Domain>
52476void typed::union_set_list<Domain>::foreach(const std::function<void(typed::union_set<Domain>)> &fn) const
52477{
52478  auto lambda_fn = [&] (isl::union_set arg0) {
52479    return fn(typed::union_set<Domain>(arg0));
52480  };
52481  return isl::union_set_list::foreach(lambda_fn);
52482}
52483
52484template <typename Domain>
52485void typed::union_set_list<Domain>::foreach_scc(const std::function<bool(typed::union_set<Domain>, typed::union_set<Domain>)> &follows, const std::function<void(typed::union_set_list<Domain>)> &fn) const
52486{
52487  auto lambda_follows = [&] (isl::union_set arg0, isl::union_set arg1) {
52488    return follows(typed::union_set<Domain>(arg0), typed::union_set<Domain>(arg1));
52489  };
52490  auto lambda_fn = [&] (isl::union_set_list arg0) {
52491    return fn(typed::union_set_list<Domain>(arg0));
52492  };
52493  return isl::union_set_list::foreach_scc(lambda_follows, lambda_fn);
52494}
52495
52496template <typename Domain>
52497typed::union_set_list<Domain> typed::union_set_list<Domain>::set_at(int index, const typed::union_set<Anonymous> &el) const
52498{
52499  auto res = isl::union_set_list::set_at(index, el);
52500  return typed::union_set_list<Domain>(res);
52501}
52502
52503typed::val<Anonymous>::val(const isl::ctx &ctx, long i)
52504  : isl::val(ctx, i)
52505{
52506}
52507
52508typed::val<Anonymous>::val(const isl::ctx &ctx, const std::string &str)
52509  : isl::val(ctx, str)
52510{
52511}
52512
52513typed::val<Anonymous> typed::val<Anonymous>::add(const typed::val<Anonymous> &v2) const
52514{
52515  auto res = isl::val::add(v2);
52516  return typed::val<Anonymous>(res);
52517}
52518
52519typed::val<Anonymous> typed::val<Anonymous>::add(long v2) const
52520{
52521  auto res = isl::val::add(v2);
52522  return typed::val<Anonymous>(res);
52523}
52524
52525typed::val<Anonymous> typed::val<Anonymous>::ceil() const
52526{
52527  auto res = isl::val::ceil();
52528  return typed::val<Anonymous>(res);
52529}
52530
52531typed::val<Anonymous> typed::val<Anonymous>::floor() const
52532{
52533  auto res = isl::val::floor();
52534  return typed::val<Anonymous>(res);
52535}
52536
52537typed::val<Anonymous> typed::val<Anonymous>::max(const typed::val<Anonymous> &v2) const
52538{
52539  auto res = isl::val::max(v2);
52540  return typed::val<Anonymous>(res);
52541}
52542
52543typed::val<Anonymous> typed::val<Anonymous>::max(long v2) const
52544{
52545  auto res = isl::val::max(v2);
52546  return typed::val<Anonymous>(res);
52547}
52548
52549typed::val<Anonymous> typed::val<Anonymous>::min(const typed::val<Anonymous> &v2) const
52550{
52551  auto res = isl::val::min(v2);
52552  return typed::val<Anonymous>(res);
52553}
52554
52555typed::val<Anonymous> typed::val<Anonymous>::min(long v2) const
52556{
52557  auto res = isl::val::min(v2);
52558  return typed::val<Anonymous>(res);
52559}
52560
52561typed::val<Anonymous> typed::val<Anonymous>::mod(const typed::val<Anonymous> &v2) const
52562{
52563  auto res = isl::val::mod(v2);
52564  return typed::val<Anonymous>(res);
52565}
52566
52567typed::val<Anonymous> typed::val<Anonymous>::mod(long v2) const
52568{
52569  auto res = isl::val::mod(v2);
52570  return typed::val<Anonymous>(res);
52571}
52572
52573typed::val<Anonymous> typed::val<Anonymous>::neg() const
52574{
52575  auto res = isl::val::neg();
52576  return typed::val<Anonymous>(res);
52577}
52578
52579typed::val<Anonymous> typed::val<Anonymous>::sub(const typed::val<Anonymous> &v2) const
52580{
52581  auto res = isl::val::sub(v2);
52582  return typed::val<Anonymous>(res);
52583}
52584
52585typed::val<Anonymous> typed::val<Anonymous>::sub(long v2) const
52586{
52587  auto res = isl::val::sub(v2);
52588  return typed::val<Anonymous>(res);
52589}
52590
52591typed::val_list<Anonymous>::val_list(const isl::ctx &ctx, int n)
52592  : isl::val_list(ctx, n)
52593{
52594}
52595
52596typed::val_list<Anonymous>::val_list(const typed::val<Anonymous> &el)
52597  : isl::val_list(el)
52598{
52599}
52600
52601typed::val_list<Anonymous>::val_list(const isl::ctx &ctx, const std::string &str)
52602  : isl::val_list(ctx, str)
52603{
52604}
52605
52606typed::val_list<Anonymous> typed::val_list<Anonymous>::add(const typed::val<Anonymous> &el) const
52607{
52608  auto res = isl::val_list::add(el);
52609  return typed::val_list<Anonymous>(res);
52610}
52611
52612typed::val_list<Anonymous> typed::val_list<Anonymous>::add(long el) const
52613{
52614  auto res = isl::val_list::add(el);
52615  return typed::val_list<Anonymous>(res);
52616}
52617
52618typed::val<Anonymous> typed::val_list<Anonymous>::at(int index) const
52619{
52620  auto res = isl::val_list::at(index);
52621  return typed::val<Anonymous>(res);
52622}
52623
52624typed::val_list<Anonymous> typed::val_list<Anonymous>::drop(unsigned int first, unsigned int n) const
52625{
52626  auto res = isl::val_list::drop(first, n);
52627  return typed::val_list<Anonymous>(res);
52628}
52629
52630void typed::val_list<Anonymous>::foreach(const std::function<void(typed::val<Anonymous>)> &fn) const
52631{
52632  auto lambda_fn = [&] (isl::val arg0) {
52633    return fn(typed::val<Anonymous>(arg0));
52634  };
52635  return isl::val_list::foreach(lambda_fn);
52636}
52637
52638void typed::val_list<Anonymous>::foreach_scc(const std::function<bool(typed::val<Anonymous>, typed::val<Anonymous>)> &follows, const std::function<void(typed::val_list<Anonymous>)> &fn) const
52639{
52640  auto lambda_follows = [&] (isl::val arg0, isl::val arg1) {
52641    return follows(typed::val<Anonymous>(arg0), typed::val<Anonymous>(arg1));
52642  };
52643  auto lambda_fn = [&] (isl::val_list arg0) {
52644    return fn(typed::val_list<Anonymous>(arg0));
52645  };
52646  return isl::val_list::foreach_scc(lambda_follows, lambda_fn);
52647}
52648
52649typed::val_list<Anonymous> typed::val_list<Anonymous>::set_at(int index, const typed::val<Anonymous> &el) const
52650{
52651  auto res = isl::val_list::set_at(index, el);
52652  return typed::val_list<Anonymous>(res);
52653}
52654
52655typed::val_list<Anonymous> typed::val_list<Anonymous>::set_at(int index, long el) const
52656{
52657  auto res = isl::val_list::set_at(index, el);
52658  return typed::val_list<Anonymous>(res);
52659}
52660
52661} // namespace typed
52662} // namespace isl
52663
52664#endif /* ISL_TYPED_CPP */
52665