in aios/storage/indexlib/index/common/field_format/section_attribute/SectionAttributeEncoder.cpp [151:392]
Status 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;
auto st = CheckBufferLen(sectionLenCursor, (section_len_t*)destEnd, _itemNumPerUnit[k]);
RETURN_IF_STATUS_ERROR(st, "check buffer failed.");
uint32_t itemCount =
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;
st = CheckBufferLen(sectionLenCursor, (section_len_t*)destEnd, leftCount);
RETURN_IF_STATUS_ERROR(st, "check buffer failed.");
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;
return Status::OK();
}