simple_go124.go raw

   1  // Copyright 2025+ Klaus Post. All rights reserved.
   2  // License information can be found in the LICENSE file.
   3  
   4  //go:build go1.24
   5  
   6  package zstd
   7  
   8  import (
   9  	"errors"
  10  	"runtime"
  11  	"sync"
  12  	"weak"
  13  )
  14  
  15  var weakMu sync.Mutex
  16  var simpleEnc weak.Pointer[Encoder]
  17  var simpleDec weak.Pointer[Decoder]
  18  
  19  // EncodeTo appends the encoded data from src to dst.
  20  func EncodeTo(dst []byte, src []byte) []byte {
  21  	weakMu.Lock()
  22  	enc := simpleEnc.Value()
  23  	if enc == nil {
  24  		var err error
  25  		enc, err = NewWriter(nil, WithEncoderConcurrency(runtime.NumCPU()), WithWindowSize(1<<20), WithLowerEncoderMem(true), WithZeroFrames(true))
  26  		if err != nil {
  27  			panic("failed to create simple encoder: " + err.Error())
  28  		}
  29  		simpleEnc = weak.Make(enc)
  30  	}
  31  	weakMu.Unlock()
  32  
  33  	return enc.EncodeAll(src, dst)
  34  }
  35  
  36  // DecodeTo appends the decoded data from src to dst.
  37  // The maximum decoded size is 1GiB,
  38  // not including what may already be in dst.
  39  func DecodeTo(dst []byte, src []byte) ([]byte, error) {
  40  	weakMu.Lock()
  41  	dec := simpleDec.Value()
  42  	if dec == nil {
  43  		var err error
  44  		dec, err = NewReader(nil, WithDecoderConcurrency(runtime.NumCPU()), WithDecoderLowmem(true), WithDecoderMaxMemory(1<<30))
  45  		if err != nil {
  46  			weakMu.Unlock()
  47  			return nil, errors.New("failed to create simple decoder: " + err.Error())
  48  		}
  49  		runtime.SetFinalizer(dec, func(d *Decoder) {
  50  			d.Close()
  51  		})
  52  		simpleDec = weak.Make(dec)
  53  	}
  54  	weakMu.Unlock()
  55  	return dec.DecodeAll(src, dst)
  56  }
  57