17 using TUI=
typename std::make_unsigned<TI>::type;
24 for(
size_t i= 0; i < data.
length(); ++i)
26 TUI val= data.
get( i );
27 int bytes=
sizeof(TUI);
45 for(
size_t i= 0; i < data.
length(); ++i)
47 TUI val= data.
get( i );
52 he.
Write(uint8_t (val >> bits ) );
67 using TUI=
typename std::make_unsigned<TI>::type;
72 for(
size_t i= 0; i < data.
length(); ++i)
75 int bytes=
sizeof(TUI);
98 for(
size_t i= 0; i < data.
length(); ++i)
112 using TUI=
typename std::make_unsigned<TI>::type;
113 for(
size_t i= 0; i < data.
length(); ++i)
124 using TUI=
typename std::make_unsigned<TI>::type;
138 for(
size_t i= 0; i < data.
length(); ++i )
149 using TUI=
typename std::make_unsigned<TI>::type;
151 TUI min = br.
Read<TUI>();
155 for(
size_t i= 0; i < data.
length(); ++i)
159 for(
size_t i= 0; i < data.
length(); ++i)
160 data.
set(i, br.
Read<TUI>( bitCnt ) + min );
172 using TUI=
typename std::make_unsigned<TI>::type;
173 TUI first= data.
get(0);
175 for(
size_t i= 1; i < data.
length(); ++i)
177 TUI second= data.
get(i);
198 using TUI=
typename std::make_unsigned<TI>::type;
199 auto prevVal= br.
Read<TUI>();
200 data.
set(0, prevVal);
201 for(
size_t i= 1; i < data.
length(); ++i)
202 data.
set(i, prevVal= br.
Read<1>() ? prevVal
213 using TUI=
typename std::make_unsigned<TI>::type;
223 auto maxSegLen = (std::numeric_limits<size_t>::min)();
226 for(
int pass= 0 ; pass < 2 ; ++ pass )
229 TUI val = data.
get(0);
235 size_t segEnd= segStart + 1;
239 if( segEnd == data.
length() )
245 val= data.
get(segEnd);
247 sparse= (prevVal == val);
250 while( ( (prevVal == val) == sparse )
251 && ++segEnd < data.
length())
254 val = data.
get(segEnd);
262 maxSegLen= (std::max)( maxSegLen, segEnd - segStart );
269 bw.
Write( bitCntRep +1, (segEnd - segStart) << 1 );
270 bw.
Write( bitCntVal , TUI(prevVal - data.
min ) );
274 bw.
Write( bitCntRep +1, ((segEnd - segStart) << 1) | 1 );
275 for(
size_t j= segStart; j < segEnd; ++j)
276 bw.
Write( bitCntVal, TUI(data.
get(j) - data.
min ) );
283 while( segStart < data.
length() );
293 | bitCntVal << (lang::Log2OfSize<uint32_t>()+1) );
306 using TUI=
typename std::make_unsigned<TI>::type;
307 if( !data.
length() )
return;
313 TUI minVal = br.
Read<TUI>();
316 while( segStart < data.
length() )
318 size_t cntRep= br.
Read<
size_t>( bitCntRep + 1 );
319 size_t segEnd= segStart + (cntRep >> 1);
320 if( (cntRep & 1) == 0 )
322 TUI val = br.
Read<TUI>( bitCntVal ) + minVal;
323 for(
size_t i= segStart ; i < segEnd ; ++i )
328 for(
size_t i= segStart ; i < segEnd ; ++i )
329 data.
set(i, br.
Read<TUI>( bitCntVal ) + minVal);
345 using TUI=
typename std::make_unsigned<TI>::type;
364 TUI first= data.
get(0);
366 for(
size_t i= 1; i < data.
length(); ++i)
370 TUI second= data.
get(i);
376 bool posNeg= second >= first;
378 bw.
Write(posNeg ? bitCntPos : bitCntNeg,
379 posNeg ? TUI( second - first - data.
minInc )
380 : TUI( first - second - data.
minDec ) );
396 using TUI=
typename std::make_unsigned<TI>::type;
406 auto minDiffPos= br.
Read<TUI>();
407 auto minDiffNeg= br.
Read<TUI>();
408 auto prevVal = br.
Read<TUI>();
409 data.
set(0, prevVal);
410 for(
size_t i= 1; i < data.
length(); ++i)
417 bool posNeg= br.
Read<1>();
418 TUI diff = br.
Read<TUI>( posNeg ? bitCntPos : bitCntNeg );
419 val = posNeg ? TUI( prevVal + minDiffPos + diff )
420 : TUI( prevVal - minDiffNeg - diff );
422 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.