inline uint32_t S16Compressor::DecodeOneUnit()

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];
}