in java/src/main/java/com/epam/deltix/zstd/Huffman.java [119:153]
public void decodeSingleStream(final ByteBuffer inputBase, final int inputAddress, final int inputLimit,
final ByteBuffer outputBase, final int outputAddress, final int outputLimit) {
final BitStream.Initializer initializer = new BitStream.Initializer(inputBase, inputAddress, inputLimit);
initializer.initialize();
long bits = initializer.getBits();
int bitsConsumed = initializer.getBitsConsumed();
int currentAddress = initializer.getCurrentAddress();
final int tableLog = this.tableLog;
final byte[] numbersOfBits = this.numbersOfBits;
final byte[] symbols = this.symbols;
// 4 symbols at a time
int output = outputAddress;
final long fastOutputLimit = outputLimit - 4;
while (output < fastOutputLimit) {
final BitStream.Loader loader = new BitStream.Loader(inputBase, inputAddress, currentAddress, bits, bitsConsumed);
final boolean done = loader.load();
bits = loader.getBits();
bitsConsumed = loader.getBitsConsumed();
currentAddress = loader.getCurrentAddress();
if (done) {
break;
}
bitsConsumed = decodeSymbol(outputBase, output, bits, bitsConsumed, tableLog, numbersOfBits, symbols);
bitsConsumed = decodeSymbol(outputBase, output + 1, bits, bitsConsumed, tableLog, numbersOfBits, symbols);
bitsConsumed = decodeSymbol(outputBase, output + 2, bits, bitsConsumed, tableLog, numbersOfBits, symbols);
bitsConsumed = decodeSymbol(outputBase, output + 3, bits, bitsConsumed, tableLog, numbersOfBits, symbols);
output += SIZE_OF_INT;
}
decodeTail(inputBase, inputAddress, currentAddress, bitsConsumed, bits, outputBase, output, outputLimit);
}