structstd.compress.zstandard.types.compressed_block.LiteralsSection[src]

Fields

header: Header
huffman_tree: ?HuffmanTree
streams: Streams

Functions

FunctionstreamCount[src]

pub fn streamCount(size_format: u2, block_type: BlockType) StreamCount

Parameters

size_format: u2
block_type: BlockType

Source Code

Source code
pub fn streamCount(size_format: u2, block_type: BlockType) StreamCount {
    return switch (block_type) {
        .raw, .rle => .one,
        .compressed, .treeless => if (size_format == 0) .one else .four,
    };
}

Source Code

Source code
pub const LiteralsSection = struct {
    header: Header,
    huffman_tree: ?HuffmanTree,
    streams: Streams,

    pub const Streams = union(enum) {
        one: []const u8,
        four: [4][]const u8,
    };

    pub const Header = struct {
        block_type: BlockType,
        size_format: u2,
        regenerated_size: u20,
        compressed_size: ?u18,
    };

    pub const BlockType = enum(u2) {
        raw,
        rle,
        compressed,
        treeless,
    };

    pub const HuffmanTree = struct {
        max_bit_count: u4,
        symbol_count_minus_one: u8,
        nodes: [256]PrefixedSymbol,

        pub const PrefixedSymbol = struct {
            symbol: u8,
            prefix: u16,
            weight: u4,
        };

        pub const Result = union(enum) {
            symbol: u8,
            index: usize,
        };

        pub fn query(self: HuffmanTree, index: usize, prefix: u16) error{NotFound}!Result {
            var node = self.nodes[index];
            const weight = node.weight;
            var i: usize = index;
            while (node.weight == weight) {
                if (node.prefix == prefix) return Result{ .symbol = node.symbol };
                if (i == 0) return error.NotFound;
                i -= 1;
                node = self.nodes[i];
            }
            return Result{ .index = i };
        }

        pub fn weightToBitCount(weight: u4, max_bit_count: u4) u4 {
            return if (weight == 0) 0 else ((max_bit_count + 1) - weight);
        }
    };

    pub const StreamCount = enum { one, four };
    pub fn streamCount(size_format: u2, block_type: BlockType) StreamCount {
        return switch (block_type) {
            .raw, .rle => .one,
            .compressed, .treeless => if (size_format == 0) .one else .four,
        };
    }
}