private void createDecoder(Decoder dest, short[] source, int start, int level) { int next = 0; int i = 0; while (i <= leafCounter && next < LEAVES_OFFSET) { i += source[start + next++] & 0xff; } if (level < next && next < LEAVES_OFFSET) { dest.branch[0] = createDecoder(source, start, level + 1); dest.branch[1] = createDecoder(source, start, level + 1); } else { i = start + LEAVES_OFFSET + leafCounter++; if (i < source.length) { dest.leafValue = source[i] & 0xff; } } }
public Decoder(short[] source) { leafCounter = 0; createDecoder(this, source, 0, 0); }
private Decoder createDecoder(short[] source, int start, int level) { Decoder dest = new Decoder(); createDecoder(dest, source, start, level); return dest; }