From 1850acb5b77aabbf4e9ba24ae6d5314c3d4d896a Mon Sep 17 00:00:00 2001 From: pacien Date: Sat, 1 Dec 2018 15:55:33 +0100 Subject: add dynamic symbol length to output --- src/huffman/huffmanencoder.nim | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/huffman/huffmanencoder.nim b/src/huffman/huffmanencoder.nim index 5ae1a68..09c6701 100644 --- a/src/huffman/huffmanencoder.nim +++ b/src/huffman/huffmanencoder.nim @@ -19,22 +19,22 @@ import ../bitio/integers, ../bitio/bitwriter import huffmantree type HuffmanEncoder*[T, U: SomeUnsignedInt] = object - codebook: TableRef[T, U] + codebook: TableRef[T, tuple[bitLength: int, value: U]] -proc buildCodebook*[T, U](tree: HuffmanTreeNode[T], codeType: typedesc[U]): TableRef[T, U] = - var codebook = newTable[T, U]() +proc buildCodebook*[T, U](tree: HuffmanTreeNode[T], codeType: typedesc[U]): TableRef[T, tuple[bitLength: int, value: U]] = + var codebook = newTable[T, tuple[bitLength: int, value: U]]() proc addCode(node: HuffmanTreeNode[T], path: U, depth: int) = case node.kind: of branch: addCode(node.left, path, depth + 1) addCode(node.right, path or (1.U shl depth), depth + 1) of leaf: - codebook[node.value] = path + codebook[node.value] = (depth, path) addCode(tree, 0.U, 0) codebook proc encoder*[T, U](tree: HuffmanTreeNode[T], codeType: typedesc[U]): HuffmanEncoder[T, U] = HuffmanEncoder[T, U](codebook: buildCodebook(tree, codeType)) -proc encode*[T, U](decoder: HuffmanEncoder[T, U], value: T): U = +proc encode*[T, U](decoder: HuffmanEncoder[T, U], value: T): tuple[bitLength: int, value: U] = decoder.codebook[value] -- cgit v1.2.3