TurboPFor: TurboPFor encode/decode c/c++ header
This commit is contained in:
80
vp4.h
80
vp4.h
@ -22,13 +22,83 @@
|
||||
- email : powturbo [_AT_] gmail [_DOT_] com
|
||||
**/
|
||||
// "Integer Compression" Turbo PforDelta
|
||||
#ifndef VP4_H_
|
||||
#define VP4_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#include <stdint.h>
|
||||
//#include <assert.h>
|
||||
|
||||
#define P4D_MAX 256
|
||||
|
||||
//********************************************** TurboPFor: Encode *****************************************************************************
|
||||
//#include <assert.h>
|
||||
// Low level API: Single block n limited
|
||||
//compress integer array with n values to the buffer out. Return value = end of compressed buffer out
|
||||
unsigned char *p4enc16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out);
|
||||
unsigned char *p4enc32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out);
|
||||
unsigned char *p4enc128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out); // SIMD (Vertical bitpacking)
|
||||
unsigned char *p4enc256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out); // SIMD (Vertical bitpacking)
|
||||
unsigned char *p4enc64( uint64_t *__restrict in, unsigned n, unsigned char *__restrict out);
|
||||
|
||||
unsigned char *p4encx16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out);// Direct access
|
||||
unsigned char *p4encx32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out);
|
||||
|
||||
unsigned char *p4denc16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start);
|
||||
unsigned char *p4denc32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
unsigned char *p4denc128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start); // SIMD (Vertical bitpacking)
|
||||
unsigned char *p4denc256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
unsigned char *p4denc64( uint64_t *__restrict in, unsigned n, unsigned char *__restrict out, uint64_t start);
|
||||
|
||||
unsigned char *p4dencx16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start);// Direct access
|
||||
unsigned char *p4dencx32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
|
||||
unsigned char *p4d1enc16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start);
|
||||
unsigned char *p4d1enc32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
unsigned char *p4d1enc128v32(unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start); // SIMD (Vertical bitpacking)
|
||||
unsigned char *p4d1enc256v32(unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
unsigned char *p4d1enc64( uint64_t *__restrict in, unsigned n, unsigned char *__restrict out, uint64_t start);
|
||||
|
||||
unsigned char *p4d1encx16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start);// Direct access
|
||||
unsigned char *p4d1encx32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
|
||||
// same as p4enc, but with b and bx as parameters. Call after _p4bitsXX
|
||||
ALWAYS_INLINE unsigned char *_p4enc16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned b, unsigned bx);
|
||||
ALWAYS_INLINE unsigned char *_p4enc32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned b, unsigned bx);
|
||||
ALWAYS_INLINE unsigned char *_p4enc128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned b, unsigned bx); // SIMD (Vertical bitpacking)
|
||||
ALWAYS_INLINE unsigned char *_p4enc256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned b, unsigned bx);
|
||||
ALWAYS_INLINE unsigned char *_p4enc64( uint64_t *__restrict in, unsigned n, unsigned char *__restrict out, unsigned b, unsigned bx);
|
||||
// calculate the best bit sizes b and bx, return b.
|
||||
ALWAYS_INLINE unsigned _p4bits16( unsigned short *__restrict in, unsigned n, unsigned *pbx);
|
||||
ALWAYS_INLINE unsigned _p4bits32( unsigned *__restrict in, unsigned n, unsigned *pbx);
|
||||
ALWAYS_INLINE unsigned _p4bits64( uint64_t *__restrict in, unsigned n, unsigned *pbx);
|
||||
|
||||
//----------------------- n unlimited ------------------
|
||||
// compress integer array with n values to the buffer out. Return value = end of compressed buffer out
|
||||
unsigned char *p4nenc16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out);
|
||||
unsigned char *p4nenc32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out);
|
||||
unsigned char *p4nenc128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out); // SIMD (Vertical bitpacking)
|
||||
unsigned char *p4nenc256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out);
|
||||
unsigned char *p4nenc64( uint64_t *__restrict in, unsigned n, unsigned char *__restrict out);
|
||||
|
||||
unsigned char *p4ndenc16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start);
|
||||
unsigned char *p4ndenc32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
unsigned char *p4ndenc128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start); // SIMD (Vertical bitpacking)
|
||||
unsigned char *p4ndenc256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
unsigned char *p4ndenc64( uint64_t *__restrict in, unsigned n, unsigned char *__restrict out, uint64_t start);
|
||||
|
||||
unsigned char *p4nd1enc16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start);
|
||||
unsigned char *p4nd1enc32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
unsigned char *p4nd1enc128v32(unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start); // SIMD (Vertical bitpacking)
|
||||
unsigned char *p4nd1enc256v32(unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start);
|
||||
unsigned char *p4nd1enc64( uint64_t *__restrict in, unsigned n, unsigned char *__restrict out, uint64_t start);
|
||||
|
||||
#define P4EB(_b_) (_b_ << 1)
|
||||
#define P4EBX(_b_, _bx_) (_bx_ << 8 | _b_ << 1 | 1)
|
||||
#define P4SAVE(_out_, _b_, _bx_) do { if(!_bx_) *_out_++ = P4EB(_b_);else *(unsigned short *)_out_ = P4EBX(_b_, _bx_), _out_ += 2; } while(0)
|
||||
|
||||
//********************************************** TurboPFor: Decode *****************************************************************************
|
||||
//----TurboPFor low level API: single block. n limited to P4D_MAX -------------------------------------------------------
|
||||
// decompress a previously (with p4enc32) 32/64 bits packed array. Return value = end of packed buffer in
|
||||
//-- scalar. (see p4getx32 for direct access)
|
||||
@ -95,8 +165,8 @@ unsigned char *p4nd1dec128v32(unsigned char *__restrict in, unsigned n, unsigned
|
||||
unsigned char *p4nd1dec256v32(unsigned char *__restrict in, unsigned n, unsigned *__restrict out, unsigned start);
|
||||
unsigned char *p4nd1dec64( unsigned char *__restrict in, unsigned n, uint64_t *__restrict out, uint64_t start);
|
||||
|
||||
#define P4D_MAX 256
|
||||
//---------------- Direct Access functions to compressed TurboPFor array p4encx16/p4encx32 -------------------------------------------------------
|
||||
#ifndef NTURBOPFOR_DAC
|
||||
#define P4D_PAD8(_x_) ( (((_x_)+8-1)/8) )
|
||||
#define P4D_B(_x_) (((_x_) >> 1) & 0x3f)
|
||||
#define P4D_XB(_x_) (((_x_) & 1)?((_x_) >> 8):0)
|
||||
@ -146,12 +216,16 @@ static ALWAYS_INLINE unsigned p4getx32(struct p4 *p4, unsigned char *in, unsigne
|
||||
static ALWAYS_INLINE unsigned short p4geqx16(struct p4 *p4, unsigned char *in, unsigned b, unsigned short val) { do p4->oval += p4getx16(p4, in, ++p4->idx, b)+1; while(p4->oval < val); return p4->oval; }
|
||||
static ALWAYS_INLINE unsigned p4geqx32(struct p4 *p4, unsigned char *in, unsigned b, unsigned val) { do p4->oval += p4getx32(p4, in, ++p4->idx, b)+1; while(p4->oval < val); return p4->oval; }
|
||||
//static ALWAYS_INLINE uint64_t p4geq64(struct p4 *p4, unsigned char *__restrict in, unsigned b, uint64_t val) { do p4->oval += p4getx64(p4, in, ++p4->idx, b)+1; while(p4->oval < val); return p4->oval; }
|
||||
|
||||
|
||||
/* DO NOT USE : like p4dec32 but using direct access. This is only a demo showing direct access usage. Use p4dec32 instead for decompressing entire blocks */
|
||||
unsigned char *p4decx32( unsigned char *in, unsigned n, unsigned *out); // unsorted
|
||||
unsigned char *p4f0decx32(unsigned char *in, unsigned n, unsigned *out, unsigned start); // FOR increasing
|
||||
unsigned char *p4fdecx32( unsigned char *in, unsigned n, unsigned *out, unsigned start); // FOR strictly increasing
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user