github.com/bodgit/sevenzip@v1.5.1/internal/lz4/reader.go (about)

     1  package lz4
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  	"sync"
     7  
     8  	lz4 "github.com/pierrec/lz4/v4"
     9  )
    10  
    11  //nolint:gochecknoglobals
    12  var lz4ReaderPool sync.Pool
    13  
    14  type readCloser struct {
    15  	c io.Closer
    16  	r *lz4.Reader
    17  }
    18  
    19  func (rc *readCloser) Close() (err error) {
    20  	if rc.c != nil {
    21  		lz4ReaderPool.Put(rc.r)
    22  		err = rc.c.Close()
    23  		rc.c, rc.r = nil, nil
    24  	}
    25  
    26  	return
    27  }
    28  
    29  func (rc *readCloser) Read(p []byte) (int, error) {
    30  	if rc.r == nil {
    31  		return 0, errors.New("lz4: Read after Close")
    32  	}
    33  
    34  	return rc.r.Read(p)
    35  }
    36  
    37  // NewReader returns a new LZ4 io.ReadCloser.
    38  func NewReader(_ []byte, _ uint64, readers []io.ReadCloser) (io.ReadCloser, error) {
    39  	if len(readers) != 1 {
    40  		return nil, errors.New("lz4: need exactly one reader")
    41  	}
    42  
    43  	r, ok := lz4ReaderPool.Get().(*lz4.Reader)
    44  	if ok {
    45  		r.Reset(readers[0])
    46  	} else {
    47  		r = lz4.NewReader(readers[0])
    48  	}
    49  
    50  	return &readCloser{
    51  		c: readers[0],
    52  		r: r,
    53  	}, nil
    54  }