16 using TUI=
typename std::make_unsigned<TI>::type;
23 for(
size_t i= 0; i < data.
length(); ++i) {
24 TUI val= data.
get( i );
25 int bytes=
sizeof(TUI);
41 for(
size_t i= 0; i < data.
length(); ++i) {
42 TUI val= data.
get( i );
46 he.
Write(uint8_t (val >> bits ) );
58 using TUI=
typename std::make_unsigned<TI>::type;
63 for(
size_t i= 0; i < data.
length(); ++i) {
65 int bytes=
sizeof(TUI);
85 for(
size_t i= 0; i < data.
length(); ++i) {
96 using TUI=
typename std::make_unsigned<TI>::type;
97 for(
size_t i= 0; i < data.
length(); ++i)
107 using TUI=
typename std::make_unsigned<TI>::type;
121 for(
size_t i= 0; i < data.
length(); ++i )
131 using TUI=
typename std::make_unsigned<TI>::type;
133 TUI min = br.
Read<TUI>();
136 for(
size_t i= 0; i < data.
length(); ++i)
140 for(
size_t i= 0; i < data.
length(); ++i)
141 data.
set(i, br.
Read<TUI>( bitCnt ) + min );
152 using TUI=
typename std::make_unsigned<TI>::type;
153 TUI first= data.
get(0);
155 for(
size_t i= 1; i < data.
length(); ++i) {
156 TUI second= data.
get(i);
174 using TUI=
typename std::make_unsigned<TI>::type;
175 auto prevVal= br.
Read<TUI>();
176 data.
set(0, prevVal);
177 for(
size_t i= 1; i < data.
length(); ++i)
178 data.
set(i, prevVal= br.
Read<1>() ? prevVal
188 using TUI=
typename std::make_unsigned<TI>::type;
198 auto maxSegLen = (std::numeric_limits<size_t>::min)();
201 for(
int pass= 0 ; pass < 2 ; ++ pass ) {
203 TUI val = data.
get(0);
209 size_t segEnd= segStart + 1;
213 if( segEnd == data.
length() ) {
216 val= data.
get(segEnd);
218 sparse= (prevVal == val);
221 while( ( (prevVal == val) == sparse )
222 && ++segEnd < data.
length())
225 val = data.
get(segEnd);
233 maxSegLen= (std::max)( maxSegLen, segEnd - segStart );
239 bw.
Write( bitCntRep +1, (segEnd - segStart) << 1 );
240 bw.
Write( bitCntVal , TUI(prevVal - data.
min ) );
244 bw.
Write( bitCntRep +1, ((segEnd - segStart) << 1) | 1 );
245 for(
size_t j= segStart; j < segEnd; ++j)
246 bw.
Write( bitCntVal, TUI(data.
get(j) - data.
min ) );
252 while( segStart < data.
length() );
261 | bitCntVal << (lang::Log2OfSize<uint32_t>()+1) );
273 using TUI=
typename std::make_unsigned<TI>::type;
274 if( !data.
length() )
return;
280 TUI minVal = br.
Read<TUI>();
283 while( segStart < data.
length() ) {
284 size_t cntRep= br.
Read<
size_t>( bitCntRep + 1 );
285 size_t segEnd= segStart + (cntRep >> 1);
286 if( (cntRep & 1) == 0 ) {
287 TUI val = br.
Read<TUI>( bitCntVal ) + minVal;
288 for(
size_t i= segStart ; i < segEnd ; ++i )
292 for(
size_t i= segStart ; i < segEnd ; ++i )
293 data.
set(i, br.
Read<TUI>( bitCntVal ) + minVal);
307 using TUI=
typename std::make_unsigned<TI>::type;
309 if( data.
length() == 1 ) {
325 TUI first= data.
get(0);
327 for(
size_t i= 1; i < data.
length(); ++i) {
330 TUI second= data.
get(i);
335 bool posNeg= second >= first;
337 bw.
Write(posNeg ? bitCntPos : bitCntNeg,
338 posNeg ? TUI( second - first - data.
minInc )
339 : TUI( first - second - data.
minDec ) );
353 using TUI=
typename std::make_unsigned<TI>::type;
354 if( data.
length() == 1 ) {
362 auto minDiffPos= br.
Read<TUI>();
363 auto minDiffNeg= br.
Read<TUI>();
364 auto prevVal = br.
Read<TUI>();
365 data.
set(0, prevVal);
366 for(
size_t i= 1; i < data.
length(); ++i) {
371 bool posNeg= br.
Read<1>();
372 TUI diff = br.
Read<TUI>( posNeg ? bitCntPos : bitCntNeg );
373 val = posNeg ? TUI( prevVal + minDiffPos + diff )
374 : TUI( prevVal - minDiffNeg - diff );
376 data.
set(i, prevVal= val);
Reads bits from a BitBufferBase.
Writes bits into a BitBufferBase.
void Write(TIntegral value)
TUI maxDec
Maximum decrease between two adjacent values.
TUI max
Maximum value (when zig-zag encoded)
void set(size_t idx, TUI value)
TUI maxInc
Maximum increase between two adjacent values.
TUI min
Maximum value (when zig-zag encoded)
TUI minInc
Minimum increase between two adjacent values.
TUI get(size_t idx) const
TUI minDec
Minimum decrease between two adjacent values.
void Write(uint8_t symbol)
void CountSymbol(uint8_t symbol)
ALIB_DLL void Generate()
Generates the huffman encoding table and writes this information to the bit writer.
#define ALIB_WARNINGS_RESTORE
#define ALIB_WARNINGS_ALLOW_SHIFT_COUNT_OVERFLOW
void writeHuffman(BitWriter &bw, ArrayCompressor::Array< TI > &data)
void writeVerySparse(BitWriter &bw, ArrayCompressor::Array< TI > &data)
void readHuffman(BitReader &br, ArrayCompressor::Array< TI > &data)
void readSparse(BitReader &br, ArrayCompressor::Array< TI > &data)
void writeUncompressed(BitWriter &bw, ArrayCompressor::Array< TI > &data)
void readMinMax(BitReader &br, ArrayCompressor::Array< TI > &data)
void writeIncremental(BitWriter &bw, ArrayCompressor::Array< TI > &data)
void readVerySparse(BitReader &br, ArrayCompressor::Array< TI > &data)
void readUncompressed(BitReader &br, ArrayCompressor::Array< TI > &data)
void readIncremental(BitReader &br, ArrayCompressor::Array< TI > &data)
void writeSparse(BitWriter &bw, ArrayCompressor::Array< TI > &data)
void writeMinMax(BitWriter &bw, ArrayCompressor::Array< TI > &data)
constexpr int Log2OfSize()
constexpr int MSB(TIntegral value)
constexpr int MSB0(TIntegral value)
constexpr TIntegral LowerMask()
int ShiftOpRHS
Type alias in namespace alib.