@Override
  public int getNumberOfValidBranches() {
    int numberOfValidBranches = 0;

    for (LineData lineData : children.values()) {
      numberOfValidBranches += lineData.getNumberOfValidBranches();
    }

    return numberOfValidBranches;
  }
  public LineData addLine(int lineNumber) {
    LineData lineData = new LineData(_name, lineNumber);

    LineData previousLineData = children.putIfAbsent(lineData.getLineNumber(), lineData);

    if (previousLineData == null) {
      return lineData;
    }

    return previousLineData;
  }
  public void addLineSwitch(int lineNumber, int switchNumber, int[] keys) {
    LineData lineData = _getLineData(lineNumber);

    lineData.addSwitch(new SwitchData(_name, lineNumber, switchNumber, keys.length));
  }
  public void addLineSwitch(int lineNumber, int switchNumber, int min, int max) {

    LineData lineData = _getLineData(lineNumber);

    lineData.addSwitch(new SwitchData(_name, lineNumber, switchNumber, max - min + 1));
  }
  public void addLineJump(int lineNumber, int branchNumber) {
    LineData lineData = _getLineData(lineNumber);

    lineData.addJump(new JumpData(_name, lineNumber, branchNumber));
  }
  public void touchSwitch(int lineNumber, int switchNumber, int branch) {
    LineData lineData = _getLineData(lineNumber);

    lineData.touchSwitch(switchNumber, branch);
  }
  public void touchJump(int lineNumber, int branchNumber, boolean branch) {
    LineData lineData = _getLineData(lineNumber);

    lineData.touchJump(branchNumber, branch);
  }
  public void touch(int lineNumber) {
    LineData lineData = _getLineData(lineNumber);

    lineData.touch();
  }