// Copyright 2019+ Klaus Post. All rights reserved.// License information can be found in the LICENSE file.// Based on work by Yann Collet, released under BSD License.package zstdimport ()// DOption is an option for creating a decoder.typeDOptionfunc(*decoderOptions) error// options retains accumulated state of multiple options.type decoderOptions struct { lowMem bool concurrent int maxDecodedSize uint64 maxWindowSize uint64 dicts []*dict ignoreChecksum bool limitToCap bool decodeBufsBelow int}func ( *decoderOptions) () { * = decoderOptions{// use less ram: true for now, but may change.lowMem: true,concurrent: runtime.GOMAXPROCS(0),maxWindowSize: MaxWindowSize,decodeBufsBelow: 128 << 10, }if .concurrent > 4 { .concurrent = 4 } .maxDecodedSize = 64 << 30}// WithDecoderLowmem will set whether to use a lower amount of memory,// but possibly have to allocate more while running.func ( bool) DOption {returnfunc( *decoderOptions) error { .lowMem = ; returnnil }}// WithDecoderConcurrency sets the number of created decoders.// When decoding block with DecodeAll, this will limit the number// of possible concurrently running decodes.// When decoding streams, this will limit the number of// inflight blocks.// When decoding streams and setting maximum to 1,// no async decoding will be done.// When a value of 0 is provided GOMAXPROCS will be used.// By default this will be set to 4 or GOMAXPROCS, whatever is lower.func ( int) DOption {returnfunc( *decoderOptions) error {if < 0 {returnerrors.New("concurrency must be at least 1") }if == 0 { .concurrent = runtime.GOMAXPROCS(0) } else { .concurrent = }returnnil }}// WithDecoderMaxMemory allows to set a maximum decoded size for in-memory// non-streaming operations or maximum window size for streaming operations.// This can be used to control memory usage of potentially hostile content.// Maximum is 1 << 63 bytes. Default is 64GiB.func ( uint64) DOption {returnfunc( *decoderOptions) error {if == 0 {returnerrors.New("WithDecoderMaxMemory must be at least 1") }if > 1<<63 {returnerrors.New("WithDecoderMaxmemory must be less than 1 << 63") } .maxDecodedSize = returnnil }}// WithDecoderDicts allows to register one or more dictionaries for the decoder.//// Each slice in dict must be in the [dictionary format] produced by// "zstd --train" from the Zstandard reference implementation.//// If several dictionaries with the same ID are provided, the last one will be used.//// [dictionary format]: https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#dictionary-formatfunc ( ...[]byte) DOption {returnfunc( *decoderOptions) error {for , := range { , := loadDict()if != nil {return } .dicts = append(.dicts, ) }returnnil }}// WithDecoderDictRaw registers a dictionary that may be used by the decoder.// The slice content can be arbitrary data.func ( uint32, []byte) DOption {returnfunc( *decoderOptions) error {ifbits.UintSize > 32 && uint(len()) > dictMaxLength {returnfmt.Errorf("dictionary of size %d > 2GiB too large", len()) } .dicts = append(.dicts, &dict{id: , content: , offsets: [3]int{1, 4, 8}})returnnil }}// WithDecoderMaxWindow allows to set a maximum window size for decodes.// This allows rejecting packets that will cause big memory usage.// The Decoder will likely allocate more memory based on the WithDecoderLowmem setting.// If WithDecoderMaxMemory is set to a lower value, that will be used.// Default is 512MB, Maximum is ~3.75 TB as per zstandard spec.func ( uint64) DOption {returnfunc( *decoderOptions) error {if < MinWindowSize {returnerrors.New("WithMaxWindowSize must be at least 1KB, 1024 bytes") }if > (1<<41)+7*(1<<38) {returnerrors.New("WithMaxWindowSize must be less than (1<<41) + 7*(1<<38) ~ 3.75TB") } .maxWindowSize = returnnil }}// WithDecodeAllCapLimit will limit DecodeAll to decoding cap(dst)-len(dst) bytes,// or any size set in WithDecoderMaxMemory.// This can be used to limit decoding to a specific maximum output size.// Disabled by default.func ( bool) DOption {returnfunc( *decoderOptions) error { .limitToCap = returnnil }}// WithDecodeBuffersBelow will fully decode readers that have a// `Bytes() []byte` and `Len() int` interface similar to bytes.Buffer.// This typically uses less allocations but will have the full decompressed object in memory.// Note that DecodeAllCapLimit will disable this, as well as giving a size of 0 or less.// Default is 128KiB.func ( int) DOption {returnfunc( *decoderOptions) error { .decodeBufsBelow = returnnil }}// IgnoreChecksum allows to forcibly ignore checksum checking.func ( bool) DOption {returnfunc( *decoderOptions) error { .ignoreChecksum = returnnil }}
The pages are generated with Goldsv0.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.