added Range on IntAbs()

This commit is contained in:
lperron@google.com
2012-09-07 11:52:55 +00:00
parent 0799c2e565
commit ff79a72cc2

View File

@@ -3441,6 +3441,20 @@ class SubIntExpr : public BaseIntExpr {
right_->SetMax(left_->Max() - m);
}
virtual int64 Max() const {
return left_->Max() - right_->Min();
}
virtual void SetMax(int64 m) {
left_->SetMax(m + right_->Max());
right_->SetMin(left_->Min() - m);
}
virtual void Range(int64* mi, int64* ma) {
*mi = left_->Min() - right_->Max();
*ma = left_->Max() - right_->Min();
}
virtual void SetRange(int64 l, int64 u) {
const int64 left_min = left_->Min();
const int64 right_min = right_->Min();
@@ -3456,15 +3470,6 @@ class SubIntExpr : public BaseIntExpr {
}
}
virtual int64 Max() const {
return left_->Max() - right_->Min();
}
virtual void SetMax(int64 m) {
left_->SetMax(m + right_->Max());
right_->SetMin(left_->Min() - m);
}
virtual bool Bound() const {
return (left_->Bound() && right_->Bound());
}
@@ -3532,6 +3537,11 @@ class SafeSubIntExpr : public SubIntExpr {
}
}
virtual void Range(int64* mi, int64* ma) {
*mi = CapSub(left_->Min(), right_->Max());
*ma = CapSub(left_->Max(), right_->Min());
}
virtual int64 Max() const {
return CapSub(left_->Max(), right_->Min());
}
@@ -4687,8 +4697,9 @@ class IntAbs : public BaseIntExpr {
virtual ~IntAbs() {}
virtual int64 Min() const {
const int64 emin = expr_->Min();
const int64 emax = expr_->Max();
int64 emin = 0;
int64 emax = 0;
expr_->Range(&emin, &emax);
if (emin >= 0) {
return emin;
}
@@ -4699,8 +4710,9 @@ class IntAbs : public BaseIntExpr {
}
virtual void SetMin(int64 m) {
const int64 emin = expr_->Min();
const int64 emax = expr_->Max();
int64 emin = 0;
int64 emax = 0;
expr_->Range(&emin, &emax);
if (emin >= 0) {
expr_->SetMin(m);
} else if (emax <= 0) {
@@ -4709,8 +4721,9 @@ class IntAbs : public BaseIntExpr {
}
virtual int64 Max() const {
const int64 emin = expr_->Min();
const int64 emax = expr_->Max();
int64 emin = 0;
int64 emax = 0;
expr_->Range(&emin, &emax);
if (emin >= 0) {
return emax;
}
@@ -4726,8 +4739,9 @@ class IntAbs : public BaseIntExpr {
virtual void SetRange(int64 mi, int64 ma) {
expr_->SetRange(-ma, ma);
const int64 emin = expr_->Min();
const int64 emax = expr_->Max();
int64 emin = 0;
int64 emax = 0;
expr_->Range(&emin, &emax);
if (emin >= 0) {
expr_->SetMin(mi);
} else if (emax <= 0) {
@@ -4735,6 +4749,22 @@ class IntAbs : public BaseIntExpr {
}
}
virtual void Range(int64* mi, int64 *ma) {
int64 emin = 0;
int64 emax = 0;
expr_->Range(&emin, &emax);
if (emin >= 0) {
*mi = emin;
*ma = emax;
} else if (emax <= 0) {
*mi = -emax;
*ma = -emin;
} else {
*mi = 0;
*ma = std::max(-emin, emax);
}
}
virtual bool Bound() const {
return expr_->Bound();
}