Program Listing for File Compression.hpp

Return to documentation for file (umap/util/Compression.hpp)

#pragma once
#include <iostream>
#include <algorithm>
#include <string>
#include <chrono>
#include <atomic>

#include <stdlib.h>    // free
#include "zstd.h"



namespace Umap{
    inline std::pair<void*,size_t> compress(void* input_buffer, size_t input_buffer_size){
        size_t output_buffer_size_bound = ZSTD_compressBound(input_buffer_size);
        void* const output_buffer = malloc(output_buffer_size_bound);
        size_t output_size = ZSTD_compress(output_buffer, output_buffer_size_bound, input_buffer, input_buffer_size, 1);
        if (ZSTD_isError(output_size)){
            std::cerr << "Compression Error: - " << ZSTD_getErrorName(output_size) << std::endl;
            exit(-1);
        }
        return std::pair<void*,size_t>(output_buffer,output_size);
    }

    inline size_t decompress(void* input_buffer, void* output_buffer, size_t compressed_size){
        uint64_t rSize = ZSTD_getFrameContentSize(input_buffer, compressed_size);
        if (rSize == ZSTD_CONTENTSIZE_ERROR){
            std::cerr << "Decompression Error: File was not compressed by ZSTD" << std::endl;
            return -1;
        }

        if(rSize == ZSTD_CONTENTSIZE_UNKNOWN){
            std::cerr << "Decompression Error: File unable to get content size" << std::endl;
            return -1;
        }
        size_t decompressed_size =  ZSTD_decompress(output_buffer, rSize, input_buffer, compressed_size);
        return decompressed_size;
    }
}