public void decodeSingleStream()

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);
    }