lz4.go 980 B

1234567891011121314151617181920212223242526272829303132333435
  1. package rbtree
  2. /*
  3. #cgo CFLAGS: -std=c99
  4. int LZ4_compressBound(int isize);
  5. int LZ4_compress_HC(const void* src, void* dst, int srcSize, int dstCapacity, int compressionLevel);
  6. int LZ4_decompress_fast(const void* source, void* dest, int originalSize);
  7. */
  8. import "C"
  9. import "unsafe"
  10. // CompressUInt32Slice compresses a slice of uint32-s with LZ4.
  11. func CompressUInt32Slice(data []uint32) []byte {
  12. dstSize := C.LZ4_compressBound(C.int(len(data) * 4))
  13. dst := make([]byte, dstSize)
  14. dstSize = C.LZ4_compress_HC(
  15. unsafe.Pointer(&data[0]),
  16. unsafe.Pointer(&dst[0]),
  17. C.int(len(data)*4),
  18. dstSize,
  19. 12)
  20. finalDst := make([]byte, dstSize)
  21. copy(finalDst, dst[:dstSize])
  22. return finalDst
  23. }
  24. // DecompressUInt32Slice decompresses a slice of uint32-s previously compressed with LZ4.
  25. // `result` must be preallocated.
  26. func DecompressUInt32Slice(data []byte, result []uint32) {
  27. C.LZ4_decompress_fast(
  28. unsafe.Pointer(&data[0]),
  29. unsafe.Pointer(&result[0]),
  30. C.int(len(result)*4))
  31. }