Function generate [src]

Update this Huffman Code object to be the minimum code for the specified frequency count. freq An array of frequencies, in which frequency[i] gives the frequency of literal i. max_bits The maximum number of bits to use for any literal.

Prototype

pub fn generate(self: *HuffmanEncoder, freq: []u16, max_bits: u32) void

Parameters

self: *HuffmanEncoderfreq: []u16max_bits: u32

Source

pub fn generate(self: *HuffmanEncoder, freq: []u16, max_bits: u32) void { var list = self.freq_cache[0 .. freq.len + 1]; // Number of non-zero literals var count: u32 = 0; // Set list to be the set of all non-zero literals and their frequencies for (freq, 0..) |f, i| { if (f != 0) { list[count] = LiteralNode{ .literal = @as(u16, @intCast(i)), .freq = f }; count += 1; } else { list[count] = LiteralNode{ .literal = 0x00, .freq = 0 }; self.codes[i].len = 0; } } list[freq.len] = LiteralNode{ .literal = 0x00, .freq = 0 }; list = list[0..count]; if (count <= 2) { // Handle the small cases here, because they are awkward for the general case code. With // two or fewer literals, everything has bit length 1. for (list, 0..) |node, i| { // "list" is in order of increasing literal value. self.codes[node.literal] = .{ .code = @intCast(i), .len = 1, }; } return; } self.lfs = list; std.mem.sort(LiteralNode, self.lfs, {}, byFreq); // Get the number of literals for each bit count const bit_count = self.bitCounts(list, max_bits); // And do the assignment self.assignEncodingAndSize(bit_count, list); }