aios/storage/indexlib/index/common/numeric_compress/Pack.h (2,788 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 T>
inline void pack(uint32_t* dest, const T* src, uint32_t n, uint32_t b)
{
uint32_t offset = 0;
uint32_t destLoc = 0;
for (uint32_t i = 0; i < n; ++i) {
dest[destLoc] |= src[i] << offset;
if (offset + b - 1 > 31) {
dest[destLoc + 1] |= src[i] >> (32 - offset);
}
destLoc += (offset + b) >> 5;
offset = (offset + b) & 31;
}
}
template <typename T>
inline void pack(uint32_t* dest, T* src, uint32_t n, uint32_t b)
{
uint32_t offset = 0;
uint32_t destLoc = 0;
for (uint32_t i = 0; i < n; ++i) {
dest[destLoc] |= src[i] << offset;
if (offset + b - 1 > 31) {
dest[destLoc + 1] |= src[i] >> (32 - offset);
}
destLoc += (offset + b) >> 5;
offset = (offset + b) & 31;
}
}
template <typename Type>
void pack_0(uint32_t* dest, const Type* encode, uint32_t n)
{
return; // nothing to do
}
template <typename Type>
void pack_1(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, ++dest, encode += 32) {
uint32_t res = encode[0] & 0x1;
res |= ((encode[1] & 0x1) << 1);
res |= ((encode[2] & 0x1) << 2);
res |= ((encode[3] & 0x1) << 3);
res |= ((encode[4] & 0x1) << 4);
res |= ((encode[5] & 0x1) << 5);
res |= ((encode[6] & 0x1) << 6);
res |= ((encode[7] & 0x1) << 7);
res |= ((encode[8] & 0x1) << 8);
res |= ((encode[9] & 0x1) << 9);
res |= ((encode[10] & 0x1) << 10);
res |= ((encode[11] & 0x1) << 11);
res |= ((encode[12] & 0x1) << 12);
res |= ((encode[13] & 0x1) << 13);
res |= ((encode[14] & 0x1) << 14);
res |= ((encode[15] & 0x1) << 15);
res |= ((encode[16] & 0x1) << 16);
res |= ((encode[17] & 0x1) << 17);
res |= ((encode[18] & 0x1) << 18);
res |= ((encode[19] & 0x1) << 19);
res |= ((encode[20] & 0x1) << 20);
res |= ((encode[21] & 0x1) << 21);
res |= ((encode[22] & 0x1) << 22);
res |= ((encode[23] & 0x1) << 23);
res |= ((encode[24] & 0x1) << 24);
res |= ((encode[25] & 0x1) << 25);
res |= ((encode[26] & 0x1) << 26);
res |= ((encode[27] & 0x1) << 27);
res |= ((encode[28] & 0x1) << 28);
res |= ((encode[29] & 0x1) << 29);
res |= ((encode[30] & 0x1) << 30);
res |= ((encode[31] & 0x1) << 31);
dest[0] = res;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 1);
}
}
template <typename Type>
void pack_2(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 2) {
uint32_t res0;
uint32_t res1;
res0 = encode[0] & 0x3;
res0 |= (encode[1] & 0x3) << 2;
res0 |= (encode[2] & 0x3) << 4;
res0 |= (encode[3] & 0x3) << 6;
res0 |= (encode[4] & 0x3) << 8;
res0 |= (encode[5] & 0x3) << 10;
res0 |= (encode[6] & 0x3) << 12;
res0 |= (encode[7] & 0x3) << 14;
res0 |= (encode[8] & 0x3) << 16;
res0 |= (encode[9] & 0x3) << 18;
res0 |= (encode[10] & 0x3) << 20;
res0 |= (encode[11] & 0x3) << 22;
res0 |= (encode[12] & 0x3) << 24;
res0 |= (encode[13] & 0x3) << 26;
res0 |= (encode[14] & 0x3) << 28;
res0 |= (encode[15] & 0x3) << 30;
res1 = encode[16] & 0x3;
res1 |= (encode[17] & 0x3) << 2;
res1 |= (encode[18] & 0x3) << 4;
res1 |= (encode[19] & 0x3) << 6;
res1 |= (encode[20] & 0x3) << 8;
res1 |= (encode[21] & 0x3) << 10;
res1 |= (encode[22] & 0x3) << 12;
res1 |= (encode[23] & 0x3) << 14;
res1 |= (encode[24] & 0x3) << 16;
res1 |= (encode[25] & 0x3) << 18;
res1 |= (encode[26] & 0x3) << 20;
res1 |= (encode[27] & 0x3) << 22;
res1 |= (encode[28] & 0x3) << 24;
res1 |= (encode[29] & 0x3) << 26;
res1 |= (encode[30] & 0x3) << 28;
res1 |= (encode[31] & 0x3) << 30;
dest[0] = res0;
dest[1] = res1;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 2);
}
}
template <typename Type>
void pack_3(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; encode += 32, i += 32, dest += 3) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
res0 = (encode[0] & 0x7);
res0 |= ((encode[1] & 0x7) << 3);
res0 |= ((encode[2] & 0x7) << 6);
res0 |= ((encode[3] & 0x7) << 9);
res0 |= ((encode[4] & 0x7) << 12);
res0 |= ((encode[5] & 0x7) << 15);
res0 |= ((encode[6] & 0x7) << 18);
res0 |= ((encode[7] & 0x7) << 21);
res0 |= ((encode[8] & 0x7) << 24);
res0 |= ((encode[9] & 0x7) << 27);
res0 |= ((encode[10] & 0x7) << 30);
res1 = ((encode[10] & 0x7) >> 2);
res1 |= ((encode[11] & 0x7) << 1);
res1 |= ((encode[12] & 0x7) << 4);
res1 |= ((encode[13] & 0x7) << 7);
res1 |= ((encode[14] & 0x7) << 10);
res1 |= ((encode[15] & 0x7) << 13);
res1 |= ((encode[16] & 0x7) << 16);
res1 |= ((encode[17] & 0x7) << 19);
res1 |= ((encode[18] & 0x7) << 22);
res1 |= ((encode[19] & 0x7) << 25);
res1 |= ((encode[20] & 0x7) << 28);
res1 |= ((encode[21] & 0x7) << 31);
res2 = ((encode[21] & 0x7) >> 1);
res2 |= ((encode[22] & 0x7) << 2);
res2 |= ((encode[23] & 0x7) << 5);
res2 |= ((encode[24] & 0x7) << 8);
res2 |= ((encode[25] & 0x7) << 11);
res2 |= ((encode[26] & 0x7) << 14);
res2 |= ((encode[27] & 0x7) << 17);
res2 |= ((encode[28] & 0x7) << 20);
res2 |= ((encode[29] & 0x7) << 23);
res2 |= ((encode[30] & 0x7) << 26);
res2 |= ((encode[31] & 0x7) << 29);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 3);
}
}
template <typename Type>
void pack_4(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, dest += 4, encode += 32) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
res0 = (encode[0] & 0xF);
res0 |= ((encode[1] & 0xF) << 4);
res0 |= ((encode[2] & 0xF) << 8);
res0 |= ((encode[3] & 0xF) << 12);
res0 |= ((encode[4] & 0xF) << 16);
res0 |= ((encode[5] & 0xF) << 20);
res0 |= ((encode[6] & 0xF) << 24);
res0 |= ((encode[7] & 0xF) << 28);
res1 = (encode[8] & 0xF);
res1 |= ((encode[9] & 0xF) << 4);
res1 |= ((encode[10] & 0xF) << 8);
res1 |= ((encode[11] & 0xF) << 12);
res1 |= ((encode[12] & 0xF) << 16);
res1 |= ((encode[13] & 0xF) << 20);
res1 |= ((encode[14] & 0xF) << 24);
res1 |= ((encode[15] & 0xF) << 28);
res2 = (encode[16] & 0xF);
res2 |= ((encode[17] & 0xF) << 4);
res2 |= ((encode[18] & 0xF) << 8);
res2 |= ((encode[19] & 0xF) << 12);
res2 |= ((encode[20] & 0xF) << 16);
res2 |= ((encode[21] & 0xF) << 20);
res2 |= ((encode[22] & 0xF) << 24);
res2 |= ((encode[23] & 0xF) << 28);
res3 = (encode[24] & 0xF);
res3 |= ((encode[25] & 0xF) << 4);
res3 |= ((encode[26] & 0xF) << 8);
res3 |= ((encode[27] & 0xF) << 12);
res3 |= ((encode[28] & 0xF) << 16);
res3 |= ((encode[29] & 0xF) << 20);
res3 |= ((encode[30] & 0xF) << 24);
res3 |= ((encode[31] & 0xF) << 28);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 4);
}
}
template <typename Type>
void pack_5(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 5) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
res0 = (encode[0] & 0x1F);
res0 |= ((encode[1] & 0x1F) << 5);
res0 |= ((encode[2] & 0x1F) << 10);
res0 |= ((encode[3] & 0x1F) << 15);
res0 |= ((encode[4] & 0x1F) << 20);
res0 |= ((encode[5] & 0x1F) << 25);
res0 |= ((encode[6] & 0x1F) << 30);
res1 = ((encode[6] & 0x1F) >> 2);
res1 |= ((encode[7] & 0x1F) << 3);
res1 |= ((encode[8] & 0x1F) << 8);
res1 |= ((encode[9] & 0x1F) << 13);
res1 |= ((encode[10] & 0x1F) << 18);
res1 |= ((encode[11] & 0x1F) << 23);
res1 |= ((encode[12] & 0x1F) << 28);
res2 = ((encode[12] & 0x1F) >> 4);
res2 |= ((encode[13] & 0x1F) << 1);
res2 |= ((encode[14] & 0x1F) << 6);
res2 |= ((encode[15] & 0x1F) << 11);
res2 |= ((encode[16] & 0x1F) << 16);
res2 |= ((encode[17] & 0x1F) << 21);
res2 |= ((encode[18] & 0x1F) << 26);
res2 |= ((encode[19] & 0x1F) << 31);
res3 = ((encode[19] & 0x1F) >> 1);
res3 |= ((encode[20] & 0x1F) << 4);
res3 |= ((encode[21] & 0x1F) << 9);
res3 |= ((encode[22] & 0x1F) << 14);
res3 |= ((encode[23] & 0x1F) << 19);
res3 |= ((encode[24] & 0x1F) << 24);
res3 |= ((encode[25] & 0x1F) << 29);
res4 = ((encode[25] & 0x1F) >> 3);
res4 |= ((encode[26] & 0x1F) << 2);
res4 |= ((encode[27] & 0x1F) << 7);
res4 |= ((encode[28] & 0x1F) << 12);
res4 |= ((encode[29] & 0x1F) << 17);
res4 |= ((encode[30] & 0x1F) << 22);
res4 |= ((encode[31] & 0x1F) << 27);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 5);
}
}
template <typename Type>
void pack_6(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, dest += 6, encode += 32) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
res0 = (encode[0] & 0x3F);
res0 |= ((encode[1] & 0x3F) << 6);
res0 |= ((encode[2] & 0x3F) << 12);
res0 |= ((encode[3] & 0x3F) << 18);
res0 |= ((encode[4] & 0x3F) << 24);
res0 |= ((encode[5] & 0x3F) << 30);
res1 = ((encode[5] & 0x3F) >> 2);
res1 |= ((encode[6] & 0x3F) << 4);
res1 |= ((encode[7] & 0x3F) << 10);
res1 |= ((encode[8] & 0x3F) << 16);
res1 |= ((encode[9] & 0x3F) << 22);
res1 |= ((encode[10] & 0x3F) << 28);
res2 = ((encode[10] & 0x3F) >> 4);
res2 |= ((encode[11] & 0x3F) << 2);
res2 |= ((encode[12] & 0x3F) << 8);
res2 |= ((encode[13] & 0x3F) << 14);
res2 |= ((encode[14] & 0x3F) << 20);
res2 |= ((encode[15] & 0x3F) << 26);
res3 = (encode[16] & 0x3F);
res3 |= ((encode[17] & 0x3F) << 6);
res3 |= ((encode[18] & 0x3F) << 12);
res3 |= ((encode[19] & 0x3F) << 18);
res3 |= ((encode[20] & 0x3F) << 24);
res3 |= ((encode[21] & 0x3F) << 30);
res4 = ((encode[21] & 0x3F) >> 2);
res4 |= ((encode[22] & 0x3F) << 4);
res4 |= ((encode[23] & 0x3F) << 10);
res4 |= ((encode[24] & 0x3F) << 16);
res4 |= ((encode[25] & 0x3F) << 22);
res4 |= ((encode[26] & 0x3F) << 28);
res5 = ((encode[26] & 0x3F) >> 4);
res5 |= ((encode[27] & 0x3F) << 2);
res5 |= ((encode[28] & 0x3F) << 8);
res5 |= ((encode[29] & 0x3F) << 14);
res5 |= ((encode[30] & 0x3F) << 20);
res5 |= ((encode[31] & 0x3F) << 26);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 6);
}
}
template <typename Type>
void pack_7(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 7) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
res0 = (encode[0] & 0x7F);
res0 |= ((encode[1] & 0x7F) << 7);
res0 |= ((encode[2] & 0x7F) << 14);
res0 |= ((encode[3] & 0x7F) << 21);
res0 |= ((encode[4] & 0x7F) << 28);
res1 = ((encode[4] & 0x7F) >> 4);
res1 |= ((encode[5] & 0x7F) << 3);
res1 |= ((encode[6] & 0x7F) << 10);
res1 |= ((encode[7] & 0x7F) << 17);
res1 |= ((encode[8] & 0x7F) << 24);
res1 |= ((encode[9] & 0x7F) << 31);
res2 = ((encode[9] & 0x7F) >> 1);
res2 |= ((encode[10] & 0x7F) << 6);
res2 |= ((encode[11] & 0x7F) << 13);
res2 |= ((encode[12] & 0x7F) << 20);
res2 |= ((encode[13] & 0x7F) << 27);
res3 = ((encode[13] & 0x7F) >> 5);
res3 |= ((encode[14] & 0x7F) << 2);
res3 |= ((encode[15] & 0x7F) << 9);
res3 |= ((encode[16] & 0x7F) << 16);
res3 |= ((encode[17] & 0x7F) << 23);
res3 |= ((encode[18] & 0x7F) << 30);
res4 = ((encode[18] & 0x7F) >> 2);
res4 |= ((encode[19] & 0x7F) << 5);
res4 |= ((encode[20] & 0x7F) << 12);
res4 |= ((encode[21] & 0x7F) << 19);
res4 |= ((encode[22] & 0x7F) << 26);
res5 = ((encode[22] & 0x7F) >> 6);
res5 |= ((encode[23] & 0x7F) << 1);
res5 |= ((encode[24] & 0x7F) << 8);
res5 |= ((encode[25] & 0x7F) << 15);
res5 |= ((encode[26] & 0x7F) << 22);
res5 |= ((encode[27] & 0x7F) << 29);
res6 = ((encode[27] & 0x7F) >> 3);
res6 |= ((encode[28] & 0x7F) << 4);
res6 |= ((encode[29] & 0x7F) << 11);
res6 |= ((encode[30] & 0x7F) << 18);
res6 |= ((encode[31] & 0x7F) << 25);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 7);
}
}
template <typename Type>
void pack_8(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 8) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
res0 = (encode[0] & 0xFF);
res0 |= ((encode[1] & 0xFF) << 8);
res0 |= ((encode[2] & 0xFF) << 16);
res0 |= ((encode[3] & 0xFF) << 24);
res1 = (encode[4] & 0xFF);
res1 |= ((encode[5] & 0xFF) << 8);
res1 |= ((encode[6] & 0xFF) << 16);
res1 |= ((encode[7] & 0xFF) << 24);
res2 = (encode[8] & 0xFF);
res2 |= ((encode[9] & 0xFF) << 8);
res2 |= ((encode[10] & 0xFF) << 16);
res2 |= ((encode[11] & 0xFF) << 24);
res3 = (encode[12] & 0xFF);
res3 |= ((encode[13] & 0xFF) << 8);
res3 |= ((encode[14] & 0xFF) << 16);
res3 |= ((encode[15] & 0xFF) << 24);
res4 = (encode[16] & 0xFF);
res4 |= ((encode[17] & 0xFF) << 8);
res4 |= ((encode[18] & 0xFF) << 16);
res4 |= ((encode[19] & 0xFF) << 24);
res5 = (encode[20] & 0xFF);
res5 |= ((encode[21] & 0xFF) << 8);
res5 |= ((encode[22] & 0xFF) << 16);
res5 |= ((encode[23] & 0xFF) << 24);
res6 = (encode[24] & 0xFF);
res6 |= ((encode[25] & 0xFF) << 8);
res6 |= ((encode[26] & 0xFF) << 16);
res6 |= ((encode[27] & 0xFF) << 24);
res7 = (encode[28] & 0xFF);
res7 |= ((encode[29] & 0xFF) << 8);
res7 |= ((encode[30] & 0xFF) << 16);
res7 |= ((encode[31] & 0xFF) << 24);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 8);
}
}
template <typename Type>
void pack_9(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 9) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
res0 = (encode[0] & 0x1FF);
res0 |= ((encode[1] & 0x1FF) << 9);
res0 |= ((encode[2] & 0x1FF) << 18);
res0 |= ((encode[3] & 0x1FF) << 27);
res1 = ((encode[3] & 0x1FF) >> 5);
res1 |= ((encode[4] & 0x1FF) << 4);
res1 |= ((encode[5] & 0x1FF) << 13);
res1 |= ((encode[6] & 0x1FF) << 22);
res1 |= ((encode[7] & 0x1FF) << 31);
res2 = ((encode[7] & 0x1FF) >> 1);
res2 |= ((encode[8] & 0x1FF) << 8);
res2 |= ((encode[9] & 0x1FF) << 17);
res2 |= ((encode[10] & 0x1FF) << 26);
res3 = ((encode[10] & 0x1FF) >> 6);
res3 |= ((encode[11] & 0x1FF) << 3);
res3 |= ((encode[12] & 0x1FF) << 12);
res3 |= ((encode[13] & 0x1FF) << 21);
res3 |= ((encode[14] & 0x1FF) << 30);
res4 = ((encode[14] & 0x1FF) >> 2);
res4 |= ((encode[15] & 0x1FF) << 7);
res4 |= ((encode[16] & 0x1FF) << 16);
res4 |= ((encode[17] & 0x1FF) << 25);
res5 = ((encode[17] & 0x1FF) >> 7);
res5 |= ((encode[18] & 0x1FF) << 2);
res5 |= ((encode[19] & 0x1FF) << 11);
res5 |= ((encode[20] & 0x1FF) << 20);
res5 |= ((encode[21] & 0x1FF) << 29);
res6 = ((encode[21] & 0x1FF) >> 3);
res6 |= ((encode[22] & 0x1FF) << 6);
res6 |= ((encode[23] & 0x1FF) << 15);
res6 |= ((encode[24] & 0x1FF) << 24);
res7 = ((encode[24] & 0x1FF) >> 8);
res7 |= ((encode[25] & 0x1FF) << 1);
res7 |= ((encode[26] & 0x1FF) << 10);
res7 |= ((encode[27] & 0x1FF) << 19);
res7 |= ((encode[28] & 0x1FF) << 28);
res8 = ((encode[28] & 0x1FF) >> 4);
res8 |= ((encode[29] & 0x1FF) << 5);
res8 |= ((encode[30] & 0x1FF) << 14);
res8 |= ((encode[31] & 0x1FF) << 23);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 9);
}
}
template <typename Type>
void pack_10(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 10) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
res0 = (encode[0] & 0x3FF);
res0 |= ((encode[1] & 0x3FF) << 10);
res0 |= ((encode[2] & 0x3FF) << 20);
res0 |= ((encode[3] & 0x3FF) << 30);
res1 = ((encode[3] & 0x3FF) >> 2);
res1 |= ((encode[4] & 0x3FF) << 8);
res1 |= ((encode[5] & 0x3FF) << 18);
res1 |= ((encode[6] & 0x3FF) << 28);
res2 = ((encode[6] & 0x3FF) >> 4);
res2 |= ((encode[7] & 0x3FF) << 6);
res2 |= ((encode[8] & 0x3FF) << 16);
res2 |= ((encode[9] & 0x3FF) << 26);
res3 = ((encode[9] & 0x3FF) >> 6);
res3 |= ((encode[10] & 0x3FF) << 4);
res3 |= ((encode[11] & 0x3FF) << 14);
res3 |= ((encode[12] & 0x3FF) << 24);
res4 = ((encode[12] & 0x3FF) >> 8);
res4 |= ((encode[13] & 0x3FF) << 2);
res4 |= ((encode[14] & 0x3FF) << 12);
res4 |= ((encode[15] & 0x3FF) << 22);
res5 = (encode[16] & 0x3FF);
res5 |= ((encode[17] & 0x3FF) << 10);
res5 |= ((encode[18] & 0x3FF) << 20);
res5 |= ((encode[19] & 0x3FF) << 30);
res6 = ((encode[19] & 0x3FF) >> 2);
res6 |= ((encode[20] & 0x3FF) << 8);
res6 |= ((encode[21] & 0x3FF) << 18);
res6 |= ((encode[22] & 0x3FF) << 28);
res7 = ((encode[22] & 0x3FF) >> 4);
res7 |= ((encode[23] & 0x3FF) << 6);
res7 |= ((encode[24] & 0x3FF) << 16);
res7 |= ((encode[25] & 0x3FF) << 26);
res8 = ((encode[25] & 0x3FF) >> 6);
res8 |= ((encode[26] & 0x3FF) << 4);
res8 |= ((encode[27] & 0x3FF) << 14);
res8 |= ((encode[28] & 0x3FF) << 24);
res9 = ((encode[28] & 0x3FF) >> 8);
res9 |= ((encode[29] & 0x3FF) << 2);
res9 |= ((encode[30] & 0x3FF) << 12);
res9 |= ((encode[31] & 0x3FF) << 22);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 10);
}
}
template <typename Type>
void pack_11(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 11) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
res0 = (encode[0] & 0x7FF);
res0 |= ((encode[1] & 0x7FF) << 11);
res0 |= ((encode[2] & 0x7FF) << 22);
res1 = ((encode[2] & 0x7FF) >> 10);
res1 |= ((encode[3] & 0x7FF) << 1);
res1 |= ((encode[4] & 0x7FF) << 12);
res1 |= ((encode[5] & 0x7FF) << 23);
res2 = ((encode[5] & 0x7FF) >> 9);
res2 |= ((encode[6] & 0x7FF) << 2);
res2 |= ((encode[7] & 0x7FF) << 13);
res2 |= ((encode[8] & 0x7FF) << 24);
res3 = ((encode[8] & 0x7FF) >> 8);
res3 |= ((encode[9] & 0x7FF) << 3);
res3 |= ((encode[10] & 0x7FF) << 14);
res3 |= ((encode[11] & 0x7FF) << 25);
res4 = ((encode[11] & 0x7FF) >> 7);
res4 |= ((encode[12] & 0x7FF) << 4);
res4 |= ((encode[13] & 0x7FF) << 15);
res4 |= ((encode[14] & 0x7FF) << 26);
res5 = ((encode[14] & 0x7FF) >> 6);
res5 |= ((encode[15] & 0x7FF) << 5);
res5 |= ((encode[16] & 0x7FF) << 16);
res5 |= ((encode[17] & 0x7FF) << 27);
res6 = ((encode[17] & 0x7FF) >> 5);
res6 |= ((encode[18] & 0x7FF) << 6);
res6 |= ((encode[19] & 0x7FF) << 17);
res6 |= ((encode[20] & 0x7FF) << 28);
res7 = ((encode[20] & 0x7FF) >> 4);
res7 |= ((encode[21] & 0x7FF) << 7);
res7 |= ((encode[22] & 0x7FF) << 18);
res7 |= ((encode[23] & 0x7FF) << 29);
res8 = ((encode[23] & 0x7FF) >> 3);
res8 |= ((encode[24] & 0x7FF) << 8);
res8 |= ((encode[25] & 0x7FF) << 19);
res8 |= ((encode[26] & 0x7FF) << 30);
res9 = ((encode[26] & 0x7FF) >> 2);
res9 |= ((encode[27] & 0x7FF) << 9);
res9 |= ((encode[28] & 0x7FF) << 20);
res9 |= ((encode[29] & 0x7FF) << 31);
res10 = ((encode[29] & 0x7FF) >> 1);
res10 |= ((encode[30] & 0x7FF) << 10);
res10 |= ((encode[31] & 0x7FF) << 21);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 11);
}
}
template <typename Type>
void pack_12(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 12) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
res0 = (encode[0] & 0xFFF);
res0 |= ((encode[1] & 0xFFF) << 12);
res0 |= ((encode[2] & 0xFFF) << 24);
res1 = ((encode[2] & 0xFFF) >> 8);
res1 |= ((encode[3] & 0xFFF) << 4);
res1 |= ((encode[4] & 0xFFF) << 16);
res1 |= ((encode[5] & 0xFFF) << 28);
res2 = ((encode[5] & 0xFFF) >> 4);
res2 |= ((encode[6] & 0xFFF) << 8);
res2 |= ((encode[7] & 0xFFF) << 20);
res3 = (encode[8] & 0xFFF);
res3 |= ((encode[9] & 0xFFF) << 12);
res3 |= ((encode[10] & 0xFFF) << 24);
res4 = ((encode[10] & 0xFFF) >> 8);
res4 |= ((encode[11] & 0xFFF) << 4);
res4 |= ((encode[12] & 0xFFF) << 16);
res4 |= ((encode[13] & 0xFFF) << 28);
res5 = ((encode[13] & 0xFFF) >> 4);
res5 |= ((encode[14] & 0xFFF) << 8);
res5 |= ((encode[15] & 0xFFF) << 20);
res6 = (encode[16] & 0xFFF);
res6 |= ((encode[17] & 0xFFF) << 12);
res6 |= ((encode[18] & 0xFFF) << 24);
res7 = ((encode[18] & 0xFFF) >> 8);
res7 |= ((encode[19] & 0xFFF) << 4);
res7 |= ((encode[20] & 0xFFF) << 16);
res7 |= ((encode[21] & 0xFFF) << 28);
res8 = ((encode[21] & 0xFFF) >> 4);
res8 |= ((encode[22] & 0xFFF) << 8);
res8 |= ((encode[23] & 0xFFF) << 20);
res9 = (encode[24] & 0xFFF);
res9 |= ((encode[25] & 0xFFF) << 12);
res9 |= ((encode[26] & 0xFFF) << 24);
res10 = ((encode[26] & 0xFFF) >> 8);
res10 |= ((encode[27] & 0xFFF) << 4);
res10 |= ((encode[28] & 0xFFF) << 16);
res10 |= ((encode[29] & 0xFFF) << 28);
res11 = ((encode[29] & 0xFFF) >> 4);
res11 |= ((encode[30] & 0xFFF) << 8);
res11 |= ((encode[31] & 0xFFF) << 20);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 12);
}
}
template <typename Type>
void pack_13(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 13) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
res0 = (encode[0] & 0x1FFF);
res0 |= ((encode[1] & 0x1FFF) << 13);
res0 |= ((encode[2] & 0x1FFF) << 26);
res1 = ((encode[2] & 0x1FFF) >> 6);
res1 |= ((encode[3] & 0x1FFF) << 7);
res1 |= ((encode[4] & 0x1FFF) << 20);
res2 = ((encode[4] & 0x1FFF) >> 12);
res2 |= ((encode[5] & 0x1FFF) << 1);
res2 |= ((encode[6] & 0x1FFF) << 14);
res2 |= ((encode[7] & 0x1FFF) << 27);
res3 = ((encode[7] & 0x1FFF) >> 5);
res3 |= ((encode[8] & 0x1FFF) << 8);
res3 |= ((encode[9] & 0x1FFF) << 21);
res4 = ((encode[9] & 0x1FFF) >> 11);
res4 |= ((encode[10] & 0x1FFF) << 2);
res4 |= ((encode[11] & 0x1FFF) << 15);
res4 |= ((encode[12] & 0x1FFF) << 28);
res5 = ((encode[12] & 0x1FFF) >> 4);
res5 |= ((encode[13] & 0x1FFF) << 9);
res5 |= ((encode[14] & 0x1FFF) << 22);
res6 = ((encode[14] & 0x1FFF) >> 10);
res6 |= ((encode[15] & 0x1FFF) << 3);
res6 |= ((encode[16] & 0x1FFF) << 16);
res6 |= ((encode[17] & 0x1FFF) << 29);
res7 = ((encode[17] & 0x1FFF) >> 3);
res7 |= ((encode[18] & 0x1FFF) << 10);
res7 |= ((encode[19] & 0x1FFF) << 23);
res8 = ((encode[19] & 0x1FFF) >> 9);
res8 |= ((encode[20] & 0x1FFF) << 4);
res8 |= ((encode[21] & 0x1FFF) << 17);
res8 |= ((encode[22] & 0x1FFF) << 30);
res9 = ((encode[22] & 0x1FFF) >> 2);
res9 |= ((encode[23] & 0x1FFF) << 11);
res9 |= ((encode[24] & 0x1FFF) << 24);
res10 = ((encode[24] & 0x1FFF) >> 8);
res10 |= ((encode[25] & 0x1FFF) << 5);
res10 |= ((encode[26] & 0x1FFF) << 18);
res10 |= ((encode[27] & 0x1FFF) << 31);
res11 = ((encode[27] & 0x1FFF) >> 1);
res11 |= ((encode[28] & 0x1FFF) << 12);
res11 |= ((encode[29] & 0x1FFF) << 25);
res12 = ((encode[29] & 0x1FFF) >> 7);
res12 |= ((encode[30] & 0x1FFF) << 6);
res12 |= ((encode[31] & 0x1FFF) << 19);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 13);
}
}
template <typename Type>
void pack_14(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 14) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
res0 = (encode[0] & 0x3FFF);
res0 |= ((encode[1] & 0x3FFF) << 14);
res0 |= ((encode[2] & 0x3FFF) << 28);
res1 = ((encode[2] & 0x3FFF) >> 4);
res1 |= ((encode[3] & 0x3FFF) << 10);
res1 |= ((encode[4] & 0x3FFF) << 24);
res2 = ((encode[4] & 0x3FFF) >> 8);
res2 |= ((encode[5] & 0x3FFF) << 6);
res2 |= ((encode[6] & 0x3FFF) << 20);
res3 = ((encode[6] & 0x3FFF) >> 12);
res3 |= ((encode[7] & 0x3FFF) << 2);
res3 |= ((encode[8] & 0x3FFF) << 16);
res3 |= ((encode[9] & 0x3FFF) << 30);
res4 = ((encode[9] & 0x3FFF) >> 2);
res4 |= ((encode[10] & 0x3FFF) << 12);
res4 |= ((encode[11] & 0x3FFF) << 26);
res5 = ((encode[11] & 0x3FFF) >> 6);
res5 |= ((encode[12] & 0x3FFF) << 8);
res5 |= ((encode[13] & 0x3FFF) << 22);
res6 = ((encode[13] & 0x3FFF) >> 10);
res6 |= ((encode[14] & 0x3FFF) << 4);
res6 |= ((encode[15] & 0x3FFF) << 18);
res7 = (encode[16] & 0x3FFF);
res7 |= ((encode[17] & 0x3FFF) << 14);
res7 |= ((encode[18] & 0x3FFF) << 28);
res8 = ((encode[18] & 0x3FFF) >> 4);
res8 |= ((encode[19] & 0x3FFF) << 10);
res8 |= ((encode[20] & 0x3FFF) << 24);
res9 = ((encode[20] & 0x3FFF) >> 8);
res9 |= ((encode[21] & 0x3FFF) << 6);
res9 |= ((encode[22] & 0x3FFF) << 20);
res10 = ((encode[22] & 0x3FFF) >> 12);
res10 |= ((encode[23] & 0x3FFF) << 2);
res10 |= ((encode[24] & 0x3FFF) << 16);
res10 |= ((encode[25] & 0x3FFF) << 30);
res11 = ((encode[25] & 0x3FFF) >> 2);
res11 |= ((encode[26] & 0x3FFF) << 12);
res11 |= ((encode[27] & 0x3FFF) << 26);
res12 = ((encode[27] & 0x3FFF) >> 6);
res12 |= ((encode[28] & 0x3FFF) << 8);
res12 |= ((encode[29] & 0x3FFF) << 22);
res13 = ((encode[29] & 0x3FFF) >> 10);
res13 |= ((encode[30] & 0x3FFF) << 4);
res13 |= ((encode[31] & 0x3FFF) << 18);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 14);
}
}
template <typename Type>
void pack_15(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 15) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
res0 = (encode[0] & 0x7FFF);
res0 |= ((encode[1] & 0x7FFF) << 15);
res0 |= ((encode[2] & 0x7FFF) << 30);
res1 = ((encode[2] & 0x7FFF) >> 2);
res1 |= ((encode[3] & 0x7FFF) << 13);
res1 |= ((encode[4] & 0x7FFF) << 28);
res2 = ((encode[4] & 0x7FFF) >> 4);
res2 |= ((encode[5] & 0x7FFF) << 11);
res2 |= ((encode[6] & 0x7FFF) << 26);
res3 = ((encode[6] & 0x7FFF) >> 6);
res3 |= ((encode[7] & 0x7FFF) << 9);
res3 |= ((encode[8] & 0x7FFF) << 24);
res4 = ((encode[8] & 0x7FFF) >> 8);
res4 |= ((encode[9] & 0x7FFF) << 7);
res4 |= ((encode[10] & 0x7FFF) << 22);
res5 = ((encode[10] & 0x7FFF) >> 10);
res5 |= ((encode[11] & 0x7FFF) << 5);
res5 |= ((encode[12] & 0x7FFF) << 20);
res6 = ((encode[12] & 0x7FFF) >> 12);
res6 |= ((encode[13] & 0x7FFF) << 3);
res6 |= ((encode[14] & 0x7FFF) << 18);
res7 = ((encode[14] & 0x7FFF) >> 14);
res7 |= ((encode[15] & 0x7FFF) << 1);
res7 |= ((encode[16] & 0x7FFF) << 16);
res7 |= ((encode[17] & 0x7FFF) << 31);
res8 = ((encode[17] & 0x7FFF) >> 1);
res8 |= ((encode[18] & 0x7FFF) << 14);
res8 |= ((encode[19] & 0x7FFF) << 29);
res9 = ((encode[19] & 0x7FFF) >> 3);
res9 |= ((encode[20] & 0x7FFF) << 12);
res9 |= ((encode[21] & 0x7FFF) << 27);
res10 = ((encode[21] & 0x7FFF) >> 5);
res10 |= ((encode[22] & 0x7FFF) << 10);
res10 |= ((encode[23] & 0x7FFF) << 25);
res11 = ((encode[23] & 0x7FFF) >> 7);
res11 |= ((encode[24] & 0x7FFF) << 8);
res11 |= ((encode[25] & 0x7FFF) << 23);
res12 = ((encode[25] & 0x7FFF) >> 9);
res12 |= ((encode[26] & 0x7FFF) << 6);
res12 |= ((encode[27] & 0x7FFF) << 21);
res13 = ((encode[27] & 0x7FFF) >> 11);
res13 |= ((encode[28] & 0x7FFF) << 4);
res13 |= ((encode[29] & 0x7FFF) << 19);
res14 = ((encode[29] & 0x7FFF) >> 13);
res14 |= ((encode[30] & 0x7FFF) << 2);
res14 |= ((encode[31] & 0x7FFF) << 17);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 15);
}
}
template <typename Type>
void pack_16(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 16) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
res0 = (encode[0] & 0xFFFF);
res0 |= ((encode[1] & 0xFFFF) << 16);
res1 = (encode[2] & 0xFFFF);
res1 |= ((encode[3] & 0xFFFF) << 16);
res2 = (encode[4] & 0xFFFF);
res2 |= ((encode[5] & 0xFFFF) << 16);
res3 = (encode[6] & 0xFFFF);
res3 |= ((encode[7] & 0xFFFF) << 16);
res4 = (encode[8] & 0xFFFF);
res4 |= ((encode[9] & 0xFFFF) << 16);
res5 = (encode[10] & 0xFFFF);
res5 |= ((encode[11] & 0xFFFF) << 16);
res6 = (encode[12] & 0xFFFF);
res6 |= ((encode[13] & 0xFFFF) << 16);
res7 = (encode[14] & 0xFFFF);
res7 |= ((encode[15] & 0xFFFF) << 16);
res8 = (encode[16] & 0xFFFF);
res8 |= ((encode[17] & 0xFFFF) << 16);
res9 = (encode[18] & 0xFFFF);
res9 |= ((encode[19] & 0xFFFF) << 16);
res10 = (encode[20] & 0xFFFF);
res10 |= ((encode[21] & 0xFFFF) << 16);
res11 = (encode[22] & 0xFFFF);
res11 |= ((encode[23] & 0xFFFF) << 16);
res12 = (encode[24] & 0xFFFF);
res12 |= ((encode[25] & 0xFFFF) << 16);
res13 = (encode[26] & 0xFFFF);
res13 |= ((encode[27] & 0xFFFF) << 16);
res14 = (encode[28] & 0xFFFF);
res14 |= ((encode[29] & 0xFFFF) << 16);
res15 = (encode[30] & 0xFFFF);
res15 |= ((encode[31] & 0xFFFF) << 16);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 16);
}
}
template <typename Type>
void pack_17(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 17) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
res0 = (encode[0] & 0x1FFFF);
res0 |= ((encode[1] & 0x1FFFF) << 17);
res1 = ((encode[1] & 0x1FFFF) >> 15);
res1 |= ((encode[2] & 0x1FFFF) << 2);
res1 |= ((encode[3] & 0x1FFFF) << 19);
res2 = ((encode[3] & 0x1FFFF) >> 13);
res2 |= ((encode[4] & 0x1FFFF) << 4);
res2 |= ((encode[5] & 0x1FFFF) << 21);
res3 = ((encode[5] & 0x1FFFF) >> 11);
res3 |= ((encode[6] & 0x1FFFF) << 6);
res3 |= ((encode[7] & 0x1FFFF) << 23);
res4 = ((encode[7] & 0x1FFFF) >> 9);
res4 |= ((encode[8] & 0x1FFFF) << 8);
res4 |= ((encode[9] & 0x1FFFF) << 25);
res5 = ((encode[9] & 0x1FFFF) >> 7);
res5 |= ((encode[10] & 0x1FFFF) << 10);
res5 |= ((encode[11] & 0x1FFFF) << 27);
res6 = ((encode[11] & 0x1FFFF) >> 5);
res6 |= ((encode[12] & 0x1FFFF) << 12);
res6 |= ((encode[13] & 0x1FFFF) << 29);
res7 = ((encode[13] & 0x1FFFF) >> 3);
res7 |= ((encode[14] & 0x1FFFF) << 14);
res7 |= ((encode[15] & 0x1FFFF) << 31);
res8 = ((encode[15] & 0x1FFFF) >> 1);
res8 |= ((encode[16] & 0x1FFFF) << 16);
res9 = ((encode[16] & 0x1FFFF) >> 16);
res9 |= ((encode[17] & 0x1FFFF) << 1);
res9 |= ((encode[18] & 0x1FFFF) << 18);
res10 = ((encode[18] & 0x1FFFF) >> 14);
res10 |= ((encode[19] & 0x1FFFF) << 3);
res10 |= ((encode[20] & 0x1FFFF) << 20);
res11 = ((encode[20] & 0x1FFFF) >> 12);
res11 |= ((encode[21] & 0x1FFFF) << 5);
res11 |= ((encode[22] & 0x1FFFF) << 22);
res12 = ((encode[22] & 0x1FFFF) >> 10);
res12 |= ((encode[23] & 0x1FFFF) << 7);
res12 |= ((encode[24] & 0x1FFFF) << 24);
res13 = ((encode[24] & 0x1FFFF) >> 8);
res13 |= ((encode[25] & 0x1FFFF) << 9);
res13 |= ((encode[26] & 0x1FFFF) << 26);
res14 = ((encode[26] & 0x1FFFF) >> 6);
res14 |= ((encode[27] & 0x1FFFF) << 11);
res14 |= ((encode[28] & 0x1FFFF) << 28);
res15 = ((encode[28] & 0x1FFFF) >> 4);
res15 |= ((encode[29] & 0x1FFFF) << 13);
res15 |= ((encode[30] & 0x1FFFF) << 30);
res16 = ((encode[30] & 0x1FFFF) >> 2);
res16 |= ((encode[31] & 0x1FFFF) << 15);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 17);
}
}
template <typename Type>
void pack_18(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 18) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
res0 = (encode[0] & 0x3FFFF);
res0 |= ((encode[1] & 0x3FFFF) << 18);
res1 = ((encode[1] & 0x3FFFF) >> 14);
res1 |= ((encode[2] & 0x3FFFF) << 4);
res1 |= ((encode[3] & 0x3FFFF) << 22);
res2 = ((encode[3] & 0x3FFFF) >> 10);
res2 |= ((encode[4] & 0x3FFFF) << 8);
res2 |= ((encode[5] & 0x3FFFF) << 26);
res3 = ((encode[5] & 0x3FFFF) >> 6);
res3 |= ((encode[6] & 0x3FFFF) << 12);
res3 |= ((encode[7] & 0x3FFFF) << 30);
res4 = ((encode[7] & 0x3FFFF) >> 2);
res4 |= ((encode[8] & 0x3FFFF) << 16);
res5 = ((encode[8] & 0x3FFFF) >> 16);
res5 |= ((encode[9] & 0x3FFFF) << 2);
res5 |= ((encode[10] & 0x3FFFF) << 20);
res6 = ((encode[10] & 0x3FFFF) >> 12);
res6 |= ((encode[11] & 0x3FFFF) << 6);
res6 |= ((encode[12] & 0x3FFFF) << 24);
res7 = ((encode[12] & 0x3FFFF) >> 8);
res7 |= ((encode[13] & 0x3FFFF) << 10);
res7 |= ((encode[14] & 0x3FFFF) << 28);
res8 = ((encode[14] & 0x3FFFF) >> 4);
res8 |= ((encode[15] & 0x3FFFF) << 14);
res9 = (encode[16] & 0x3FFFF);
res9 |= ((encode[17] & 0x3FFFF) << 18);
res10 = ((encode[17] & 0x3FFFF) >> 14);
res10 |= ((encode[18] & 0x3FFFF) << 4);
res10 |= ((encode[19] & 0x3FFFF) << 22);
res11 = ((encode[19] & 0x3FFFF) >> 10);
res11 |= ((encode[20] & 0x3FFFF) << 8);
res11 |= ((encode[21] & 0x3FFFF) << 26);
res12 = ((encode[21] & 0x3FFFF) >> 6);
res12 |= ((encode[22] & 0x3FFFF) << 12);
res12 |= ((encode[23] & 0x3FFFF) << 30);
res13 = ((encode[23] & 0x3FFFF) >> 2);
res13 |= ((encode[24] & 0x3FFFF) << 16);
res14 = ((encode[24] & 0x3FFFF) >> 16);
res14 |= ((encode[25] & 0x3FFFF) << 2);
res14 |= ((encode[26] & 0x3FFFF) << 20);
res15 = ((encode[26] & 0x3FFFF) >> 12);
res15 |= ((encode[27] & 0x3FFFF) << 6);
res15 |= ((encode[28] & 0x3FFFF) << 24);
res16 = ((encode[28] & 0x3FFFF) >> 8);
res16 |= ((encode[29] & 0x3FFFF) << 10);
res16 |= ((encode[30] & 0x3FFFF) << 28);
res17 = ((encode[30] & 0x3FFFF) >> 4);
res17 |= ((encode[31] & 0x3FFFF) << 14);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 18);
}
}
template <typename Type>
void pack_19(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 19) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
res0 = (encode[0] & 0x7FFFF);
res0 |= ((encode[1] & 0x7FFFF) << 19);
res1 = ((encode[1] & 0x7FFFF) >> 13);
res1 |= ((encode[2] & 0x7FFFF) << 6);
res1 |= ((encode[3] & 0x7FFFF) << 25);
res2 = ((encode[3] & 0x7FFFF) >> 7);
res2 |= ((encode[4] & 0x7FFFF) << 12);
res2 |= ((encode[5] & 0x7FFFF) << 31);
res3 = ((encode[5] & 0x7FFFF) >> 1);
res3 |= ((encode[6] & 0x7FFFF) << 18);
res4 = ((encode[6] & 0x7FFFF) >> 14);
res4 |= ((encode[7] & 0x7FFFF) << 5);
res4 |= ((encode[8] & 0x7FFFF) << 24);
res5 = ((encode[8] & 0x7FFFF) >> 8);
res5 |= ((encode[9] & 0x7FFFF) << 11);
res5 |= ((encode[10] & 0x7FFFF) << 30);
res6 = ((encode[10] & 0x7FFFF) >> 2);
res6 |= ((encode[11] & 0x7FFFF) << 17);
res7 = ((encode[11] & 0x7FFFF) >> 15);
res7 |= ((encode[12] & 0x7FFFF) << 4);
res7 |= ((encode[13] & 0x7FFFF) << 23);
res8 = ((encode[13] & 0x7FFFF) >> 9);
res8 |= ((encode[14] & 0x7FFFF) << 10);
res8 |= ((encode[15] & 0x7FFFF) << 29);
res9 = ((encode[15] & 0x7FFFF) >> 3);
res9 |= ((encode[16] & 0x7FFFF) << 16);
res10 = ((encode[16] & 0x7FFFF) >> 16);
res10 |= ((encode[17] & 0x7FFFF) << 3);
res10 |= ((encode[18] & 0x7FFFF) << 22);
res11 = ((encode[18] & 0x7FFFF) >> 10);
res11 |= ((encode[19] & 0x7FFFF) << 9);
res11 |= ((encode[20] & 0x7FFFF) << 28);
res12 = ((encode[20] & 0x7FFFF) >> 4);
res12 |= ((encode[21] & 0x7FFFF) << 15);
res13 = ((encode[21] & 0x7FFFF) >> 17);
res13 |= ((encode[22] & 0x7FFFF) << 2);
res13 |= ((encode[23] & 0x7FFFF) << 21);
res14 = ((encode[23] & 0x7FFFF) >> 11);
res14 |= ((encode[24] & 0x7FFFF) << 8);
res14 |= ((encode[25] & 0x7FFFF) << 27);
res15 = ((encode[25] & 0x7FFFF) >> 5);
res15 |= ((encode[26] & 0x7FFFF) << 14);
res16 = ((encode[26] & 0x7FFFF) >> 18);
res16 |= ((encode[27] & 0x7FFFF) << 1);
res16 |= ((encode[28] & 0x7FFFF) << 20);
res17 = ((encode[28] & 0x7FFFF) >> 12);
res17 |= ((encode[29] & 0x7FFFF) << 7);
res17 |= ((encode[30] & 0x7FFFF) << 26);
res18 = ((encode[30] & 0x7FFFF) >> 6);
res18 |= ((encode[31] & 0x7FFFF) << 13);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 19);
}
}
template <typename Type>
void pack_20(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 20) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
res0 = (encode[0] & 0xFFFFF);
res0 |= ((encode[1] & 0xFFFFF) << 20);
res1 = ((encode[1] & 0xFFFFF) >> 12);
res1 |= ((encode[2] & 0xFFFFF) << 8);
res1 |= ((encode[3] & 0xFFFFF) << 28);
res2 = ((encode[3] & 0xFFFFF) >> 4);
res2 |= ((encode[4] & 0xFFFFF) << 16);
res3 = ((encode[4] & 0xFFFFF) >> 16);
res3 |= ((encode[5] & 0xFFFFF) << 4);
res3 |= ((encode[6] & 0xFFFFF) << 24);
res4 = ((encode[6] & 0xFFFFF) >> 8);
res4 |= ((encode[7] & 0xFFFFF) << 12);
res5 = (encode[8] & 0xFFFFF);
res5 |= ((encode[9] & 0xFFFFF) << 20);
res6 = ((encode[9] & 0xFFFFF) >> 12);
res6 |= ((encode[10] & 0xFFFFF) << 8);
res6 |= ((encode[11] & 0xFFFFF) << 28);
res7 = ((encode[11] & 0xFFFFF) >> 4);
res7 |= ((encode[12] & 0xFFFFF) << 16);
res8 = ((encode[12] & 0xFFFFF) >> 16);
res8 |= ((encode[13] & 0xFFFFF) << 4);
res8 |= ((encode[14] & 0xFFFFF) << 24);
res9 = ((encode[14] & 0xFFFFF) >> 8);
res9 |= ((encode[15] & 0xFFFFF) << 12);
res10 = (encode[16] & 0xFFFFF);
res10 |= ((encode[17] & 0xFFFFF) << 20);
res11 = ((encode[17] & 0xFFFFF) >> 12);
res11 |= ((encode[18] & 0xFFFFF) << 8);
res11 |= ((encode[19] & 0xFFFFF) << 28);
res12 = ((encode[19] & 0xFFFFF) >> 4);
res12 |= ((encode[20] & 0xFFFFF) << 16);
res13 = ((encode[20] & 0xFFFFF) >> 16);
res13 |= ((encode[21] & 0xFFFFF) << 4);
res13 |= ((encode[22] & 0xFFFFF) << 24);
res14 = ((encode[22] & 0xFFFFF) >> 8);
res14 |= ((encode[23] & 0xFFFFF) << 12);
res15 = (encode[24] & 0xFFFFF);
res15 |= ((encode[25] & 0xFFFFF) << 20);
res16 = ((encode[25] & 0xFFFFF) >> 12);
res16 |= ((encode[26] & 0xFFFFF) << 8);
res16 |= ((encode[27] & 0xFFFFF) << 28);
res17 = ((encode[27] & 0xFFFFF) >> 4);
res17 |= ((encode[28] & 0xFFFFF) << 16);
res18 = ((encode[28] & 0xFFFFF) >> 16);
res18 |= ((encode[29] & 0xFFFFF) << 4);
res18 |= ((encode[30] & 0xFFFFF) << 24);
res19 = ((encode[30] & 0xFFFFF) >> 8);
res19 |= ((encode[31] & 0xFFFFF) << 12);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 20);
}
}
template <typename Type>
void pack_21(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 21) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
res0 = (encode[0] & 0x1FFFFF);
res0 |= ((encode[1] & 0x1FFFFF) << 21);
res1 = ((encode[1] & 0x1FFFFF) >> 11);
res1 |= ((encode[2] & 0x1FFFFF) << 10);
res1 |= ((encode[3] & 0x1FFFFF) << 31);
res2 = ((encode[3] & 0x1FFFFF) >> 1);
res2 |= ((encode[4] & 0x1FFFFF) << 20);
res3 = ((encode[4] & 0x1FFFFF) >> 12);
res3 |= ((encode[5] & 0x1FFFFF) << 9);
res3 |= ((encode[6] & 0x1FFFFF) << 30);
res4 = ((encode[6] & 0x1FFFFF) >> 2);
res4 |= ((encode[7] & 0x1FFFFF) << 19);
res5 = ((encode[7] & 0x1FFFFF) >> 13);
res5 |= ((encode[8] & 0x1FFFFF) << 8);
res5 |= ((encode[9] & 0x1FFFFF) << 29);
res6 = ((encode[9] & 0x1FFFFF) >> 3);
res6 |= ((encode[10] & 0x1FFFFF) << 18);
res7 = ((encode[10] & 0x1FFFFF) >> 14);
res7 |= ((encode[11] & 0x1FFFFF) << 7);
res7 |= ((encode[12] & 0x1FFFFF) << 28);
res8 = ((encode[12] & 0x1FFFFF) >> 4);
res8 |= ((encode[13] & 0x1FFFFF) << 17);
res9 = ((encode[13] & 0x1FFFFF) >> 15);
res9 |= ((encode[14] & 0x1FFFFF) << 6);
res9 |= ((encode[15] & 0x1FFFFF) << 27);
res10 = ((encode[15] & 0x1FFFFF) >> 5);
res10 |= ((encode[16] & 0x1FFFFF) << 16);
res11 = ((encode[16] & 0x1FFFFF) >> 16);
res11 |= ((encode[17] & 0x1FFFFF) << 5);
res11 |= ((encode[18] & 0x1FFFFF) << 26);
res12 = ((encode[18] & 0x1FFFFF) >> 6);
res12 |= ((encode[19] & 0x1FFFFF) << 15);
res13 = ((encode[19] & 0x1FFFFF) >> 17);
res13 |= ((encode[20] & 0x1FFFFF) << 4);
res13 |= ((encode[21] & 0x1FFFFF) << 25);
res14 = ((encode[21] & 0x1FFFFF) >> 7);
res14 |= ((encode[22] & 0x1FFFFF) << 14);
res15 = ((encode[22] & 0x1FFFFF) >> 18);
res15 |= ((encode[23] & 0x1FFFFF) << 3);
res15 |= ((encode[24] & 0x1FFFFF) << 24);
res16 = ((encode[24] & 0x1FFFFF) >> 8);
res16 |= ((encode[25] & 0x1FFFFF) << 13);
res17 = ((encode[25] & 0x1FFFFF) >> 19);
res17 |= ((encode[26] & 0x1FFFFF) << 2);
res17 |= ((encode[27] & 0x1FFFFF) << 23);
res18 = ((encode[27] & 0x1FFFFF) >> 9);
res18 |= ((encode[28] & 0x1FFFFF) << 12);
res19 = ((encode[28] & 0x1FFFFF) >> 20);
res19 |= ((encode[29] & 0x1FFFFF) << 1);
res19 |= ((encode[30] & 0x1FFFFF) << 22);
res20 = ((encode[30] & 0x1FFFFF) >> 10);
res20 |= ((encode[31] & 0x1FFFFF) << 11);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 21);
}
}
template <typename Type>
void pack_22(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 22) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
res0 = (encode[0] & 0x3FFFFF);
res0 |= ((encode[1] & 0x3FFFFF) << 22);
res1 = ((encode[1] & 0x3FFFFF) >> 10);
res1 |= ((encode[2] & 0x3FFFFF) << 12);
res2 = ((encode[2] & 0x3FFFFF) >> 20);
res2 |= ((encode[3] & 0x3FFFFF) << 2);
res2 |= ((encode[4] & 0x3FFFFF) << 24);
res3 = ((encode[4] & 0x3FFFFF) >> 8);
res3 |= ((encode[5] & 0x3FFFFF) << 14);
res4 = ((encode[5] & 0x3FFFFF) >> 18);
res4 |= ((encode[6] & 0x3FFFFF) << 4);
res4 |= ((encode[7] & 0x3FFFFF) << 26);
res5 = ((encode[7] & 0x3FFFFF) >> 6);
res5 |= ((encode[8] & 0x3FFFFF) << 16);
res6 = ((encode[8] & 0x3FFFFF) >> 16);
res6 |= ((encode[9] & 0x3FFFFF) << 6);
res6 |= ((encode[10] & 0x3FFFFF) << 28);
res7 = ((encode[10] & 0x3FFFFF) >> 4);
res7 |= ((encode[11] & 0x3FFFFF) << 18);
res8 = ((encode[11] & 0x3FFFFF) >> 14);
res8 |= ((encode[12] & 0x3FFFFF) << 8);
res8 |= ((encode[13] & 0x3FFFFF) << 30);
res9 = ((encode[13] & 0x3FFFFF) >> 2);
res9 |= ((encode[14] & 0x3FFFFF) << 20);
res10 = ((encode[14] & 0x3FFFFF) >> 12);
res10 |= ((encode[15] & 0x3FFFFF) << 10);
res11 = (encode[16] & 0x3FFFFF);
res11 |= ((encode[17] & 0x3FFFFF) << 22);
res12 = ((encode[17] & 0x3FFFFF) >> 10);
res12 |= ((encode[18] & 0x3FFFFF) << 12);
res13 = ((encode[18] & 0x3FFFFF) >> 20);
res13 |= ((encode[19] & 0x3FFFFF) << 2);
res13 |= ((encode[20] & 0x3FFFFF) << 24);
res14 = ((encode[20] & 0x3FFFFF) >> 8);
res14 |= ((encode[21] & 0x3FFFFF) << 14);
res15 = ((encode[21] & 0x3FFFFF) >> 18);
res15 |= ((encode[22] & 0x3FFFFF) << 4);
res15 |= ((encode[23] & 0x3FFFFF) << 26);
res16 = ((encode[23] & 0x3FFFFF) >> 6);
res16 |= ((encode[24] & 0x3FFFFF) << 16);
res17 = ((encode[24] & 0x3FFFFF) >> 16);
res17 |= ((encode[25] & 0x3FFFFF) << 6);
res17 |= ((encode[26] & 0x3FFFFF) << 28);
res18 = ((encode[26] & 0x3FFFFF) >> 4);
res18 |= ((encode[27] & 0x3FFFFF) << 18);
res19 = ((encode[27] & 0x3FFFFF) >> 14);
res19 |= ((encode[28] & 0x3FFFFF) << 8);
res19 |= ((encode[29] & 0x3FFFFF) << 30);
res20 = ((encode[29] & 0x3FFFFF) >> 2);
res20 |= ((encode[30] & 0x3FFFFF) << 20);
res21 = ((encode[30] & 0x3FFFFF) >> 12);
res21 |= ((encode[31] & 0x3FFFFF) << 10);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 22);
}
}
template <typename Type>
void pack_23(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 23) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
uint32_t res22;
res0 = (encode[0] & 0x7FFFFF);
res0 |= ((encode[1] & 0x7FFFFF) << 23);
res1 = ((encode[1] & 0x7FFFFF) >> 9);
res1 |= ((encode[2] & 0x7FFFFF) << 14);
res2 = ((encode[2] & 0x7FFFFF) >> 18);
res2 |= ((encode[3] & 0x7FFFFF) << 5);
res2 |= ((encode[4] & 0x7FFFFF) << 28);
res3 = ((encode[4] & 0x7FFFFF) >> 4);
res3 |= ((encode[5] & 0x7FFFFF) << 19);
res4 = ((encode[5] & 0x7FFFFF) >> 13);
res4 |= ((encode[6] & 0x7FFFFF) << 10);
res5 = ((encode[6] & 0x7FFFFF) >> 22);
res5 |= ((encode[7] & 0x7FFFFF) << 1);
res5 |= ((encode[8] & 0x7FFFFF) << 24);
res6 = ((encode[8] & 0x7FFFFF) >> 8);
res6 |= ((encode[9] & 0x7FFFFF) << 15);
res7 = ((encode[9] & 0x7FFFFF) >> 17);
res7 |= ((encode[10] & 0x7FFFFF) << 6);
res7 |= ((encode[11] & 0x7FFFFF) << 29);
res8 = ((encode[11] & 0x7FFFFF) >> 3);
res8 |= ((encode[12] & 0x7FFFFF) << 20);
res9 = ((encode[12] & 0x7FFFFF) >> 12);
res9 |= ((encode[13] & 0x7FFFFF) << 11);
res10 = ((encode[13] & 0x7FFFFF) >> 21);
res10 |= ((encode[14] & 0x7FFFFF) << 2);
res10 |= ((encode[15] & 0x7FFFFF) << 25);
res11 = ((encode[15] & 0x7FFFFF) >> 7);
res11 |= ((encode[16] & 0x7FFFFF) << 16);
res12 = ((encode[16] & 0x7FFFFF) >> 16);
res12 |= ((encode[17] & 0x7FFFFF) << 7);
res12 |= ((encode[18] & 0x7FFFFF) << 30);
res13 = ((encode[18] & 0x7FFFFF) >> 2);
res13 |= ((encode[19] & 0x7FFFFF) << 21);
res14 = ((encode[19] & 0x7FFFFF) >> 11);
res14 |= ((encode[20] & 0x7FFFFF) << 12);
res15 = ((encode[20] & 0x7FFFFF) >> 20);
res15 |= ((encode[21] & 0x7FFFFF) << 3);
res15 |= ((encode[22] & 0x7FFFFF) << 26);
res16 = ((encode[22] & 0x7FFFFF) >> 6);
res16 |= ((encode[23] & 0x7FFFFF) << 17);
res17 = ((encode[23] & 0x7FFFFF) >> 15);
res17 |= ((encode[24] & 0x7FFFFF) << 8);
res17 |= ((encode[25] & 0x7FFFFF) << 31);
res18 = ((encode[25] & 0x7FFFFF) >> 1);
res18 |= ((encode[26] & 0x7FFFFF) << 22);
res19 = ((encode[26] & 0x7FFFFF) >> 10);
res19 |= ((encode[27] & 0x7FFFFF) << 13);
res20 = ((encode[27] & 0x7FFFFF) >> 19);
res20 |= ((encode[28] & 0x7FFFFF) << 4);
res20 |= ((encode[29] & 0x7FFFFF) << 27);
res21 = ((encode[29] & 0x7FFFFF) >> 5);
res21 |= ((encode[30] & 0x7FFFFF) << 18);
res22 = ((encode[30] & 0x7FFFFF) >> 14);
res22 |= ((encode[31] & 0x7FFFFF) << 9);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
dest[22] = res22;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 23);
}
}
template <typename Type>
void pack_24(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 24) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
uint32_t res22;
uint32_t res23;
res0 = (encode[0] & 0xFFFFFF);
res0 |= ((encode[1] & 0xFFFFFF) << 24);
res1 = ((encode[1] & 0xFFFFFF) >> 8);
res1 |= ((encode[2] & 0xFFFFFF) << 16);
res2 = ((encode[2] & 0xFFFFFF) >> 16);
res2 |= ((encode[3] & 0xFFFFFF) << 8);
res3 = (encode[4] & 0xFFFFFF);
res3 |= ((encode[5] & 0xFFFFFF) << 24);
res4 = ((encode[5] & 0xFFFFFF) >> 8);
res4 |= ((encode[6] & 0xFFFFFF) << 16);
res5 = ((encode[6] & 0xFFFFFF) >> 16);
res5 |= ((encode[7] & 0xFFFFFF) << 8);
res6 = (encode[8] & 0xFFFFFF);
res6 |= ((encode[9] & 0xFFFFFF) << 24);
res7 = ((encode[9] & 0xFFFFFF) >> 8);
res7 |= ((encode[10] & 0xFFFFFF) << 16);
res8 = ((encode[10] & 0xFFFFFF) >> 16);
res8 |= ((encode[11] & 0xFFFFFF) << 8);
res9 = (encode[12] & 0xFFFFFF);
res9 |= ((encode[13] & 0xFFFFFF) << 24);
res10 = ((encode[13] & 0xFFFFFF) >> 8);
res10 |= ((encode[14] & 0xFFFFFF) << 16);
res11 = ((encode[14] & 0xFFFFFF) >> 16);
res11 |= ((encode[15] & 0xFFFFFF) << 8);
res12 = (encode[16] & 0xFFFFFF);
res12 |= ((encode[17] & 0xFFFFFF) << 24);
res13 = ((encode[17] & 0xFFFFFF) >> 8);
res13 |= ((encode[18] & 0xFFFFFF) << 16);
res14 = ((encode[18] & 0xFFFFFF) >> 16);
res14 |= ((encode[19] & 0xFFFFFF) << 8);
res15 = (encode[20] & 0xFFFFFF);
res15 |= ((encode[21] & 0xFFFFFF) << 24);
res16 = ((encode[21] & 0xFFFFFF) >> 8);
res16 |= ((encode[22] & 0xFFFFFF) << 16);
res17 = ((encode[22] & 0xFFFFFF) >> 16);
res17 |= ((encode[23] & 0xFFFFFF) << 8);
res18 = (encode[24] & 0xFFFFFF);
res18 |= ((encode[25] & 0xFFFFFF) << 24);
res19 = ((encode[25] & 0xFFFFFF) >> 8);
res19 |= ((encode[26] & 0xFFFFFF) << 16);
res20 = ((encode[26] & 0xFFFFFF) >> 16);
res20 |= ((encode[27] & 0xFFFFFF) << 8);
res21 = (encode[28] & 0xFFFFFF);
res21 |= ((encode[29] & 0xFFFFFF) << 24);
res22 = ((encode[29] & 0xFFFFFF) >> 8);
res22 |= ((encode[30] & 0xFFFFFF) << 16);
res23 = ((encode[30] & 0xFFFFFF) >> 16);
res23 |= ((encode[31] & 0xFFFFFF) << 8);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
dest[22] = res22;
dest[23] = res23;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 24);
}
}
template <typename Type>
void pack_25(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 25) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
uint32_t res22;
uint32_t res23;
uint32_t res24;
res0 = (encode[0] & 0x1FFFFFF);
res0 |= ((encode[1] & 0x1FFFFFF) << 25);
res1 = ((encode[1] & 0x1FFFFFF) >> 7);
res1 |= ((encode[2] & 0x1FFFFFF) << 18);
res2 = ((encode[2] & 0x1FFFFFF) >> 14);
res2 |= ((encode[3] & 0x1FFFFFF) << 11);
res3 = ((encode[3] & 0x1FFFFFF) >> 21);
res3 |= ((encode[4] & 0x1FFFFFF) << 4);
res3 |= ((encode[5] & 0x1FFFFFF) << 29);
res4 = ((encode[5] & 0x1FFFFFF) >> 3);
res4 |= ((encode[6] & 0x1FFFFFF) << 22);
res5 = ((encode[6] & 0x1FFFFFF) >> 10);
res5 |= ((encode[7] & 0x1FFFFFF) << 15);
res6 = ((encode[7] & 0x1FFFFFF) >> 17);
res6 |= ((encode[8] & 0x1FFFFFF) << 8);
res7 = ((encode[8] & 0x1FFFFFF) >> 24);
res7 |= ((encode[9] & 0x1FFFFFF) << 1);
res7 |= ((encode[10] & 0x1FFFFFF) << 26);
res8 = ((encode[10] & 0x1FFFFFF) >> 6);
res8 |= ((encode[11] & 0x1FFFFFF) << 19);
res9 = ((encode[11] & 0x1FFFFFF) >> 13);
res9 |= ((encode[12] & 0x1FFFFFF) << 12);
res10 = ((encode[12] & 0x1FFFFFF) >> 20);
res10 |= ((encode[13] & 0x1FFFFFF) << 5);
res10 |= ((encode[14] & 0x1FFFFFF) << 30);
res11 = ((encode[14] & 0x1FFFFFF) >> 2);
res11 |= ((encode[15] & 0x1FFFFFF) << 23);
res12 = ((encode[15] & 0x1FFFFFF) >> 9);
res12 |= ((encode[16] & 0x1FFFFFF) << 16);
res13 = ((encode[16] & 0x1FFFFFF) >> 16);
res13 |= ((encode[17] & 0x1FFFFFF) << 9);
res14 = ((encode[17] & 0x1FFFFFF) >> 23);
res14 |= ((encode[18] & 0x1FFFFFF) << 2);
res14 |= ((encode[19] & 0x1FFFFFF) << 27);
res15 = ((encode[19] & 0x1FFFFFF) >> 5);
res15 |= ((encode[20] & 0x1FFFFFF) << 20);
res16 = ((encode[20] & 0x1FFFFFF) >> 12);
res16 |= ((encode[21] & 0x1FFFFFF) << 13);
res17 = ((encode[21] & 0x1FFFFFF) >> 19);
res17 |= ((encode[22] & 0x1FFFFFF) << 6);
res17 |= ((encode[23] & 0x1FFFFFF) << 31);
res18 = ((encode[23] & 0x1FFFFFF) >> 1);
res18 |= ((encode[24] & 0x1FFFFFF) << 24);
res19 = ((encode[24] & 0x1FFFFFF) >> 8);
res19 |= ((encode[25] & 0x1FFFFFF) << 17);
res20 = ((encode[25] & 0x1FFFFFF) >> 15);
res20 |= ((encode[26] & 0x1FFFFFF) << 10);
res21 = ((encode[26] & 0x1FFFFFF) >> 22);
res21 |= ((encode[27] & 0x1FFFFFF) << 3);
res21 |= ((encode[28] & 0x1FFFFFF) << 28);
res22 = ((encode[28] & 0x1FFFFFF) >> 4);
res22 |= ((encode[29] & 0x1FFFFFF) << 21);
res23 = ((encode[29] & 0x1FFFFFF) >> 11);
res23 |= ((encode[30] & 0x1FFFFFF) << 14);
res24 = ((encode[30] & 0x1FFFFFF) >> 18);
res24 |= ((encode[31] & 0x1FFFFFF) << 7);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
dest[22] = res22;
dest[23] = res23;
dest[24] = res24;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 25);
}
}
template <typename Type>
void pack_26(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 26) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
uint32_t res22;
uint32_t res23;
uint32_t res24;
uint32_t res25;
res0 = (encode[0] & 0x3FFFFFF);
res0 |= ((encode[1] & 0x3FFFFFF) << 26);
res1 = ((encode[1] & 0x3FFFFFF) >> 6);
res1 |= ((encode[2] & 0x3FFFFFF) << 20);
res2 = ((encode[2] & 0x3FFFFFF) >> 12);
res2 |= ((encode[3] & 0x3FFFFFF) << 14);
res3 = ((encode[3] & 0x3FFFFFF) >> 18);
res3 |= ((encode[4] & 0x3FFFFFF) << 8);
res4 = ((encode[4] & 0x3FFFFFF) >> 24);
res4 |= ((encode[5] & 0x3FFFFFF) << 2);
res4 |= ((encode[6] & 0x3FFFFFF) << 28);
res5 = ((encode[6] & 0x3FFFFFF) >> 4);
res5 |= ((encode[7] & 0x3FFFFFF) << 22);
res6 = ((encode[7] & 0x3FFFFFF) >> 10);
res6 |= ((encode[8] & 0x3FFFFFF) << 16);
res7 = ((encode[8] & 0x3FFFFFF) >> 16);
res7 |= ((encode[9] & 0x3FFFFFF) << 10);
res8 = ((encode[9] & 0x3FFFFFF) >> 22);
res8 |= ((encode[10] & 0x3FFFFFF) << 4);
res8 |= ((encode[11] & 0x3FFFFFF) << 30);
res9 = ((encode[11] & 0x3FFFFFF) >> 2);
res9 |= ((encode[12] & 0x3FFFFFF) << 24);
res10 = ((encode[12] & 0x3FFFFFF) >> 8);
res10 |= ((encode[13] & 0x3FFFFFF) << 18);
res11 = ((encode[13] & 0x3FFFFFF) >> 14);
res11 |= ((encode[14] & 0x3FFFFFF) << 12);
res12 = ((encode[14] & 0x3FFFFFF) >> 20);
res12 |= ((encode[15] & 0x3FFFFFF) << 6);
res13 = (encode[16] & 0x3FFFFFF);
res13 |= ((encode[17] & 0x3FFFFFF) << 26);
res14 = ((encode[17] & 0x3FFFFFF) >> 6);
res14 |= ((encode[18] & 0x3FFFFFF) << 20);
res15 = ((encode[18] & 0x3FFFFFF) >> 12);
res15 |= ((encode[19] & 0x3FFFFFF) << 14);
res16 = ((encode[19] & 0x3FFFFFF) >> 18);
res16 |= ((encode[20] & 0x3FFFFFF) << 8);
res17 = ((encode[20] & 0x3FFFFFF) >> 24);
res17 |= ((encode[21] & 0x3FFFFFF) << 2);
res17 |= ((encode[22] & 0x3FFFFFF) << 28);
res18 = ((encode[22] & 0x3FFFFFF) >> 4);
res18 |= ((encode[23] & 0x3FFFFFF) << 22);
res19 = ((encode[23] & 0x3FFFFFF) >> 10);
res19 |= ((encode[24] & 0x3FFFFFF) << 16);
res20 = ((encode[24] & 0x3FFFFFF) >> 16);
res20 |= ((encode[25] & 0x3FFFFFF) << 10);
res21 = ((encode[25] & 0x3FFFFFF) >> 22);
res21 |= ((encode[26] & 0x3FFFFFF) << 4);
res21 |= ((encode[27] & 0x3FFFFFF) << 30);
res22 = ((encode[27] & 0x3FFFFFF) >> 2);
res22 |= ((encode[28] & 0x3FFFFFF) << 24);
res23 = ((encode[28] & 0x3FFFFFF) >> 8);
res23 |= ((encode[29] & 0x3FFFFFF) << 18);
res24 = ((encode[29] & 0x3FFFFFF) >> 14);
res24 |= ((encode[30] & 0x3FFFFFF) << 12);
res25 = ((encode[30] & 0x3FFFFFF) >> 20);
res25 |= ((encode[31] & 0x3FFFFFF) << 6);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
dest[22] = res22;
dest[23] = res23;
dest[24] = res24;
dest[25] = res25;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 26);
}
}
template <typename Type>
void pack_27(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 27) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
uint32_t res22;
uint32_t res23;
uint32_t res24;
uint32_t res25;
uint32_t res26;
res0 = (encode[0] & 0x7FFFFFF);
res0 |= ((encode[1] & 0x7FFFFFF) << 27);
res1 = ((encode[1] & 0x7FFFFFF) >> 5);
res1 |= ((encode[2] & 0x7FFFFFF) << 22);
res2 = ((encode[2] & 0x7FFFFFF) >> 10);
res2 |= ((encode[3] & 0x7FFFFFF) << 17);
res3 = ((encode[3] & 0x7FFFFFF) >> 15);
res3 |= ((encode[4] & 0x7FFFFFF) << 12);
res4 = ((encode[4] & 0x7FFFFFF) >> 20);
res4 |= ((encode[5] & 0x7FFFFFF) << 7);
res5 = ((encode[5] & 0x7FFFFFF) >> 25);
res5 |= ((encode[6] & 0x7FFFFFF) << 2);
res5 |= ((encode[7] & 0x7FFFFFF) << 29);
res6 = ((encode[7] & 0x7FFFFFF) >> 3);
res6 |= ((encode[8] & 0x7FFFFFF) << 24);
res7 = ((encode[8] & 0x7FFFFFF) >> 8);
res7 |= ((encode[9] & 0x7FFFFFF) << 19);
res8 = ((encode[9] & 0x7FFFFFF) >> 13);
res8 |= ((encode[10] & 0x7FFFFFF) << 14);
res9 = ((encode[10] & 0x7FFFFFF) >> 18);
res9 |= ((encode[11] & 0x7FFFFFF) << 9);
res10 = ((encode[11] & 0x7FFFFFF) >> 23);
res10 |= ((encode[12] & 0x7FFFFFF) << 4);
res10 |= ((encode[13] & 0x7FFFFFF) << 31);
res11 = ((encode[13] & 0x7FFFFFF) >> 1);
res11 |= ((encode[14] & 0x7FFFFFF) << 26);
res12 = ((encode[14] & 0x7FFFFFF) >> 6);
res12 |= ((encode[15] & 0x7FFFFFF) << 21);
res13 = ((encode[15] & 0x7FFFFFF) >> 11);
res13 |= ((encode[16] & 0x7FFFFFF) << 16);
res14 = ((encode[16] & 0x7FFFFFF) >> 16);
res14 |= ((encode[17] & 0x7FFFFFF) << 11);
res15 = ((encode[17] & 0x7FFFFFF) >> 21);
res15 |= ((encode[18] & 0x7FFFFFF) << 6);
res16 = ((encode[18] & 0x7FFFFFF) >> 26);
res16 |= ((encode[19] & 0x7FFFFFF) << 1);
res16 |= ((encode[20] & 0x7FFFFFF) << 28);
res17 = ((encode[20] & 0x7FFFFFF) >> 4);
res17 |= ((encode[21] & 0x7FFFFFF) << 23);
res18 = ((encode[21] & 0x7FFFFFF) >> 9);
res18 |= ((encode[22] & 0x7FFFFFF) << 18);
res19 = ((encode[22] & 0x7FFFFFF) >> 14);
res19 |= ((encode[23] & 0x7FFFFFF) << 13);
res20 = ((encode[23] & 0x7FFFFFF) >> 19);
res20 |= ((encode[24] & 0x7FFFFFF) << 8);
res21 = ((encode[24] & 0x7FFFFFF) >> 24);
res21 |= ((encode[25] & 0x7FFFFFF) << 3);
res21 |= ((encode[26] & 0x7FFFFFF) << 30);
res22 = ((encode[26] & 0x7FFFFFF) >> 2);
res22 |= ((encode[27] & 0x7FFFFFF) << 25);
res23 = ((encode[27] & 0x7FFFFFF) >> 7);
res23 |= ((encode[28] & 0x7FFFFFF) << 20);
res24 = ((encode[28] & 0x7FFFFFF) >> 12);
res24 |= ((encode[29] & 0x7FFFFFF) << 15);
res25 = ((encode[29] & 0x7FFFFFF) >> 17);
res25 |= ((encode[30] & 0x7FFFFFF) << 10);
res26 = ((encode[30] & 0x7FFFFFF) >> 22);
res26 |= ((encode[31] & 0x7FFFFFF) << 5);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
dest[22] = res22;
dest[23] = res23;
dest[24] = res24;
dest[25] = res25;
dest[26] = res26;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 27);
}
}
template <typename Type>
void pack_28(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 28) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
uint32_t res22;
uint32_t res23;
uint32_t res24;
uint32_t res25;
uint32_t res26;
uint32_t res27;
res0 = (encode[0] & 0xFFFFFFF);
res0 |= ((encode[1] & 0xFFFFFFF) << 28);
res1 = ((encode[1] & 0xFFFFFFF) >> 4);
res1 |= ((encode[2] & 0xFFFFFFF) << 24);
res2 = ((encode[2] & 0xFFFFFFF) >> 8);
res2 |= ((encode[3] & 0xFFFFFFF) << 20);
res3 = ((encode[3] & 0xFFFFFFF) >> 12);
res3 |= ((encode[4] & 0xFFFFFFF) << 16);
res4 = ((encode[4] & 0xFFFFFFF) >> 16);
res4 |= ((encode[5] & 0xFFFFFFF) << 12);
res5 = ((encode[5] & 0xFFFFFFF) >> 20);
res5 |= ((encode[6] & 0xFFFFFFF) << 8);
res6 = ((encode[6] & 0xFFFFFFF) >> 24);
res6 |= ((encode[7] & 0xFFFFFFF) << 4);
res7 = (encode[8] & 0xFFFFFFF);
res7 |= ((encode[9] & 0xFFFFFFF) << 28);
res8 = ((encode[9] & 0xFFFFFFF) >> 4);
res8 |= ((encode[10] & 0xFFFFFFF) << 24);
res9 = ((encode[10] & 0xFFFFFFF) >> 8);
res9 |= ((encode[11] & 0xFFFFFFF) << 20);
res10 = ((encode[11] & 0xFFFFFFF) >> 12);
res10 |= ((encode[12] & 0xFFFFFFF) << 16);
res11 = ((encode[12] & 0xFFFFFFF) >> 16);
res11 |= ((encode[13] & 0xFFFFFFF) << 12);
res12 = ((encode[13] & 0xFFFFFFF) >> 20);
res12 |= ((encode[14] & 0xFFFFFFF) << 8);
res13 = ((encode[14] & 0xFFFFFFF) >> 24);
res13 |= ((encode[15] & 0xFFFFFFF) << 4);
res14 = (encode[16] & 0xFFFFFFF);
res14 |= ((encode[17] & 0xFFFFFFF) << 28);
res15 = ((encode[17] & 0xFFFFFFF) >> 4);
res15 |= ((encode[18] & 0xFFFFFFF) << 24);
res16 = ((encode[18] & 0xFFFFFFF) >> 8);
res16 |= ((encode[19] & 0xFFFFFFF) << 20);
res17 = ((encode[19] & 0xFFFFFFF) >> 12);
res17 |= ((encode[20] & 0xFFFFFFF) << 16);
res18 = ((encode[20] & 0xFFFFFFF) >> 16);
res18 |= ((encode[21] & 0xFFFFFFF) << 12);
res19 = ((encode[21] & 0xFFFFFFF) >> 20);
res19 |= ((encode[22] & 0xFFFFFFF) << 8);
res20 = ((encode[22] & 0xFFFFFFF) >> 24);
res20 |= ((encode[23] & 0xFFFFFFF) << 4);
res21 = (encode[24] & 0xFFFFFFF);
res21 |= ((encode[25] & 0xFFFFFFF) << 28);
res22 = ((encode[25] & 0xFFFFFFF) >> 4);
res22 |= ((encode[26] & 0xFFFFFFF) << 24);
res23 = ((encode[26] & 0xFFFFFFF) >> 8);
res23 |= ((encode[27] & 0xFFFFFFF) << 20);
res24 = ((encode[27] & 0xFFFFFFF) >> 12);
res24 |= ((encode[28] & 0xFFFFFFF) << 16);
res25 = ((encode[28] & 0xFFFFFFF) >> 16);
res25 |= ((encode[29] & 0xFFFFFFF) << 12);
res26 = ((encode[29] & 0xFFFFFFF) >> 20);
res26 |= ((encode[30] & 0xFFFFFFF) << 8);
res27 = ((encode[30] & 0xFFFFFFF) >> 24);
res27 |= ((encode[31] & 0xFFFFFFF) << 4);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
dest[22] = res22;
dest[23] = res23;
dest[24] = res24;
dest[25] = res25;
dest[26] = res26;
dest[27] = res27;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 28);
}
}
template <typename Type>
void pack_29(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 29) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
uint32_t res22;
uint32_t res23;
uint32_t res24;
uint32_t res25;
uint32_t res26;
uint32_t res27;
uint32_t res28;
res0 = (encode[0] & 0x1FFFFFFF);
res0 |= ((encode[1] & 0x1FFFFFFF) << 29);
res1 = ((encode[1] & 0x1FFFFFFF) >> 3);
res1 |= ((encode[2] & 0x1FFFFFFF) << 26);
res2 = ((encode[2] & 0x1FFFFFFF) >> 6);
res2 |= ((encode[3] & 0x1FFFFFFF) << 23);
res3 = ((encode[3] & 0x1FFFFFFF) >> 9);
res3 |= ((encode[4] & 0x1FFFFFFF) << 20);
res4 = ((encode[4] & 0x1FFFFFFF) >> 12);
res4 |= ((encode[5] & 0x1FFFFFFF) << 17);
res5 = ((encode[5] & 0x1FFFFFFF) >> 15);
res5 |= ((encode[6] & 0x1FFFFFFF) << 14);
res6 = ((encode[6] & 0x1FFFFFFF) >> 18);
res6 |= ((encode[7] & 0x1FFFFFFF) << 11);
res7 = ((encode[7] & 0x1FFFFFFF) >> 21);
res7 |= ((encode[8] & 0x1FFFFFFF) << 8);
res8 = ((encode[8] & 0x1FFFFFFF) >> 24);
res8 |= ((encode[9] & 0x1FFFFFFF) << 5);
res9 = ((encode[9] & 0x1FFFFFFF) >> 27);
res9 |= ((encode[10] & 0x1FFFFFFF) << 2);
res9 |= ((encode[11] & 0x1FFFFFFF) << 31);
res10 = ((encode[11] & 0x1FFFFFFF) >> 1);
res10 |= ((encode[12] & 0x1FFFFFFF) << 28);
res11 = ((encode[12] & 0x1FFFFFFF) >> 4);
res11 |= ((encode[13] & 0x1FFFFFFF) << 25);
res12 = ((encode[13] & 0x1FFFFFFF) >> 7);
res12 |= ((encode[14] & 0x1FFFFFFF) << 22);
res13 = ((encode[14] & 0x1FFFFFFF) >> 10);
res13 |= ((encode[15] & 0x1FFFFFFF) << 19);
res14 = ((encode[15] & 0x1FFFFFFF) >> 13);
res14 |= ((encode[16] & 0x1FFFFFFF) << 16);
res15 = ((encode[16] & 0x1FFFFFFF) >> 16);
res15 |= ((encode[17] & 0x1FFFFFFF) << 13);
res16 = ((encode[17] & 0x1FFFFFFF) >> 19);
res16 |= ((encode[18] & 0x1FFFFFFF) << 10);
res17 = ((encode[18] & 0x1FFFFFFF) >> 22);
res17 |= ((encode[19] & 0x1FFFFFFF) << 7);
res18 = ((encode[19] & 0x1FFFFFFF) >> 25);
res18 |= ((encode[20] & 0x1FFFFFFF) << 4);
res19 = ((encode[20] & 0x1FFFFFFF) >> 28);
res19 |= ((encode[21] & 0x1FFFFFFF) << 1);
res19 |= ((encode[22] & 0x1FFFFFFF) << 30);
res20 = ((encode[22] & 0x1FFFFFFF) >> 2);
res20 |= ((encode[23] & 0x1FFFFFFF) << 27);
res21 = ((encode[23] & 0x1FFFFFFF) >> 5);
res21 |= ((encode[24] & 0x1FFFFFFF) << 24);
res22 = ((encode[24] & 0x1FFFFFFF) >> 8);
res22 |= ((encode[25] & 0x1FFFFFFF) << 21);
res23 = ((encode[25] & 0x1FFFFFFF) >> 11);
res23 |= ((encode[26] & 0x1FFFFFFF) << 18);
res24 = ((encode[26] & 0x1FFFFFFF) >> 14);
res24 |= ((encode[27] & 0x1FFFFFFF) << 15);
res25 = ((encode[27] & 0x1FFFFFFF) >> 17);
res25 |= ((encode[28] & 0x1FFFFFFF) << 12);
res26 = ((encode[28] & 0x1FFFFFFF) >> 20);
res26 |= ((encode[29] & 0x1FFFFFFF) << 9);
res27 = ((encode[29] & 0x1FFFFFFF) >> 23);
res27 |= ((encode[30] & 0x1FFFFFFF) << 6);
res28 = ((encode[30] & 0x1FFFFFFF) >> 26);
res28 |= ((encode[31] & 0x1FFFFFFF) << 3);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
dest[22] = res22;
dest[23] = res23;
dest[24] = res24;
dest[25] = res25;
dest[26] = res26;
dest[27] = res27;
dest[28] = res28;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 29);
}
}
template <typename Type>
void pack_30(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 30) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
uint32_t res22;
uint32_t res23;
uint32_t res24;
uint32_t res25;
uint32_t res26;
uint32_t res27;
uint32_t res28;
uint32_t res29;
res0 = (encode[0] & 0x3FFFFFFF);
res0 |= ((encode[1] & 0x3FFFFFFF) << 30);
res1 = ((encode[1] & 0x3FFFFFFF) >> 2);
res1 |= ((encode[2] & 0x3FFFFFFF) << 28);
res2 = ((encode[2] & 0x3FFFFFFF) >> 4);
res2 |= ((encode[3] & 0x3FFFFFFF) << 26);
res3 = ((encode[3] & 0x3FFFFFFF) >> 6);
res3 |= ((encode[4] & 0x3FFFFFFF) << 24);
res4 = ((encode[4] & 0x3FFFFFFF) >> 8);
res4 |= ((encode[5] & 0x3FFFFFFF) << 22);
res5 = ((encode[5] & 0x3FFFFFFF) >> 10);
res5 |= ((encode[6] & 0x3FFFFFFF) << 20);
res6 = ((encode[6] & 0x3FFFFFFF) >> 12);
res6 |= ((encode[7] & 0x3FFFFFFF) << 18);
res7 = ((encode[7] & 0x3FFFFFFF) >> 14);
res7 |= ((encode[8] & 0x3FFFFFFF) << 16);
res8 = ((encode[8] & 0x3FFFFFFF) >> 16);
res8 |= ((encode[9] & 0x3FFFFFFF) << 14);
res9 = ((encode[9] & 0x3FFFFFFF) >> 18);
res9 |= ((encode[10] & 0x3FFFFFFF) << 12);
res10 = ((encode[10] & 0x3FFFFFFF) >> 20);
res10 |= ((encode[11] & 0x3FFFFFFF) << 10);
res11 = ((encode[11] & 0x3FFFFFFF) >> 22);
res11 |= ((encode[12] & 0x3FFFFFFF) << 8);
res12 = ((encode[12] & 0x3FFFFFFF) >> 24);
res12 |= ((encode[13] & 0x3FFFFFFF) << 6);
res13 = ((encode[13] & 0x3FFFFFFF) >> 26);
res13 |= ((encode[14] & 0x3FFFFFFF) << 4);
res14 = ((encode[14] & 0x3FFFFFFF) >> 28);
res14 |= ((encode[15] & 0x3FFFFFFF) << 2);
res15 = (encode[16] & 0x3FFFFFFF);
res15 |= ((encode[17] & 0x3FFFFFFF) << 30);
res16 = ((encode[17] & 0x3FFFFFFF) >> 2);
res16 |= ((encode[18] & 0x3FFFFFFF) << 28);
res17 = ((encode[18] & 0x3FFFFFFF) >> 4);
res17 |= ((encode[19] & 0x3FFFFFFF) << 26);
res18 = ((encode[19] & 0x3FFFFFFF) >> 6);
res18 |= ((encode[20] & 0x3FFFFFFF) << 24);
res19 = ((encode[20] & 0x3FFFFFFF) >> 8);
res19 |= ((encode[21] & 0x3FFFFFFF) << 22);
res20 = ((encode[21] & 0x3FFFFFFF) >> 10);
res20 |= ((encode[22] & 0x3FFFFFFF) << 20);
res21 = ((encode[22] & 0x3FFFFFFF) >> 12);
res21 |= ((encode[23] & 0x3FFFFFFF) << 18);
res22 = ((encode[23] & 0x3FFFFFFF) >> 14);
res22 |= ((encode[24] & 0x3FFFFFFF) << 16);
res23 = ((encode[24] & 0x3FFFFFFF) >> 16);
res23 |= ((encode[25] & 0x3FFFFFFF) << 14);
res24 = ((encode[25] & 0x3FFFFFFF) >> 18);
res24 |= ((encode[26] & 0x3FFFFFFF) << 12);
res25 = ((encode[26] & 0x3FFFFFFF) >> 20);
res25 |= ((encode[27] & 0x3FFFFFFF) << 10);
res26 = ((encode[27] & 0x3FFFFFFF) >> 22);
res26 |= ((encode[28] & 0x3FFFFFFF) << 8);
res27 = ((encode[28] & 0x3FFFFFFF) >> 24);
res27 |= ((encode[29] & 0x3FFFFFFF) << 6);
res28 = ((encode[29] & 0x3FFFFFFF) >> 26);
res28 |= ((encode[30] & 0x3FFFFFFF) << 4);
res29 = ((encode[30] & 0x3FFFFFFF) >> 28);
res29 |= ((encode[31] & 0x3FFFFFFF) << 2);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
dest[22] = res22;
dest[23] = res23;
dest[24] = res24;
dest[25] = res25;
dest[26] = res26;
dest[27] = res27;
dest[28] = res28;
dest[29] = res29;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 30);
}
}
template <typename Type>
void pack_31(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 31) {
uint32_t res0;
uint32_t res1;
uint32_t res2;
uint32_t res3;
uint32_t res4;
uint32_t res5;
uint32_t res6;
uint32_t res7;
uint32_t res8;
uint32_t res9;
uint32_t res10;
uint32_t res11;
uint32_t res12;
uint32_t res13;
uint32_t res14;
uint32_t res15;
uint32_t res16;
uint32_t res17;
uint32_t res18;
uint32_t res19;
uint32_t res20;
uint32_t res21;
uint32_t res22;
uint32_t res23;
uint32_t res24;
uint32_t res25;
uint32_t res26;
uint32_t res27;
uint32_t res28;
uint32_t res29;
uint32_t res30;
res0 = (encode[0] & 0x7FFFFFFF);
res0 |= ((encode[1] & 0x7FFFFFFF) << 31);
res1 = ((encode[1] & 0x7FFFFFFF) >> 1);
res1 |= ((encode[2] & 0x7FFFFFFF) << 30);
res2 = ((encode[2] & 0x7FFFFFFF) >> 2);
res2 |= ((encode[3] & 0x7FFFFFFF) << 29);
res3 = ((encode[3] & 0x7FFFFFFF) >> 3);
res3 |= ((encode[4] & 0x7FFFFFFF) << 28);
res4 = ((encode[4] & 0x7FFFFFFF) >> 4);
res4 |= ((encode[5] & 0x7FFFFFFF) << 27);
res5 = ((encode[5] & 0x7FFFFFFF) >> 5);
res5 |= ((encode[6] & 0x7FFFFFFF) << 26);
res6 = ((encode[6] & 0x7FFFFFFF) >> 6);
res6 |= ((encode[7] & 0x7FFFFFFF) << 25);
res7 = ((encode[7] & 0x7FFFFFFF) >> 7);
res7 |= ((encode[8] & 0x7FFFFFFF) << 24);
res8 = ((encode[8] & 0x7FFFFFFF) >> 8);
res8 |= ((encode[9] & 0x7FFFFFFF) << 23);
res9 = ((encode[9] & 0x7FFFFFFF) >> 9);
res9 |= ((encode[10] & 0x7FFFFFFF) << 22);
res10 = ((encode[10] & 0x7FFFFFFF) >> 10);
res10 |= ((encode[11] & 0x7FFFFFFF) << 21);
res11 = ((encode[11] & 0x7FFFFFFF) >> 11);
res11 |= ((encode[12] & 0x7FFFFFFF) << 20);
res12 = ((encode[12] & 0x7FFFFFFF) >> 12);
res12 |= ((encode[13] & 0x7FFFFFFF) << 19);
res13 = ((encode[13] & 0x7FFFFFFF) >> 13);
res13 |= ((encode[14] & 0x7FFFFFFF) << 18);
res14 = ((encode[14] & 0x7FFFFFFF) >> 14);
res14 |= ((encode[15] & 0x7FFFFFFF) << 17);
res15 = ((encode[15] & 0x7FFFFFFF) >> 15);
res15 |= ((encode[16] & 0x7FFFFFFF) << 16);
res16 = ((encode[16] & 0x7FFFFFFF) >> 16);
res16 |= ((encode[17] & 0x7FFFFFFF) << 15);
res17 = ((encode[17] & 0x7FFFFFFF) >> 17);
res17 |= ((encode[18] & 0x7FFFFFFF) << 14);
res18 = ((encode[18] & 0x7FFFFFFF) >> 18);
res18 |= ((encode[19] & 0x7FFFFFFF) << 13);
res19 = ((encode[19] & 0x7FFFFFFF) >> 19);
res19 |= ((encode[20] & 0x7FFFFFFF) << 12);
res20 = ((encode[20] & 0x7FFFFFFF) >> 20);
res20 |= ((encode[21] & 0x7FFFFFFF) << 11);
res21 = ((encode[21] & 0x7FFFFFFF) >> 21);
res21 |= ((encode[22] & 0x7FFFFFFF) << 10);
res22 = ((encode[22] & 0x7FFFFFFF) >> 22);
res22 |= ((encode[23] & 0x7FFFFFFF) << 9);
res23 = ((encode[23] & 0x7FFFFFFF) >> 23);
res23 |= ((encode[24] & 0x7FFFFFFF) << 8);
res24 = ((encode[24] & 0x7FFFFFFF) >> 24);
res24 |= ((encode[25] & 0x7FFFFFFF) << 7);
res25 = ((encode[25] & 0x7FFFFFFF) >> 25);
res25 |= ((encode[26] & 0x7FFFFFFF) << 6);
res26 = ((encode[26] & 0x7FFFFFFF) >> 26);
res26 |= ((encode[27] & 0x7FFFFFFF) << 5);
res27 = ((encode[27] & 0x7FFFFFFF) >> 27);
res27 |= ((encode[28] & 0x7FFFFFFF) << 4);
res28 = ((encode[28] & 0x7FFFFFFF) >> 28);
res28 |= ((encode[29] & 0x7FFFFFFF) << 3);
res29 = ((encode[29] & 0x7FFFFFFF) >> 29);
res29 |= ((encode[30] & 0x7FFFFFFF) << 2);
res30 = ((encode[30] & 0x7FFFFFFF) >> 30);
res30 |= ((encode[31] & 0x7FFFFFFF) << 1);
dest[0] = res0;
dest[1] = res1;
dest[2] = res2;
dest[3] = res3;
dest[4] = res4;
dest[5] = res5;
dest[6] = res6;
dest[7] = res7;
dest[8] = res8;
dest[9] = res9;
dest[10] = res10;
dest[11] = res11;
dest[12] = res12;
dest[13] = res13;
dest[14] = res14;
dest[15] = res15;
dest[16] = res16;
dest[17] = res17;
dest[18] = res18;
dest[19] = res19;
dest[20] = res20;
dest[21] = res21;
dest[22] = res22;
dest[23] = res23;
dest[24] = res24;
dest[25] = res25;
dest[26] = res26;
dest[27] = res27;
dest[28] = res28;
dest[29] = res29;
dest[30] = res30;
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 31);
}
}
template <typename Type>
void pack_32(uint32_t* dest, const Type* encode, uint32_t n)
{
for (uint32_t i = 32; i <= n; i += 32, encode += 32, dest += 32) {
dest[0] = encode[0];
dest[1] = encode[1];
dest[2] = encode[2];
dest[3] = encode[3];
dest[4] = encode[4];
dest[5] = encode[5];
dest[6] = encode[6];
dest[7] = encode[7];
dest[8] = encode[8];
dest[9] = encode[9];
dest[10] = encode[10];
dest[11] = encode[11];
dest[12] = encode[12];
dest[13] = encode[13];
dest[14] = encode[14];
dest[15] = encode[15];
dest[16] = encode[16];
dest[17] = encode[17];
dest[18] = encode[18];
dest[19] = encode[19];
dest[20] = encode[20];
dest[21] = encode[21];
dest[22] = encode[22];
dest[23] = encode[23];
dest[24] = encode[24];
dest[25] = encode[25];
dest[26] = encode[26];
dest[27] = encode[27];
dest[28] = encode[28];
dest[29] = encode[29];
dest[30] = encode[30];
dest[31] = encode[31];
}
uint32_t rest = n % 32;
if (rest > 0) {
pack(dest, encode, rest, 32);
}
}
} // namespace indexlib::index