mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-18 13:42:02 +00:00
140 lines
6.7 KiB
C
140 lines
6.7 KiB
C
|
/* ******************************************************************
|
||
|
Huff0 : Huffman codec, part of New Generation Entropy library
|
||
|
header file, for static linking only
|
||
|
Copyright (C) 2013-2016, Yann Collet
|
||
|
|
||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||
|
|
||
|
Redistribution and use in source and binary forms, with or without
|
||
|
modification, are permitted provided that the following conditions are
|
||
|
met:
|
||
|
|
||
|
* Redistributions of source code must retain the above copyright
|
||
|
notice, this list of conditions and the following disclaimer.
|
||
|
* Redistributions in binary form must reproduce the above
|
||
|
copyright notice, this list of conditions and the following disclaimer
|
||
|
in the documentation and/or other materials provided with the
|
||
|
distribution.
|
||
|
|
||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
|
||
|
You can contact the author at :
|
||
|
- Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
||
|
****************************************************************** */
|
||
|
#ifndef HUFF0_STATIC_H
|
||
|
#define HUFF0_STATIC_H
|
||
|
|
||
|
#if defined (__cplusplus)
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* ****************************************
|
||
|
* Dependency
|
||
|
******************************************/
|
||
|
#include "huff0.h"
|
||
|
|
||
|
|
||
|
/* ****************************************
|
||
|
* Static allocation
|
||
|
******************************************/
|
||
|
/* Huff0 buffer bounds */
|
||
|
#define HUF_CTABLEBOUND 129
|
||
|
#define HUF_BLOCKBOUND(size) (size + (size>>8) + 8) /* only true if incompressible pre-filtered with fast heuristic */
|
||
|
#define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
|
||
|
|
||
|
/* static allocation of Huff0's Compression Table */
|
||
|
#define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \
|
||
|
U32 name##hb[maxSymbolValue+1]; \
|
||
|
void* name##hv = &(name##hb); \
|
||
|
HUF_CElt* name = (HUF_CElt*)(name##hv) /* no final ; */
|
||
|
|
||
|
/* static allocation of Huff0's DTable */
|
||
|
#define HUF_DTABLE_SIZE(maxTableLog) (1 + (1<<maxTableLog))
|
||
|
#define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \
|
||
|
unsigned short DTable[HUF_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
|
||
|
#define HUF_CREATE_STATIC_DTABLEX4(DTable, maxTableLog) \
|
||
|
unsigned int DTable[HUF_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
|
||
|
#define HUF_CREATE_STATIC_DTABLEX6(DTable, maxTableLog) \
|
||
|
unsigned int DTable[HUF_DTABLE_SIZE(maxTableLog) * 3 / 2] = { maxTableLog }
|
||
|
|
||
|
|
||
|
/* ****************************************
|
||
|
* Advanced decompression functions
|
||
|
******************************************/
|
||
|
size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
|
||
|
size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* double-symbols decoder */
|
||
|
size_t HUF_decompress4X6 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* quad-symbols decoder */
|
||
|
|
||
|
|
||
|
/* ****************************************
|
||
|
* Huff0 detailed API
|
||
|
******************************************/
|
||
|
/*!
|
||
|
HUF_compress() does the following:
|
||
|
1. count symbol occurrence from source[] into table count[] using FSE_count()
|
||
|
2. build Huffman table from count using HUF_buildCTable()
|
||
|
3. save Huffman table to memory buffer using HUF_writeCTable()
|
||
|
4. encode the data stream using HUF_compress_usingCTable()
|
||
|
|
||
|
The following API allows targeting specific sub-functions for advanced tasks.
|
||
|
For example, it's possible to compress several blocks using the same 'CTable',
|
||
|
or to save and regenerate 'CTable' using external methods.
|
||
|
*/
|
||
|
/* FSE_count() : find it within "fse.h" */
|
||
|
typedef struct HUF_CElt_s HUF_CElt; /* incomplete type */
|
||
|
size_t HUF_buildCTable (HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue, unsigned maxNbBits);
|
||
|
size_t HUF_writeCTable (void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog);
|
||
|
size_t HUF_compress4X_into4Segments(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable);
|
||
|
|
||
|
|
||
|
/*!
|
||
|
HUF_decompress() does the following:
|
||
|
1. select the decompression algorithm (X2, X4, X6) based on pre-computed heuristics
|
||
|
2. build Huffman table from save, using HUF_readDTableXn()
|
||
|
3. decode 1 or 4 segments in parallel using HUF_decompressSXn_usingDTable
|
||
|
*/
|
||
|
size_t HUF_readDTableX2 (unsigned short* DTable, const void* src, size_t srcSize);
|
||
|
size_t HUF_readDTableX4 (unsigned* DTable, const void* src, size_t srcSize);
|
||
|
size_t HUF_readDTableX6 (unsigned* DTable, const void* src, size_t srcSize);
|
||
|
|
||
|
size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned short* DTable);
|
||
|
size_t HUF_decompress4X4_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned* DTable);
|
||
|
size_t HUF_decompress4X6_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned* DTable);
|
||
|
|
||
|
|
||
|
/* single stream variants */
|
||
|
|
||
|
size_t HUF_compress1X (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
|
||
|
size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable);
|
||
|
|
||
|
size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
|
||
|
size_t HUF_decompress1X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* double-symbol decoder */
|
||
|
size_t HUF_decompress1X6 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* quad-symbol decoder */
|
||
|
|
||
|
size_t HUF_decompress1X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned short* DTable);
|
||
|
size_t HUF_decompress1X4_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned* DTable);
|
||
|
size_t HUF_decompress1X6_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned* DTable);
|
||
|
|
||
|
|
||
|
/* Loading a CTable saved with HUF_writeCTable() */
|
||
|
|
||
|
size_t HUF_readCTable (HUF_CElt* CTable, unsigned maxSymbolValue, const void* src, size_t srcSize);
|
||
|
|
||
|
|
||
|
#if defined (__cplusplus)
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* HUFF0_STATIC_H */
|