Source File
huffman_code.go
Belonging Package
compress/flate
package flate
import (
)
type hcode struct {
code, len uint16
}
type huffmanEncoder struct {
codes []hcode
freqcache []literalNode
bitCount [17]int32
lns byLiteral // stored to avoid repeated allocation in generate
lfs byFreq // stored to avoid repeated allocation in generate
}
type literalNode struct {
literal uint16
freq int32
}
func ( *hcode) ( uint16, uint16) {
.len =
.code =
}
func () literalNode { return literalNode{math.MaxUint16, math.MaxInt32} }
func ( int) *huffmanEncoder {
return &huffmanEncoder{codes: make([]hcode, )}
}
func () *huffmanEncoder {
:= newHuffmanEncoder(maxNumLit)
:= .codes
var uint16
for = 0; < maxNumLit; ++ {
var uint16
var uint16
switch {
= + 48
= 8
break
= + 400 - 144
= 9
break
= - 256
= 7
break
= + 192 - 280
= 8
}
[] = hcode{code: reverseBits(, byte()), len: }
}
return
}
func () *huffmanEncoder {
:= newHuffmanEncoder(30)
:= .codes
for := range {
[] = hcode{code: reverseBits(uint16(), 5), len: 5}
}
return
}
var fixedLiteralEncoding *huffmanEncoder = generateFixedLiteralEncoding()
var fixedOffsetEncoding *huffmanEncoder = generateFixedOffsetEncoding()
func ( *huffmanEncoder) ( []int32) int {
var int
for , := range {
if != 0 {
+= int() * int(.codes[].len)
}
}
return
}
const maxBitsLimit = 16
func ( *huffmanEncoder) ( []literalNode, int32) []int32 {
if >= maxBitsLimit {
panic("flate: maxBits too large")
}
:= int32(len())
= [0 : +1]
[] = maxNode()
if > -1 {
= - 1
}
var [maxBitsLimit][maxBitsLimit]int32
[] = levelInfo{
level: ,
lastFreq: [1].freq,
nextCharFreq: [2].freq,
nextPairFreq: [0].freq + [1].freq,
}
[][] = 2
if == 1 {
[].nextPairFreq = math.MaxInt32
}
}
[].needed = 2* - 4
:=
for {
:= &[]
.needed = 0
[+1].nextPairFreq = math.MaxInt32
++
continue
}
:= .lastFreq
:= [][] + 1
[][] =
.nextCharFreq = [].freq
break
}
[.level+1].nextPairFreq = + .lastFreq
++
for [-1].needed > 0 {
--
}
}
}
[] = [] - [-1]
++
}
return
}
func ( *huffmanEncoder) ( []int32, []literalNode) {
:= uint16(0)
for , := range {
<<= 1
if == 0 || == 0 {
continue
func ( *huffmanEncoder) ( []int32, int32) {
.freqcache = make([]literalNode, maxNumLit+1)
}
for , := range {
if != 0 {
[] = literalNode{uint16(), }
++
} else {
[] = literalNode{}
.codes[].len = 0
}
}
[len()] = literalNode{}
= [:]
.assignEncodingAndSize(, )
}
type byLiteral []literalNode
func ( *byLiteral) ( []literalNode) {
* = byLiteral()
sort.Sort()
}
func ( byLiteral) () int { return len() }
func ( byLiteral) (, int) bool {
return [].literal < [].literal
}
func ( byLiteral) (, int) { [], [] = [], [] }
type byFreq []literalNode
func ( *byFreq) ( []literalNode) {
* = byFreq()
sort.Sort()
}
func ( byFreq) () int { return len() }
func ( byFreq) (, int) bool {
if [].freq == [].freq {
return [].literal < [].literal
}
return [].freq < [].freq
}
func ( byFreq) (, int) { [], [] = [], [] }
func ( uint16, byte) uint16 {
return bits.Reverse16( << (16 - ))
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |