Commit 5288d466 authored by Chinmay Garde's avatar Chinmay Garde

Dry up incremental expression construction from constants, variable, terms and other expressions

parent a8e6ea06
......@@ -8,57 +8,7 @@ class ConstantMember extends EquationMember {
double value = 0.0;
ConstantMember(this.value);
Expression _asExpression() => new Expression([], this.value);
Constraint operator >=(EquationMember m) => _asExpression() >= m;
Constraint operator <=(EquationMember m) => _asExpression() <= m;
operator ==(EquationMember m) => _asExpression() == m;
Expression operator +(EquationMember m) {
if (m is ConstantMember) {
return new Expression([], this.value + m.value);
}
if (m is Variable) {
return new Expression([new Term(m, 1.0)], this.value);
}
if (m is Term) {
return new Expression([m], this.value);
}
if (m is Expression) {
return new Expression(new List.from(m.terms), this.value + m.constant);
}
assert(false);
return null;
}
Expression operator -(EquationMember m) {
if (m is ConstantMember) {
return new Expression([], this.value - m.value);
}
if (m is Variable) {
return new Expression([new Term(m, -1.0)], this.value);
}
if (m is Term) {
return new Expression([new Term(m.variable, -m.coefficient)], this.value);
}
if (m is Expression) {
var negatedTerms = m.terms.fold(new List<Term>(), (list, term) => list
..add(new Term(term.variable, -term.coefficient)));
return new Expression(negatedTerms, this.value - m.constant);
}
assert(false);
return null;
}
Expression asExpression() => new Expression([], this.value);
EquationMember operator *(double m) {
return new ConstantMember(this.value * m);
......
......@@ -4,4 +4,16 @@
part of cassowary;
abstract class EquationMember {}
abstract class EquationMember {
Expression asExpression();
Constraint operator >=(EquationMember m) => asExpression() >= m;
Constraint operator <=(EquationMember m) => asExpression() <= m;
operator ==(EquationMember m) => asExpression() == m;
Expression operator +(EquationMember m) => asExpression() + m;
Expression operator -(EquationMember m) => asExpression() - m;
}
......@@ -12,6 +12,8 @@ class Expression extends EquationMember {
Expression(this.terms, this.constant);
Expression asExpression() => this;
Constraint _createConstraint(
EquationMember /* rhs */ value, Relation relation) {
if (value is ConstantMember) {
......
......@@ -11,60 +11,9 @@ class Term extends EquationMember {
Term(this.variable, this.coefficient);
Expression _asExpression() =>
Expression asExpression() =>
new Expression([new Term(this.variable, this.coefficient)], 0.0);
Constraint operator >=(EquationMember m) => _asExpression() >= m;
Constraint operator <=(EquationMember m) => _asExpression() <= m;
operator ==(EquationMember m) => _asExpression() == m;
Expression operator +(EquationMember m) {
if (m is ConstantMember) {
return new Expression([this], m.value);
}
if (m is Variable) {
return new Expression([this, new Term(m, 1.0)], 0.0);
}
if (m is Term) {
return new Expression([this, m], 0.0);
}
if (m is Expression) {
return new Expression(
new List.from(m.terms)..insert(0, this), m.constant);
}
assert(false);
return null;
}
Expression operator -(EquationMember m) {
if (m is ConstantMember) {
return new Expression([this], -m.value);
}
if (m is Variable) {
return new Expression([this, new Term(m, -1.0)], 0.0);
}
if (m is Term) {
return new Expression([this, new Term(m.variable, -m.coefficient)], 0.0);
}
if (m is Expression) {
var negatedTerms = m.terms.fold(new List<Term>(),
(list, t) => list..add(new Term(t.variable, -t.coefficient)));
return new Expression(negatedTerms..insert(0, this), -m.constant);
}
assert(false);
return null;
}
EquationMember operator *(double m) {
return new Term(this.variable, this.coefficient * m);
}
......
......@@ -8,60 +8,7 @@ class Variable extends EquationMember {
double value = 0.0;
Variable(this.value);
Expression _asExpression() => new Expression([new Term(this, 1.0)], 0.0);
Constraint operator >=(EquationMember m) => _asExpression() >= m;
Constraint operator <=(EquationMember m) => _asExpression() <= m;
operator ==(EquationMember m) => _asExpression() == m;
Expression operator +(EquationMember m) {
if (m is ConstantMember) {
return new Expression([new Term(this, 1.0)], m.value);
}
if (m is Variable) {
return new Expression([new Term(this, 1.0), new Term(m, 1.0)], 0.0);
}
if (m is Term) {
return new Expression([new Term(this, 1.0), m], 0.0);
}
if (m is Expression) {
return new Expression(
new List.from(m.terms)..insert(0, new Term(this, 1.0)), m.constant);
}
assert(false);
return null;
}
Expression operator -(EquationMember m) {
if (m is ConstantMember) {
return new Expression([new Term(this, 1.0)], -m.value);
}
if (m is Variable) {
return new Expression([new Term(this, 1.0), new Term(m, -1.0)], 0.0);
}
if (m is Term) {
return new Expression(
[new Term(this, 1.0), new Term(m.variable, -m.coefficient)], 0.0);
}
if (m is Expression) {
var negatedTerms = m.terms.fold(new List<Term>(),
(list, t) => list..add(new Term(t.variable, -t.coefficient)));
negatedTerms.insert(0, new Term(this, 1.0));
return new Expression(negatedTerms, -m.constant);
}
assert(false);
return null;
}
Expression asExpression() => new Expression([new Term(this, 1.0)], 0.0);
EquationMember operator *(double m) {
return new Term(this, m);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment