package byteutil

// ChanPool struct
//
// Usage:
//
//	bp := strutil.NewByteChanPool(500, 1024, 1024)
//	buf:=bp.Get()
//	defer bp.Put(buf)
//	// use buf do something ...
//
// refer https://www.flysnow.org/2020/08/21/golang-chan-byte-pool.html
// from https://github.com/minio/minio/blob/master/internal/bpool/bpool.go
type ChanPool struct {
	c    chan []byte
	w    int // init byte width
	wcap int // set byte cap
}

// NewChanPool instance
func ( int,  int,  int) *ChanPool {
	return &ChanPool{
		c:    make(chan []byte, ),
		w:    ,
		wcap: ,
	}
}

// Get gets a []byte from the BytePool, or creates a new one if none are
// available in the pool.
func ( *ChanPool) () ( []byte) {
	select {
	case  = <-.c: // reuse existing buffer
	default:
		// create new buffer
		if .wcap > 0 {
			 = make([]byte, .w, .wcap)
		} else {
			 = make([]byte, .w)
		}
	}
	return
}

// Put returns the given Buffer to the BytePool.
func ( *ChanPool) ( []byte) {
	select {
	case .c <- :
		// buffer went back into pool
	default:
		// buffer didn't go back into pool, just discard
	}
}

// Width returns the width of the byte arrays in this pool.
func ( *ChanPool) () ( int) {
	return .w
}

// WidthCap returns the cap width of the byte arrays in this pool.
func ( *ChanPool) () ( int) {
	return .wcap
}