74 lines
1.9 KiB
Dart
74 lines
1.9 KiB
Dart
// Copyright (c) 2015 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
part of cassowary;
|
|
|
|
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;
|
|
}
|
|
|
|
EquationMember operator *(double m) {
|
|
return new Term(this, m);
|
|
}
|
|
|
|
EquationMember operator /(double m) {
|
|
return new Term(this, 1.0 / m);
|
|
}
|
|
}
|