| 1563 | } |
| 1564 | |
| 1565 | void p_nooverlap(FlatZincSpace& s, const ConExpr& ce, AST::Node *ann) { |
| 1566 | IntVarArgs x0 = s.arg2intvarargs(ce[0]); |
| 1567 | IntVarArgs w = s.arg2intvarargs(ce[1]); |
| 1568 | IntVarArgs y0 = s.arg2intvarargs(ce[2]); |
| 1569 | IntVarArgs h = s.arg2intvarargs(ce[3]); |
| 1570 | if (w.assigned() && h.assigned()) { |
| 1571 | IntArgs iw(w.size()); |
| 1572 | for (int i=w.size(); i--;) |
| 1573 | iw[i] = w[i].val(); |
| 1574 | IntArgs ih(h.size()); |
| 1575 | for (int i=h.size(); i--;) |
| 1576 | ih[i] = h[i].val(); |
| 1577 | nooverlap(s,x0,iw,y0,ih,s.ann2ipl(ann)); |
| 1578 | |
| 1579 | int miny = y0[0].min(); |
| 1580 | int maxy = y0[0].max(); |
| 1581 | int maxdy = ih[0]; |
| 1582 | for (int i=1; i<y0.size(); i++) { |
| 1583 | miny = std::min(miny,y0[i].min()); |
| 1584 | maxy = std::max(maxy,y0[i].max()); |
| 1585 | maxdy = std::max(maxdy,ih[i]); |
| 1586 | } |
| 1587 | int minx = x0[0].min(); |
| 1588 | int maxx = x0[0].max(); |
| 1589 | int maxdx = iw[0]; |
| 1590 | for (int i=1; i<x0.size(); i++) { |
| 1591 | minx = std::min(minx,x0[i].min()); |
| 1592 | maxx = std::max(maxx,x0[i].max()); |
| 1593 | maxdx = std::max(maxdx,iw[i]); |
| 1594 | } |
| 1595 | if (miny > Int::Limits::min && maxy < Int::Limits::max) { |
| 1596 | cumulative(s,maxdy+maxy-miny,x0,iw,ih); |
| 1597 | cumulative(s,maxdx+maxx-minx,y0,ih,iw); |
| 1598 | } |
| 1599 | } else { |
| 1600 | IntVarArgs x1(x0.size()), y1(y0.size()); |
| 1601 | for (int i=x0.size(); i--; ) |
| 1602 | x1[i] = expr(s, x0[i] + w[i]); |
| 1603 | for (int i=y0.size(); i--; ) |
| 1604 | y1[i] = expr(s, y0[i] + h[i]); |
| 1605 | nooverlap(s,x0,w,x1,y0,h,y1,s.ann2ipl(ann)); |
| 1606 | } |
| 1607 | } |
| 1608 | |
| 1609 | void p_precede(FlatZincSpace& s, const ConExpr& ce, AST::Node* ann) { |
| 1610 | IntVarArgs x = s.arg2intvarargs(ce[0]); |
nothing calls this directly
no test coverage detected