1 #ifndef ISL_MULTI_H
2 #define ISL_MULTI_H
3 
4 #include <isl/val_type.h>
5 #include <isl/space_type.h>
6 #include <isl/list.h>
7 #include <isl/set_type.h>
8 
9 #if defined(__cplusplus)
10 extern "C" {
11 #endif
12 
13 #define ISL_DECLARE_MULTI(BASE)						\
14 unsigned isl_multi_##BASE##_dim(__isl_keep isl_multi_##BASE *multi,	\
15 	enum isl_dim_type type);					\
16 isl_ctx *isl_multi_##BASE##_get_ctx(					\
17 	__isl_keep isl_multi_##BASE *multi);				\
18 __isl_give isl_space *isl_multi_##BASE##_get_space(			\
19 	__isl_keep isl_multi_##BASE *multi);				\
20 __isl_give isl_space *isl_multi_##BASE##_get_domain_space(		\
21 	__isl_keep isl_multi_##BASE *multi);				\
22 int isl_multi_##BASE##_find_dim_by_name(				\
23 	__isl_keep isl_multi_##BASE *multi,				\
24 	enum isl_dim_type type, const char *name);			\
25 __isl_give isl_multi_##BASE *isl_multi_##BASE##_from_##BASE##_list(	\
26 	__isl_take isl_space *space, __isl_take isl_##BASE##_list *list); \
27 __isl_give isl_multi_##BASE *isl_multi_##BASE##_zero(			\
28 	__isl_take isl_space *space);					\
29 __isl_give isl_multi_##BASE *isl_multi_##BASE##_copy(			\
30 	__isl_keep isl_multi_##BASE *multi);				\
31 __isl_null isl_multi_##BASE *isl_multi_##BASE##_free(			\
32 	__isl_take isl_multi_##BASE *multi);				\
33 isl_bool isl_multi_##BASE##_plain_is_equal(				\
34 	__isl_keep isl_multi_##BASE *multi1,				\
35 	__isl_keep isl_multi_##BASE *multi2);				\
36 isl_bool isl_multi_##BASE##_involves_nan(				\
37 	__isl_keep isl_multi_##BASE *multi);				\
38 int isl_multi_##BASE##_find_dim_by_id(					\
39 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type,	\
40 	__isl_keep isl_id *id);						\
41 __isl_give isl_id *isl_multi_##BASE##_get_dim_id(			\
42 	__isl_keep isl_multi_##BASE *multi,				\
43 	enum isl_dim_type type, unsigned pos);				\
44 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_dim_name(		\
45 	__isl_take isl_multi_##BASE *multi,				\
46 	enum isl_dim_type type, unsigned pos, const char *s);		\
47 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_dim_id(		\
48 	__isl_take isl_multi_##BASE *multi,				\
49 	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);	\
50 const char *isl_multi_##BASE##_get_tuple_name(				\
51 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);	\
52 isl_bool isl_multi_##BASE##_has_tuple_id(				\
53 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);	\
54 __isl_give isl_id *isl_multi_##BASE##_get_tuple_id(			\
55 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);	\
56 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_tuple_name(		\
57 	__isl_take isl_multi_##BASE *multi,				\
58 	enum isl_dim_type type, const char *s);				\
59 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_tuple_id(		\
60 	__isl_take isl_multi_##BASE *multi,				\
61 	enum isl_dim_type type, __isl_take isl_id *id);			\
62 __isl_give isl_multi_##BASE *isl_multi_##BASE##_reset_tuple_id(		\
63 	__isl_take isl_multi_##BASE *multi, enum isl_dim_type type);	\
64 __isl_give isl_multi_##BASE *isl_multi_##BASE##_reset_user(		\
65 	__isl_take isl_multi_##BASE *multi);				\
66 __isl_give isl_multi_##BASE *isl_multi_##BASE##_drop_dims(		\
67 	__isl_take isl_multi_##BASE *multi, enum isl_dim_type type,	\
68 	unsigned first, unsigned n);					\
69 __isl_give isl_##BASE *isl_multi_##BASE##_get_##BASE(			\
70 	__isl_keep isl_multi_##BASE *multi, int pos);			\
71 __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_##BASE(		\
72 	__isl_take isl_multi_##BASE *multi, int pos,			\
73 	__isl_take isl_##BASE *el);					\
74 __isl_give isl_multi_##BASE *isl_multi_##BASE##_range_splice(		\
75 	__isl_take isl_multi_##BASE *multi1, unsigned pos,		\
76 	__isl_take isl_multi_##BASE *multi2);				\
77 __isl_give isl_multi_##BASE *isl_multi_##BASE##_flatten_range(		\
78 	__isl_take isl_multi_##BASE *multi);				\
79 __isl_export								\
80 __isl_give isl_multi_##BASE *isl_multi_##BASE##_flat_range_product(	\
81 	__isl_take isl_multi_##BASE *multi1,				\
82 	__isl_take isl_multi_##BASE *multi2);				\
83 __isl_export								\
84 __isl_give isl_multi_##BASE *isl_multi_##BASE##_range_product(		\
85 	__isl_take isl_multi_##BASE *multi1,				\
86 	__isl_take isl_multi_##BASE *multi2);				\
87 __isl_give isl_multi_##BASE *isl_multi_##BASE##_factor_range(		\
88 	__isl_take isl_multi_##BASE *multi);				\
89 isl_bool isl_multi_##BASE##_range_is_wrapping(				\
90 	__isl_keep isl_multi_##BASE *multi);				\
91 __isl_give isl_multi_##BASE *isl_multi_##BASE##_range_factor_domain(	\
92 	__isl_take isl_multi_##BASE *multi);				\
93 __isl_give isl_multi_##BASE *isl_multi_##BASE##_range_factor_range(	\
94 	__isl_take isl_multi_##BASE *multi);				\
95 __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_val(		\
96 	__isl_take isl_multi_##BASE *multi, __isl_take isl_val *v);	\
97 __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_down_val(		\
98 	__isl_take isl_multi_##BASE *multi, __isl_take isl_val *v);	\
99 __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_multi_val(	\
100 	__isl_take isl_multi_##BASE *multi,				\
101 	__isl_take isl_multi_val *mv);					\
102 __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_down_multi_val(	\
103 	__isl_take isl_multi_##BASE *multi,				\
104 	__isl_take isl_multi_val *mv);					\
105 __isl_give isl_multi_##BASE *isl_multi_##BASE##_mod_multi_val(		\
106 	__isl_take isl_multi_##BASE *multi,				\
107 	__isl_take isl_multi_val *mv);					\
108 __isl_export								\
109 __isl_give isl_multi_##BASE *isl_multi_##BASE##_add(			\
110 	__isl_take isl_multi_##BASE *multi1,				\
111 	__isl_take isl_multi_##BASE *multi2);				\
112 __isl_give isl_multi_##BASE *isl_multi_##BASE##_sub(			\
113 	__isl_take isl_multi_##BASE *multi1,				\
114 	__isl_take isl_multi_##BASE *multi2);				\
115 __isl_give isl_multi_##BASE *isl_multi_##BASE##_align_params(		\
116 	__isl_take isl_multi_##BASE *multi,				\
117 	__isl_take isl_space *model);					\
118 __isl_give isl_multi_##BASE *isl_multi_##BASE##_from_range(		\
119 	__isl_take isl_multi_##BASE *multi);
120 
121 #define ISL_DECLARE_MULTI_CMP(BASE)					\
122 int isl_multi_##BASE##_plain_cmp(__isl_keep isl_multi_##BASE *multi1,	\
123 	__isl_keep isl_multi_##BASE *multi2);
124 
125 #define ISL_DECLARE_MULTI_NEG(BASE)					\
126 __isl_give isl_multi_##BASE *isl_multi_##BASE##_neg(		 	\
127 	__isl_take isl_multi_##BASE *multi);
128 
129 #define ISL_DECLARE_MULTI_DIMS(BASE)					\
130 isl_bool isl_multi_##BASE##_involves_dims(				\
131 	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type,	\
132 	unsigned first, unsigned n);					\
133 __isl_give isl_multi_##BASE *isl_multi_##BASE##_insert_dims(		\
134 	__isl_take isl_multi_##BASE *multi, enum isl_dim_type type,	\
135 	unsigned first, unsigned n);					\
136 __isl_give isl_multi_##BASE *isl_multi_##BASE##_add_dims(		\
137 	__isl_take isl_multi_##BASE *multi, enum isl_dim_type type,	\
138 	unsigned n);							\
139 __isl_give isl_multi_##BASE *						\
140 isl_multi_##BASE##_project_domain_on_params(				\
141 	__isl_take isl_multi_##BASE *multi);
142 
143 #define ISL_DECLARE_MULTI_WITH_DOMAIN(BASE)				\
144 __isl_export								\
145 __isl_give isl_multi_##BASE *isl_multi_##BASE##_product(		\
146 	__isl_take isl_multi_##BASE *multi1,				\
147 	__isl_take isl_multi_##BASE *multi2);				\
148 __isl_give isl_multi_##BASE *isl_multi_##BASE##_splice(			\
149 	__isl_take isl_multi_##BASE *multi1, unsigned in_pos,		\
150 	unsigned out_pos, __isl_take isl_multi_##BASE *multi2);
151 
152 #if defined(__cplusplus)
153 }
154 #endif
155 
156 #endif
157