aios/storage/indexlib/index/common/numeric_compress/UnalignedUnpack.h (2,654 lines of code) (raw):
/*
* Copyright 2014-present Alibaba Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <stdint.h>
namespace indexlib::index {
template <typename Type>
inline void unaligned_unpack_0(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
for (uint32_t i = 0; i < dataNum; ++i) {
decode[i] = 0;
}
}
template <typename Type>
inline void unaligned_unpack_1(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t val = encode[offset++];
decode[0] = (val << 31) >> 31;
if (--rest == 0)
return;
decode[1] = (val << 30) >> 31;
if (--rest == 0)
return;
decode[2] = (val << 29) >> 31;
if (--rest == 0)
return;
decode[3] = (val << 28) >> 31;
if (--rest == 0)
return;
decode[4] = (val << 27) >> 31;
if (--rest == 0)
return;
decode[5] = (val << 26) >> 31;
if (--rest == 0)
return;
decode[6] = (val << 25) >> 31;
if (--rest == 0)
return;
decode[7] = (val << 24) >> 31;
if (--rest == 0)
return;
decode[8] = (val << 23) >> 31;
if (--rest == 0)
return;
decode[9] = (val << 22) >> 31; // 10
if (--rest == 0)
return;
decode[10] = (val << 21) >> 31;
if (--rest == 0)
return;
decode[11] = (val << 20) >> 31;
if (--rest == 0)
return;
decode[12] = (val << 19) >> 31;
if (--rest == 0)
return;
decode[13] = (val << 18) >> 31;
if (--rest == 0)
return;
decode[14] = (val << 17) >> 31;
if (--rest == 0)
return;
decode[15] = (val << 16) >> 31;
if (--rest == 0)
return;
decode[16] = (val << 15) >> 31;
if (--rest == 0)
return;
decode[17] = (val << 14) >> 31;
if (--rest == 0)
return;
decode[18] = (val << 13) >> 31;
if (--rest == 0)
return;
decode[19] = (val << 12) >> 31; // 20
if (--rest == 0)
return;
decode[20] = (val << 11) >> 31;
if (--rest == 0)
return;
decode[21] = (val << 10) >> 31;
if (--rest == 0)
return;
decode[22] = (val << 9) >> 31;
if (--rest == 0)
return;
decode[23] = (val << 8) >> 31;
if (--rest == 0)
return;
decode[24] = (val << 7) >> 31;
if (--rest == 0)
return;
decode[25] = (val << 6) >> 31;
if (--rest == 0)
return;
decode[26] = (val << 5) >> 31;
if (--rest == 0)
return;
decode[27] = (val << 4) >> 31;
if (--rest == 0)
return;
decode[28] = (val << 3) >> 31;
if (--rest == 0)
return;
decode[29] = (val << 2) >> 31;
if (--rest == 0)
return;
decode[30] = (val << 1) >> 31;
return;
}
template <typename Type>
inline void unaligned_unpack_2(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 4;
uint32_t rest = dataNum % 16;
uint32_t decodedOffset = 0;
uint32_t val = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 16) {
val = encode[offset++];
decode[0] = (val << 30) >> 30;
decode[1] = (val << 28) >> 30;
decode[2] = (val << 26) >> 30;
decode[3] = (val << 24) >> 30;
decode[4] = (val << 22) >> 30;
decode[5] = (val << 20) >> 30;
decode[6] = (val << 18) >> 30;
decode[7] = (val << 16) >> 30;
decode[8] = (val << 14) >> 30;
decode[9] = (val << 12) >> 30;
decode[10] = (val << 10) >> 30;
decode[11] = (val << 8) >> 30;
decode[12] = (val << 6) >> 30;
decode[13] = (val << 4) >> 30;
decode[14] = (val << 2) >> 30;
decode[15] = val >> 30;
}
if (rest == 0)
return;
val = encode[offset++];
decode[decodedOffset] = (val << 30) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 28) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 26) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 24) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 22) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 20) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 18) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 16) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 14) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 12) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 10) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 8) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 6) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 4) >> 30;
if (--rest == 0)
return;
decode[++decodedOffset] = (val << 2) >> 30;
return;
}
template <typename Type>
inline void unaligned_unpack_3(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 29) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 26) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 23) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 20) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 17) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 14) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 11) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 8) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 5) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 2) >> 29;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 31) >> 29) | (val1 >> 30);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 28) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 25) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 22) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 19) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 16) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 13) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 10) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 7) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 4) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 1) >> 29;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 30) >> 29) | (val2 >> 31);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 27) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 24) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 21) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 18) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 15) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 12) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 9) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 6) >> 29;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 3) >> 29;
return;
}
template <typename Type>
inline void unaligned_unpack_4(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 3;
uint32_t rest = dataNum % 8;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 8) {
uint32_t val1 = encode[offset++];
decode[0] = (val1 << 28) >> 28;
decode[1] = (val1 << 24) >> 28;
decode[2] = (val1 << 20) >> 28;
decode[3] = (val1 << 16) >> 28;
decode[4] = (val1 << 12) >> 28;
decode[5] = (val1 << 8) >> 28;
decode[6] = (val1 << 4) >> 28;
decode[7] = val1 >> 28;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 28) >> 28;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 24) >> 28;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 20) >> 28;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 16) >> 28;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 12) >> 28;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 8) >> 28;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 4) >> 28;
return;
}
template <typename Type>
inline void unaligned_unpack_5(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 27) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 22) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 17) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 12) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 7) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 2) >> 27;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 29) >> 27) | (val1 >> 30);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 24) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 19) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 14) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 9) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 4) >> 27;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 31) >> 27) | (val2 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 26) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 21) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 16) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 11) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 6) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 1) >> 27;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 28) >> 27) | (val3 >> 31);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 23) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 18) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 13) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 8) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 3) >> 27;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 30) >> 27) | (val4 >> 29);
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 25) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 20) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 15) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 10) >> 27;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 5) >> 27;
return;
}
template <typename Type>
inline void unaligned_unpack_6(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 4;
uint32_t rest = dataNum % 16;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 16) {
uint32_t val1 = encode[offset++];
uint32_t val2 = encode[offset++];
uint32_t val3 = encode[offset++];
decode[0] = (val1 << 26) >> 26;
decode[1] = (val1 << 20) >> 26;
decode[2] = (val1 << 14) >> 26;
decode[3] = (val1 << 8) >> 26;
decode[4] = (val1 << 2) >> 26;
decode[5] = ((val2 << 28) >> 26) | (val1 >> 30);
decode[6] = (val2 << 22) >> 26;
decode[7] = (val2 << 16) >> 26;
decode[8] = (val2 << 10) >> 26;
decode[9] = (val2 << 4) >> 26;
decode[10] = ((val3 << 30) >> 26) | (val2 >> 28);
decode[11] = (val3 << 24) >> 26;
decode[12] = (val3 << 18) >> 26;
decode[13] = (val3 << 12) >> 26;
decode[14] = (val3 << 6) >> 26;
decode[15] = val3 >> 26;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 26) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 20) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 14) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 8) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 2) >> 26;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 28) >> 26) | (val1 >> 30);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 22) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 16) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 10) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 4) >> 26;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 30) >> 26) | (val2 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 24) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 18) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 12) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 6) >> 26;
if (--rest == 0)
return;
decode[++decodedOffset] = val3 >> 26;
return;
}
template <typename Type>
inline void unaligned_unpack_7(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 25) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 18) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 11) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 4) >> 25;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 29) >> 25) | (val1 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 22) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 15) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 8) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 1) >> 25;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 26) >> 25) | (val2 >> 31);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 19) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 12) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 5) >> 25;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 30) >> 25) | (val3 >> 27);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 23) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 16) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 9) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 2) >> 25;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 27) >> 25) | (val4 >> 30);
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 20) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 13) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 6) >> 25;
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 31) >> 25) | (val5 >> 26);
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 24) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 17) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 10) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 3) >> 25;
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 28) >> 25) | (val6 >> 29);
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 21) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 14) >> 25;
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 7) >> 25;
return;
}
template <typename Type>
inline void unaligned_unpack_8(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 2;
uint32_t rest = dataNum % 4;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 4) {
uint32_t val1 = encode[offset++];
decode[0] = (val1 << 24) >> 24;
decode[1] = (val1 << 16) >> 24;
decode[2] = (val1 << 8) >> 24;
decode[3] = val1 >> 24;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 24) >> 24;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 16) >> 24;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 8) >> 24;
return;
}
template <typename Type>
inline void unaligned_unpack_9(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 23) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 14) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 5) >> 23;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 28) >> 23) | (val1 >> 27);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 19) >> 23; // 5
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 10) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 1) >> 23;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 24) >> 23) | (val2 >> 31);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 15) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 6) >> 23; // 10
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 29) >> 23) | (val3 >> 26);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 20) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 11) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 2) >> 23;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 25) >> 23) | (val4 >> 30); // 15
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 16) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 7) >> 23;
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 30) >> 23) | (val5 >> 25);
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 21) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 12) >> 23; // 20
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 3) >> 23;
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 26) >> 23) | (val6 >> 29);
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 17) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 8) >> 23;
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[++decodedOffset] = ((val8 << 31) >> 23) | (val7 >> 24); // 25
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 22) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 13) >> 23;
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 4) >> 23;
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[++decodedOffset] = ((val9 << 27) >> 23) | (val8 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val9 << 18) >> 23; // 30
if (--rest == 0)
return;
decode[++decodedOffset] = (val9 << 9) >> 23;
return;
}
template <typename Type>
inline void unaligned_unpack_10(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 4;
uint32_t rest = dataNum % 16;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 16) {
uint32_t val1 = encode[offset++];
uint32_t val2 = encode[offset++];
uint32_t val3 = encode[offset++];
uint32_t val4 = encode[offset++];
uint32_t val5 = encode[offset++];
decode[0] = (val1 << 22) >> 22;
decode[1] = (val1 << 12) >> 22;
decode[2] = (val1 << 2) >> 22;
decode[3] = ((val2 << 24) >> 22) | (val1 >> 30);
decode[4] = (val2 << 14) >> 22;
decode[5] = (val2 << 4) >> 22;
decode[6] = ((val3 << 26) >> 22) | (val2 >> 28);
decode[7] = (val3 << 16) >> 22;
decode[8] = (val3 << 6) >> 22;
decode[9] = ((val4 << 28) >> 22) | (val3 >> 26);
decode[10] = (val4 << 18) >> 22;
decode[11] = (val4 << 8) >> 22;
decode[12] = ((val5 << 30) >> 22) | (val4 >> 24);
decode[13] = (val5 << 20) >> 22;
decode[14] = (val5 << 10) >> 22;
decode[15] = val5 >> 22;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 22) >> 22;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 12) >> 22;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 2) >> 22;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 24) >> 22) | (val1 >> 30);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 14) >> 22;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 4) >> 22;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 26) >> 22) | (val2 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 16) >> 22;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 6) >> 22;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 28) >> 22) | (val3 >> 26);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 18) >> 22;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 8) >> 22;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 30) >> 22) | (val4 >> 24);
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 20) >> 22;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 10) >> 22;
return;
}
template <typename Type>
inline void unaligned_unpack_11(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 21) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 10) >> 21;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 31) >> 21) | (val1 >> 22);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 20) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 9) >> 21;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 30) >> 21) | (val2 >> 23);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 19) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 8) >> 21;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 29) >> 21) | (val3 >> 24);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 18) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 7) >> 21;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 28) >> 21) | (val4 >> 25);
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 17) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 6) >> 21;
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 27) >> 21) | (val5 >> 26);
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 16) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 5) >> 21;
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 26) >> 21) | (val6 >> 27);
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 15) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 4) >> 21;
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[++decodedOffset] = ((val8 << 25) >> 21) | (val7 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 14) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 3) >> 21;
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[++decodedOffset] = ((val9 << 24) >> 21) | (val8 >> 29);
if (--rest == 0)
return;
decode[++decodedOffset] = (val9 << 13) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val9 << 2) >> 21;
if (--rest == 0)
return;
uint32_t val10 = encode[offset++];
decode[++decodedOffset] = ((val10 << 23) >> 21) | (val9 >> 30);
if (--rest == 0)
return;
decode[++decodedOffset] = (val10 << 12) >> 21;
if (--rest == 0)
return;
decode[++decodedOffset] = (val10 << 1) >> 21;
if (--rest == 0)
return;
uint32_t val11 = encode[offset++];
decode[++decodedOffset] = ((val11 << 22) >> 21) | (val10 >> 31);
if (--rest == 0)
return;
decode[++decodedOffset] = (val11 << 11) >> 21;
return;
}
template <typename Type>
inline void unaligned_unpack_12(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 3;
uint32_t rest = dataNum % 8;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 8) {
uint32_t val1 = encode[offset++];
uint32_t val2 = encode[offset++];
uint32_t val3 = encode[offset++];
decode[0] = (val1 << 20) >> 20;
decode[1] = (val1 << 8) >> 20;
decode[2] = ((val2 << 28) >> 20) | (val1 >> 24);
decode[3] = (val2 << 16) >> 20;
decode[4] = (val2 << 4) >> 20;
decode[5] = ((val3 << 24) >> 20) | (val2 >> 28);
decode[6] = (val3 << 12) >> 20;
decode[7] = val3 >> 20;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 20) >> 20;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 8) >> 20;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 28) >> 20) | (val1 >> 24);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 16) >> 20;
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 4) >> 20;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 24) >> 20) | (val2 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 12) >> 20;
if (--rest == 0)
return;
decode[++decodedOffset] = val3 >> 20;
return;
}
template <typename Type>
inline void unaligned_unpack_13(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 19) >> 19;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 6) >> 19;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 25) >> 19) | (val1 >> 26);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 12) >> 19;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 31) >> 19) | (val2 >> 20);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 18) >> 19;
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 5) >> 19;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 24) >> 19) | (val3 >> 27);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 11) >> 19;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 30) >> 19) | (val4 >> 21);
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 17) >> 19;
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 4) >> 19;
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 23) >> 19) | (val5 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 10) >> 19;
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 29) >> 19) | (val6 >> 22);
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 16) >> 19;
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 3) >> 19;
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[++decodedOffset] = ((val8 << 22) >> 19) | (val7 >> 29);
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 9) >> 19;
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[++decodedOffset] = ((val9 << 28) >> 19) | (val8 >> 23);
if (--rest == 0)
return;
decode[++decodedOffset] = (val9 << 15) >> 19;
if (--rest == 0)
return;
decode[++decodedOffset] = (val9 << 2) >> 19;
if (--rest == 0)
return;
uint32_t val10 = encode[offset++];
decode[++decodedOffset] = ((val10 << 21) >> 19) | (val9 >> 30);
if (--rest == 0)
return;
decode[++decodedOffset] = (val10 << 8) >> 19;
if (--rest == 0)
return;
uint32_t val11 = encode[offset++];
decode[++decodedOffset] = ((val11 << 27) >> 19) | (val10 >> 24);
if (--rest == 0)
return;
decode[++decodedOffset] = (val11 << 14) >> 19;
if (--rest == 0)
return;
decode[++decodedOffset] = (val11 << 1) >> 19;
if (--rest == 0)
return;
uint32_t val12 = encode[offset++];
decode[++decodedOffset] = ((val12 << 20) >> 19) | (val11 >> 31);
if (--rest == 0)
return;
decode[++decodedOffset] = (val12 << 7) >> 19;
if (--rest == 0)
return;
uint32_t val13 = encode[offset++];
decode[++decodedOffset] = ((val13 << 26) >> 19) | (val12 >> 25);
if (--rest == 0)
return;
decode[++decodedOffset] = (val13 << 13) >> 19;
return;
}
template <typename Type>
inline void unaligned_unpack_14(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 4;
uint32_t rest = dataNum % 16;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 16) {
uint32_t val1 = encode[offset++];
uint32_t val2 = encode[offset++];
uint32_t val3 = encode[offset++];
uint32_t val4 = encode[offset++];
uint32_t val5 = encode[offset++];
uint32_t val6 = encode[offset++];
uint32_t val7 = encode[offset++];
decode[0] = (val1 << 18) >> 18;
decode[1] = (val1 << 4) >> 18;
decode[2] = ((val2 << 22) >> 18) | (val1 >> 28);
decode[3] = (val2 << 8) >> 18;
decode[4] = ((val3 << 26) >> 18) | (val2 >> 24);
decode[5] = (val3 << 12) >> 18;
decode[6] = ((val4 << 30) >> 18) | (val3 >> 20);
decode[7] = (val4 << 16) >> 18;
decode[8] = (val4 << 2) >> 18;
decode[9] = ((val5 << 20) >> 18) | (val4 >> 30);
decode[10] = (val5 << 6) >> 18;
decode[11] = ((val6 << 24) >> 18) | (val5 >> 26);
decode[12] = (val6 << 10) >> 18;
decode[13] = ((val7 << 28) >> 18) | (val6 >> 22);
decode[14] = (val7 << 14) >> 18;
decode[15] = val7 >> 18;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 18) >> 18;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 4) >> 18;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 22) >> 18) | (val1 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 8) >> 18;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 26) >> 18) | (val2 >> 24);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 12) >> 18;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 30) >> 18) | (val3 >> 20);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 16) >> 18;
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 2) >> 18;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 20) >> 18) | (val4 >> 30);
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 6) >> 18;
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 24) >> 18) | (val5 >> 26);
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 10) >> 18;
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 28) >> 18) | (val6 >> 22);
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 14) >> 18;
if (--rest == 0)
return;
decode[++decodedOffset] = val7 >> 18;
return;
}
template <typename Type>
inline void unaligned_unpack_15(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 17) >> 17;
if (--rest == 0)
return;
decode[++decodedOffset] = (val1 << 2) >> 17;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 19) >> 17) | (val1 >> 30);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 4) >> 17;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 21) >> 17) | (val2 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 6) >> 17;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 23) >> 17) | (val3 >> 26);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 8) >> 17;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 25) >> 17) | (val4 >> 24);
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 10) >> 17;
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 27) >> 17) | (val5 >> 22);
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 12) >> 17;
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 29) >> 17) | (val6 >> 20);
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 14) >> 17;
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[++decodedOffset] = ((val8 << 31) >> 17) | (val7 >> 18);
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 16) >> 17;
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 1) >> 17;
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[++decodedOffset] = ((val9 << 18) >> 17) | (val8 >> 31);
if (--rest == 0)
return;
decode[++decodedOffset] = (val9 << 3) >> 17;
if (--rest == 0)
return;
uint32_t val10 = encode[offset++];
decode[++decodedOffset] = ((val10 << 20) >> 17) | (val9 >> 29);
if (--rest == 0)
return;
decode[++decodedOffset] = (val10 << 5) >> 17;
if (--rest == 0)
return;
uint32_t val11 = encode[offset++];
decode[++decodedOffset] = ((val11 << 22) >> 17) | (val10 >> 27);
if (--rest == 0)
return;
decode[++decodedOffset] = (val11 << 7) >> 17;
if (--rest == 0)
return;
uint32_t val12 = encode[offset++];
decode[++decodedOffset] = ((val12 << 24) >> 17) | (val11 >> 25);
if (--rest == 0)
return;
decode[++decodedOffset] = (val12 << 9) >> 17;
if (--rest == 0)
return;
uint32_t val13 = encode[offset++];
decode[++decodedOffset] = ((val13 << 26) >> 17) | (val12 >> 23);
if (--rest == 0)
return;
decode[++decodedOffset] = (val13 << 11) >> 17;
if (--rest == 0)
return;
uint32_t val14 = encode[offset++];
decode[++decodedOffset] = ((val14 << 28) >> 17) | (val13 >> 21);
if (--rest == 0)
return;
decode[++decodedOffset] = (val14 << 13) >> 17;
if (--rest == 0)
return;
uint32_t val15 = encode[offset++];
decode[++decodedOffset] = ((val15 << 30) >> 17) | (val14 >> 19);
if (--rest == 0)
return;
decode[++decodedOffset] = (val15 << 15) >> 17;
if (--rest == 0)
return;
decode[++decodedOffset] = val15 >> 17;
return;
}
template <typename Type>
inline void unaligned_unpack_16(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t decodedOffset = 0;
uint32_t maxBlocks = dataNum >> 1;
uint32_t rest = dataNum % 2;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 2) {
uint32_t val1 = encode[offset++];
decode[0] = (val1 << 16) >> 16;
decode[1] = (val1 >> 16);
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 16) >> 16;
return;
}
template <typename Type>
inline void unaligned_unpack_17(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 15) >> 15;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 30) >> 15) | (val1 >> 17);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 13) >> 15;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 28) >> 15) | (val2 >> 19);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 11) >> 15;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 26) >> 15) | (val3 >> 21);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 9) >> 15;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 24) >> 15) | (val4 >> 23);
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 7) >> 15;
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 22) >> 15) | (val5 >> 25);
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 5) >> 15;
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 20) >> 15) | (val6 >> 27);
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 3) >> 15;
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[++decodedOffset] = ((val8 << 18) >> 15) | (val7 >> 29);
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 1) >> 15;
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[++decodedOffset] = ((val9 << 16) >> 15) | (val8 >> 31);
if (--rest == 0)
return;
uint32_t val10 = encode[offset++];
decode[++decodedOffset] = ((val10 << 31) >> 15) | (val9 >> 16);
if (--rest == 0)
return;
decode[++decodedOffset] = (val10 << 14) >> 15;
if (--rest == 0)
return;
uint32_t val11 = encode[offset++];
decode[++decodedOffset] = ((val11 << 29) >> 15) | (val10 >> 18);
if (--rest == 0)
return;
decode[++decodedOffset] = (val11 << 12) >> 15;
if (--rest == 0)
return;
uint32_t val12 = encode[offset++];
decode[++decodedOffset] = ((val12 << 27) >> 15) | (val11 >> 20);
if (--rest == 0)
return;
decode[++decodedOffset] = (val12 << 10) >> 15;
if (--rest == 0)
return;
uint32_t val13 = encode[offset++];
decode[++decodedOffset] = ((val13 << 25) >> 15) | (val12 >> 22);
if (--rest == 0)
return;
decode[++decodedOffset] = (val13 << 8) >> 15;
if (--rest == 0)
return;
uint32_t val14 = encode[offset++];
decode[++decodedOffset] = ((val14 << 23) >> 15) | (val13 >> 24);
if (--rest == 0)
return;
decode[++decodedOffset] = (val14 << 6) >> 15;
if (--rest == 0)
return;
uint32_t val15 = encode[offset++];
decode[++decodedOffset] = ((val15 << 21) >> 15) | (val14 >> 26);
if (--rest == 0)
return;
decode[++decodedOffset] = (val15 << 4) >> 15;
if (--rest == 0)
return;
uint32_t val16 = encode[offset++];
decode[++decodedOffset] = ((val16 << 19) >> 15) | (val15 >> 28);
if (--rest == 0)
return;
decode[++decodedOffset] = (val16 << 2) >> 15;
if (--rest == 0)
return;
uint32_t val17 = encode[offset++];
decode[++decodedOffset] = ((val17 << 17) >> 15) | (val16 >> 30);
return;
}
template <typename Type>
inline void unaligned_unpack_18(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 4;
uint32_t rest = dataNum % 16;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 16) {
uint32_t val1 = encode[offset++];
uint32_t val2 = encode[offset++];
uint32_t val3 = encode[offset++];
uint32_t val4 = encode[offset++];
uint32_t val5 = encode[offset++];
uint32_t val6 = encode[offset++];
uint32_t val7 = encode[offset++];
uint32_t val8 = encode[offset++];
uint32_t val9 = encode[offset++];
decode[0] = (val1 << 14) >> 14;
decode[1] = ((val2 << 28) >> 14) | (val1 >> 18);
decode[2] = (val2 << 10) >> 14;
decode[3] = ((val3 << 24) >> 14) | (val2 >> 22);
decode[4] = (val3 << 6) >> 14;
decode[5] = ((val4 << 20) >> 14) | (val3 >> 26);
decode[6] = (val4 << 2) >> 14;
decode[7] = ((val5 << 16) >> 14) | (val4 >> 30);
decode[8] = ((val6 << 30) >> 14) | (val5 >> 16);
decode[9] = (val6 << 12) >> 14;
decode[10] = ((val7 << 26) >> 14) | (val6 >> 20);
decode[11] = (val7 << 8) >> 14;
decode[12] = ((val8 << 22) >> 14) | (val7 >> 24);
decode[13] = (val8 << 4) >> 14;
decode[14] = ((val9 << 18) >> 14) | (val8 >> 28);
decode[15] = val9 >> 14;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 14) >> 14;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 28) >> 14) | (val1 >> 18);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 10) >> 14;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 24) >> 14) | (val2 >> 22);
if (--rest == 0)
return;
decode[++decodedOffset] = (val3 << 6) >> 14;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 20) >> 14) | (val3 >> 26);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 2) >> 14;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 16) >> 14) | (val4 >> 30);
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 30) >> 14) | (val5 >> 16);
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 12) >> 14;
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 26) >> 14) | (val6 >> 20);
if (--rest == 0)
return;
decode[++decodedOffset] = (val7 << 8) >> 14;
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[++decodedOffset] = ((val8 << 22) >> 14) | (val7 >> 24);
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 4) >> 14;
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[++decodedOffset] = ((val9 << 18) >> 14) | (val8 >> 28);
return;
}
template <typename Type>
inline void unaligned_unpack_19(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t rest = dataNum;
decode[0] = encode[0] & 0x7FFFF;
if (--rest == 0)
return;
decode[1] = ((encode[0] >> 19) | (encode[1] << 13)) & 0x7FFFF;
if (--rest == 0)
return;
decode[2] = (encode[1] >> 6) & 0x7FFFF;
if (--rest == 0)
return;
decode[3] = ((encode[1] >> 25) | (encode[2] << 7)) & 0x7FFFF;
if (--rest == 0)
return;
decode[4] = (encode[2] >> 12) & 0x7FFFF;
if (--rest == 0)
return;
decode[5] = ((encode[2] >> 31) | (encode[3] << 1)) & 0x7FFFF;
if (--rest == 0)
return;
decode[6] = ((encode[3] >> 18) | (encode[4] << 14)) & 0x7FFFF;
if (--rest == 0)
return;
decode[7] = (encode[4] >> 5) & 0x7FFFF;
if (--rest == 0)
return;
decode[8] = ((encode[4] >> 24) | (encode[5] << 8)) & 0x7FFFF;
if (--rest == 0)
return;
decode[9] = (encode[5] >> 11) & 0x7FFFF;
if (--rest == 0)
return;
decode[10] = ((encode[5] >> 30) | (encode[6] << 2)) & 0x7FFFF;
if (--rest == 0)
return;
decode[11] = ((encode[6] >> 17) | (encode[7] << 15)) & 0x7FFFF;
if (--rest == 0)
return;
decode[12] = (encode[7] >> 4) & 0x7FFFF;
if (--rest == 0)
return;
decode[13] = ((encode[7] >> 23) | (encode[8] << 9)) & 0x7FFFF;
if (--rest == 0)
return;
decode[14] = (encode[8] >> 10) & 0x7FFFF;
if (--rest == 0)
return;
decode[15] = ((encode[8] >> 29) | (encode[9] << 3)) & 0x7FFFF;
if (--rest == 0)
return;
decode[16] = ((encode[9] >> 16) | (encode[10] << 16)) & 0x7FFFF;
if (--rest == 0)
return;
decode[17] = (encode[10] >> 3) & 0x7FFFF;
if (--rest == 0)
return;
decode[18] = ((encode[10] >> 22) | (encode[11] << 10)) & 0x7FFFF;
if (--rest == 0)
return;
decode[19] = (encode[11] >> 9) & 0x7FFFF;
if (--rest == 0)
return;
decode[20] = ((encode[11] >> 28) | (encode[12] << 4)) & 0x7FFFF;
if (--rest == 0)
return;
decode[21] = ((encode[12] >> 15) | (encode[13] << 17)) & 0x7FFFF;
if (--rest == 0)
return;
decode[22] = (encode[13] >> 2) & 0x7FFFF;
if (--rest == 0)
return;
decode[23] = ((encode[13] >> 21) | (encode[14] << 11)) & 0x7FFFF;
if (--rest == 0)
return;
decode[24] = (encode[14] >> 8) & 0x7FFFF;
if (--rest == 0)
return;
decode[25] = ((encode[14] >> 27) | (encode[15] << 5)) & 0x7FFFF;
if (--rest == 0)
return;
decode[26] = ((encode[15] >> 14) | (encode[16] << 18)) & 0x7FFFF;
if (--rest == 0)
return;
decode[27] = (encode[16] >> 1) & 0x7FFFF;
if (--rest == 0)
return;
decode[28] = ((encode[16] >> 20) | (encode[17] << 12)) & 0x7FFFF;
if (--rest == 0)
return;
decode[29] = (encode[17] >> 7) & 0x7FFFF;
if (--rest == 0)
return;
decode[30] = ((encode[17] >> 26) | (encode[18] << 6)) & 0x7FFFF;
// uint32_t offset = 0;
// uint32_t rest = dataNum;
// uint32_t val1 = encode[offset++];
// decode[0] = (val1 << 13) >> 13;
// if(--rest == 0) return;
// uint32_t val2 = encode[offset++];
// decode[1] = ((val2 << 26) >> 13) | (val1 >> 19);
// if(--rest == 0) return;
// decode[2] = (val2 << 7) >> 13;
// if(--rest == 0) return;
// uint32_t val3 = encode[offset++];
// decode[3] = ((val3 << 20) >> 13) | (val2 >> 25);
// if(--rest == 0) return;
// decode[4] = (val3 << 1 ) >> 13;
// if(--rest == 0) return;
// uint32_t val4 = encode[offset++];
// decode[5] = ((val4 << 14) >> 13) | (val3 >> 31);
// if(--rest == 0) return;
// uint32_t val5 = encode[offset++];
// decode[6] = ((val5 << 27) >> 13) | (val4 >> 18);
// if(--rest == 0) return;
// decode[7] = (val5 << 8 ) >> 13;
// if(--rest == 0) return;
// uint32_t val6 = encode[offset++];
// decode[8] = ((val6 << 8 ) | (val5 >> 24)) >> 13;//((val6 << 8 ) >> 13) | (val5 >> 24);
// if(--rest == 0) return;
// decode[9] = (val6 << 2) >> 13;
// if(--rest == 0) return;
// uint32_t val7 = encode[offset++];
// decode[10] = ((val7 << 15) >> 13) | (val6 >> 30);
// if(--rest == 0) return;
// uint32_t val8 = encode[offset++];
// decode[11] = ((val8 << 28) >> 13) | (val7 >> 17);
// if(--rest == 0) return;
// decode[12] = (val8 << 9) >> 13;
// if(--rest == 0) return;
// uint32_t val9 = encode[offset++];
// decode[13] = ((val9 << 22) >> 13) | (val8 >> 23);
// if(--rest == 0) return;
// decode[14] = (val9 << 3) >> 13;
// if(--rest == 0) return;
// uint32_t val10 = encode[offset++];
// decode[15] = ((val10 << 16) >> 13) | (val9 >> 29);
// if(--rest == 0) return;
// uint32_t val11 = encode[offset++];
// decode[16] = ((val11 << 29) >> 13) | (val10 >> 16);
// if(--rest == 0) return;
// decode[17] = (val11 << 10) >> 13;
// if(--rest == 0) return;
// uint32_t val12 = encode[offset++];
// decode[18] = ((val12 << 23) >> 13) | (val11 >> 22);
// if(--rest == 0) return;
// decode[19] = (val12 << 4) >> 13;
// if(--rest == 0) return;
// uint32_t val13 = encode[offset++];
// decode[20] = ((val13 << 17) >> 13) | (val12 >> 28);
// if(--rest == 0) return;
// uint32_t val14 = encode[offset++];
// decode[21] = ((val14 << 30) >> 13) | (val13 >> 15);
// if(--rest == 0) return;
// decode[22] = (val14 << 11) >> 13;
// if(--rest == 0) return;
// uint32_t val15 = encode[offset++];
// decode[23] = ((val15 << 24) >> 13) | (val14 >> 21);
// if(--rest == 0) return;
// decode[24] = (val15 << 5) >> 13;
// if(--rest == 0) return;
// uint32_t val16 = encode[offset++];
// decode[25] = ((val16 << 18) >> 13) | (val15 >> 27);
// if(--rest == 0) return;
// uint32_t val17 = encode[offset++];
// decode[26] = ((val17 << 31) >> 13) | (val16 >> 14);
// if(--rest == 0) return;
// decode[27] = (val17 << 12) >> 13;
// if(--rest == 0) return;
// uint32_t val18 = encode[offset++];
// decode[28] = ((val18 << 25) >> 13) | (val17 >> 20);
// if(--rest == 0) return;
// decode[29] = (val18 << 6) >> 13;
// if(--rest == 0) return;
// uint32_t val19 = encode[offset++];
// decode[30] = ((val19 << 19 ) >> 13) | (val18 >> 26);
// return;
}
template <typename Type>
inline void unaligned_unpack_20(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 3;
uint32_t rest = dataNum % 8;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 8) {
uint32_t val1 = encode[offset++];
uint32_t val2 = encode[offset++];
uint32_t val3 = encode[offset++];
uint32_t val4 = encode[offset++];
uint32_t val5 = encode[offset++];
decode[0] = (val1 << 12) >> 12;
decode[1] = ((val2 << 24) >> 12) | (val1 >> 20);
decode[2] = (val2 << 4) >> 12;
decode[3] = ((val3 << 16) >> 12) | (val2 >> 28);
decode[4] = ((val4 << 28) >> 12) | (val3 >> 16);
decode[5] = (val4 << 8) >> 12;
decode[6] = ((val5 << 20) >> 12) | (val4 >> 24);
decode[7] = val5 >> 12;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 12) >> 12;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 24) >> 12) | (val1 >> 20);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 4) >> 12;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 16) >> 12) | (val2 >> 28);
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 28) >> 12) | (val3 >> 16);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 8) >> 12;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 20) >> 12) | (val4 >> 24);
return;
}
template <typename Type>
inline void unaligned_unpack_21(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 11) >> 11;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 22) >> 11) | (val1 >> 21);
if (--rest == 0)
return;
decode[++decodedOffset] = (val2 << 1) >> 11;
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 12) >> 11) | (val2 >> 31);
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 23) >> 11) | (val3 >> 20);
if (--rest == 0)
return;
decode[++decodedOffset] = (val4 << 2) >> 11;
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 13) >> 11) | (val4 >> 30);
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 24) >> 11) | (val5 >> 19);
if (--rest == 0)
return;
decode[++decodedOffset] = (val6 << 3) >> 11;
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 14) >> 11) | (val6 >> 29);
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[++decodedOffset] = ((val8 << 25) >> 11) | (val7 >> 18);
if (--rest == 0)
return;
decode[++decodedOffset] = (val8 << 4) >> 11;
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[++decodedOffset] = ((val9 << 15) >> 11) | (val8 >> 28);
if (--rest == 0)
return;
uint32_t val10 = encode[offset++];
decode[++decodedOffset] = ((val10 << 26) >> 11) | (val9 >> 17);
if (--rest == 0)
return;
decode[++decodedOffset] = (val10 << 5) >> 11;
if (--rest == 0)
return;
uint32_t val11 = encode[offset++];
decode[++decodedOffset] = ((val11 << 16) >> 11) | (val10 >> 27);
if (--rest == 0)
return;
uint32_t val12 = encode[offset++];
decode[++decodedOffset] = ((val12 << 27) >> 11) | (val11 >> 16);
if (--rest == 0)
return;
decode[++decodedOffset] = (val12 << 6) >> 11;
if (--rest == 0)
return;
uint32_t val13 = encode[offset++];
decode[++decodedOffset] = ((val13 << 17) >> 11) | (val12 >> 26);
if (--rest == 0)
return;
uint32_t val14 = encode[offset++];
decode[++decodedOffset] = ((val14 << 28) >> 11) | (val13 >> 15);
if (--rest == 0)
return;
decode[++decodedOffset] = (val14 << 7) >> 11;
if (--rest == 0)
return;
uint32_t val15 = encode[offset++];
decode[++decodedOffset] = ((val15 << 18) >> 11) | (val14 >> 25);
if (--rest == 0)
return;
uint32_t val16 = encode[offset++];
decode[++decodedOffset] = ((val16 << 29) >> 11) | (val15 >> 14);
if (--rest == 0)
return;
decode[++decodedOffset] = (val16 << 8) >> 11;
if (--rest == 0)
return;
uint32_t val17 = encode[offset++];
decode[++decodedOffset] = ((val17 << 19) >> 11) | (val16 >> 24);
if (--rest == 0)
return;
uint32_t val18 = encode[offset++];
decode[++decodedOffset] = ((val18 << 30) >> 11) | (val17 >> 13);
if (--rest == 0)
return;
decode[++decodedOffset] = (val18 << 9) >> 11;
if (--rest == 0)
return;
uint32_t val19 = encode[offset++];
decode[++decodedOffset] = ((val19 << 20) >> 11) | (val18 >> 23);
if (--rest == 0)
return;
uint32_t val20 = encode[offset++];
decode[++decodedOffset] = ((val20 << 31) >> 11) | (val19 >> 12);
if (--rest == 0)
return;
decode[++decodedOffset] = (val20 << 10) >> 11;
if (--rest == 0)
return;
uint32_t val21 = encode[offset++];
decode[++decodedOffset] = ((val21 << 21) >> 11) | (val20 >> 22);
return;
}
template <typename Type>
inline void unaligned_unpack_22(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 4;
uint32_t rest = dataNum % 16;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 16) {
uint32_t val1 = encode[offset++];
uint32_t val2 = encode[offset++];
uint32_t val3 = encode[offset++];
uint32_t val4 = encode[offset++];
uint32_t val5 = encode[offset++];
uint32_t val6 = encode[offset++];
uint32_t val7 = encode[offset++];
uint32_t val8 = encode[offset++];
uint32_t val9 = encode[offset++];
uint32_t val10 = encode[offset++];
uint32_t val11 = encode[offset++];
decode[0] = (val1 << 10) >> 10;
decode[1] = ((val2 << 20) >> 10) | (val1 >> 22);
decode[2] = ((val3 << 30) >> 10) | (val2 >> 12);
decode[3] = (val3 << 8) >> 10;
decode[4] = ((val4 << 18) >> 10) | (val3 >> 24);
decode[5] = ((val5 << 28) >> 10) | (val4 >> 14);
decode[6] = (val5 << 6) >> 10;
decode[7] = ((val6 << 16) >> 10) | (val5 >> 26);
decode[8] = ((val7 << 26) >> 10) | (val6 >> 16);
decode[9] = (val7 << 4) >> 10;
decode[10] = ((val8 << 14) >> 10) | (val7 >> 28);
decode[11] = ((val9 << 24) >> 10) | (val8 >> 18);
decode[12] = (val9 << 2) >> 10;
decode[13] = ((val10 << 12) >> 10) | (val9 >> 30);
decode[14] = ((val11 << 22) >> 10) | (val10 >> 20);
decode[15] = val11 >> 10;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset++] = (val1 << 10) >> 10;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[decodedOffset++] = ((val2 << 20) >> 10) | (val1 >> 22);
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[decodedOffset++] = ((val3 << 30) >> 10) | (val2 >> 12);
if (--rest == 0)
return;
decode[decodedOffset++] = (val3 << 8) >> 10;
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[decodedOffset++] = ((val4 << 18) >> 10) | (val3 >> 24);
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[decodedOffset++] = ((val5 << 28) >> 10) | (val4 >> 14);
if (--rest == 0)
return;
decode[decodedOffset++] = (val5 << 6) >> 10;
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[decodedOffset++] = ((val6 << 16) >> 10) | (val5 >> 26);
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[decodedOffset++] = ((val7 << 26) >> 10) | (val6 >> 16);
if (--rest == 0)
return;
decode[decodedOffset++] = (val7 << 4) >> 10;
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[decodedOffset++] = ((val8 << 14) >> 10) | (val7 >> 28);
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[decodedOffset++] = ((val9 << 24) >> 10) | (val8 >> 18);
if (--rest == 0)
return;
decode[decodedOffset++] = (val9 << 2) >> 10;
if (--rest == 0)
return;
uint32_t val10 = encode[offset++];
decode[decodedOffset++] = ((val10 << 12) >> 10) | (val9 >> 30);
if (--rest == 0)
return;
uint32_t val11 = encode[offset++];
decode[decodedOffset++] = ((val11 << 22) >> 10) | (val10 >> 20);
return;
}
template <typename Type>
inline void unaligned_unpack_23(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t rest = dataNum;
decode[0] = encode[0] & 0x7FFFFF;
if (--rest == 0)
return;
decode[1] = ((encode[0] >> 23) | (encode[1] << 9)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[2] = ((encode[1] >> 14) | (encode[2] << 18)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[3] = (encode[2] >> 5) & 0x7FFFFF;
if (--rest == 0)
return;
decode[4] = ((encode[2] >> 28) | (encode[3] << 4)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[5] = ((encode[3] >> 19) | (encode[4] << 13)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[6] = ((encode[4] >> 10) | (encode[5] << 22)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[7] = (encode[5] >> 1) & 0x7FFFFF;
if (--rest == 0)
return;
decode[8] = ((encode[5] >> 24) | (encode[6] << 8)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[9] = ((encode[6] >> 15) | (encode[7] << 17)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[10] = (encode[7] >> 6) & 0x7FFFFF;
if (--rest == 0)
return;
decode[11] = ((encode[7] >> 29) | (encode[8] << 3)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[12] = ((encode[8] >> 20) | (encode[9] << 12)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[13] = ((encode[9] >> 11) | (encode[10] << 21)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[14] = (encode[10] >> 2) & 0x7FFFFF;
if (--rest == 0)
return;
decode[15] = ((encode[10] >> 25) | (encode[11] << 7)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[16] = ((encode[11] >> 16) | (encode[12] << 16)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[17] = (encode[12] >> 7) & 0x7FFFFF;
if (--rest == 0)
return;
decode[18] = ((encode[12] >> 30) | (encode[13] << 2)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[19] = ((encode[13] >> 21) | (encode[14] << 11)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[20] = ((encode[14] >> 12) | (encode[15] << 20)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[21] = (encode[15] >> 3) & 0x7FFFFF;
if (--rest == 0)
return;
decode[22] = ((encode[15] >> 26) | (encode[16] << 6)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[23] = ((encode[16] >> 17) | (encode[17] << 15)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[24] = (encode[17] >> 8) & 0x7FFFFF;
if (--rest == 0)
return;
decode[25] = ((encode[17] >> 31) | (encode[18] << 1)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[26] = ((encode[18] >> 22) | (encode[19] << 10)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[27] = ((encode[19] >> 13) | (encode[20] << 19)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[28] = (encode[20] >> 4) & 0x7FFFFF;
if (--rest == 0)
return;
decode[29] = ((encode[20] >> 27) | (encode[21] << 5)) & 0x7FFFFF;
if (--rest == 0)
return;
decode[30] = ((encode[21] >> 18) | (encode[22] << 14)) & 0x7FFFFF;
}
template <typename Type>
inline void unaligned_unpack_24(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t maxBlocks = dataNum >> 2;
uint32_t rest = dataNum % 4;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 4, encode += 3) {
uint32_t val1 = encode[0];
uint32_t val2 = encode[1];
uint32_t val3 = encode[2];
decode[0] = val1 & 0xFFFFFF;
decode[1] = ((val1 >> 24) | (val2 << 8)) & 0xFFFFFF;
decode[2] = ((val2 >> 16) | (val3 << 16)) & 0xFFFFFF;
decode[3] = (val3 >> 8) & 0xFFFFFF;
}
if (rest == 0)
return;
decode[0] = encode[0] & 0xFFFFFF;
if (--rest == 0)
return;
decode[1] = ((encode[0] >> 24) | (encode[1] << 8)) & 0xFFFFFF;
if (--rest == 0)
return;
decode[2] = ((encode[1] >> 16) | (encode[2] << 16)) & 0xFFFFFF;
}
template <typename Type>
inline void unaligned_unpack_25(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t rest = dataNum;
decode[0] = encode[0] & 0x1FFFFFF;
if (--rest == 0)
return;
decode[1] = ((encode[0] >> 25) | (encode[1] << 7)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[2] = ((encode[1] >> 18) | (encode[2] << 14)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[3] = ((encode[2] >> 11) | (encode[3] << 21)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[4] = (encode[3] >> 4) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[5] = ((encode[3] >> 29) | (encode[4] << 3)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[6] = ((encode[4] >> 22) | (encode[5] << 10)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[7] = ((encode[5] >> 15) | (encode[6] << 17)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[8] = ((encode[6] >> 8) | (encode[7] << 24)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[9] = (encode[7] >> 1) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[10] = ((encode[7] >> 26) | (encode[8] << 6)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[11] = ((encode[8] >> 19) | (encode[9] << 13)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[12] = ((encode[9] >> 12) | (encode[10] << 20)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[13] = (encode[10] >> 5) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[14] = ((encode[10] >> 30) | (encode[11] << 2)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[15] = ((encode[11] >> 23) | (encode[12] << 9)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[16] = ((encode[12] >> 16) | (encode[13] << 16)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[17] = ((encode[13] >> 9) | (encode[14] << 23)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[18] = (encode[14] >> 2) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[19] = ((encode[14] >> 27) | (encode[15] << 5)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[20] = ((encode[15] >> 20) | (encode[16] << 12)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[21] = ((encode[16] >> 13) | (encode[17] << 19)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[22] = (encode[17] >> 6) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[23] = ((encode[17] >> 31) | (encode[18] << 1)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[24] = ((encode[18] >> 24) | (encode[19] << 8)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[25] = ((encode[19] >> 17) | (encode[20] << 15)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[26] = ((encode[20] >> 10) | (encode[21] << 22)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[27] = (encode[21] >> 3) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[28] = ((encode[21] >> 28) | (encode[22] << 4)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[29] = ((encode[22] >> 21) | (encode[23] << 11)) & 0x1FFFFFF;
if (--rest == 0)
return;
decode[30] = ((encode[23] >> 14) | (encode[24] << 18)) & 0x1FFFFFF;
}
template <typename Type>
inline void unaligned_unpack_26(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 4;
uint32_t rest = dataNum % 16;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 16) {
uint32_t val1 = encode[offset++];
uint32_t val2 = encode[offset++];
uint32_t val3 = encode[offset++];
uint32_t val4 = encode[offset++];
uint32_t val5 = encode[offset++];
uint32_t val6 = encode[offset++];
uint32_t val7 = encode[offset++];
uint32_t val8 = encode[offset++];
uint32_t val9 = encode[offset++];
uint32_t val10 = encode[offset++];
uint32_t val11 = encode[offset++];
uint32_t val12 = encode[offset++];
uint32_t val13 = encode[offset++];
decode[0] = (val1 << 6) >> 6;
decode[1] = ((val2 << 12) >> 6) | (val1 >> 26);
decode[2] = ((val3 << 18) >> 6) | (val2 >> 20);
decode[3] = ((val4 << 24) >> 6) | (val3 >> 14);
decode[4] = ((val5 << 30) >> 6) | (val4 >> 8);
decode[5] = (val5 << 4) >> 6;
decode[6] = ((val6 << 10) >> 6) | (val5 >> 28);
decode[7] = ((val7 << 16) >> 6) | (val6 >> 22);
decode[8] = ((val8 << 22) >> 6) | (val7 >> 16);
decode[9] = ((val9 << 28) >> 6) | (val8 >> 10);
decode[10] = (val9 << 2) >> 6;
decode[11] = ((val10 << 8) >> 6) | (val9 >> 30);
decode[12] = ((val11 << 14) >> 6) | (val10 >> 24);
decode[13] = ((val12 << 20) >> 6) | (val11 >> 18);
decode[14] = ((val13 << 26) >> 6) | (val12 >> 12);
decode[15] = val13 >> 6;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 6) >> 6;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 12) >> 6) | (val1 >> 26);
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 18) >> 6) | (val2 >> 20);
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 24) >> 6) | (val3 >> 14);
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 30) >> 6) | (val4 >> 8);
if (--rest == 0)
return;
decode[++decodedOffset] = (val5 << 4) >> 6;
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 10) >> 6) | (val5 >> 28);
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 16) >> 6) | (val6 >> 22);
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[++decodedOffset] = ((val8 << 22) >> 6) | (val7 >> 16);
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[++decodedOffset] = ((val9 << 28) >> 6) | (val8 >> 10);
if (--rest == 0)
return;
decode[++decodedOffset] = (val9 << 2) >> 6;
if (--rest == 0)
return;
uint32_t val10 = encode[offset++];
decode[++decodedOffset] = ((val10 << 8) >> 6) | (val9 >> 30);
if (--rest == 0)
return;
uint32_t val11 = encode[offset++];
decode[++decodedOffset] = ((val11 << 14) >> 6) | (val10 >> 24);
if (--rest == 0)
return;
uint32_t val12 = encode[offset++];
decode[++decodedOffset] = ((val12 << 20) >> 6) | (val11 >> 18);
if (--rest == 0)
return;
uint32_t val13 = encode[offset++];
decode[++decodedOffset] = ((val13 << 26) >> 6) | (val12 >> 12);
return;
}
template <typename Type>
inline void unaligned_unpack_27(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t rest = dataNum;
decode[0] = encode[0] & 0x7FFFFFF;
if (--rest == 0)
return;
decode[1] = ((encode[0] >> 27) | (encode[1] << 5)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[2] = ((encode[1] >> 22) | (encode[2] << 10)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[3] = ((encode[2] >> 17) | (encode[3] << 15)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[4] = ((encode[3] >> 12) | (encode[4] << 20)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[5] = ((encode[4] >> 7) | (encode[5] << 25)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[6] = (encode[5] >> 2) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[7] = ((encode[5] >> 29) | (encode[6] << 3)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[8] = ((encode[6] >> 24) | (encode[7] << 8)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[9] = ((encode[7] >> 19) | (encode[8] << 13)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[10] = ((encode[8] >> 14) | (encode[9] << 18)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[11] = ((encode[9] >> 9) | (encode[10] << 23)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[12] = (encode[10] >> 4) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[13] = ((encode[10] >> 31) | (encode[11] << 1)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[14] = ((encode[11] >> 26) | (encode[12] << 6)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[15] = ((encode[12] >> 21) | (encode[13] << 11)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[16] = ((encode[13] >> 16) | (encode[14] << 16)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[17] = ((encode[14] >> 11) | (encode[15] << 21)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[18] = ((encode[15] >> 6) | (encode[16] << 26)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[19] = (encode[16] >> 1) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[20] = ((encode[16] >> 28) | (encode[17] << 4)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[21] = ((encode[17] >> 23) | (encode[18] << 9)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[22] = ((encode[18] >> 18) | (encode[19] << 14)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[23] = ((encode[19] >> 13) | (encode[20] << 19)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[24] = ((encode[20] >> 8) | (encode[21] << 24)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[25] = (encode[21] >> 3) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[26] = ((encode[21] >> 30) | (encode[22] << 2)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[27] = ((encode[22] >> 25) | (encode[23] << 7)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[28] = ((encode[23] >> 20) | (encode[24] << 12)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[29] = ((encode[24] >> 15) | (encode[25] << 17)) & 0x7FFFFFF;
if (--rest == 0)
return;
decode[30] = ((encode[25] >> 10) | (encode[26] << 22)) & 0x7FFFFFF;
}
template <typename Type>
inline void unaligned_unpack_28(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t maxBlocks = dataNum >> 3;
uint32_t rest = dataNum % 8;
uint32_t decodedOffset = 0;
// block process
for (uint32_t block = 0; block < maxBlocks; block++, decode += 8) {
uint32_t val1 = encode[offset++];
uint32_t val2 = encode[offset++];
uint32_t val3 = encode[offset++];
uint32_t val4 = encode[offset++];
uint32_t val5 = encode[offset++];
uint32_t val6 = encode[offset++];
uint32_t val7 = encode[offset++];
decode[0] = (val1 << 4) >> 4;
decode[1] = ((val2 << 8) >> 4) | (val1 >> 28);
decode[2] = ((val3 << 12) >> 4) | (val2 >> 24);
decode[3] = ((val4 << 16) >> 4) | (val3 >> 20);
decode[4] = ((val5 << 20) >> 4) | (val4 >> 16);
decode[5] = ((val6 << 24) >> 4) | (val5 >> 12);
decode[6] = ((val7 << 28) >> 4) | (val6 >> 8);
decode[7] = val7 >> 4;
}
if (rest == 0)
return;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 4) >> 4;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 8) >> 4) | (val1 >> 28);
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 12) >> 4) | (val2 >> 24);
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 16) >> 4) | (val3 >> 20);
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 20) >> 4) | (val4 >> 16);
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 24) >> 4) | (val5 >> 12);
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 28) >> 4) | (val6 >> 8);
return;
}
template <typename Type>
inline void unaligned_unpack_29(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t offset = 0;
uint32_t rest = dataNum;
uint32_t decodedOffset = 0;
uint32_t val1 = encode[offset++];
decode[decodedOffset] = (val1 << 3) >> 3;
if (--rest == 0)
return;
uint32_t val2 = encode[offset++];
decode[++decodedOffset] = ((val2 << 6) >> 3) | (val1 >> 29);
if (--rest == 0)
return;
uint32_t val3 = encode[offset++];
decode[++decodedOffset] = ((val3 << 9) >> 3) | (val2 >> 26);
if (--rest == 0)
return;
uint32_t val4 = encode[offset++];
decode[++decodedOffset] = ((val4 << 12) >> 3) | (val3 >> 23);
if (--rest == 0)
return;
uint32_t val5 = encode[offset++];
decode[++decodedOffset] = ((val5 << 15) >> 3) | (val4 >> 20);
if (--rest == 0)
return;
uint32_t val6 = encode[offset++];
decode[++decodedOffset] = ((val6 << 18) >> 3) | (val5 >> 17);
if (--rest == 0)
return;
uint32_t val7 = encode[offset++];
decode[++decodedOffset] = ((val7 << 21) >> 3) | (val6 >> 14);
if (--rest == 0)
return;
uint32_t val8 = encode[offset++];
decode[++decodedOffset] = ((val8 << 24) >> 3) | (val7 >> 11);
if (--rest == 0)
return;
uint32_t val9 = encode[offset++];
decode[++decodedOffset] = ((val9 << 27) >> 3) | (val8 >> 8);
if (--rest == 0)
return;
uint32_t val10 = encode[offset++];
decode[++decodedOffset] = ((val10 << 30) >> 3) | (val9 >> 5);
if (--rest == 0)
return;
decode[++decodedOffset] = (val10 << 1) >> 3;
if (--rest == 0)
return;
uint32_t val11 = encode[offset++];
decode[++decodedOffset] = ((val11 << 4) >> 3) | (val10 >> 31);
if (--rest == 0)
return;
uint32_t val12 = encode[offset++];
decode[++decodedOffset] = ((val12 << 7) >> 3) | (val11 >> 28);
if (--rest == 0)
return;
uint32_t val13 = encode[offset++];
decode[++decodedOffset] = ((val13 << 10) >> 3) | (val12 >> 25);
if (--rest == 0)
return;
uint32_t val14 = encode[offset++];
decode[++decodedOffset] = ((val14 << 13) >> 3) | (val13 >> 22);
if (--rest == 0)
return;
uint32_t val15 = encode[offset++];
decode[++decodedOffset] = ((val15 << 16) >> 3) | (val14 >> 19);
if (--rest == 0)
return;
uint32_t val16 = encode[offset++];
decode[++decodedOffset] = ((val16 << 19) >> 3) | (val15 >> 16);
if (--rest == 0)
return;
uint32_t val17 = encode[offset++];
decode[++decodedOffset] = ((val17 << 22) >> 3) | (val16 >> 13);
if (--rest == 0)
return;
uint32_t val18 = encode[offset++];
decode[++decodedOffset] = ((val18 << 25) >> 3) | (val17 >> 10);
if (--rest == 0)
return;
uint32_t val19 = encode[offset++];
decode[++decodedOffset] = ((val19 << 28) >> 3) | (val18 >> 7);
if (--rest == 0)
return;
uint32_t val20 = encode[offset++];
decode[++decodedOffset] = ((val20 << 31) >> 3) | (val19 >> 4);
if (--rest == 0)
return;
decode[++decodedOffset] = (val20 << 2) >> 3;
if (--rest == 0)
return;
uint32_t val21 = encode[offset++];
decode[++decodedOffset] = ((val21 << 5) >> 3) | (val20 >> 30);
if (--rest == 0)
return;
uint32_t val22 = encode[offset++];
decode[++decodedOffset] = ((val22 << 8) >> 3) | (val21 >> 27);
if (--rest == 0)
return;
uint32_t val23 = encode[offset++];
decode[++decodedOffset] = ((val23 << 11) >> 3) | (val22 >> 24);
if (--rest == 0)
return;
uint32_t val24 = encode[offset++];
decode[++decodedOffset] = ((val24 << 14) >> 3) | (val23 >> 21);
if (--rest == 0)
return;
uint32_t val25 = encode[offset++];
decode[++decodedOffset] = ((val25 << 17) >> 3) | (val24 >> 18);
if (--rest == 0)
return;
uint32_t val26 = encode[offset++];
decode[++decodedOffset] = ((val26 << 20) >> 3) | (val25 >> 15);
if (--rest == 0)
return;
uint32_t val27 = encode[offset++];
decode[++decodedOffset] = ((val27 << 23) >> 3) | (val26 >> 12);
if (--rest == 0)
return;
uint32_t val28 = encode[offset++];
decode[++decodedOffset] = ((val28 << 26) >> 3) | (val27 >> 9);
if (--rest == 0)
return;
uint32_t val29 = encode[offset++];
decode[++decodedOffset] = ((val29 << 29) >> 3) | (val28 >> 6);
return;
}
template <typename Type>
inline void unaligned_unpack_30(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t maxBlocks = dataNum >> 4;
uint32_t rest = dataNum % 16;
for (uint32_t block = 0; block < maxBlocks; block++, decode += 16, encode += 15) {
decode[0] = encode[0] & 0x3FFFFFFF;
decode[1] = ((encode[0] >> 30) | (encode[1] << 2)) & 0x3FFFFFFF;
decode[2] = ((encode[1] >> 28) | (encode[2] << 4)) & 0x3FFFFFFF;
decode[3] = ((encode[2] >> 26) | (encode[3] << 6)) & 0x3FFFFFFF;
decode[4] = ((encode[3] >> 24) | (encode[4] << 8)) & 0x3FFFFFFF;
decode[5] = ((encode[4] >> 22) | (encode[5] << 10)) & 0x3FFFFFFF;
decode[6] = ((encode[5] >> 20) | (encode[6] << 12)) & 0x3FFFFFFF;
decode[7] = ((encode[6] >> 18) | (encode[7] << 14)) & 0x3FFFFFFF;
decode[8] = ((encode[7] >> 16) | (encode[8] << 16)) & 0x3FFFFFFF;
decode[9] = ((encode[8] >> 14) | (encode[9] << 18)) & 0x3FFFFFFF;
decode[10] = ((encode[9] >> 12) | (encode[10] << 20)) & 0x3FFFFFFF;
decode[11] = ((encode[10] >> 10) | (encode[11] << 22)) & 0x3FFFFFFF;
decode[12] = ((encode[11] >> 8) | (encode[12] << 24)) & 0x3FFFFFFF;
decode[13] = ((encode[12] >> 6) | (encode[13] << 26)) & 0x3FFFFFFF;
decode[14] = ((encode[13] >> 4) | (encode[14] << 28)) & 0x3FFFFFFF;
decode[15] = (encode[14] >> 2) & 0x3FFFFFFF;
}
if (rest == 0)
return;
decode[0] = encode[0] & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[1] = ((encode[0] >> 30) | (encode[1] << 2)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[2] = ((encode[1] >> 28) | (encode[2] << 4)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[3] = ((encode[2] >> 26) | (encode[3] << 6)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[4] = ((encode[3] >> 24) | (encode[4] << 8)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[5] = ((encode[4] >> 22) | (encode[5] << 10)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[6] = ((encode[5] >> 20) | (encode[6] << 12)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[7] = ((encode[6] >> 18) | (encode[7] << 14)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[8] = ((encode[7] >> 16) | (encode[8] << 16)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[9] = ((encode[8] >> 14) | (encode[9] << 18)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[10] = ((encode[9] >> 12) | (encode[10] << 20)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[11] = ((encode[10] >> 10) | (encode[11] << 22)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[12] = ((encode[11] >> 8) | (encode[12] << 24)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[13] = ((encode[12] >> 6) | (encode[13] << 26)) & 0x3FFFFFFF;
if (--rest == 0)
return;
decode[14] = ((encode[13] >> 4) | (encode[14] << 28)) & 0x3FFFFFFF;
}
template <typename Type>
inline void unaligned_unpack_31(Type* decode, const uint32_t* encode, uint32_t dataNum)
{
uint32_t rest = dataNum;
decode[0] = encode[0] & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[1] = ((encode[0] >> 31) | (encode[1] << 1)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[2] = ((encode[1] >> 30) | (encode[2] << 2)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[3] = ((encode[2] >> 29) | (encode[3] << 3)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[4] = ((encode[3] >> 28) | (encode[4] << 4)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[5] = ((encode[4] >> 27) | (encode[5] << 5)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[6] = ((encode[5] >> 26) | (encode[6] << 6)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[7] = ((encode[6] >> 25) | (encode[7] << 7)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[8] = ((encode[7] >> 24) | (encode[8] << 8)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[9] = ((encode[8] >> 23) | (encode[9] << 9)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[10] = ((encode[9] >> 22) | (encode[10] << 10)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[11] = ((encode[10] >> 21) | (encode[11] << 11)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[12] = ((encode[11] >> 20) | (encode[12] << 12)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[13] = ((encode[12] >> 19) | (encode[13] << 13)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[14] = ((encode[13] >> 18) | (encode[14] << 14)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[15] = ((encode[14] >> 17) | (encode[15] << 15)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[16] = ((encode[15] >> 16) | (encode[16] << 16)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[17] = ((encode[16] >> 15) | (encode[17] << 17)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[18] = ((encode[17] >> 14) | (encode[18] << 18)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[19] = ((encode[18] >> 13) | (encode[19] << 19)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[20] = ((encode[19] >> 12) | (encode[20] << 20)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[21] = ((encode[20] >> 11) | (encode[21] << 21)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[22] = ((encode[21] >> 10) | (encode[22] << 22)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[23] = ((encode[22] >> 9) | (encode[23] << 23)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[24] = ((encode[23] >> 8) | (encode[24] << 24)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[25] = ((encode[24] >> 7) | (encode[25] << 25)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[26] = ((encode[25] >> 6) | (encode[26] << 26)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[27] = ((encode[26] >> 5) | (encode[27] << 27)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[28] = ((encode[27] >> 4) | (encode[28] << 28)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[29] = ((encode[28] >> 3) | (encode[29] << 29)) & 0x7FFFFFFF;
if (--rest == 0)
return;
decode[30] = ((encode[29] >> 2) | (encode[30] << 30)) & 0x7FFFFFFF;
}
} // namespace indexlib::index