blocks.go 1.8 KB

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