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