in aios/storage/indexlib/index/common/numeric_compress/NosseNewPfordeltaCompressor.h [693:944]
inline void NosseNewPForDeltaCompressor::S9Decode(T* dest, uint32_t* src, size_t srcLen, size_t firstExceptionPos,
uint32_t frameBits)
{
size_t currentPos = firstExceptionPos;
uint32_t head = 0;
for (size_t i = 0; i < srcLen; i++) {
uint32_t val = src[i];
uint32_t header = (val >> 28) + head;
switch (header) {
case 0: // code num : 28, bitwidth : 1
{
dest[currentPos] |= ((val << 4) >> 31) << frameBits;
currentPos += ((val << 5) >> 31) + 1;
dest[currentPos] |= ((val << 6) >> 31) << frameBits;
currentPos += ((val << 7) >> 31) + 1;
dest[currentPos] |= ((val << 8) >> 31) << frameBits;
currentPos += ((val << 9) >> 31) + 1;
dest[currentPos] |= ((val << 10) >> 31) << frameBits;
currentPos += ((val << 11) >> 31) + 1;
dest[currentPos] |= ((val << 12) >> 31) << frameBits;
currentPos += ((val << 13) >> 31) + 1; // 10
dest[currentPos] |= ((val << 14) >> 31) << frameBits;
currentPos += ((val << 15) >> 31) + 1;
dest[currentPos] |= ((val << 16) >> 31) << frameBits;
currentPos += ((val << 17) >> 31) + 1;
dest[currentPos] |= ((val << 18) >> 31) << frameBits;
currentPos += ((val << 19) >> 31) + 1;
dest[currentPos] |= ((val << 20) >> 31) << frameBits;
currentPos += ((val << 21) >> 31) + 1;
dest[currentPos] |= ((val << 22) >> 31) << frameBits;
currentPos += ((val << 23) >> 31) + 1; // 20
dest[currentPos] |= ((val << 24) >> 31) << frameBits;
currentPos += ((val << 25) >> 31) + 1;
dest[currentPos] |= ((val << 26) >> 31) << frameBits;
currentPos += ((val << 27) >> 31) + 1;
dest[currentPos] |= ((val << 28) >> 31) << frameBits;
currentPos += ((val << 29) >> 31) + 1;
dest[currentPos] |= ((val << 30) >> 31) << frameBits;
currentPos += ((val << 31) >> 31) + 1;
head = 0;
break;
}
case 1: // code num : 14, bitwidth : 2
{
dest[currentPos] |= ((val << 4) >> 30) << frameBits;
currentPos += ((val << 6) >> 30) + 1;
dest[currentPos] |= ((val << 8) >> 30) << frameBits;
currentPos += ((val << 10) >> 30) + 1;
dest[currentPos] |= ((val << 12) >> 30) << frameBits;
currentPos += ((val << 14) >> 30) + 1;
dest[currentPos] |= ((val << 16) >> 30) << frameBits;
currentPos += ((val << 18) >> 30) + 1;
dest[currentPos] |= ((val << 20) >> 30) << frameBits;
currentPos += ((val << 22) >> 30) + 1; // 10
dest[currentPos] |= ((val << 24) >> 30) << frameBits;
currentPos += ((val << 26) >> 30) + 1;
dest[currentPos] |= ((val << 28) >> 30) << frameBits;
currentPos += ((val << 30) >> 30) + 1;
head = 0;
break;
}
case 2: // code num : 9, bitwidth : 3
{
dest[currentPos] |= ((val << 5) >> 29) << frameBits;
currentPos += ((val << 8) >> 29) + 1;
dest[currentPos] |= ((val << 11) >> 29) << frameBits;
currentPos += ((val << 14) >> 29) + 1;
dest[currentPos] |= ((val << 17) >> 29) << frameBits;
currentPos += ((val << 20) >> 29) + 1;
dest[currentPos] |= ((val << 23) >> 29) << frameBits;
currentPos += ((val << 26) >> 29) + 1;
dest[currentPos] |= ((val << 29) >> 29) << frameBits;
head = 16;
break;
}
case 3: // code num : 7, bitwidth : 4
{
dest[currentPos] |= ((val << 4) >> 28) << frameBits;
currentPos += ((val << 8) >> 28) + 1;
dest[currentPos] |= ((val << 12) >> 28) << frameBits;
currentPos += ((val << 16) >> 28) + 1;
dest[currentPos] |= ((val << 20) >> 28) << frameBits;
currentPos += ((val << 24) >> 28) + 1;
dest[currentPos] |= ((val << 28) >> 28) << frameBits;
head = 16;
break;
}
case 4: // code num : 5, bitwidth : 5
{
dest[currentPos] |= ((val << 7) >> 27) << frameBits;
currentPos += ((val << 12) >> 27) + 1;
dest[currentPos] |= ((val << 17) >> 27) << frameBits;
currentPos += ((val << 22) >> 27) + 1;
dest[currentPos] |= ((val << 27) >> 27) << frameBits;
head = 16;
break;
}
case 5: // code num : 4, bitwidth : 7
{
dest[currentPos] |= ((val << 4) >> 25) << frameBits;
currentPos += ((val << 11) >> 25) + 1;
dest[currentPos] |= ((val << 18) >> 25) << frameBits;
currentPos += ((val << 25) >> 25) + 1;
head = 0;
break;
}
case 6: // code num : 3, bitwidth : 9
{
dest[currentPos] |= ((val << 5) >> 23) << frameBits;
currentPos += ((val << 14) >> 23) + 1;
dest[currentPos] |= ((val << 23) >> 23) << frameBits;
head = 16;
break;
}
case 7: // code num : 2, bitwidth : 14
{
dest[currentPos] |= ((val << 4) >> 18) << frameBits;
currentPos += ((val << 18) >> 18) + 1;
head = 0;
break;
}
case 8: // code num : 1, bitwidth : 28
{
dest[currentPos] |= ((val << 4) >> 4) << frameBits;
head = 16;
break;
}
case 16: // code num : 28, bitwidth : 1
{
currentPos += ((val << 4) >> 31) + 1;
dest[currentPos] |= ((val << 5) >> 31) << frameBits;
currentPos += ((val << 6) >> 31) + 1;
dest[currentPos] |= ((val << 7) >> 31) << frameBits;
currentPos += ((val << 8) >> 31) + 1;
dest[currentPos] |= ((val << 9) >> 31) << frameBits;
currentPos += ((val << 10) >> 31) + 1;
dest[currentPos] |= ((val << 11) >> 31) << frameBits;
currentPos += ((val << 12) >> 31) + 1;
dest[currentPos] |= ((val << 13) >> 31) << frameBits; // 10
currentPos += ((val << 14) >> 31) + 1;
dest[currentPos] |= ((val << 15) >> 31) << frameBits;
currentPos += ((val << 16) >> 31) + 1;
dest[currentPos] |= ((val << 17) >> 31) << frameBits;
currentPos += ((val << 18) >> 31) + 1;
dest[currentPos] |= ((val << 19) >> 31) << frameBits;
currentPos += ((val << 20) >> 31) + 1;
dest[currentPos] |= ((val << 21) >> 31) << frameBits;
currentPos += ((val << 22) >> 31) + 1;
dest[currentPos] |= ((val << 23) >> 31) << frameBits; // 20
currentPos += ((val << 24) >> 31) + 1;
dest[currentPos] |= ((val << 25) >> 31) << frameBits;
currentPos += ((val << 26) >> 31) + 1;
dest[currentPos] |= ((val << 27) >> 31) << frameBits;
currentPos += ((val << 28) >> 31) + 1;
dest[currentPos] |= ((val << 29) >> 31) << frameBits;
currentPos += ((val << 30) >> 31) + 1;
dest[currentPos] |= ((val << 31) >> 31) << frameBits;
head = 16;
break;
}
case 17: // code num : 14, bitwidth : 2
{
currentPos += ((val << 4) >> 30) + 1;
dest[currentPos] |= ((val << 6) >> 30) << frameBits;
currentPos += ((val << 8) >> 30) + 1;
dest[currentPos] |= ((val << 10) >> 30) << frameBits;
currentPos += ((val << 12) >> 30) + 1;
dest[currentPos] |= ((val << 14) >> 30) << frameBits;
currentPos += ((val << 16) >> 30) + 1;
dest[currentPos] |= ((val << 18) >> 30) << frameBits;
currentPos += ((val << 20) >> 30) + 1;
dest[currentPos] |= ((val << 22) >> 30) << frameBits; // 10
currentPos += ((val << 24) >> 30) + 1;
dest[currentPos] |= ((val << 26) >> 30) << frameBits;
currentPos += ((val << 28) >> 30) + 1;
dest[currentPos] |= ((val << 30) >> 30) << frameBits;
head = 16;
break;
}
case 18: // code num : 9, bitwidth : 3
{
currentPos += ((val << 5) >> 29) + 1;
dest[currentPos] |= ((val << 8) >> 29) << frameBits;
currentPos += ((val << 11) >> 29) + 1;
dest[currentPos] |= ((val << 14) >> 29) << frameBits;
currentPos += ((val << 17) >> 29) + 1;
dest[currentPos] |= ((val << 20) >> 29) << frameBits;
currentPos += ((val << 23) >> 29) + 1;
dest[currentPos] |= ((val << 26) >> 29) << frameBits;
currentPos += ((val << 29) >> 29) + 1;
head = 0;
break;
}
case 19: // code num : 7, bitwidth : 4
{
currentPos += ((val << 4) >> 28) + 1;
dest[currentPos] |= ((val << 8) >> 28) << frameBits;
currentPos += ((val << 12) >> 28) + 1;
dest[currentPos] |= ((val << 16) >> 28) << frameBits;
currentPos += ((val << 20) >> 28) + 1;
dest[currentPos] |= ((val << 24) >> 28) << frameBits;
currentPos += ((val << 28) >> 28) + 1;
head = 0;
break;
}
case 20: // code num : 5, bitwidth : 5
{
currentPos += ((val << 7) >> 27) + 1;
dest[currentPos] |= ((val << 12) >> 27) << frameBits;
currentPos += ((val << 17) >> 27) + 1;
dest[currentPos] |= ((val << 22) >> 27) << frameBits;
currentPos += ((val << 27) >> 27) + 1;
head = 0;
break;
}
case 21: // code num : 4, bitwidth : 7
{
currentPos += ((val << 4) >> 25) + 1;
dest[currentPos] |= ((val << 11) >> 25) << frameBits;
currentPos += ((val << 18) >> 25) + 1;
dest[currentPos] |= ((val << 25) >> 25) << frameBits;
head = 16;
break;
}
case 22: // code num : 3, bitwidth : 9
{
currentPos += ((val << 5) >> 23) + 1;
dest[currentPos] |= ((val << 14) >> 23) << frameBits;
currentPos += ((val << 23) >> 23) + 1;
head = 0;
break;
}
case 23: // code num : 2, bitwidth : 14
{
currentPos += ((val << 4) >> 18) + 1;
dest[currentPos] |= ((val << 18) >> 18) << frameBits;
head = 16;
break;
}
case 24: // code num : 1, bitwidth : 28
{
currentPos += ((val << 4) >> 4) + 1;
head = 0;
break;
}
default:
assert(false);
} // end switch
} // end for
}