hMap method
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;
}