hMap method

u16 hMap(
  1. List<int> cd,
  2. int mb,
  3. int r
)

Implementation

u16 hMap(List<int> cd, int mb, int r) {
  int s = cd.length;
  // index
  int i = 0;
  // u16 "map": index -> # of codes with bit length = index
  u16 l = u16(mb);
  // length of cd must be 288 (total # of codes)
  for (; i < s; ++i) {
    ++l[cd[i] - 1];
  }
  // u16 "map": index -> minimum code for bit length = index
  u16 le = u16(mb);
  for (i = 1; i < mb; ++i) {
    le[i] = (le[i - 1] + l[i - 1]) << 1;
  }
  late u16 co;
  if (r != 0) {
    // u16 "map": index -> number of actual bits, symbol for code
    co = u16(1 << mb);
    // bits to remove for reverser
    int rvb = 15 - mb;
    for (i = 0; i < s; ++i) {
      // ignore 0 lengths
      if (cd[i] != 0) {
        // num encoding both symbol and bits read
        int sv = (i << 4) | cd[i];
        // free bits
        int r_1 = mb - cd[i];
        // start value
        int v = le[cd[i] - 1]++ << r_1;
        // m is end value
        for (int m = v | ((1 << r_1) - 1); v <= m; ++v) {
          // every 16 bit value starting with the code yields the same result
          co[rev[v] >> rvb] = sv;
        }
      }
    }
  }
  else {
    co = u16(s);
    for (i = 0; i < s; ++i) {
      if (cd[i] != 0) {
        co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);
      }
    }
  }
  return co;
}