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