1 | /* |
2 | * Copyright 2011 Sven Verdoolaege |
3 | * Copyright 2012-2013 Ecole Normale Superieure |
4 | * |
5 | * Use of this software is governed by the MIT license |
6 | * |
7 | * Written by Sven Verdoolaege, |
8 | * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France |
9 | */ |
10 | |
11 | #include <isl/space.h> |
12 | |
13 | #include <isl_multi_macro.h> |
14 | |
15 | const char *FN(MULTI(BASE),get_tuple_name)(__isl_keep MULTI(BASE) *multi, |
16 | enum isl_dim_type type) |
17 | { |
18 | return multi ? isl_space_get_tuple_name(space: multi->space, type) : NULL; |
19 | } |
20 | |
21 | /* Does the specified tuple have an id? |
22 | */ |
23 | isl_bool FN(MULTI(BASE),has_tuple_id)(__isl_keep MULTI(BASE) *multi, |
24 | enum isl_dim_type type) |
25 | { |
26 | if (!multi) |
27 | return isl_bool_error; |
28 | return isl_space_has_tuple_id(space: multi->space, type); |
29 | } |
30 | |
31 | /* Does the (range) tuple of "multi" have an identifier? |
32 | * |
33 | * Technically, the implementation should use isl_dim_set if "multi" |
34 | * lives in a set space and isl_dim_out if it lives in a map space. |
35 | * Internally, however, it can be assumed that isl_dim_set is equal |
36 | * to isl_dim_out. |
37 | */ |
38 | isl_bool FN(MULTI(BASE),has_range_tuple_id)(__isl_keep MULTI(BASE) *multi) |
39 | { |
40 | return FN(MULTI(BASE),has_tuple_id)(multi, type: isl_dim_out); |
41 | } |
42 | |
43 | /* Return the id of the specified tuple. |
44 | */ |
45 | __isl_give isl_id *FN(MULTI(BASE),get_tuple_id)(__isl_keep MULTI(BASE) *multi, |
46 | enum isl_dim_type type) |
47 | { |
48 | return multi ? isl_space_get_tuple_id(space: multi->space, type) : NULL; |
49 | } |
50 | |
51 | /* Return the identifier of the (range) tuple of "multi", assuming it has one. |
52 | * |
53 | * Technically, the implementation should use isl_dim_set if "multi" |
54 | * lives in a set space and isl_dim_out if it lives in a map space. |
55 | * Internally, however, it can be assumed that isl_dim_set is equal |
56 | * to isl_dim_out. |
57 | */ |
58 | __isl_give isl_id *FN(MULTI(BASE),get_range_tuple_id)( |
59 | __isl_keep MULTI(BASE) *multi) |
60 | { |
61 | return FN(MULTI(BASE),get_tuple_id)(multi, type: isl_dim_out); |
62 | } |
63 | |
64 | __isl_give MULTI(BASE) *FN(MULTI(BASE),set_tuple_name)( |
65 | __isl_keep MULTI(BASE) *multi, enum isl_dim_type type, |
66 | const char *s) |
67 | { |
68 | isl_space *space; |
69 | |
70 | multi = FN(MULTI(BASE),cow)(multi); |
71 | if (!multi) |
72 | return NULL; |
73 | |
74 | space = FN(MULTI(BASE),get_space)(multi); |
75 | space = isl_space_set_tuple_name(space, type, s); |
76 | |
77 | return FN(MULTI(BASE),reset_space)(multi, space); |
78 | } |
79 | |
80 | __isl_give MULTI(BASE) *FN(MULTI(BASE),set_tuple_id)( |
81 | __isl_take MULTI(BASE) *multi, enum isl_dim_type type, |
82 | __isl_take isl_id *id) |
83 | { |
84 | isl_space *space; |
85 | |
86 | multi = FN(MULTI(BASE),cow)(multi); |
87 | if (!multi) |
88 | goto error; |
89 | |
90 | space = FN(MULTI(BASE),get_space)(multi); |
91 | space = isl_space_set_tuple_id(space, type, id); |
92 | |
93 | return FN(MULTI(BASE),reset_space)(multi, space); |
94 | error: |
95 | isl_id_free(id); |
96 | return NULL; |
97 | } |
98 | |
99 | /* Replace the identifier of the (range) tuple of "multi" by "id". |
100 | * |
101 | * Technically, the implementation should use isl_dim_set if "multi" |
102 | * lives in a set space and isl_dim_out if it lives in a map space. |
103 | * Internally, however, it can be assumed that isl_dim_set is equal |
104 | * to isl_dim_out. |
105 | */ |
106 | __isl_give MULTI(BASE) *FN(MULTI(BASE),set_range_tuple_id)( |
107 | __isl_take MULTI(BASE) *multi, __isl_take isl_id *id) |
108 | { |
109 | return FN(MULTI(BASE),set_tuple_id)(multi, type: isl_dim_out, id); |
110 | } |
111 | |
112 | /* Drop the id on the specified tuple. |
113 | */ |
114 | __isl_give MULTI(BASE) *FN(MULTI(BASE),reset_tuple_id)( |
115 | __isl_take MULTI(BASE) *multi, enum isl_dim_type type) |
116 | { |
117 | isl_space *space; |
118 | |
119 | if (!multi) |
120 | return NULL; |
121 | if (!FN(MULTI(BASE),has_tuple_id)(multi, type)) |
122 | return multi; |
123 | |
124 | multi = FN(MULTI(BASE),cow)(multi); |
125 | if (!multi) |
126 | return NULL; |
127 | |
128 | space = FN(MULTI(BASE),get_space)(multi); |
129 | space = isl_space_reset_tuple_id(space, type); |
130 | |
131 | return FN(MULTI(BASE),reset_space)(multi, space); |
132 | } |
133 | |
134 | /* Drop the identifier of the (range) tuple of "multi". |
135 | * |
136 | * Technically, the implementation should use isl_dim_set if "multi" |
137 | * lives in a set space and isl_dim_out if it lives in a map space. |
138 | * Internally, however, it can be assumed that isl_dim_set is equal |
139 | * to isl_dim_out. |
140 | */ |
141 | __isl_give MULTI(BASE) *FN(MULTI(BASE),reset_range_tuple_id)( |
142 | __isl_take MULTI(BASE) *multi) |
143 | { |
144 | return FN(MULTI(BASE),reset_tuple_id)(multi, type: isl_dim_out); |
145 | } |
146 | |