blocks.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. var (
  11. BlockPool64K = sync.Pool{New: func() interface{} { return make([]byte, Block64Kb) }}
  12. BlockPool256K = sync.Pool{New: func() interface{} { return make([]byte, Block256Kb) }}
  13. BlockPool1M = sync.Pool{New: func() interface{} { return make([]byte, Block1Mb) }}
  14. BlockPool4M = sync.Pool{New: func() interface{} { return make([]byte, Block4Mb) }}
  15. )
  16. func Index(b uint32) BlockSizeIndex {
  17. switch b {
  18. case Block64Kb:
  19. return 4
  20. case Block256Kb:
  21. return 5
  22. case Block1Mb:
  23. return 6
  24. case Block4Mb:
  25. return 7
  26. }
  27. return 0
  28. }
  29. func IsValid(b uint32) bool {
  30. return Index(b) > 0
  31. }
  32. type BlockSizeIndex uint8
  33. func (b BlockSizeIndex) IsValid() bool {
  34. switch b {
  35. case 4, 5, 6, 7:
  36. return true
  37. }
  38. return false
  39. }
  40. func (b BlockSizeIndex) Get() []byte {
  41. var buf interface{}
  42. switch b {
  43. case 4:
  44. buf = BlockPool64K.Get()
  45. case 5:
  46. buf = BlockPool256K.Get()
  47. case 6:
  48. buf = BlockPool1M.Get()
  49. case 7:
  50. buf = BlockPool4M.Get()
  51. }
  52. return buf.([]byte)
  53. }
  54. func (b BlockSizeIndex) Put(buf []byte) {
  55. // Safeguard: do not allow invalid buffers.
  56. switch c := uint32(cap(buf)); b {
  57. case 4:
  58. if c == Block64Kb {
  59. BlockPool64K.Put(buf[:c])
  60. }
  61. case 5:
  62. if c == Block256Kb {
  63. BlockPool256K.Put(buf[:c])
  64. }
  65. case 6:
  66. if c == Block1Mb {
  67. BlockPool1M.Put(buf[:c])
  68. }
  69. case 7:
  70. if c == Block4Mb {
  71. BlockPool4M.Put(buf[:c])
  72. }
  73. }
  74. }
  75. type CompressionLevel uint32
  76. const Fast CompressionLevel = 0