github.com/mdaxf/iac@v0.0.0-20240519030858-58a061660378/vendor_skip/github.com/pierrec/lz4/v4/internal/lz4block/blocks.go (about)

     1  // Package lz4block provides LZ4 BlockSize types and pools of buffers.
     2  package lz4block
     3  
     4  import "sync"
     5  
     6  const (
     7  	Block64Kb uint32 = 1 << (16 + iota*2)
     8  	Block256Kb
     9  	Block1Mb
    10  	Block4Mb
    11  	Block8Mb = 2 * Block4Mb
    12  )
    13  
    14  var (
    15  	BlockPool64K  = sync.Pool{New: func() interface{} { return make([]byte, Block64Kb) }}
    16  	BlockPool256K = sync.Pool{New: func() interface{} { return make([]byte, Block256Kb) }}
    17  	BlockPool1M   = sync.Pool{New: func() interface{} { return make([]byte, Block1Mb) }}
    18  	BlockPool4M   = sync.Pool{New: func() interface{} { return make([]byte, Block4Mb) }}
    19  	BlockPool8M   = sync.Pool{New: func() interface{} { return make([]byte, Block8Mb) }}
    20  )
    21  
    22  func Index(b uint32) BlockSizeIndex {
    23  	switch b {
    24  	case Block64Kb:
    25  		return 4
    26  	case Block256Kb:
    27  		return 5
    28  	case Block1Mb:
    29  		return 6
    30  	case Block4Mb:
    31  		return 7
    32  	case Block8Mb: // only valid in legacy mode
    33  		return 3
    34  	}
    35  	return 0
    36  }
    37  
    38  func IsValid(b uint32) bool {
    39  	return Index(b) > 0
    40  }
    41  
    42  type BlockSizeIndex uint8
    43  
    44  func (b BlockSizeIndex) IsValid() bool {
    45  	switch b {
    46  	case 4, 5, 6, 7:
    47  		return true
    48  	}
    49  	return false
    50  }
    51  
    52  func (b BlockSizeIndex) Get() []byte {
    53  	var buf interface{}
    54  	switch b {
    55  	case 4:
    56  		buf = BlockPool64K.Get()
    57  	case 5:
    58  		buf = BlockPool256K.Get()
    59  	case 6:
    60  		buf = BlockPool1M.Get()
    61  	case 7:
    62  		buf = BlockPool4M.Get()
    63  	case 3:
    64  		buf = BlockPool8M.Get()
    65  	}
    66  	return buf.([]byte)
    67  }
    68  
    69  func Put(buf []byte) {
    70  	// Safeguard: do not allow invalid buffers.
    71  	switch c := cap(buf); uint32(c) {
    72  	case Block64Kb:
    73  		BlockPool64K.Put(buf[:c])
    74  	case Block256Kb:
    75  		BlockPool256K.Put(buf[:c])
    76  	case Block1Mb:
    77  		BlockPool1M.Put(buf[:c])
    78  	case Block4Mb:
    79  		BlockPool4M.Put(buf[:c])
    80  	case Block8Mb:
    81  		BlockPool8M.Put(buf[:c])
    82  	}
    83  }
    84  
    85  type CompressionLevel uint32
    86  
    87  const Fast CompressionLevel = 0