Source File
fse.go
Belonging Package
github.com/klauspost/compress/fse
// Copyright 2018 Klaus Post. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.// Based on work Copyright (c) 2013, Yann Collet, released under BSD License.// Package fse provides Finite State Entropy encoding and decoding.//// Finite State Entropy encoding provides a fast near-optimal symbol encoding/decoding// for byte blocks as implemented in zstd.//// See https://github.com/klauspost/compress/tree/master/fse for more information.package fseimport ()const (/*!MEMORY_USAGE :* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)* Increasing memory usage improves compression ratio* Reduced memory usage can improve speed, due to cache effect* Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */maxMemoryUsage = 14defaultMemoryUsage = 13maxTableLog = maxMemoryUsage - 2maxTablesize = 1 << maxTableLogdefaultTablelog = defaultMemoryUsage - 2minTablelog = 5maxSymbolValue = 255)var (// ErrIncompressible is returned when input is judged to be too hard to compress.ErrIncompressible = errors.New("input is not compressible")// ErrUseRLE is returned from the compressor when the input is a single byte value repeated.ErrUseRLE = errors.New("input is single value repeated"))// Scratch provides temporary storage for compression and decompression.type Scratch struct {// Privatecount [maxSymbolValue + 1]uint32norm [maxSymbolValue + 1]int16br byteReaderbits bitReaderbw bitWriterct cTable // Compression tables.decTable []decSymbol // Decompression table.maxCount int // count of the most probable symbol// Per block parameters.// These can be used to override compression parameters of the block.// Do not touch, unless you know what you are doing.// Out is output buffer.// If the scratch is re-used before the caller is done processing the output,// set this field to nil.// Otherwise the output buffer will be re-used for next Compression/Decompression step// and allocation will be avoided.Out []byte// DecompressLimit limits the maximum decoded size acceptable.// If > 0 decompression will stop when approximately this many bytes// has been decoded.// If 0, maximum size will be 2GB.DecompressLimit intsymbolLen uint16 // Length of active part of the symbol table.actualTableLog uint8 // Selected tablelog.zeroBits bool // no bits has prob > 50%.clearCount bool // clear count// MaxSymbolValue will override the maximum symbol value of the next block.MaxSymbolValue uint8// TableLog will attempt to override the tablelog for the next block.TableLog uint8}// Histogram allows to populate the histogram and skip that step in the compression,// It otherwise allows to inspect the histogram when compression is done.// To indicate that you have populated the histogram call HistogramFinished// with the value of the highest populated symbol, as well as the number of entries// in the most populated entry. These are accepted at face value.// The returned slice will always be length 256.func ( *Scratch) () []uint32 {return .count[:]}// HistogramFinished can be called to indicate that the histogram has been populated.// maxSymbol is the index of the highest set symbol of the next data segment.// maxCount is the number of entries in the most populated entry.// These are accepted at face value.func ( *Scratch) ( uint8, int) {.maxCount =.symbolLen = uint16() + 1.clearCount = != 0}// prepare will prepare and allocate scratch tables used for both compression and decompression.func ( *Scratch) ( []byte) (*Scratch, error) {if == nil {= &Scratch{}}if .MaxSymbolValue == 0 {.MaxSymbolValue = 255}if .TableLog == 0 {.TableLog = defaultTablelog}if .TableLog > maxTableLog {return nil, fmt.Errorf("tableLog (%d) > maxTableLog (%d)", .TableLog, maxTableLog)}if cap(.Out) == 0 {.Out = make([]byte, 0, len())}if .clearCount && .maxCount == 0 {for := range .count {.count[] = 0}.clearCount = false}.br.init()if .DecompressLimit == 0 {// Max size 2GB..DecompressLimit = (2 << 30) - 1}return , nil}// tableStep returns the next table index.func tableStep( uint32) uint32 {return ( >> 1) + ( >> 3) + 3}func highBits( uint32) ( uint32) {return uint32(bits.Len32() - 1)}
![]() |
The pages are generated with Golds v0.8.2. (GOOS=linux 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 @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |