in aios/storage/indexlib/index/common/numeric_compress/S16Compressor.h [108:325]
inline uint32_t S16Compressor::DecodeOneUnit(T* dest, T* destEnd, const uint32_t* src)
{
uint32_t k = (*src) >> 28;
T* destCursor = dest;
switch (k) {
case 0:
// CheckBufferLen(dest, destEnd, 28);
*destCursor++ = (*src) & 1;
*destCursor++ = (*src >> 1) & 1;
*destCursor++ = (*src >> 2) & 1;
*destCursor++ = (*src >> 3) & 1;
*destCursor++ = (*src >> 4) & 1;
*destCursor++ = (*src >> 5) & 1;
*destCursor++ = (*src >> 6) & 1;
*destCursor++ = (*src >> 7) & 1;
*destCursor++ = (*src >> 8) & 1;
*destCursor++ = (*src >> 9) & 1;
*destCursor++ = (*src >> 10) & 1;
*destCursor++ = (*src >> 11) & 1;
*destCursor++ = (*src >> 12) & 1;
*destCursor++ = (*src >> 13) & 1;
*destCursor++ = (*src >> 14) & 1;
*destCursor++ = (*src >> 15) & 1;
*destCursor++ = (*src >> 16) & 1;
*destCursor++ = (*src >> 17) & 1;
*destCursor++ = (*src >> 18) & 1;
*destCursor++ = (*src >> 19) & 1;
*destCursor++ = (*src >> 20) & 1;
*destCursor++ = (*src >> 21) & 1;
*destCursor++ = (*src >> 22) & 1;
*destCursor++ = (*src >> 23) & 1;
*destCursor++ = (*src >> 24) & 1;
*destCursor++ = (*src >> 25) & 1;
*destCursor++ = (*src >> 26) & 1;
*destCursor++ = (*src >> 27) & 1;
break;
case 1:
// CheckBufferLen(dest, destEnd, 21);
*destCursor++ = (*src) & 3;
*destCursor++ = (*src >> 2) & 3;
*destCursor++ = (*src >> 4) & 3;
*destCursor++ = (*src >> 6) & 3;
*destCursor++ = (*src >> 8) & 3;
*destCursor++ = (*src >> 10) & 3;
*destCursor++ = (*src >> 12) & 3;
*destCursor++ = (*src >> 14) & 1;
*destCursor++ = (*src >> 15) & 1;
*destCursor++ = (*src >> 16) & 1;
*destCursor++ = (*src >> 17) & 1;
*destCursor++ = (*src >> 18) & 1;
*destCursor++ = (*src >> 19) & 1;
*destCursor++ = (*src >> 20) & 1;
*destCursor++ = (*src >> 21) & 1;
*destCursor++ = (*src >> 22) & 1;
*destCursor++ = (*src >> 23) & 1;
*destCursor++ = (*src >> 24) & 1;
*destCursor++ = (*src >> 25) & 1;
*destCursor++ = (*src >> 26) & 1;
*destCursor++ = (*src >> 27) & 1;
break;
case 2:
// CheckBufferLen(dest, destEnd, 21);
*destCursor++ = (*src) & 1;
*destCursor++ = (*src >> 1) & 1;
*destCursor++ = (*src >> 2) & 1;
*destCursor++ = (*src >> 3) & 1;
*destCursor++ = (*src >> 4) & 1;
*destCursor++ = (*src >> 5) & 1;
*destCursor++ = (*src >> 6) & 1;
*destCursor++ = (*src >> 7) & 3;
*destCursor++ = (*src >> 9) & 3;
*destCursor++ = (*src >> 11) & 3;
*destCursor++ = (*src >> 13) & 3;
*destCursor++ = (*src >> 15) & 3;
*destCursor++ = (*src >> 17) & 3;
*destCursor++ = (*src >> 19) & 3;
*destCursor++ = (*src >> 21) & 1;
*destCursor++ = (*src >> 22) & 1;
*destCursor++ = (*src >> 23) & 1;
*destCursor++ = (*src >> 24) & 1;
*destCursor++ = (*src >> 25) & 1;
*destCursor++ = (*src >> 26) & 1;
*destCursor++ = (*src >> 27) & 1;
break;
case 3:
// CheckBufferLen(dest, destEnd, 21);
*destCursor++ = (*src) & 1;
*destCursor++ = (*src >> 1) & 1;
*destCursor++ = (*src >> 2) & 1;
*destCursor++ = (*src >> 3) & 1;
*destCursor++ = (*src >> 4) & 1;
*destCursor++ = (*src >> 5) & 1;
*destCursor++ = (*src >> 6) & 1;
*destCursor++ = (*src >> 7) & 1;
*destCursor++ = (*src >> 8) & 1;
*destCursor++ = (*src >> 9) & 1;
*destCursor++ = (*src >> 10) & 1;
*destCursor++ = (*src >> 11) & 1;
*destCursor++ = (*src >> 12) & 1;
*destCursor++ = (*src >> 13) & 1;
*destCursor++ = (*src >> 14) & 3;
*destCursor++ = (*src >> 16) & 3;
*destCursor++ = (*src >> 18) & 3;
*destCursor++ = (*src >> 20) & 3;
*destCursor++ = (*src >> 22) & 3;
*destCursor++ = (*src >> 24) & 3;
*destCursor++ = (*src >> 26) & 3;
break;
case 4:
// CheckBufferLen(dest, destEnd, 14);
*destCursor++ = (*src) & 3;
*destCursor++ = (*src >> 2) & 3;
*destCursor++ = (*src >> 4) & 3;
*destCursor++ = (*src >> 6) & 3;
*destCursor++ = (*src >> 8) & 3;
*destCursor++ = (*src >> 10) & 3;
*destCursor++ = (*src >> 12) & 3;
*destCursor++ = (*src >> 14) & 3;
*destCursor++ = (*src >> 16) & 3;
*destCursor++ = (*src >> 18) & 3;
*destCursor++ = (*src >> 20) & 3;
*destCursor++ = (*src >> 22) & 3;
*destCursor++ = (*src >> 24) & 3;
*destCursor++ = (*src >> 26) & 3;
break;
case 5:
// CheckBufferLen(dest, destEnd, 9);
*destCursor++ = (*src) & 15;
*destCursor++ = (*src >> 4) & 7;
*destCursor++ = (*src >> 7) & 7;
*destCursor++ = (*src >> 10) & 7;
*destCursor++ = (*src >> 13) & 7;
*destCursor++ = (*src >> 16) & 7;
*destCursor++ = (*src >> 19) & 7;
*destCursor++ = (*src >> 22) & 7;
*destCursor++ = (*src >> 25) & 7;
break;
case 6:
// CheckBufferLen(dest, destEnd, 8);
*destCursor++ = (*src) & 7;
*destCursor++ = (*src >> 3) & 15;
*destCursor++ = (*src >> 7) & 15;
*destCursor++ = (*src >> 11) & 15;
*destCursor++ = (*src >> 15) & 15;
*destCursor++ = (*src >> 19) & 7;
*destCursor++ = (*src >> 22) & 7;
*destCursor++ = (*src >> 25) & 7;
break;
case 7:
// CheckBufferLen(dest, destEnd, 7);
*destCursor++ = (*src) & 15;
*destCursor++ = (*src >> 4) & 15;
*destCursor++ = (*src >> 8) & 15;
*destCursor++ = (*src >> 12) & 15;
*destCursor++ = (*src >> 16) & 15;
*destCursor++ = (*src >> 20) & 15;
*destCursor++ = (*src >> 24) & 15;
break;
case 8:
// CheckBufferLen(dest, destEnd, 6);
*destCursor++ = (*src) & 31;
*destCursor++ = (*src >> 5) & 31;
*destCursor++ = (*src >> 10) & 31;
*destCursor++ = (*src >> 15) & 31;
*destCursor++ = (*src >> 20) & 15;
*destCursor++ = (*src >> 24) & 15;
break;
case 9:
// CheckBufferLen(dest, destEnd, 6);
*destCursor++ = (*src) & 15;
*destCursor++ = (*src >> 4) & 15;
*destCursor++ = (*src >> 8) & 31;
*destCursor++ = (*src >> 13) & 31;
*destCursor++ = (*src >> 18) & 31;
*destCursor++ = (*src >> 23) & 31;
break;
case 10:
// CheckBufferLen(dest, destEnd, 5);
*destCursor++ = (*src) & 63;
*destCursor++ = (*src >> 6) & 63;
*destCursor++ = (*src >> 12) & 63;
*destCursor++ = (*src >> 18) & 31;
*destCursor++ = (*src >> 23) & 31;
break;
case 11:
// CheckBufferLen(dest, destEnd, 5);
*destCursor++ = (*src) & 31;
*destCursor++ = (*src >> 5) & 31;
*destCursor++ = (*src >> 10) & 63;
*destCursor++ = (*src >> 16) & 63;
*destCursor++ = (*src >> 22) & 63;
break;
case 12:
// CheckBufferLen(dest, destEnd, 4);
*destCursor++ = (*src) & 127;
*destCursor++ = (*src >> 7) & 127;
*destCursor++ = (*src >> 14) & 127;
*destCursor++ = (*src >> 21) & 127;
break;
case 13:
// CheckBufferLen(dest, destEnd, 3);
*destCursor++ = (*src) & 1023;
*destCursor++ = (*src >> 10) & 511;
*destCursor++ = (*src >> 19) & 511;
break;
case 14:
// CheckBufferLen(dest, destEnd, 2);
*destCursor++ = (*src) & 16383;
*destCursor++ = (*src >> 14) & 16383;
break;
case 15:
// CheckBufferLen(dest, destEnd, 1);
*destCursor++ = (*src) & ((1 << 28) - 1);
break;
}
return itemNumPerUnit[k];
}