getRSSvalue static method

int getRSSvalue(
  1. List<int> widths,
  2. int maxWidth,
  3. bool noNarrow
)

Implementation

static int getRSSvalue(List<int> widths, int maxWidth, bool noNarrow) {
  int n = 0;
  for (int width in widths) {
    n += width;
  }
  int val = 0;
  int narrowMask = 0;
  final elements = widths.length;
  for (int bar = 0; bar < elements - 1; bar++) {
    int elmWidth = 1;
    for (narrowMask |= 1 << bar;
        elmWidth < widths[bar];
        elmWidth++, narrowMask &= ~(1 << bar)) {
      int subVal = _combins(n - elmWidth - 1, elements - bar - 2);
      if (noNarrow &&
          (narrowMask == 0) &&
          (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) {
        subVal -=
            _combins(n - elmWidth - (elements - bar), elements - bar - 2);
      }
      if (elements - bar - 1 > 1) {
        int lessVal = 0;
        for (int mxwElement = n - elmWidth - (elements - bar - 2);
            mxwElement > maxWidth;
            mxwElement--) {
          lessVal +=
              _combins(n - elmWidth - mxwElement - 1, elements - bar - 3);
        }
        subVal -= lessVal * (elements - 1 - bar);
      } else if (n - elmWidth > maxWidth) {
        subVal--;
      }
      val += subVal;
    }
    n -= elmWidth;
  }
  return val;
}