void SectionAttributeEncoder::DecodeSectionLens()

in aios/storage/indexlib/indexlib/common/field_format/section_attribute/section_attribute_encoder.cpp [134:372]


void SectionAttributeEncoder::DecodeSectionLens(const uint8_t*& srcCursor, uint8_t*& destCursor, uint8_t* destEnd)
{
    section_len_t* sectionLenCursor = (section_len_t*)destCursor;
    uint32_t k = ((uint32_t)(*srcCursor)) >> 28;
    CheckBufferLen(sectionLenCursor, (section_len_t*)destEnd, itemNumPerUnit[k]);
    uint32_t itemCount =
        index::S16Compressor::DecodeOneUnit(sectionLenCursor, (section_len_t*)destEnd, (const uint32_t*)srcCursor);
    uint32_t sectionCount = (uint32_t)(*sectionLenCursor);

    sectionLenCursor += itemCount;
    srcCursor += sizeof(uint32_t);
    int32_t leftCount = (int32_t)sectionCount;
    leftCount -= itemCount - 1;

    CheckBufferLen(sectionLenCursor, (section_len_t*)destEnd, leftCount);

    while (leftCount > 0) {
        const uint32_t* src = (const uint32_t*)srcCursor;
        uint32_t k = (*src) >> 28;
        // uint64_t tmpCursor=0;

        switch (k) {
        case 0:
            sectionLenCursor[0] = (*src) & 1;
            sectionLenCursor[1] = (*src >> 1) & 1;
            sectionLenCursor[2] = (*src >> 2) & 1;
            sectionLenCursor[3] = (*src >> 3) & 1;
            sectionLenCursor[4] = (*src >> 4) & 1;
            sectionLenCursor[5] = (*src >> 5) & 1;
            sectionLenCursor[6] = (*src >> 6) & 1;
            sectionLenCursor[7] = (*src >> 7) & 1;
            sectionLenCursor[8] = (*src >> 8) & 1;
            sectionLenCursor[9] = (*src >> 9) & 1;
            sectionLenCursor[10] = (*src >> 10) & 1;
            sectionLenCursor[11] = (*src >> 11) & 1;
            sectionLenCursor[12] = (*src >> 12) & 1;
            sectionLenCursor[13] = (*src >> 13) & 1;
            sectionLenCursor[14] = (*src >> 14) & 1;
            sectionLenCursor[15] = (*src >> 15) & 1;
            sectionLenCursor[16] = (*src >> 16) & 1;
            sectionLenCursor[17] = (*src >> 17) & 1;
            sectionLenCursor[18] = (*src >> 18) & 1;
            sectionLenCursor[19] = (*src >> 19) & 1;
            sectionLenCursor[20] = (*src >> 20) & 1;
            sectionLenCursor[21] = (*src >> 21) & 1;
            sectionLenCursor[22] = (*src >> 22) & 1;
            sectionLenCursor[23] = (*src >> 23) & 1;
            sectionLenCursor[24] = (*src >> 24) & 1;
            sectionLenCursor[25] = (*src >> 25) & 1;
            sectionLenCursor[26] = (*src >> 26) & 1;
            sectionLenCursor[27] = (*src >> 27) & 1;
            sectionLenCursor += 28;
            break;
        case 1:
            sectionLenCursor[0] = (*src) & 3;
            sectionLenCursor[1] = (*src >> 2) & 3;
            sectionLenCursor[2] = (*src >> 4) & 3;
            sectionLenCursor[3] = (*src >> 6) & 3;
            sectionLenCursor[4] = (*src >> 8) & 3;
            sectionLenCursor[5] = (*src >> 10) & 3;
            sectionLenCursor[6] = (*src >> 12) & 3;
            sectionLenCursor[7] = (*src >> 14) & 1;
            sectionLenCursor[8] = (*src >> 15) & 1;
            sectionLenCursor[9] = (*src >> 16) & 1;
            sectionLenCursor[10] = (*src >> 17) & 1;
            sectionLenCursor[11] = (*src >> 18) & 1;
            sectionLenCursor[12] = (*src >> 19) & 1;
            sectionLenCursor[13] = (*src >> 20) & 1;
            sectionLenCursor[14] = (*src >> 21) & 1;
            sectionLenCursor[15] = (*src >> 22) & 1;
            sectionLenCursor[16] = (*src >> 23) & 1;
            sectionLenCursor[17] = (*src >> 24) & 1;
            sectionLenCursor[18] = (*src >> 25) & 1;
            sectionLenCursor[19] = (*src >> 26) & 1;
            sectionLenCursor[20] = (*src >> 27) & 1;
            sectionLenCursor += 21;
            break;
        case 2:
            sectionLenCursor[0] = (*src) & 1;
            sectionLenCursor[1] = (*src >> 1) & 1;
            sectionLenCursor[2] = (*src >> 2) & 1;
            sectionLenCursor[3] = (*src >> 3) & 1;
            sectionLenCursor[4] = (*src >> 4) & 1;
            sectionLenCursor[5] = (*src >> 5) & 1;
            sectionLenCursor[6] = (*src >> 6) & 1;
            sectionLenCursor[7] = (*src >> 7) & 3;
            sectionLenCursor[8] = (*src >> 9) & 3;
            sectionLenCursor[9] = (*src >> 11) & 3;
            sectionLenCursor[10] = (*src >> 13) & 3;
            sectionLenCursor[11] = (*src >> 15) & 3;
            sectionLenCursor[12] = (*src >> 17) & 3;
            sectionLenCursor[13] = (*src >> 19) & 3;
            sectionLenCursor[14] = (*src >> 21) & 1;
            sectionLenCursor[15] = (*src >> 22) & 1;
            sectionLenCursor[16] = (*src >> 23) & 1;
            sectionLenCursor[17] = (*src >> 24) & 1;
            sectionLenCursor[18] = (*src >> 25) & 1;
            sectionLenCursor[19] = (*src >> 26) & 1;
            sectionLenCursor[20] = (*src >> 27) & 1;
            sectionLenCursor += 21;
            break;
        case 3:
            sectionLenCursor[0] = (*src) & 1;
            sectionLenCursor[1] = (*src >> 1) & 1;
            sectionLenCursor[2] = (*src >> 2) & 1;
            sectionLenCursor[3] = (*src >> 3) & 1;
            sectionLenCursor[4] = (*src >> 4) & 1;
            sectionLenCursor[5] = (*src >> 5) & 1;
            sectionLenCursor[6] = (*src >> 6) & 1;
            sectionLenCursor[7] = (*src >> 7) & 1;
            sectionLenCursor[8] = (*src >> 8) & 1;
            sectionLenCursor[9] = (*src >> 9) & 1;
            sectionLenCursor[10] = (*src >> 10) & 1;
            sectionLenCursor[11] = (*src >> 11) & 1;
            sectionLenCursor[12] = (*src >> 12) & 1;
            sectionLenCursor[13] = (*src >> 13) & 1;
            sectionLenCursor[14] = (*src >> 14) & 3;
            sectionLenCursor[15] = (*src >> 16) & 3;
            sectionLenCursor[16] = (*src >> 18) & 3;
            sectionLenCursor[17] = (*src >> 20) & 3;
            sectionLenCursor[18] = (*src >> 22) & 3;
            sectionLenCursor[19] = (*src >> 24) & 3;
            sectionLenCursor[20] = (*src >> 26) & 3;
            sectionLenCursor += 21;
            break;
        case 4:
            sectionLenCursor[0] = (*src) & 3;
            sectionLenCursor[1] = (*src >> 2) & 3;
            sectionLenCursor[2] = (*src >> 4) & 3;
            sectionLenCursor[3] = (*src >> 6) & 3;
            sectionLenCursor[4] = (*src >> 8) & 3;
            sectionLenCursor[5] = (*src >> 10) & 3;
            sectionLenCursor[6] = (*src >> 12) & 3;
            sectionLenCursor[7] = (*src >> 14) & 3;
            sectionLenCursor[8] = (*src >> 16) & 3;
            sectionLenCursor[9] = (*src >> 18) & 3;
            sectionLenCursor[10] = (*src >> 20) & 3;
            sectionLenCursor[11] = (*src >> 22) & 3;
            sectionLenCursor[12] = (*src >> 24) & 3;
            sectionLenCursor[13] = (*src >> 26) & 3;
            sectionLenCursor += 14;
            break;
        case 5:
            sectionLenCursor[0] = (*src) & 15;
            sectionLenCursor[1] = (*src >> 4) & 7;
            sectionLenCursor[2] = (*src >> 7) & 7;
            sectionLenCursor[3] = (*src >> 10) & 7;
            sectionLenCursor[4] = (*src >> 13) & 7;
            sectionLenCursor[5] = (*src >> 16) & 7;
            sectionLenCursor[6] = (*src >> 19) & 7;
            sectionLenCursor[7] = (*src >> 22) & 7;
            sectionLenCursor[8] = (*src >> 25) & 7;
            sectionLenCursor += 9;
            break;
        case 6:
            sectionLenCursor[0] = (*src) & 7;
            sectionLenCursor[1] = (*src >> 3) & 15;
            sectionLenCursor[2] = (*src >> 7) & 15;
            sectionLenCursor[3] = (*src >> 11) & 15;
            sectionLenCursor[4] = (*src >> 15) & 15;
            sectionLenCursor[5] = (*src >> 19) & 7;
            sectionLenCursor[6] = (*src >> 22) & 7;
            sectionLenCursor[7] = (*src >> 25) & 7;
            sectionLenCursor += 8;
            break;
        case 7:
            sectionLenCursor[0] = (*src) & 15;
            sectionLenCursor[1] = (*src >> 4) & 15;
            sectionLenCursor[2] = (*src >> 8) & 15;
            sectionLenCursor[3] = (*src >> 12) & 15;
            sectionLenCursor[4] = (*src >> 16) & 15;
            sectionLenCursor[5] = (*src >> 20) & 15;
            sectionLenCursor[6] = (*src >> 24) & 15;
            sectionLenCursor += 7;
            break;
        case 8:
            sectionLenCursor[0] = (*src) & 31;
            sectionLenCursor[1] = (*src >> 5) & 31;
            sectionLenCursor[2] = (*src >> 10) & 31;
            sectionLenCursor[3] = (*src >> 15) & 31;
            sectionLenCursor[4] = (*src >> 20) & 15;
            sectionLenCursor[5] = (*src >> 24) & 15;
            sectionLenCursor += 6;
            break;
        case 9:
            sectionLenCursor[0] = (*src) & 15;
            sectionLenCursor[1] = (*src >> 4) & 15;
            sectionLenCursor[2] = (*src >> 8) & 31;
            sectionLenCursor[3] = (*src >> 13) & 31;
            sectionLenCursor[4] = (*src >> 18) & 31;
            sectionLenCursor[5] = (*src >> 23) & 31;
            sectionLenCursor += 6;
            break;
        case 10:
            sectionLenCursor[0] = (*src) & 63;
            sectionLenCursor[1] = (*src >> 6) & 63;
            sectionLenCursor[2] = (*src >> 12) & 63;
            sectionLenCursor[3] = (*src >> 18) & 31;
            sectionLenCursor[4] = (*src >> 23) & 31;
            sectionLenCursor += 5;
            break;
        case 11:
            sectionLenCursor[0] = (*src) & 31;
            sectionLenCursor[1] = (*src >> 5) & 31;
            sectionLenCursor[2] = (*src >> 10) & 63;
            sectionLenCursor[3] = (*src >> 16) & 63;
            sectionLenCursor[4] = (*src >> 22) & 63;
            sectionLenCursor += 5;
            break;
        case 12:
            sectionLenCursor[0] = (*src) & 127;
            sectionLenCursor[1] = (*src >> 7) & 127;
            sectionLenCursor[2] = (*src >> 14) & 127;
            sectionLenCursor[3] = (*src >> 21) & 127;
            sectionLenCursor += 4;
            break;
        case 13:
            sectionLenCursor[0] = (*src) & 1023;
            sectionLenCursor[1] = (*src >> 10) & 511;
            sectionLenCursor[2] = (*src >> 19) & 511;
            sectionLenCursor += 3;
            break;
        case 14:
            sectionLenCursor[0] = (*src) & 16383;
            sectionLenCursor[1] = (*src >> 14) & 16383;
            sectionLenCursor += 2;
            break;
        case 15:
            *sectionLenCursor++ = (*src) & ((1 << 28) - 1);
            break;
        }

        itemCount = itemNumPerUnit[k];
        leftCount -= itemCount;
        srcCursor += sizeof(uint32_t);
    }

    destCursor = (uint8_t*)sectionLenCursor;
}