2 * Copyright 2010 INRIA Saclay
3 * Copyright 2011 Sven Verdoolaege
5 * Use of this software is governed by the MIT license
7 * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
8 * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
12 #include <isl_pw_macro.h>
14 /* Make sure "pw" has room for at least "n" more pieces.
16 * If there is only one reference to pw, we extend it in place.
17 * Otherwise, we create a new PW and copy the pieces.
19 static __isl_give PW
*FN(PW
,grow
)(__isl_take PW
*pw
, int n
)
27 if (pw
->n
+ n
<= pw
->size
)
29 ctx
= FN(PW
,get_ctx
)(pw
);
32 res
= isl_realloc(ctx
, pw
, struct PW
,
33 sizeof(struct PW
) + (n
- 1) * sizeof(S(PW
,piece
)));
35 return FN(PW
,free
)(pw
);
39 res
= FN(PW
,alloc_size
)(isl_space_copy(pw
->dim
) OPT_TYPE_ARG(pw
->), n
);
41 return FN(PW
,free
)(pw
);
42 for (i
= 0; i
< pw
->n
; ++i
)
43 res
= FN(PW
,add_piece
)(res
, isl_set_copy(pw
->p
[i
].set
),
44 FN(EL
,copy
)(pw
->p
[i
].FIELD
));
49 __isl_give PW
*FN(PW
,add_disjoint
)(__isl_take PW
*pw1
, __isl_take PW
*pw2
)
54 if (FN(PW
,align_params_bin
)(&pw1
, &pw2
) < 0)
57 if (pw1
->size
< pw1
->n
+ pw2
->n
&& pw1
->n
< pw2
->n
)
58 return FN(PW
,add_disjoint
)(pw2
, pw1
);
60 ctx
= isl_space_get_ctx(pw1
->dim
);
61 if (!OPT_EQUAL_TYPES(pw1
->, pw2
->))
62 isl_die(ctx
, isl_error_invalid
,
63 "fold types don't match", goto error
);
64 if (FN(PW
,check_equal_space
)(pw1
, pw2
) < 0)
67 if (FN(PW
,IS_ZERO
)(pw1
)) {
72 if (FN(PW
,IS_ZERO
)(pw2
)) {
77 pw1
= FN(PW
,grow
)(pw1
, pw2
->n
);
81 for (i
= 0; i
< pw2
->n
; ++i
)
82 pw1
= FN(PW
,add_piece
)(pw1
,
83 isl_set_copy(pw2
->p
[i
].set
),
84 FN(EL
,copy
)(pw2
->p
[i
].FIELD
));