// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #ifndef JUNGFRAUJOCH_JFJOCHCOMPRESSOR_H #define JUNGFRAUJOCH_JFJOCHCOMPRESSOR_H #include #include #include #include #include "CompressionAlgorithmEnum.h" #include "MaxCompressedSize.h" #include "JFJochZstdCompressor.h" class JFJochBitShuffleCompressor { JFJochZstdCompressor zstd_compressor; CompressionAlgorithm algorithm; std::vector tmp_space; size_t CompressBlock(char *dest, const char * source, size_t nelements, size_t elem_size); public: constexpr static const size_t DefaultBlockSize = 4096; explicit JFJochBitShuffleCompressor(CompressionAlgorithm algorithm); template size_t Compress(void *dest, const std::vector &src) { return Compress((char *) dest, (char *) src.data(), src.size(), sizeof(T)); }; template std::vector Compress(const std::vector &src) { return Compress(src.data(), src.size(), sizeof(T)); } std::vector Compress(const void* source, size_t nelements, size_t elem_size); size_t Compress(void *dest, const void* source, size_t nelements, size_t elem_size); private: char scratch[DefaultBlockSize * sizeof(uint64_t)]; }; template std::vector bitshuffle(const std::vector &input, size_t block_size) { std::vector ret(input.size() * sizeof(T)); bshuf_bitshuffle(input.data(), ret.data(), input.size(), sizeof(T), block_size); return ret; } #endif //JUNGFRAUJOCH_JFJOCHCOMPRESSOR_H