File: simple_go124.go

package info (click to toggle)
golang-github-klauspost-compress 1.18.1%2Bds1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 46,628 kB
  • sloc: asm: 23,155; sh: 72; makefile: 12
file content (56 lines) | stat: -rw-r--r-- 1,427 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// Copyright 2025+ Klaus Post. All rights reserved.
// License information can be found in the LICENSE file.

//go:build go1.24

package zstd

import (
	"errors"
	"runtime"
	"sync"
	"weak"
)

var weakMu sync.Mutex
var simpleEnc weak.Pointer[Encoder]
var simpleDec weak.Pointer[Decoder]

// EncodeTo appends the encoded data from src to dst.
func EncodeTo(dst []byte, src []byte) []byte {
	weakMu.Lock()
	enc := simpleEnc.Value()
	if enc == nil {
		var err error
		enc, err = NewWriter(nil, WithEncoderConcurrency(runtime.NumCPU()), WithWindowSize(1<<20), WithLowerEncoderMem(true), WithZeroFrames(true))
		if err != nil {
			panic("failed to create simple encoder: " + err.Error())
		}
		simpleEnc = weak.Make(enc)
	}
	weakMu.Unlock()

	return enc.EncodeAll(src, dst)
}

// DecodeTo appends the decoded data from src to dst.
// The maximum decoded size is 1GiB,
// not including what may already be in dst.
func DecodeTo(dst []byte, src []byte) ([]byte, error) {
	weakMu.Lock()
	dec := simpleDec.Value()
	if dec == nil {
		var err error
		dec, err = NewReader(nil, WithDecoderConcurrency(runtime.NumCPU()), WithDecoderLowmem(true), WithDecoderMaxMemory(1<<30))
		if err != nil {
			weakMu.Unlock()
			return nil, errors.New("failed to create simple decoder: " + err.Error())
		}
		runtime.SetFinalizer(dec, func(d *Decoder) {
			d.Close()
		})
		simpleDec = weak.Make(dec)
	}
	weakMu.Unlock()
	return dec.DecodeAll(src, dst)
}