Home | History | Annotate | Line # | Download | only in dist
      1  1.1  mrg /*
      2  1.1  mrg  * Copyright 2010      INRIA Saclay
      3  1.1  mrg  *
      4  1.1  mrg  * Use of this software is governed by the MIT license
      5  1.1  mrg  *
      6  1.1  mrg  * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
      7  1.1  mrg  * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
      8  1.1  mrg  * 91893 Orsay, France
      9  1.1  mrg  */
     10  1.1  mrg 
     11  1.1  mrg __isl_give PW *FN(PW,insert_dims)(__isl_take PW *pw, enum isl_dim_type type,
     12  1.1  mrg 	unsigned first, unsigned n)
     13  1.1  mrg {
     14  1.1  mrg 	int i;
     15  1.1  mrg 	isl_size n_piece;
     16  1.1  mrg 	enum isl_dim_type set_type;
     17  1.1  mrg 	isl_space *space;
     18  1.1  mrg 
     19  1.1  mrg 	n_piece = FN(PW,n_piece)(pw);
     20  1.1  mrg 	if (n_piece < 0)
     21  1.1  mrg 		return FN(PW,free)(pw);
     22  1.1  mrg 	if (n == 0 && !isl_space_is_named_or_nested(pw->dim, type))
     23  1.1  mrg 		return pw;
     24  1.1  mrg 
     25  1.1  mrg 	set_type = type == isl_dim_in ? isl_dim_set : type;
     26  1.1  mrg 
     27  1.1  mrg 	space = FN(PW,take_space)(pw);
     28  1.1  mrg 	space = isl_space_insert_dims(space, type, first, n);
     29  1.1  mrg 	pw = FN(PW,restore_space)(pw, space);
     30  1.1  mrg 
     31  1.1  mrg 	for (i = 0; i < n_piece; ++i) {
     32  1.1  mrg 		isl_set *domain;
     33  1.1  mrg 		EL *el;
     34  1.1  mrg 
     35  1.1  mrg 		domain = FN(PW,take_domain_at)(pw, i);
     36  1.1  mrg 		domain = isl_set_insert_dims(domain, set_type, first, n);
     37  1.1  mrg 		pw = FN(PW,restore_domain_at)(pw, i, domain);
     38  1.1  mrg 		el = FN(PW,take_base_at)(pw, i);
     39  1.1  mrg 		el = FN(EL,insert_dims)(el, type, first, n);
     40  1.1  mrg 		pw = FN(PW,restore_base_at)(pw, i, el);
     41  1.1  mrg 	}
     42  1.1  mrg 
     43  1.1  mrg 	return pw;
     44  1.1  mrg }
     45  1.1  mrg 
     46  1.1  mrg __isl_give PW *FN(PW,add_dims)(__isl_take PW *pw, enum isl_dim_type type,
     47  1.1  mrg 	unsigned n)
     48  1.1  mrg {
     49  1.1  mrg 	isl_size pos;
     50  1.1  mrg 
     51  1.1  mrg 	pos = FN(PW,dim)(pw, type);
     52  1.1  mrg 	if (pos < 0)
     53  1.1  mrg 		return FN(PW,free)(pw);
     54  1.1  mrg 
     55  1.1  mrg 	return FN(PW,insert_dims)(pw, type, pos, n);
     56  1.1  mrg }
     57