// 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) }