row.dart 1.93 KB
Newer Older
1 2 3 4 5 6
// 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;

7 8
class _Row {
  final Map<_Symbol, double> cells;
9
  double constant = 0.0;
10

11 12 13
  _Row(this.constant) : this.cells = new Map<_Symbol, double>();
  _Row.fromRow(_Row row)
      : this.cells = new Map<_Symbol, double>.from(row.cells),
14
        this.constant = row.constant;
15

16
  double add(double value) => constant += value;
17

18
  void insertSymbol(_Symbol symbol, [double coefficient = 1.0]) {
19
    double val = _elvis(cells[symbol], 0.0);
20

21
    if (_nearZero(val + coefficient)) {
22
      cells.remove(symbol);
23
    } else {
24
      cells[symbol] = val + coefficient;
25 26 27
    }
  }

28
  void insertRow(_Row other, [double coefficient = 1.0]) {
29
    constant += other.constant * coefficient;
30 31 32
    other.cells.forEach((s, v) => insertSymbol(s, v * coefficient));
  }

33
  void removeSymbol(_Symbol symbol) {
34
    cells.remove(symbol);
35 36
  }

37 38 39 40
  void reverseSign() {
    constant = -constant;
    cells.forEach((s, v) => cells[s] = -v);
  }
41

42
  void solveForSymbol(_Symbol symbol) {
43 44 45 46 47
    assert(cells.containsKey(symbol));
    double coefficient = -1.0 / cells[symbol];
    cells.remove(symbol);
    constant *= coefficient;
    cells.forEach((s, v) => cells[s] = v * coefficient);
48 49
  }

50
  void solveForSymbols(_Symbol lhs, _Symbol rhs) {
51 52 53 54
    insertSymbol(lhs, -1.0);
    solveForSymbol(rhs);
  }

55
  double coefficientForSymbol(_Symbol symbol) => _elvis(cells[symbol], 0.0);
56

57
  void substitute(_Symbol symbol, _Row row) {
58
    double coefficient = cells[symbol];
59 60 61 62 63

    if (coefficient == null) {
      return;
    }

64
    cells.remove(symbol);
65 66
    insertRow(row, coefficient);
  }
67 68 69 70 71 72 73 74 75 76 77

  String toString() {
    StringBuffer buffer = new StringBuffer();

    buffer.write(constant);

    cells.forEach((symbol, value) =>
        buffer.write(" + " + value.toString() + " * " + symbol.toString()));

    return buffer.toString();
  }
78
}