All Downloads are FREE. Search and download functionalities are using the official Maven repository.

skadistats.clarity.io.bitstream.BitStream32 Maven / Gradle / Ivy

package skadistats.clarity.io.bitstream;

import skadistats.clarity.io.s2.FieldOpHuffmanTree;
import skadistats.clarity.io.s2.FieldOpType;
import skadistats.clarity.platform.buffer.Buffer;

public class BitStream32 extends BitStream {

    private final Buffer.B32 buffer;

    public BitStream32(Buffer.B32 buffer) {
        this.buffer = buffer;
    }

    protected int peekBit(int pos) {
        return buffer.get(pos >> 5) >> (pos & 31) & 1;
    }

    @Override
    public int readUBitInt(int n) {
        assert n <= 32;
        var start = pos >> 5;
        var end = (pos + n - 1) >> 5;
        var s = pos & 31;
        pos += n;
        return (int)(((buffer.get(start) >>> s) | (buffer.get(end) << (32 - s))) & MASKS[n]);
    }

    @Override
    public long readUBitLong(int n) {
        assert n <= 64;
        if (n > 32) {
            long l = readUBitInt(32);
            long h = readUBitInt(n - 32);
            return h << 32 | l;
        } else {
            return readUBitInt(n);
        }
    }

    @Override
    public void readBitsIntoByteArray(byte[] dest, int n) {
        var o = 0;
        while (n > 8) {
            dest[o++] = (byte)readUBitInt(8);
            n -= 8;
        }
        if (n > 0) {
            dest[o] = (byte)readUBitInt(n);
        }
    }

    @Override
    public FieldOpType readFieldOp() {
        var offs = pos >> 5;
        var s = pos & 31;
        var i = 0;
        var v = buffer.get(offs);
        while (true) {
            pos++;
            i = FieldOpHuffmanTree.tree[i][v >>> s & 1];
            if (i < 0) {
                return FieldOpHuffmanTree.ops[-i - 1];
            }
            if (++s == 32) {
                v = buffer.get(++offs);
                s = 0;
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy