#pragma once // // This file is distributed under the MIT License. See LICENSE.md for details. // #include "llvm/ADT/ArrayRef.h" #include "llvm/Support/raw_ostream.h" #include "revng/ADT/STLExtras.h" #include "zlib.h" void gzipCompress(llvm::raw_ostream &OS, llvm::ArrayRef Buffer, int CompressionLevel = 3); template inline void gzipCompress(llvm::raw_ostream &OS, T Buffer, int CompressionLevel = 3) { gzipCompress(OS, { reinterpret_cast(Buffer.data()), Buffer.size() }, CompressionLevel); } template inline llvm::SmallVector gzipCompress(T Buffer, int CompressionLevel = 3) { llvm::SmallVector Result; llvm::raw_svector_ostream OS(Result); gzipCompress(OS, Buffer); return Result; } void gzipDecompress(llvm::raw_ostream &OS, llvm::ArrayRef Buffer); template inline void gzipDecompress(llvm::raw_ostream &OS, T Buffer) { gzipDecompress(OS, { reinterpret_cast(Buffer.data()), Buffer.size() }); } template inline llvm::SmallVector gzipDecompress(T Buffer) { llvm::SmallVector Result; llvm::raw_svector_ostream OS(Result); gzipDecompress(OS, Buffer); return Result; } class GzipCompressedOstream : public llvm::raw_ostream { private: llvm::raw_ostream &OS; llvm::SmallVector OutBuffer; z_stream Stream; public: GzipCompressedOstream(llvm::raw_ostream &OS, int CompressionLevel = 3); ~GzipCompressedOstream() override; void flush(); private: void write_impl(const char *Ptr, size_t Size) override; uint64_t current_pos() const override { return OS.tell(); } };