blob: 8fb61568e4ab0bb79060fdbe4e521d9583049191 [file]
// 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 Row {
final Map<Symbol, double> _cells = new Map<Symbol, double>();
double _constant = 0.0;
double get constant => _constant;
Map<Symbol, double> get cells => _cells;
double add(double value) => _constant += value;
void insertSymbol(Symbol symbol, [double coefficient = 1.0]) {
double val = _elvis(_cells[symbol], 0.0) + coefficient;
if (_nearZero(val)) {
_cells.remove(symbol);
} else {
_cells[symbol] = val + coefficient;
}
}
void insertRow(Row other, [double coefficient = 1.0]) {
_constant += other.constant * coefficient;
other.cells.forEach((s, v) => insertSymbol(s, v * coefficient));
}
void removeSymbol(Symbol symbol) {
_cells.remove(symbol);
}
void reverseSign() => _cells.forEach((s, v) => _cells[s] = -v);
void solveForSymbol(Symbol symbol) {
assert(_cells.containsKey(symbol));
double coefficient = -1.0 / _cells[symbol];
_cells.remove(symbol);
_constant *= coefficient;
_cells.forEach((s, v) => _cells[s] = v * coefficient);
}
void solveForSymbols(Symbol lhs, Symbol rhs) {
insertSymbol(lhs, -1.0);
solveForSymbol(rhs);
}
double coefficientForSymbol(Symbol symbol) => _elvis(_cells[symbol], 0.0);
void substitute(Symbol symbol, Row row) {
double coefficient = _cells[symbol];
if (coefficient == null) {
return;
}
_cells.remove(symbol);
insertRow(row, coefficient);
}
}