inline void NewPForDeltaCompressor::S9Decode()

in aios/storage/indexlib/index/common/numeric_compress/NewPfordeltaCompressor.h [741:992]


inline void NewPForDeltaCompressor::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
}