diff --git a/datasketches/src/theta/bit_pack.rs b/datasketches/src/theta/bit_pack.rs index 013899b..0c8902f 100644 --- a/datasketches/src/theta/bit_pack.rs +++ b/datasketches/src/theta/bit_pack.rs @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -pub(crate) const BLOCK_WIDTH: usize = 8; +pub(super) const BLOCK_WIDTH: usize = 8; #[inline] fn low_bit_to_byte_mask(bits: u8) -> u8 { @@ -33,7 +33,7 @@ fn low_bit_to_byte_mask(bits: u8) -> u8 { /// Panics if the buffer is too small to hold the packed values. /// The caller must ensure that `bytes` has enough capacity for /// the total number of bits to be packed. -pub(crate) struct BitPacker<'a> { +pub(super) struct BitPacker<'a> { bytes: &'a mut [u8], byte_index: usize, byte_bit_used: u8, @@ -104,7 +104,7 @@ impl<'a> BitPacker<'a> { /// Panics if the buffer is too small to provide the requested bits. /// The caller must ensure that `bytes` has enough capacity for /// the total number of bits to be unpacked. -pub(crate) struct BitUnpacker<'a> { +pub(super) struct BitUnpacker<'a> { bytes: &'a [u8], byte_index: usize, byte_bit_used: u8, @@ -2531,2441 +2531,2431 @@ fn unpack_bits_7(values: &mut [u64], bytes: &[u8]) { #[inline] fn unpack_bits_8(values: &mut [u64], bytes: &[u8]) { - values[0] = (bytes[0]) as u64; - values[1] = (bytes[1]) as u64; - values[2] = (bytes[2]) as u64; - values[3] = (bytes[3]) as u64; - values[4] = (bytes[4]) as u64; - values[5] = (bytes[5]) as u64; - values[6] = (bytes[6]) as u64; - values[7] = (bytes[7]) as u64; + values[0] = bytes[0] as u64; + values[1] = bytes[1] as u64; + values[2] = bytes[2] as u64; + values[3] = bytes[3] as u64; + values[4] = bytes[4] as u64; + values[5] = bytes[5] as u64; + values[6] = bytes[6] as u64; + values[7] = bytes[7] as u64; } #[inline] fn unpack_bits_9(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 1) | (((bytes[1] >> 7) & 0x1) as u64); + values[0] = ((bytes[0] as u64) << 1) | (((bytes[1] >> 7) & 0x1) as u64); values[1] = ((((bytes[1]) & 0x7f) as u64) << 2) | (((bytes[2] >> 6) & 0x3) as u64); values[2] = ((((bytes[2]) & 0x3f) as u64) << 3) | (((bytes[3] >> 5) & 0x7) as u64); values[3] = ((((bytes[3]) & 0x1f) as u64) << 4) | (((bytes[4] >> 4) & 0xf) as u64); values[4] = ((((bytes[4]) & 0xf) as u64) << 5) | (((bytes[5] >> 3) & 0x1f) as u64); values[5] = ((((bytes[5]) & 0x7) as u64) << 6) | (((bytes[6] >> 2) & 0x3f) as u64); values[6] = ((((bytes[6]) & 0x3) as u64) << 7) | (((bytes[7] >> 1) & 0x7f) as u64); - values[7] = ((((bytes[7]) & 0x1) as u64) << 8) | ((bytes[8]) as u64); + values[7] = ((((bytes[7]) & 0x1) as u64) << 8) | (bytes[8] as u64); } #[inline] fn unpack_bits_10(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 2) | (((bytes[1] >> 6) & 0x3) as u64); + values[0] = ((bytes[0] as u64) << 2) | (((bytes[1] >> 6) & 0x3) as u64); values[1] = ((((bytes[1]) & 0x3f) as u64) << 4) | (((bytes[2] >> 4) & 0xf) as u64); values[2] = ((((bytes[2]) & 0xf) as u64) << 6) | (((bytes[3] >> 2) & 0x3f) as u64); - values[3] = ((((bytes[3]) & 0x3) as u64) << 8) | ((bytes[4]) as u64); - values[4] = (((bytes[5]) as u64) << 2) | (((bytes[6] >> 6) & 0x3) as u64); + values[3] = ((((bytes[3]) & 0x3) as u64) << 8) | (bytes[4] as u64); + values[4] = ((bytes[5] as u64) << 2) | (((bytes[6] >> 6) & 0x3) as u64); values[5] = ((((bytes[6]) & 0x3f) as u64) << 4) | (((bytes[7] >> 4) & 0xf) as u64); values[6] = ((((bytes[7]) & 0xf) as u64) << 6) | (((bytes[8] >> 2) & 0x3f) as u64); - values[7] = ((((bytes[8]) & 0x3) as u64) << 8) | ((bytes[9]) as u64); + values[7] = ((((bytes[8]) & 0x3) as u64) << 8) | (bytes[9] as u64); } #[inline] fn unpack_bits_11(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 3) | (((bytes[1] >> 5) & 0x7) as u64); + values[0] = ((bytes[0] as u64) << 3) | (((bytes[1] >> 5) & 0x7) as u64); values[1] = ((((bytes[1]) & 0x1f) as u64) << 6) | (((bytes[2] >> 2) & 0x3f) as u64); values[2] = ((((bytes[2]) & 0x3) as u64) << 9) - | (((bytes[3]) as u64) << 1) + | ((bytes[3] as u64) << 1) | (((bytes[4] >> 7) & 0x1) as u64); values[3] = ((((bytes[4]) & 0x7f) as u64) << 4) | (((bytes[5] >> 4) & 0xf) as u64); values[4] = ((((bytes[5]) & 0xf) as u64) << 7) | (((bytes[6] >> 1) & 0x7f) as u64); values[5] = ((((bytes[6]) & 0x1) as u64) << 10) - | (((bytes[7]) as u64) << 2) + | ((bytes[7] as u64) << 2) | (((bytes[8] >> 6) & 0x3) as u64); values[6] = ((((bytes[8]) & 0x3f) as u64) << 5) | (((bytes[9] >> 3) & 0x1f) as u64); - values[7] = ((((bytes[9]) & 0x7) as u64) << 8) | ((bytes[10]) as u64); + values[7] = ((((bytes[9]) & 0x7) as u64) << 8) | (bytes[10] as u64); } #[inline] fn unpack_bits_12(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 4) | (((bytes[1] >> 4) & 0xf) as u64); - values[1] = ((((bytes[1]) & 0xf) as u64) << 8) | ((bytes[2]) as u64); - values[2] = (((bytes[3]) as u64) << 4) | (((bytes[4] >> 4) & 0xf) as u64); - values[3] = ((((bytes[4]) & 0xf) as u64) << 8) | ((bytes[5]) as u64); - values[4] = (((bytes[6]) as u64) << 4) | (((bytes[7] >> 4) & 0xf) as u64); - values[5] = ((((bytes[7]) & 0xf) as u64) << 8) | ((bytes[8]) as u64); - values[6] = (((bytes[9]) as u64) << 4) | (((bytes[10] >> 4) & 0xf) as u64); - values[7] = ((((bytes[10]) & 0xf) as u64) << 8) | ((bytes[11]) as u64); + values[0] = ((bytes[0] as u64) << 4) | (((bytes[1] >> 4) & 0xf) as u64); + values[1] = ((((bytes[1]) & 0xf) as u64) << 8) | (bytes[2] as u64); + values[2] = ((bytes[3] as u64) << 4) | (((bytes[4] >> 4) & 0xf) as u64); + values[3] = ((((bytes[4]) & 0xf) as u64) << 8) | (bytes[5] as u64); + values[4] = ((bytes[6] as u64) << 4) | (((bytes[7] >> 4) & 0xf) as u64); + values[5] = ((((bytes[7]) & 0xf) as u64) << 8) | (bytes[8] as u64); + values[6] = ((bytes[9] as u64) << 4) | (((bytes[10] >> 4) & 0xf) as u64); + values[7] = ((((bytes[10]) & 0xf) as u64) << 8) | (bytes[11] as u64); } #[inline] fn unpack_bits_13(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 5) | (((bytes[1] >> 3) & 0x1f) as u64); + values[0] = ((bytes[0] as u64) << 5) | (((bytes[1] >> 3) & 0x1f) as u64); values[1] = ((((bytes[1]) & 0x7) as u64) << 10) - | (((bytes[2]) as u64) << 2) + | ((bytes[2] as u64) << 2) | (((bytes[3] >> 6) & 0x3) as u64); values[2] = ((((bytes[3]) & 0x3f) as u64) << 7) | (((bytes[4] >> 1) & 0x7f) as u64); values[3] = ((((bytes[4]) & 0x1) as u64) << 12) - | (((bytes[5]) as u64) << 4) + | ((bytes[5] as u64) << 4) | (((bytes[6] >> 4) & 0xf) as u64); values[4] = ((((bytes[6]) & 0xf) as u64) << 9) - | (((bytes[7]) as u64) << 1) + | ((bytes[7] as u64) << 1) | (((bytes[8] >> 7) & 0x1) as u64); values[5] = ((((bytes[8]) & 0x7f) as u64) << 6) | (((bytes[9] >> 2) & 0x3f) as u64); values[6] = ((((bytes[9]) & 0x3) as u64) << 11) - | (((bytes[10]) as u64) << 3) + | ((bytes[10] as u64) << 3) | (((bytes[11] >> 5) & 0x7) as u64); - values[7] = ((((bytes[11]) & 0x1f) as u64) << 8) | ((bytes[12]) as u64); + values[7] = ((((bytes[11]) & 0x1f) as u64) << 8) | (bytes[12] as u64); } #[inline] fn unpack_bits_14(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 6) | (((bytes[1] >> 2) & 0x3f) as u64); + values[0] = ((bytes[0] as u64) << 6) | (((bytes[1] >> 2) & 0x3f) as u64); values[1] = ((((bytes[1]) & 0x3) as u64) << 12) - | (((bytes[2]) as u64) << 4) + | ((bytes[2] as u64) << 4) | (((bytes[3] >> 4) & 0xf) as u64); values[2] = ((((bytes[3]) & 0xf) as u64) << 10) - | (((bytes[4]) as u64) << 2) + | ((bytes[4] as u64) << 2) | (((bytes[5] >> 6) & 0x3) as u64); - values[3] = ((((bytes[5]) & 0x3f) as u64) << 8) | ((bytes[6]) as u64); - values[4] = (((bytes[7]) as u64) << 6) | (((bytes[8] >> 2) & 0x3f) as u64); + values[3] = ((((bytes[5]) & 0x3f) as u64) << 8) | (bytes[6] as u64); + values[4] = ((bytes[7] as u64) << 6) | (((bytes[8] >> 2) & 0x3f) as u64); values[5] = ((((bytes[8]) & 0x3) as u64) << 12) - | (((bytes[9]) as u64) << 4) + | ((bytes[9] as u64) << 4) | (((bytes[10] >> 4) & 0xf) as u64); values[6] = ((((bytes[10]) & 0xf) as u64) << 10) - | (((bytes[11]) as u64) << 2) + | ((bytes[11] as u64) << 2) | (((bytes[12] >> 6) & 0x3) as u64); - values[7] = ((((bytes[12]) & 0x3f) as u64) << 8) | ((bytes[13]) as u64); + values[7] = ((((bytes[12]) & 0x3f) as u64) << 8) | (bytes[13] as u64); } #[inline] fn unpack_bits_15(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 7) | (((bytes[1] >> 1) & 0x7f) as u64); + values[0] = ((bytes[0] as u64) << 7) | (((bytes[1] >> 1) & 0x7f) as u64); values[1] = ((((bytes[1]) & 0x1) as u64) << 14) - | (((bytes[2]) as u64) << 6) + | ((bytes[2] as u64) << 6) | (((bytes[3] >> 2) & 0x3f) as u64); values[2] = ((((bytes[3]) & 0x3) as u64) << 13) - | (((bytes[4]) as u64) << 5) + | ((bytes[4] as u64) << 5) | (((bytes[5] >> 3) & 0x1f) as u64); values[3] = ((((bytes[5]) & 0x7) as u64) << 12) - | (((bytes[6]) as u64) << 4) + | ((bytes[6] as u64) << 4) | (((bytes[7] >> 4) & 0xf) as u64); values[4] = ((((bytes[7]) & 0xf) as u64) << 11) - | (((bytes[8]) as u64) << 3) + | ((bytes[8] as u64) << 3) | (((bytes[9] >> 5) & 0x7) as u64); values[5] = ((((bytes[9]) & 0x1f) as u64) << 10) - | (((bytes[10]) as u64) << 2) + | ((bytes[10] as u64) << 2) | (((bytes[11] >> 6) & 0x3) as u64); values[6] = ((((bytes[11]) & 0x3f) as u64) << 9) - | (((bytes[12]) as u64) << 1) + | ((bytes[12] as u64) << 1) | (((bytes[13] >> 7) & 0x1) as u64); - values[7] = ((((bytes[13]) & 0x7f) as u64) << 8) | ((bytes[14]) as u64); + values[7] = ((((bytes[13]) & 0x7f) as u64) << 8) | (bytes[14] as u64); } #[inline] fn unpack_bits_16(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 8) | ((bytes[1]) as u64); - values[1] = (((bytes[2]) as u64) << 8) | ((bytes[3]) as u64); - values[2] = (((bytes[4]) as u64) << 8) | ((bytes[5]) as u64); - values[3] = (((bytes[6]) as u64) << 8) | ((bytes[7]) as u64); - values[4] = (((bytes[8]) as u64) << 8) | ((bytes[9]) as u64); - values[5] = (((bytes[10]) as u64) << 8) | ((bytes[11]) as u64); - values[6] = (((bytes[12]) as u64) << 8) | ((bytes[13]) as u64); - values[7] = (((bytes[14]) as u64) << 8) | ((bytes[15]) as u64); + values[0] = ((bytes[0] as u64) << 8) | (bytes[1] as u64); + values[1] = ((bytes[2] as u64) << 8) | (bytes[3] as u64); + values[2] = ((bytes[4] as u64) << 8) | (bytes[5] as u64); + values[3] = ((bytes[6] as u64) << 8) | (bytes[7] as u64); + values[4] = ((bytes[8] as u64) << 8) | (bytes[9] as u64); + values[5] = ((bytes[10] as u64) << 8) | (bytes[11] as u64); + values[6] = ((bytes[12] as u64) << 8) | (bytes[13] as u64); + values[7] = ((bytes[14] as u64) << 8) | (bytes[15] as u64); } #[inline] fn unpack_bits_17(values: &mut [u64], bytes: &[u8]) { values[0] = - (((bytes[0]) as u64) << 9) | (((bytes[1]) as u64) << 1) | (((bytes[2] >> 7) & 0x1) as u64); + ((bytes[0] as u64) << 9) | ((bytes[1] as u64) << 1) | (((bytes[2] >> 7) & 0x1) as u64); values[1] = ((((bytes[2]) & 0x7f) as u64) << 10) - | (((bytes[3]) as u64) << 2) + | ((bytes[3] as u64) << 2) | (((bytes[4] >> 6) & 0x3) as u64); values[2] = ((((bytes[4]) & 0x3f) as u64) << 11) - | (((bytes[5]) as u64) << 3) + | ((bytes[5] as u64) << 3) | (((bytes[6] >> 5) & 0x7) as u64); values[3] = ((((bytes[6]) & 0x1f) as u64) << 12) - | (((bytes[7]) as u64) << 4) + | ((bytes[7] as u64) << 4) | (((bytes[8] >> 4) & 0xf) as u64); values[4] = ((((bytes[8]) & 0xf) as u64) << 13) - | (((bytes[9]) as u64) << 5) + | ((bytes[9] as u64) << 5) | (((bytes[10] >> 3) & 0x1f) as u64); values[5] = ((((bytes[10]) & 0x7) as u64) << 14) - | (((bytes[11]) as u64) << 6) + | ((bytes[11] as u64) << 6) | (((bytes[12] >> 2) & 0x3f) as u64); values[6] = ((((bytes[12]) & 0x3) as u64) << 15) - | (((bytes[13]) as u64) << 7) + | ((bytes[13] as u64) << 7) | (((bytes[14] >> 1) & 0x7f) as u64); values[7] = - ((((bytes[14]) & 0x1) as u64) << 16) | (((bytes[15]) as u64) << 8) | ((bytes[16]) as u64); + ((((bytes[14]) & 0x1) as u64) << 16) | ((bytes[15] as u64) << 8) | (bytes[16] as u64); } #[inline] fn unpack_bits_18(values: &mut [u64], bytes: &[u8]) { values[0] = - (((bytes[0]) as u64) << 10) | (((bytes[1]) as u64) << 2) | (((bytes[2] >> 6) & 0x3) as u64); + ((bytes[0] as u64) << 10) | ((bytes[1] as u64) << 2) | (((bytes[2] >> 6) & 0x3) as u64); values[1] = ((((bytes[2]) & 0x3f) as u64) << 12) - | (((bytes[3]) as u64) << 4) + | ((bytes[3] as u64) << 4) | (((bytes[4] >> 4) & 0xf) as u64); values[2] = ((((bytes[4]) & 0xf) as u64) << 14) - | (((bytes[5]) as u64) << 6) + | ((bytes[5] as u64) << 6) | (((bytes[6] >> 2) & 0x3f) as u64); - values[3] = - ((((bytes[6]) & 0x3) as u64) << 16) | (((bytes[7]) as u64) << 8) | ((bytes[8]) as u64); - values[4] = (((bytes[9]) as u64) << 10) - | (((bytes[10]) as u64) << 2) - | (((bytes[11] >> 6) & 0x3) as u64); + values[3] = ((((bytes[6]) & 0x3) as u64) << 16) | ((bytes[7] as u64) << 8) | (bytes[8] as u64); + values[4] = + ((bytes[9] as u64) << 10) | ((bytes[10] as u64) << 2) | (((bytes[11] >> 6) & 0x3) as u64); values[5] = ((((bytes[11]) & 0x3f) as u64) << 12) - | (((bytes[12]) as u64) << 4) + | ((bytes[12] as u64) << 4) | (((bytes[13] >> 4) & 0xf) as u64); values[6] = ((((bytes[13]) & 0xf) as u64) << 14) - | (((bytes[14]) as u64) << 6) + | ((bytes[14] as u64) << 6) | (((bytes[15] >> 2) & 0x3f) as u64); values[7] = - ((((bytes[15]) & 0x3) as u64) << 16) | (((bytes[16]) as u64) << 8) | ((bytes[17]) as u64); + ((((bytes[15]) & 0x3) as u64) << 16) | ((bytes[16] as u64) << 8) | (bytes[17] as u64); } #[inline] fn unpack_bits_19(values: &mut [u64], bytes: &[u8]) { values[0] = - (((bytes[0]) as u64) << 11) | (((bytes[1]) as u64) << 3) | (((bytes[2] >> 5) & 0x7) as u64); + ((bytes[0] as u64) << 11) | ((bytes[1] as u64) << 3) | (((bytes[2] >> 5) & 0x7) as u64); values[1] = ((((bytes[2]) & 0x1f) as u64) << 14) - | (((bytes[3]) as u64) << 6) + | ((bytes[3] as u64) << 6) | (((bytes[4] >> 2) & 0x3f) as u64); values[2] = ((((bytes[4]) & 0x3) as u64) << 17) - | (((bytes[5]) as u64) << 9) - | (((bytes[6]) as u64) << 1) + | ((bytes[5] as u64) << 9) + | ((bytes[6] as u64) << 1) | (((bytes[7] >> 7) & 0x1) as u64); values[3] = ((((bytes[7]) & 0x7f) as u64) << 12) - | (((bytes[8]) as u64) << 4) + | ((bytes[8] as u64) << 4) | (((bytes[9] >> 4) & 0xf) as u64); values[4] = ((((bytes[9]) & 0xf) as u64) << 15) - | (((bytes[10]) as u64) << 7) + | ((bytes[10] as u64) << 7) | (((bytes[11] >> 1) & 0x7f) as u64); values[5] = ((((bytes[11]) & 0x1) as u64) << 18) - | (((bytes[12]) as u64) << 10) - | (((bytes[13]) as u64) << 2) + | ((bytes[12] as u64) << 10) + | ((bytes[13] as u64) << 2) | (((bytes[14] >> 6) & 0x3) as u64); values[6] = ((((bytes[14]) & 0x3f) as u64) << 13) - | (((bytes[15]) as u64) << 5) + | ((bytes[15] as u64) << 5) | (((bytes[16] >> 3) & 0x1f) as u64); values[7] = - ((((bytes[16]) & 0x7) as u64) << 16) | (((bytes[17]) as u64) << 8) | ((bytes[18]) as u64); + ((((bytes[16]) & 0x7) as u64) << 16) | ((bytes[17] as u64) << 8) | (bytes[18] as u64); } #[inline] fn unpack_bits_20(values: &mut [u64], bytes: &[u8]) { values[0] = - (((bytes[0]) as u64) << 12) | (((bytes[1]) as u64) << 4) | (((bytes[2] >> 4) & 0xf) as u64); - values[1] = - ((((bytes[2]) & 0xf) as u64) << 16) | (((bytes[3]) as u64) << 8) | ((bytes[4]) as u64); + ((bytes[0] as u64) << 12) | ((bytes[1] as u64) << 4) | (((bytes[2] >> 4) & 0xf) as u64); + values[1] = ((((bytes[2]) & 0xf) as u64) << 16) | ((bytes[3] as u64) << 8) | (bytes[4] as u64); values[2] = - (((bytes[5]) as u64) << 12) | (((bytes[6]) as u64) << 4) | (((bytes[7] >> 4) & 0xf) as u64); - values[3] = - ((((bytes[7]) & 0xf) as u64) << 16) | (((bytes[8]) as u64) << 8) | ((bytes[9]) as u64); - values[4] = (((bytes[10]) as u64) << 12) - | (((bytes[11]) as u64) << 4) - | (((bytes[12] >> 4) & 0xf) as u64); + ((bytes[5] as u64) << 12) | ((bytes[6] as u64) << 4) | (((bytes[7] >> 4) & 0xf) as u64); + values[3] = ((((bytes[7]) & 0xf) as u64) << 16) | ((bytes[8] as u64) << 8) | (bytes[9] as u64); + values[4] = + ((bytes[10] as u64) << 12) | ((bytes[11] as u64) << 4) | (((bytes[12] >> 4) & 0xf) as u64); values[5] = - ((((bytes[12]) & 0xf) as u64) << 16) | (((bytes[13]) as u64) << 8) | ((bytes[14]) as u64); - values[6] = (((bytes[15]) as u64) << 12) - | (((bytes[16]) as u64) << 4) - | (((bytes[17] >> 4) & 0xf) as u64); + ((((bytes[12]) & 0xf) as u64) << 16) | ((bytes[13] as u64) << 8) | (bytes[14] as u64); + values[6] = + ((bytes[15] as u64) << 12) | ((bytes[16] as u64) << 4) | (((bytes[17] >> 4) & 0xf) as u64); values[7] = - ((((bytes[17]) & 0xf) as u64) << 16) | (((bytes[18]) as u64) << 8) | ((bytes[19]) as u64); + ((((bytes[17]) & 0xf) as u64) << 16) | ((bytes[18] as u64) << 8) | (bytes[19] as u64); } #[inline] fn unpack_bits_21(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 13) - | (((bytes[1]) as u64) << 5) - | (((bytes[2] >> 3) & 0x1f) as u64); + values[0] = + ((bytes[0] as u64) << 13) | ((bytes[1] as u64) << 5) | (((bytes[2] >> 3) & 0x1f) as u64); values[1] = ((((bytes[2]) & 0x7) as u64) << 18) - | (((bytes[3]) as u64) << 10) - | (((bytes[4]) as u64) << 2) + | ((bytes[3] as u64) << 10) + | ((bytes[4] as u64) << 2) | (((bytes[5] >> 6) & 0x3) as u64); values[2] = ((((bytes[5]) & 0x3f) as u64) << 15) - | (((bytes[6]) as u64) << 7) + | ((bytes[6] as u64) << 7) | (((bytes[7] >> 1) & 0x7f) as u64); values[3] = ((((bytes[7]) & 0x1) as u64) << 20) - | (((bytes[8]) as u64) << 12) - | (((bytes[9]) as u64) << 4) + | ((bytes[8] as u64) << 12) + | ((bytes[9] as u64) << 4) | (((bytes[10] >> 4) & 0xf) as u64); values[4] = ((((bytes[10]) & 0xf) as u64) << 17) - | (((bytes[11]) as u64) << 9) - | (((bytes[12]) as u64) << 1) + | ((bytes[11] as u64) << 9) + | ((bytes[12] as u64) << 1) | (((bytes[13] >> 7) & 0x1) as u64); values[5] = ((((bytes[13]) & 0x7f) as u64) << 14) - | (((bytes[14]) as u64) << 6) + | ((bytes[14] as u64) << 6) | (((bytes[15] >> 2) & 0x3f) as u64); values[6] = ((((bytes[15]) & 0x3) as u64) << 19) - | (((bytes[16]) as u64) << 11) - | (((bytes[17]) as u64) << 3) + | ((bytes[16] as u64) << 11) + | ((bytes[17] as u64) << 3) | (((bytes[18] >> 5) & 0x7) as u64); values[7] = - ((((bytes[18]) & 0x1f) as u64) << 16) | (((bytes[19]) as u64) << 8) | ((bytes[20]) as u64); + ((((bytes[18]) & 0x1f) as u64) << 16) | ((bytes[19] as u64) << 8) | (bytes[20] as u64); } #[inline] fn unpack_bits_22(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 14) - | (((bytes[1]) as u64) << 6) - | (((bytes[2] >> 2) & 0x3f) as u64); + values[0] = + ((bytes[0] as u64) << 14) | ((bytes[1] as u64) << 6) | (((bytes[2] >> 2) & 0x3f) as u64); values[1] = ((((bytes[2]) & 0x3) as u64) << 20) - | (((bytes[3]) as u64) << 12) - | (((bytes[4]) as u64) << 4) + | ((bytes[3] as u64) << 12) + | ((bytes[4] as u64) << 4) | (((bytes[5] >> 4) & 0xf) as u64); values[2] = ((((bytes[5]) & 0xf) as u64) << 18) - | (((bytes[6]) as u64) << 10) - | (((bytes[7]) as u64) << 2) + | ((bytes[6] as u64) << 10) + | ((bytes[7] as u64) << 2) | (((bytes[8] >> 6) & 0x3) as u64); values[3] = - ((((bytes[8]) & 0x3f) as u64) << 16) | (((bytes[9]) as u64) << 8) | ((bytes[10]) as u64); - values[4] = (((bytes[11]) as u64) << 14) - | (((bytes[12]) as u64) << 6) - | (((bytes[13] >> 2) & 0x3f) as u64); + ((((bytes[8]) & 0x3f) as u64) << 16) | ((bytes[9] as u64) << 8) | (bytes[10] as u64); + values[4] = + ((bytes[11] as u64) << 14) | ((bytes[12] as u64) << 6) | (((bytes[13] >> 2) & 0x3f) as u64); values[5] = ((((bytes[13]) & 0x3) as u64) << 20) - | (((bytes[14]) as u64) << 12) - | (((bytes[15]) as u64) << 4) + | ((bytes[14] as u64) << 12) + | ((bytes[15] as u64) << 4) | (((bytes[16] >> 4) & 0xf) as u64); values[6] = ((((bytes[16]) & 0xf) as u64) << 18) - | (((bytes[17]) as u64) << 10) - | (((bytes[18]) as u64) << 2) + | ((bytes[17] as u64) << 10) + | ((bytes[18] as u64) << 2) | (((bytes[19] >> 6) & 0x3) as u64); values[7] = - ((((bytes[19]) & 0x3f) as u64) << 16) | (((bytes[20]) as u64) << 8) | ((bytes[21]) as u64); + ((((bytes[19]) & 0x3f) as u64) << 16) | ((bytes[20] as u64) << 8) | (bytes[21] as u64); } #[inline] fn unpack_bits_23(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 15) - | (((bytes[1]) as u64) << 7) - | (((bytes[2] >> 1) & 0x7f) as u64); + values[0] = + ((bytes[0] as u64) << 15) | ((bytes[1] as u64) << 7) | (((bytes[2] >> 1) & 0x7f) as u64); values[1] = ((((bytes[2]) & 0x1) as u64) << 22) - | (((bytes[3]) as u64) << 14) - | (((bytes[4]) as u64) << 6) + | ((bytes[3] as u64) << 14) + | ((bytes[4] as u64) << 6) | (((bytes[5] >> 2) & 0x3f) as u64); values[2] = ((((bytes[5]) & 0x3) as u64) << 21) - | (((bytes[6]) as u64) << 13) - | (((bytes[7]) as u64) << 5) + | ((bytes[6] as u64) << 13) + | ((bytes[7] as u64) << 5) | (((bytes[8] >> 3) & 0x1f) as u64); values[3] = ((((bytes[8]) & 0x7) as u64) << 20) - | (((bytes[9]) as u64) << 12) - | (((bytes[10]) as u64) << 4) + | ((bytes[9] as u64) << 12) + | ((bytes[10] as u64) << 4) | (((bytes[11] >> 4) & 0xf) as u64); values[4] = ((((bytes[11]) & 0xf) as u64) << 19) - | (((bytes[12]) as u64) << 11) - | (((bytes[13]) as u64) << 3) + | ((bytes[12] as u64) << 11) + | ((bytes[13] as u64) << 3) | (((bytes[14] >> 5) & 0x7) as u64); values[5] = ((((bytes[14]) & 0x1f) as u64) << 18) - | (((bytes[15]) as u64) << 10) - | (((bytes[16]) as u64) << 2) + | ((bytes[15] as u64) << 10) + | ((bytes[16] as u64) << 2) | (((bytes[17] >> 6) & 0x3) as u64); values[6] = ((((bytes[17]) & 0x3f) as u64) << 17) - | (((bytes[18]) as u64) << 9) - | (((bytes[19]) as u64) << 1) + | ((bytes[18] as u64) << 9) + | ((bytes[19] as u64) << 1) | (((bytes[20] >> 7) & 0x1) as u64); values[7] = - ((((bytes[20]) & 0x7f) as u64) << 16) | (((bytes[21]) as u64) << 8) | ((bytes[22]) as u64); + ((((bytes[20]) & 0x7f) as u64) << 16) | ((bytes[21] as u64) << 8) | (bytes[22] as u64); } #[inline] fn unpack_bits_24(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 16) | (((bytes[1]) as u64) << 8) | ((bytes[2]) as u64); - values[1] = (((bytes[3]) as u64) << 16) | (((bytes[4]) as u64) << 8) | ((bytes[5]) as u64); - values[2] = (((bytes[6]) as u64) << 16) | (((bytes[7]) as u64) << 8) | ((bytes[8]) as u64); - values[3] = (((bytes[9]) as u64) << 16) | (((bytes[10]) as u64) << 8) | ((bytes[11]) as u64); - values[4] = (((bytes[12]) as u64) << 16) | (((bytes[13]) as u64) << 8) | ((bytes[14]) as u64); - values[5] = (((bytes[15]) as u64) << 16) | (((bytes[16]) as u64) << 8) | ((bytes[17]) as u64); - values[6] = (((bytes[18]) as u64) << 16) | (((bytes[19]) as u64) << 8) | ((bytes[20]) as u64); - values[7] = (((bytes[21]) as u64) << 16) | (((bytes[22]) as u64) << 8) | ((bytes[23]) as u64); + values[0] = ((bytes[0] as u64) << 16) | ((bytes[1] as u64) << 8) | (bytes[2] as u64); + values[1] = ((bytes[3] as u64) << 16) | ((bytes[4] as u64) << 8) | (bytes[5] as u64); + values[2] = ((bytes[6] as u64) << 16) | ((bytes[7] as u64) << 8) | (bytes[8] as u64); + values[3] = ((bytes[9] as u64) << 16) | ((bytes[10] as u64) << 8) | (bytes[11] as u64); + values[4] = ((bytes[12] as u64) << 16) | ((bytes[13] as u64) << 8) | (bytes[14] as u64); + values[5] = ((bytes[15] as u64) << 16) | ((bytes[16] as u64) << 8) | (bytes[17] as u64); + values[6] = ((bytes[18] as u64) << 16) | ((bytes[19] as u64) << 8) | (bytes[20] as u64); + values[7] = ((bytes[21] as u64) << 16) | ((bytes[22] as u64) << 8) | (bytes[23] as u64); } #[inline] fn unpack_bits_25(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 17) - | (((bytes[1]) as u64) << 9) - | (((bytes[2]) as u64) << 1) + values[0] = ((bytes[0] as u64) << 17) + | ((bytes[1] as u64) << 9) + | ((bytes[2] as u64) << 1) | (((bytes[3] >> 7) & 0x1) as u64); values[1] = ((((bytes[3]) & 0x7f) as u64) << 18) - | (((bytes[4]) as u64) << 10) - | (((bytes[5]) as u64) << 2) + | ((bytes[4] as u64) << 10) + | ((bytes[5] as u64) << 2) | (((bytes[6] >> 6) & 0x3) as u64); values[2] = ((((bytes[6]) & 0x3f) as u64) << 19) - | (((bytes[7]) as u64) << 11) - | (((bytes[8]) as u64) << 3) + | ((bytes[7] as u64) << 11) + | ((bytes[8] as u64) << 3) | (((bytes[9] >> 5) & 0x7) as u64); values[3] = ((((bytes[9]) & 0x1f) as u64) << 20) - | (((bytes[10]) as u64) << 12) - | (((bytes[11]) as u64) << 4) + | ((bytes[10] as u64) << 12) + | ((bytes[11] as u64) << 4) | (((bytes[12] >> 4) & 0xf) as u64); values[4] = ((((bytes[12]) & 0xf) as u64) << 21) - | (((bytes[13]) as u64) << 13) - | (((bytes[14]) as u64) << 5) + | ((bytes[13] as u64) << 13) + | ((bytes[14] as u64) << 5) | (((bytes[15] >> 3) & 0x1f) as u64); values[5] = ((((bytes[15]) & 0x7) as u64) << 22) - | (((bytes[16]) as u64) << 14) - | (((bytes[17]) as u64) << 6) + | ((bytes[16] as u64) << 14) + | ((bytes[17] as u64) << 6) | (((bytes[18] >> 2) & 0x3f) as u64); values[6] = ((((bytes[18]) & 0x3) as u64) << 23) - | (((bytes[19]) as u64) << 15) - | (((bytes[20]) as u64) << 7) + | ((bytes[19] as u64) << 15) + | ((bytes[20] as u64) << 7) | (((bytes[21] >> 1) & 0x7f) as u64); values[7] = ((((bytes[21]) & 0x1) as u64) << 24) - | (((bytes[22]) as u64) << 16) - | (((bytes[23]) as u64) << 8) - | ((bytes[24]) as u64); + | ((bytes[22] as u64) << 16) + | ((bytes[23] as u64) << 8) + | (bytes[24] as u64); } #[inline] fn unpack_bits_26(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 18) - | (((bytes[1]) as u64) << 10) - | (((bytes[2]) as u64) << 2) + values[0] = ((bytes[0] as u64) << 18) + | ((bytes[1] as u64) << 10) + | ((bytes[2] as u64) << 2) | (((bytes[3] >> 6) & 0x3) as u64); values[1] = ((((bytes[3]) & 0x3f) as u64) << 20) - | (((bytes[4]) as u64) << 12) - | (((bytes[5]) as u64) << 4) + | ((bytes[4] as u64) << 12) + | ((bytes[5] as u64) << 4) | (((bytes[6] >> 4) & 0xf) as u64); values[2] = ((((bytes[6]) & 0xf) as u64) << 22) - | (((bytes[7]) as u64) << 14) - | (((bytes[8]) as u64) << 6) + | ((bytes[7] as u64) << 14) + | ((bytes[8] as u64) << 6) | (((bytes[9] >> 2) & 0x3f) as u64); values[3] = ((((bytes[9]) & 0x3) as u64) << 24) - | (((bytes[10]) as u64) << 16) - | (((bytes[11]) as u64) << 8) - | ((bytes[12]) as u64); - values[4] = (((bytes[13]) as u64) << 18) - | (((bytes[14]) as u64) << 10) - | (((bytes[15]) as u64) << 2) + | ((bytes[10] as u64) << 16) + | ((bytes[11] as u64) << 8) + | (bytes[12] as u64); + values[4] = ((bytes[13] as u64) << 18) + | ((bytes[14] as u64) << 10) + | ((bytes[15] as u64) << 2) | (((bytes[16] >> 6) & 0x3) as u64); values[5] = ((((bytes[16]) & 0x3f) as u64) << 20) - | (((bytes[17]) as u64) << 12) - | (((bytes[18]) as u64) << 4) + | ((bytes[17] as u64) << 12) + | ((bytes[18] as u64) << 4) | (((bytes[19] >> 4) & 0xf) as u64); values[6] = ((((bytes[19]) & 0xf) as u64) << 22) - | (((bytes[20]) as u64) << 14) - | (((bytes[21]) as u64) << 6) + | ((bytes[20] as u64) << 14) + | ((bytes[21] as u64) << 6) | (((bytes[22] >> 2) & 0x3f) as u64); values[7] = ((((bytes[22]) & 0x3) as u64) << 24) - | (((bytes[23]) as u64) << 16) - | (((bytes[24]) as u64) << 8) - | ((bytes[25]) as u64); + | ((bytes[23] as u64) << 16) + | ((bytes[24] as u64) << 8) + | (bytes[25] as u64); } #[inline] fn unpack_bits_27(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 19) - | (((bytes[1]) as u64) << 11) - | (((bytes[2]) as u64) << 3) + values[0] = ((bytes[0] as u64) << 19) + | ((bytes[1] as u64) << 11) + | ((bytes[2] as u64) << 3) | (((bytes[3] >> 5) & 0x7) as u64); values[1] = ((((bytes[3]) & 0x1f) as u64) << 22) - | (((bytes[4]) as u64) << 14) - | (((bytes[5]) as u64) << 6) + | ((bytes[4] as u64) << 14) + | ((bytes[5] as u64) << 6) | (((bytes[6] >> 2) & 0x3f) as u64); values[2] = ((((bytes[6]) & 0x3) as u64) << 25) - | (((bytes[7]) as u64) << 17) - | (((bytes[8]) as u64) << 9) - | (((bytes[9]) as u64) << 1) + | ((bytes[7] as u64) << 17) + | ((bytes[8] as u64) << 9) + | ((bytes[9] as u64) << 1) | (((bytes[10] >> 7) & 0x1) as u64); values[3] = ((((bytes[10]) & 0x7f) as u64) << 20) - | (((bytes[11]) as u64) << 12) - | (((bytes[12]) as u64) << 4) + | ((bytes[11] as u64) << 12) + | ((bytes[12] as u64) << 4) | (((bytes[13] >> 4) & 0xf) as u64); values[4] = ((((bytes[13]) & 0xf) as u64) << 23) - | (((bytes[14]) as u64) << 15) - | (((bytes[15]) as u64) << 7) + | ((bytes[14] as u64) << 15) + | ((bytes[15] as u64) << 7) | (((bytes[16] >> 1) & 0x7f) as u64); values[5] = ((((bytes[16]) & 0x1) as u64) << 26) - | (((bytes[17]) as u64) << 18) - | (((bytes[18]) as u64) << 10) - | (((bytes[19]) as u64) << 2) + | ((bytes[17] as u64) << 18) + | ((bytes[18] as u64) << 10) + | ((bytes[19] as u64) << 2) | (((bytes[20] >> 6) & 0x3) as u64); values[6] = ((((bytes[20]) & 0x3f) as u64) << 21) - | (((bytes[21]) as u64) << 13) - | (((bytes[22]) as u64) << 5) + | ((bytes[21] as u64) << 13) + | ((bytes[22] as u64) << 5) | (((bytes[23] >> 3) & 0x1f) as u64); values[7] = ((((bytes[23]) & 0x7) as u64) << 24) - | (((bytes[24]) as u64) << 16) - | (((bytes[25]) as u64) << 8) - | ((bytes[26]) as u64); + | ((bytes[24] as u64) << 16) + | ((bytes[25] as u64) << 8) + | (bytes[26] as u64); } #[inline] fn unpack_bits_28(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 20) - | (((bytes[1]) as u64) << 12) - | (((bytes[2]) as u64) << 4) + values[0] = ((bytes[0] as u64) << 20) + | ((bytes[1] as u64) << 12) + | ((bytes[2] as u64) << 4) | (((bytes[3] >> 4) & 0xf) as u64); values[1] = ((((bytes[3]) & 0xf) as u64) << 24) - | (((bytes[4]) as u64) << 16) - | (((bytes[5]) as u64) << 8) - | ((bytes[6]) as u64); - values[2] = (((bytes[7]) as u64) << 20) - | (((bytes[8]) as u64) << 12) - | (((bytes[9]) as u64) << 4) + | ((bytes[4] as u64) << 16) + | ((bytes[5] as u64) << 8) + | (bytes[6] as u64); + values[2] = ((bytes[7] as u64) << 20) + | ((bytes[8] as u64) << 12) + | ((bytes[9] as u64) << 4) | (((bytes[10] >> 4) & 0xf) as u64); values[3] = ((((bytes[10]) & 0xf) as u64) << 24) - | (((bytes[11]) as u64) << 16) - | (((bytes[12]) as u64) << 8) - | ((bytes[13]) as u64); - values[4] = (((bytes[14]) as u64) << 20) - | (((bytes[15]) as u64) << 12) - | (((bytes[16]) as u64) << 4) + | ((bytes[11] as u64) << 16) + | ((bytes[12] as u64) << 8) + | (bytes[13] as u64); + values[4] = ((bytes[14] as u64) << 20) + | ((bytes[15] as u64) << 12) + | ((bytes[16] as u64) << 4) | (((bytes[17] >> 4) & 0xf) as u64); values[5] = ((((bytes[17]) & 0xf) as u64) << 24) - | (((bytes[18]) as u64) << 16) - | (((bytes[19]) as u64) << 8) - | ((bytes[20]) as u64); - values[6] = (((bytes[21]) as u64) << 20) - | (((bytes[22]) as u64) << 12) - | (((bytes[23]) as u64) << 4) + | ((bytes[18] as u64) << 16) + | ((bytes[19] as u64) << 8) + | (bytes[20] as u64); + values[6] = ((bytes[21] as u64) << 20) + | ((bytes[22] as u64) << 12) + | ((bytes[23] as u64) << 4) | (((bytes[24] >> 4) & 0xf) as u64); values[7] = ((((bytes[24]) & 0xf) as u64) << 24) - | (((bytes[25]) as u64) << 16) - | (((bytes[26]) as u64) << 8) - | ((bytes[27]) as u64); + | ((bytes[25] as u64) << 16) + | ((bytes[26] as u64) << 8) + | (bytes[27] as u64); } #[inline] fn unpack_bits_29(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 21) - | (((bytes[1]) as u64) << 13) - | (((bytes[2]) as u64) << 5) + values[0] = ((bytes[0] as u64) << 21) + | ((bytes[1] as u64) << 13) + | ((bytes[2] as u64) << 5) | (((bytes[3] >> 3) & 0x1f) as u64); values[1] = ((((bytes[3]) & 0x7) as u64) << 26) - | (((bytes[4]) as u64) << 18) - | (((bytes[5]) as u64) << 10) - | (((bytes[6]) as u64) << 2) + | ((bytes[4] as u64) << 18) + | ((bytes[5] as u64) << 10) + | ((bytes[6] as u64) << 2) | (((bytes[7] >> 6) & 0x3) as u64); values[2] = ((((bytes[7]) & 0x3f) as u64) << 23) - | (((bytes[8]) as u64) << 15) - | (((bytes[9]) as u64) << 7) + | ((bytes[8] as u64) << 15) + | ((bytes[9] as u64) << 7) | (((bytes[10] >> 1) & 0x7f) as u64); values[3] = ((((bytes[10]) & 0x1) as u64) << 28) - | (((bytes[11]) as u64) << 20) - | (((bytes[12]) as u64) << 12) - | (((bytes[13]) as u64) << 4) + | ((bytes[11] as u64) << 20) + | ((bytes[12] as u64) << 12) + | ((bytes[13] as u64) << 4) | (((bytes[14] >> 4) & 0xf) as u64); values[4] = ((((bytes[14]) & 0xf) as u64) << 25) - | (((bytes[15]) as u64) << 17) - | (((bytes[16]) as u64) << 9) - | (((bytes[17]) as u64) << 1) + | ((bytes[15] as u64) << 17) + | ((bytes[16] as u64) << 9) + | ((bytes[17] as u64) << 1) | (((bytes[18] >> 7) & 0x1) as u64); values[5] = ((((bytes[18]) & 0x7f) as u64) << 22) - | (((bytes[19]) as u64) << 14) - | (((bytes[20]) as u64) << 6) + | ((bytes[19] as u64) << 14) + | ((bytes[20] as u64) << 6) | (((bytes[21] >> 2) & 0x3f) as u64); values[6] = ((((bytes[21]) & 0x3) as u64) << 27) - | (((bytes[22]) as u64) << 19) - | (((bytes[23]) as u64) << 11) - | (((bytes[24]) as u64) << 3) + | ((bytes[22] as u64) << 19) + | ((bytes[23] as u64) << 11) + | ((bytes[24] as u64) << 3) | (((bytes[25] >> 5) & 0x7) as u64); values[7] = ((((bytes[25]) & 0x1f) as u64) << 24) - | (((bytes[26]) as u64) << 16) - | (((bytes[27]) as u64) << 8) - | ((bytes[28]) as u64); + | ((bytes[26] as u64) << 16) + | ((bytes[27] as u64) << 8) + | (bytes[28] as u64); } #[inline] fn unpack_bits_30(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 22) - | (((bytes[1]) as u64) << 14) - | (((bytes[2]) as u64) << 6) + values[0] = ((bytes[0] as u64) << 22) + | ((bytes[1] as u64) << 14) + | ((bytes[2] as u64) << 6) | (((bytes[3] >> 2) & 0x3f) as u64); values[1] = ((((bytes[3]) & 0x3) as u64) << 28) - | (((bytes[4]) as u64) << 20) - | (((bytes[5]) as u64) << 12) - | (((bytes[6]) as u64) << 4) + | ((bytes[4] as u64) << 20) + | ((bytes[5] as u64) << 12) + | ((bytes[6] as u64) << 4) | (((bytes[7] >> 4) & 0xf) as u64); values[2] = ((((bytes[7]) & 0xf) as u64) << 26) - | (((bytes[8]) as u64) << 18) - | (((bytes[9]) as u64) << 10) - | (((bytes[10]) as u64) << 2) + | ((bytes[8] as u64) << 18) + | ((bytes[9] as u64) << 10) + | ((bytes[10] as u64) << 2) | (((bytes[11] >> 6) & 0x3) as u64); values[3] = ((((bytes[11]) & 0x3f) as u64) << 24) - | (((bytes[12]) as u64) << 16) - | (((bytes[13]) as u64) << 8) - | ((bytes[14]) as u64); - values[4] = (((bytes[15]) as u64) << 22) - | (((bytes[16]) as u64) << 14) - | (((bytes[17]) as u64) << 6) + | ((bytes[12] as u64) << 16) + | ((bytes[13] as u64) << 8) + | (bytes[14] as u64); + values[4] = ((bytes[15] as u64) << 22) + | ((bytes[16] as u64) << 14) + | ((bytes[17] as u64) << 6) | (((bytes[18] >> 2) & 0x3f) as u64); values[5] = ((((bytes[18]) & 0x3) as u64) << 28) - | (((bytes[19]) as u64) << 20) - | (((bytes[20]) as u64) << 12) - | (((bytes[21]) as u64) << 4) + | ((bytes[19] as u64) << 20) + | ((bytes[20] as u64) << 12) + | ((bytes[21] as u64) << 4) | (((bytes[22] >> 4) & 0xf) as u64); values[6] = ((((bytes[22]) & 0xf) as u64) << 26) - | (((bytes[23]) as u64) << 18) - | (((bytes[24]) as u64) << 10) - | (((bytes[25]) as u64) << 2) + | ((bytes[23] as u64) << 18) + | ((bytes[24] as u64) << 10) + | ((bytes[25] as u64) << 2) | (((bytes[26] >> 6) & 0x3) as u64); values[7] = ((((bytes[26]) & 0x3f) as u64) << 24) - | (((bytes[27]) as u64) << 16) - | (((bytes[28]) as u64) << 8) - | ((bytes[29]) as u64); + | ((bytes[27] as u64) << 16) + | ((bytes[28] as u64) << 8) + | (bytes[29] as u64); } #[inline] fn unpack_bits_31(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 23) - | (((bytes[1]) as u64) << 15) - | (((bytes[2]) as u64) << 7) + values[0] = ((bytes[0] as u64) << 23) + | ((bytes[1] as u64) << 15) + | ((bytes[2] as u64) << 7) | (((bytes[3] >> 1) & 0x7f) as u64); values[1] = ((((bytes[3]) & 0x1) as u64) << 30) - | (((bytes[4]) as u64) << 22) - | (((bytes[5]) as u64) << 14) - | (((bytes[6]) as u64) << 6) + | ((bytes[4] as u64) << 22) + | ((bytes[5] as u64) << 14) + | ((bytes[6] as u64) << 6) | (((bytes[7] >> 2) & 0x3f) as u64); values[2] = ((((bytes[7]) & 0x3) as u64) << 29) - | (((bytes[8]) as u64) << 21) - | (((bytes[9]) as u64) << 13) - | (((bytes[10]) as u64) << 5) + | ((bytes[8] as u64) << 21) + | ((bytes[9] as u64) << 13) + | ((bytes[10] as u64) << 5) | (((bytes[11] >> 3) & 0x1f) as u64); values[3] = ((((bytes[11]) & 0x7) as u64) << 28) - | (((bytes[12]) as u64) << 20) - | (((bytes[13]) as u64) << 12) - | (((bytes[14]) as u64) << 4) + | ((bytes[12] as u64) << 20) + | ((bytes[13] as u64) << 12) + | ((bytes[14] as u64) << 4) | (((bytes[15] >> 4) & 0xf) as u64); values[4] = ((((bytes[15]) & 0xf) as u64) << 27) - | (((bytes[16]) as u64) << 19) - | (((bytes[17]) as u64) << 11) - | (((bytes[18]) as u64) << 3) + | ((bytes[16] as u64) << 19) + | ((bytes[17] as u64) << 11) + | ((bytes[18] as u64) << 3) | (((bytes[19] >> 5) & 0x7) as u64); values[5] = ((((bytes[19]) & 0x1f) as u64) << 26) - | (((bytes[20]) as u64) << 18) - | (((bytes[21]) as u64) << 10) - | (((bytes[22]) as u64) << 2) + | ((bytes[20] as u64) << 18) + | ((bytes[21] as u64) << 10) + | ((bytes[22] as u64) << 2) | (((bytes[23] >> 6) & 0x3) as u64); values[6] = ((((bytes[23]) & 0x3f) as u64) << 25) - | (((bytes[24]) as u64) << 17) - | (((bytes[25]) as u64) << 9) - | (((bytes[26]) as u64) << 1) + | ((bytes[24] as u64) << 17) + | ((bytes[25] as u64) << 9) + | ((bytes[26] as u64) << 1) | (((bytes[27] >> 7) & 0x1) as u64); values[7] = ((((bytes[27]) & 0x7f) as u64) << 24) - | (((bytes[28]) as u64) << 16) - | (((bytes[29]) as u64) << 8) - | ((bytes[30]) as u64); + | ((bytes[28] as u64) << 16) + | ((bytes[29] as u64) << 8) + | (bytes[30] as u64); } #[inline] fn unpack_bits_32(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 24) - | (((bytes[1]) as u64) << 16) - | (((bytes[2]) as u64) << 8) - | ((bytes[3]) as u64); - values[1] = (((bytes[4]) as u64) << 24) - | (((bytes[5]) as u64) << 16) - | (((bytes[6]) as u64) << 8) - | ((bytes[7]) as u64); - values[2] = (((bytes[8]) as u64) << 24) - | (((bytes[9]) as u64) << 16) - | (((bytes[10]) as u64) << 8) - | ((bytes[11]) as u64); - values[3] = (((bytes[12]) as u64) << 24) - | (((bytes[13]) as u64) << 16) - | (((bytes[14]) as u64) << 8) - | ((bytes[15]) as u64); - values[4] = (((bytes[16]) as u64) << 24) - | (((bytes[17]) as u64) << 16) - | (((bytes[18]) as u64) << 8) - | ((bytes[19]) as u64); - values[5] = (((bytes[20]) as u64) << 24) - | (((bytes[21]) as u64) << 16) - | (((bytes[22]) as u64) << 8) - | ((bytes[23]) as u64); - values[6] = (((bytes[24]) as u64) << 24) - | (((bytes[25]) as u64) << 16) - | (((bytes[26]) as u64) << 8) - | ((bytes[27]) as u64); - values[7] = (((bytes[28]) as u64) << 24) - | (((bytes[29]) as u64) << 16) - | (((bytes[30]) as u64) << 8) - | ((bytes[31]) as u64); + values[0] = ((bytes[0] as u64) << 24) + | ((bytes[1] as u64) << 16) + | ((bytes[2] as u64) << 8) + | (bytes[3] as u64); + values[1] = ((bytes[4] as u64) << 24) + | ((bytes[5] as u64) << 16) + | ((bytes[6] as u64) << 8) + | (bytes[7] as u64); + values[2] = ((bytes[8] as u64) << 24) + | ((bytes[9] as u64) << 16) + | ((bytes[10] as u64) << 8) + | (bytes[11] as u64); + values[3] = ((bytes[12] as u64) << 24) + | ((bytes[13] as u64) << 16) + | ((bytes[14] as u64) << 8) + | (bytes[15] as u64); + values[4] = ((bytes[16] as u64) << 24) + | ((bytes[17] as u64) << 16) + | ((bytes[18] as u64) << 8) + | (bytes[19] as u64); + values[5] = ((bytes[20] as u64) << 24) + | ((bytes[21] as u64) << 16) + | ((bytes[22] as u64) << 8) + | (bytes[23] as u64); + values[6] = ((bytes[24] as u64) << 24) + | ((bytes[25] as u64) << 16) + | ((bytes[26] as u64) << 8) + | (bytes[27] as u64); + values[7] = ((bytes[28] as u64) << 24) + | ((bytes[29] as u64) << 16) + | ((bytes[30] as u64) << 8) + | (bytes[31] as u64); } #[inline] fn unpack_bits_33(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 25) - | (((bytes[1]) as u64) << 17) - | (((bytes[2]) as u64) << 9) - | (((bytes[3]) as u64) << 1) + values[0] = ((bytes[0] as u64) << 25) + | ((bytes[1] as u64) << 17) + | ((bytes[2] as u64) << 9) + | ((bytes[3] as u64) << 1) | (((bytes[4] >> 7) & 0x1) as u64); values[1] = ((((bytes[4]) & 0x7f) as u64) << 26) - | (((bytes[5]) as u64) << 18) - | (((bytes[6]) as u64) << 10) - | (((bytes[7]) as u64) << 2) + | ((bytes[5] as u64) << 18) + | ((bytes[6] as u64) << 10) + | ((bytes[7] as u64) << 2) | (((bytes[8] >> 6) & 0x3) as u64); values[2] = ((((bytes[8]) & 0x3f) as u64) << 27) - | (((bytes[9]) as u64) << 19) - | (((bytes[10]) as u64) << 11) - | (((bytes[11]) as u64) << 3) + | ((bytes[9] as u64) << 19) + | ((bytes[10] as u64) << 11) + | ((bytes[11] as u64) << 3) | (((bytes[12] >> 5) & 0x7) as u64); values[3] = ((((bytes[12]) & 0x1f) as u64) << 28) - | (((bytes[13]) as u64) << 20) - | (((bytes[14]) as u64) << 12) - | (((bytes[15]) as u64) << 4) + | ((bytes[13] as u64) << 20) + | ((bytes[14] as u64) << 12) + | ((bytes[15] as u64) << 4) | (((bytes[16] >> 4) & 0xf) as u64); values[4] = ((((bytes[16]) & 0xf) as u64) << 29) - | (((bytes[17]) as u64) << 21) - | (((bytes[18]) as u64) << 13) - | (((bytes[19]) as u64) << 5) + | ((bytes[17] as u64) << 21) + | ((bytes[18] as u64) << 13) + | ((bytes[19] as u64) << 5) | (((bytes[20] >> 3) & 0x1f) as u64); values[5] = ((((bytes[20]) & 0x7) as u64) << 30) - | (((bytes[21]) as u64) << 22) - | (((bytes[22]) as u64) << 14) - | (((bytes[23]) as u64) << 6) + | ((bytes[21] as u64) << 22) + | ((bytes[22] as u64) << 14) + | ((bytes[23] as u64) << 6) | (((bytes[24] >> 2) & 0x3f) as u64); values[6] = ((((bytes[24]) & 0x3) as u64) << 31) - | (((bytes[25]) as u64) << 23) - | (((bytes[26]) as u64) << 15) - | (((bytes[27]) as u64) << 7) + | ((bytes[25] as u64) << 23) + | ((bytes[26] as u64) << 15) + | ((bytes[27] as u64) << 7) | (((bytes[28] >> 1) & 0x7f) as u64); values[7] = ((((bytes[28]) & 0x1) as u64) << 32) - | (((bytes[29]) as u64) << 24) - | (((bytes[30]) as u64) << 16) - | (((bytes[31]) as u64) << 8) - | ((bytes[32]) as u64); + | ((bytes[29] as u64) << 24) + | ((bytes[30] as u64) << 16) + | ((bytes[31] as u64) << 8) + | (bytes[32] as u64); } #[inline] fn unpack_bits_34(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 26) - | (((bytes[1]) as u64) << 18) - | (((bytes[2]) as u64) << 10) - | (((bytes[3]) as u64) << 2) + values[0] = ((bytes[0] as u64) << 26) + | ((bytes[1] as u64) << 18) + | ((bytes[2] as u64) << 10) + | ((bytes[3] as u64) << 2) | (((bytes[4] >> 6) & 0x3) as u64); values[1] = ((((bytes[4]) & 0x3f) as u64) << 28) - | (((bytes[5]) as u64) << 20) - | (((bytes[6]) as u64) << 12) - | (((bytes[7]) as u64) << 4) + | ((bytes[5] as u64) << 20) + | ((bytes[6] as u64) << 12) + | ((bytes[7] as u64) << 4) | (((bytes[8] >> 4) & 0xf) as u64); values[2] = ((((bytes[8]) & 0xf) as u64) << 30) - | (((bytes[9]) as u64) << 22) - | (((bytes[10]) as u64) << 14) - | (((bytes[11]) as u64) << 6) + | ((bytes[9] as u64) << 22) + | ((bytes[10] as u64) << 14) + | ((bytes[11] as u64) << 6) | (((bytes[12] >> 2) & 0x3f) as u64); values[3] = ((((bytes[12]) & 0x3) as u64) << 32) - | (((bytes[13]) as u64) << 24) - | (((bytes[14]) as u64) << 16) - | (((bytes[15]) as u64) << 8) - | ((bytes[16]) as u64); - values[4] = (((bytes[17]) as u64) << 26) - | (((bytes[18]) as u64) << 18) - | (((bytes[19]) as u64) << 10) - | (((bytes[20]) as u64) << 2) + | ((bytes[13] as u64) << 24) + | ((bytes[14] as u64) << 16) + | ((bytes[15] as u64) << 8) + | (bytes[16] as u64); + values[4] = ((bytes[17] as u64) << 26) + | ((bytes[18] as u64) << 18) + | ((bytes[19] as u64) << 10) + | ((bytes[20] as u64) << 2) | (((bytes[21] >> 6) & 0x3) as u64); values[5] = ((((bytes[21]) & 0x3f) as u64) << 28) - | (((bytes[22]) as u64) << 20) - | (((bytes[23]) as u64) << 12) - | (((bytes[24]) as u64) << 4) + | ((bytes[22] as u64) << 20) + | ((bytes[23] as u64) << 12) + | ((bytes[24] as u64) << 4) | (((bytes[25] >> 4) & 0xf) as u64); values[6] = ((((bytes[25]) & 0xf) as u64) << 30) - | (((bytes[26]) as u64) << 22) - | (((bytes[27]) as u64) << 14) - | (((bytes[28]) as u64) << 6) + | ((bytes[26] as u64) << 22) + | ((bytes[27] as u64) << 14) + | ((bytes[28] as u64) << 6) | (((bytes[29] >> 2) & 0x3f) as u64); values[7] = ((((bytes[29]) & 0x3) as u64) << 32) - | (((bytes[30]) as u64) << 24) - | (((bytes[31]) as u64) << 16) - | (((bytes[32]) as u64) << 8) - | ((bytes[33]) as u64); + | ((bytes[30] as u64) << 24) + | ((bytes[31] as u64) << 16) + | ((bytes[32] as u64) << 8) + | (bytes[33] as u64); } #[inline] fn unpack_bits_35(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 27) - | (((bytes[1]) as u64) << 19) - | (((bytes[2]) as u64) << 11) - | (((bytes[3]) as u64) << 3) + values[0] = ((bytes[0] as u64) << 27) + | ((bytes[1] as u64) << 19) + | ((bytes[2] as u64) << 11) + | ((bytes[3] as u64) << 3) | (((bytes[4] >> 5) & 0x7) as u64); values[1] = ((((bytes[4]) & 0x1f) as u64) << 30) - | (((bytes[5]) as u64) << 22) - | (((bytes[6]) as u64) << 14) - | (((bytes[7]) as u64) << 6) + | ((bytes[5] as u64) << 22) + | ((bytes[6] as u64) << 14) + | ((bytes[7] as u64) << 6) | (((bytes[8] >> 2) & 0x3f) as u64); values[2] = ((((bytes[8]) & 0x3) as u64) << 33) - | (((bytes[9]) as u64) << 25) - | (((bytes[10]) as u64) << 17) - | (((bytes[11]) as u64) << 9) - | (((bytes[12]) as u64) << 1) + | ((bytes[9] as u64) << 25) + | ((bytes[10] as u64) << 17) + | ((bytes[11] as u64) << 9) + | ((bytes[12] as u64) << 1) | (((bytes[13] >> 7) & 0x1) as u64); values[3] = ((((bytes[13]) & 0x7f) as u64) << 28) - | (((bytes[14]) as u64) << 20) - | (((bytes[15]) as u64) << 12) - | (((bytes[16]) as u64) << 4) + | ((bytes[14] as u64) << 20) + | ((bytes[15] as u64) << 12) + | ((bytes[16] as u64) << 4) | (((bytes[17] >> 4) & 0xf) as u64); values[4] = ((((bytes[17]) & 0xf) as u64) << 31) - | (((bytes[18]) as u64) << 23) - | (((bytes[19]) as u64) << 15) - | (((bytes[20]) as u64) << 7) + | ((bytes[18] as u64) << 23) + | ((bytes[19] as u64) << 15) + | ((bytes[20] as u64) << 7) | (((bytes[21] >> 1) & 0x7f) as u64); values[5] = ((((bytes[21]) & 0x1) as u64) << 34) - | (((bytes[22]) as u64) << 26) - | (((bytes[23]) as u64) << 18) - | (((bytes[24]) as u64) << 10) - | (((bytes[25]) as u64) << 2) + | ((bytes[22] as u64) << 26) + | ((bytes[23] as u64) << 18) + | ((bytes[24] as u64) << 10) + | ((bytes[25] as u64) << 2) | (((bytes[26] >> 6) & 0x3) as u64); values[6] = ((((bytes[26]) & 0x3f) as u64) << 29) - | (((bytes[27]) as u64) << 21) - | (((bytes[28]) as u64) << 13) - | (((bytes[29]) as u64) << 5) + | ((bytes[27] as u64) << 21) + | ((bytes[28] as u64) << 13) + | ((bytes[29] as u64) << 5) | (((bytes[30] >> 3) & 0x1f) as u64); values[7] = ((((bytes[30]) & 0x7) as u64) << 32) - | (((bytes[31]) as u64) << 24) - | (((bytes[32]) as u64) << 16) - | (((bytes[33]) as u64) << 8) - | ((bytes[34]) as u64); + | ((bytes[31] as u64) << 24) + | ((bytes[32] as u64) << 16) + | ((bytes[33] as u64) << 8) + | (bytes[34] as u64); } #[inline] fn unpack_bits_36(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 28) - | (((bytes[1]) as u64) << 20) - | (((bytes[2]) as u64) << 12) - | (((bytes[3]) as u64) << 4) + values[0] = ((bytes[0] as u64) << 28) + | ((bytes[1] as u64) << 20) + | ((bytes[2] as u64) << 12) + | ((bytes[3] as u64) << 4) | (((bytes[4] >> 4) & 0xf) as u64); values[1] = ((((bytes[4]) & 0xf) as u64) << 32) - | (((bytes[5]) as u64) << 24) - | (((bytes[6]) as u64) << 16) - | (((bytes[7]) as u64) << 8) - | ((bytes[8]) as u64); - values[2] = (((bytes[9]) as u64) << 28) - | (((bytes[10]) as u64) << 20) - | (((bytes[11]) as u64) << 12) - | (((bytes[12]) as u64) << 4) + | ((bytes[5] as u64) << 24) + | ((bytes[6] as u64) << 16) + | ((bytes[7] as u64) << 8) + | (bytes[8] as u64); + values[2] = ((bytes[9] as u64) << 28) + | ((bytes[10] as u64) << 20) + | ((bytes[11] as u64) << 12) + | ((bytes[12] as u64) << 4) | (((bytes[13] >> 4) & 0xf) as u64); values[3] = ((((bytes[13]) & 0xf) as u64) << 32) - | (((bytes[14]) as u64) << 24) - | (((bytes[15]) as u64) << 16) - | (((bytes[16]) as u64) << 8) - | ((bytes[17]) as u64); - values[4] = (((bytes[18]) as u64) << 28) - | (((bytes[19]) as u64) << 20) - | (((bytes[20]) as u64) << 12) - | (((bytes[21]) as u64) << 4) + | ((bytes[14] as u64) << 24) + | ((bytes[15] as u64) << 16) + | ((bytes[16] as u64) << 8) + | (bytes[17] as u64); + values[4] = ((bytes[18] as u64) << 28) + | ((bytes[19] as u64) << 20) + | ((bytes[20] as u64) << 12) + | ((bytes[21] as u64) << 4) | (((bytes[22] >> 4) & 0xf) as u64); values[5] = ((((bytes[22]) & 0xf) as u64) << 32) - | (((bytes[23]) as u64) << 24) - | (((bytes[24]) as u64) << 16) - | (((bytes[25]) as u64) << 8) - | ((bytes[26]) as u64); - values[6] = (((bytes[27]) as u64) << 28) - | (((bytes[28]) as u64) << 20) - | (((bytes[29]) as u64) << 12) - | (((bytes[30]) as u64) << 4) + | ((bytes[23] as u64) << 24) + | ((bytes[24] as u64) << 16) + | ((bytes[25] as u64) << 8) + | (bytes[26] as u64); + values[6] = ((bytes[27] as u64) << 28) + | ((bytes[28] as u64) << 20) + | ((bytes[29] as u64) << 12) + | ((bytes[30] as u64) << 4) | (((bytes[31] >> 4) & 0xf) as u64); values[7] = ((((bytes[31]) & 0xf) as u64) << 32) - | (((bytes[32]) as u64) << 24) - | (((bytes[33]) as u64) << 16) - | (((bytes[34]) as u64) << 8) - | ((bytes[35]) as u64); + | ((bytes[32] as u64) << 24) + | ((bytes[33] as u64) << 16) + | ((bytes[34] as u64) << 8) + | (bytes[35] as u64); } #[inline] fn unpack_bits_37(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 29) - | (((bytes[1]) as u64) << 21) - | (((bytes[2]) as u64) << 13) - | (((bytes[3]) as u64) << 5) + values[0] = ((bytes[0] as u64) << 29) + | ((bytes[1] as u64) << 21) + | ((bytes[2] as u64) << 13) + | ((bytes[3] as u64) << 5) | (((bytes[4] >> 3) & 0x1f) as u64); values[1] = ((((bytes[4]) & 0x7) as u64) << 34) - | (((bytes[5]) as u64) << 26) - | (((bytes[6]) as u64) << 18) - | (((bytes[7]) as u64) << 10) - | (((bytes[8]) as u64) << 2) + | ((bytes[5] as u64) << 26) + | ((bytes[6] as u64) << 18) + | ((bytes[7] as u64) << 10) + | ((bytes[8] as u64) << 2) | (((bytes[9] >> 6) & 0x3) as u64); values[2] = ((((bytes[9]) & 0x3f) as u64) << 31) - | (((bytes[10]) as u64) << 23) - | (((bytes[11]) as u64) << 15) - | (((bytes[12]) as u64) << 7) + | ((bytes[10] as u64) << 23) + | ((bytes[11] as u64) << 15) + | ((bytes[12] as u64) << 7) | (((bytes[13] >> 1) & 0x7f) as u64); values[3] = ((((bytes[13]) & 0x1) as u64) << 36) - | (((bytes[14]) as u64) << 28) - | (((bytes[15]) as u64) << 20) - | (((bytes[16]) as u64) << 12) - | (((bytes[17]) as u64) << 4) + | ((bytes[14] as u64) << 28) + | ((bytes[15] as u64) << 20) + | ((bytes[16] as u64) << 12) + | ((bytes[17] as u64) << 4) | (((bytes[18] >> 4) & 0xf) as u64); values[4] = ((((bytes[18]) & 0xf) as u64) << 33) - | (((bytes[19]) as u64) << 25) - | (((bytes[20]) as u64) << 17) - | (((bytes[21]) as u64) << 9) - | (((bytes[22]) as u64) << 1) + | ((bytes[19] as u64) << 25) + | ((bytes[20] as u64) << 17) + | ((bytes[21] as u64) << 9) + | ((bytes[22] as u64) << 1) | (((bytes[23] >> 7) & 0x1) as u64); values[5] = ((((bytes[23]) & 0x7f) as u64) << 30) - | (((bytes[24]) as u64) << 22) - | (((bytes[25]) as u64) << 14) - | (((bytes[26]) as u64) << 6) + | ((bytes[24] as u64) << 22) + | ((bytes[25] as u64) << 14) + | ((bytes[26] as u64) << 6) | (((bytes[27] >> 2) & 0x3f) as u64); values[6] = ((((bytes[27]) & 0x3) as u64) << 35) - | (((bytes[28]) as u64) << 27) - | (((bytes[29]) as u64) << 19) - | (((bytes[30]) as u64) << 11) - | (((bytes[31]) as u64) << 3) + | ((bytes[28] as u64) << 27) + | ((bytes[29] as u64) << 19) + | ((bytes[30] as u64) << 11) + | ((bytes[31] as u64) << 3) | (((bytes[32] >> 5) & 0x7) as u64); values[7] = ((((bytes[32]) & 0x1f) as u64) << 32) - | (((bytes[33]) as u64) << 24) - | (((bytes[34]) as u64) << 16) - | (((bytes[35]) as u64) << 8) - | ((bytes[36]) as u64); + | ((bytes[33] as u64) << 24) + | ((bytes[34] as u64) << 16) + | ((bytes[35] as u64) << 8) + | (bytes[36] as u64); } #[inline] fn unpack_bits_38(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 30) - | (((bytes[1]) as u64) << 22) - | (((bytes[2]) as u64) << 14) - | (((bytes[3]) as u64) << 6) + values[0] = ((bytes[0] as u64) << 30) + | ((bytes[1] as u64) << 22) + | ((bytes[2] as u64) << 14) + | ((bytes[3] as u64) << 6) | (((bytes[4] >> 2) & 0x3f) as u64); values[1] = ((((bytes[4]) & 0x3) as u64) << 36) - | (((bytes[5]) as u64) << 28) - | (((bytes[6]) as u64) << 20) - | (((bytes[7]) as u64) << 12) - | (((bytes[8]) as u64) << 4) + | ((bytes[5] as u64) << 28) + | ((bytes[6] as u64) << 20) + | ((bytes[7] as u64) << 12) + | ((bytes[8] as u64) << 4) | (((bytes[9] >> 4) & 0xf) as u64); values[2] = ((((bytes[9]) & 0xf) as u64) << 34) - | (((bytes[10]) as u64) << 26) - | (((bytes[11]) as u64) << 18) - | (((bytes[12]) as u64) << 10) - | (((bytes[13]) as u64) << 2) + | ((bytes[10] as u64) << 26) + | ((bytes[11] as u64) << 18) + | ((bytes[12] as u64) << 10) + | ((bytes[13] as u64) << 2) | (((bytes[14] >> 6) & 0x3) as u64); values[3] = ((((bytes[14]) & 0x3f) as u64) << 32) - | (((bytes[15]) as u64) << 24) - | (((bytes[16]) as u64) << 16) - | (((bytes[17]) as u64) << 8) - | ((bytes[18]) as u64); - values[4] = (((bytes[19]) as u64) << 30) - | (((bytes[20]) as u64) << 22) - | (((bytes[21]) as u64) << 14) - | (((bytes[22]) as u64) << 6) + | ((bytes[15] as u64) << 24) + | ((bytes[16] as u64) << 16) + | ((bytes[17] as u64) << 8) + | (bytes[18] as u64); + values[4] = ((bytes[19] as u64) << 30) + | ((bytes[20] as u64) << 22) + | ((bytes[21] as u64) << 14) + | ((bytes[22] as u64) << 6) | (((bytes[23] >> 2) & 0x3f) as u64); values[5] = ((((bytes[23]) & 0x3) as u64) << 36) - | (((bytes[24]) as u64) << 28) - | (((bytes[25]) as u64) << 20) - | (((bytes[26]) as u64) << 12) - | (((bytes[27]) as u64) << 4) + | ((bytes[24] as u64) << 28) + | ((bytes[25] as u64) << 20) + | ((bytes[26] as u64) << 12) + | ((bytes[27] as u64) << 4) | (((bytes[28] >> 4) & 0xf) as u64); values[6] = ((((bytes[28]) & 0xf) as u64) << 34) - | (((bytes[29]) as u64) << 26) - | (((bytes[30]) as u64) << 18) - | (((bytes[31]) as u64) << 10) - | (((bytes[32]) as u64) << 2) + | ((bytes[29] as u64) << 26) + | ((bytes[30] as u64) << 18) + | ((bytes[31] as u64) << 10) + | ((bytes[32] as u64) << 2) | (((bytes[33] >> 6) & 0x3) as u64); values[7] = ((((bytes[33]) & 0x3f) as u64) << 32) - | (((bytes[34]) as u64) << 24) - | (((bytes[35]) as u64) << 16) - | (((bytes[36]) as u64) << 8) - | ((bytes[37]) as u64); + | ((bytes[34] as u64) << 24) + | ((bytes[35] as u64) << 16) + | ((bytes[36] as u64) << 8) + | (bytes[37] as u64); } #[inline] fn unpack_bits_39(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 31) - | (((bytes[1]) as u64) << 23) - | (((bytes[2]) as u64) << 15) - | (((bytes[3]) as u64) << 7) + values[0] = ((bytes[0] as u64) << 31) + | ((bytes[1] as u64) << 23) + | ((bytes[2] as u64) << 15) + | ((bytes[3] as u64) << 7) | (((bytes[4] >> 1) & 0x7f) as u64); values[1] = ((((bytes[4]) & 0x1) as u64) << 38) - | (((bytes[5]) as u64) << 30) - | (((bytes[6]) as u64) << 22) - | (((bytes[7]) as u64) << 14) - | (((bytes[8]) as u64) << 6) + | ((bytes[5] as u64) << 30) + | ((bytes[6] as u64) << 22) + | ((bytes[7] as u64) << 14) + | ((bytes[8] as u64) << 6) | (((bytes[9] >> 2) & 0x3f) as u64); values[2] = ((((bytes[9]) & 0x3) as u64) << 37) - | (((bytes[10]) as u64) << 29) - | (((bytes[11]) as u64) << 21) - | (((bytes[12]) as u64) << 13) - | (((bytes[13]) as u64) << 5) + | ((bytes[10] as u64) << 29) + | ((bytes[11] as u64) << 21) + | ((bytes[12] as u64) << 13) + | ((bytes[13] as u64) << 5) | (((bytes[14] >> 3) & 0x1f) as u64); values[3] = ((((bytes[14]) & 0x7) as u64) << 36) - | (((bytes[15]) as u64) << 28) - | (((bytes[16]) as u64) << 20) - | (((bytes[17]) as u64) << 12) - | (((bytes[18]) as u64) << 4) + | ((bytes[15] as u64) << 28) + | ((bytes[16] as u64) << 20) + | ((bytes[17] as u64) << 12) + | ((bytes[18] as u64) << 4) | (((bytes[19] >> 4) & 0xf) as u64); values[4] = ((((bytes[19]) & 0xf) as u64) << 35) - | (((bytes[20]) as u64) << 27) - | (((bytes[21]) as u64) << 19) - | (((bytes[22]) as u64) << 11) - | (((bytes[23]) as u64) << 3) + | ((bytes[20] as u64) << 27) + | ((bytes[21] as u64) << 19) + | ((bytes[22] as u64) << 11) + | ((bytes[23] as u64) << 3) | (((bytes[24] >> 5) & 0x7) as u64); values[5] = ((((bytes[24]) & 0x1f) as u64) << 34) - | (((bytes[25]) as u64) << 26) - | (((bytes[26]) as u64) << 18) - | (((bytes[27]) as u64) << 10) - | (((bytes[28]) as u64) << 2) + | ((bytes[25] as u64) << 26) + | ((bytes[26] as u64) << 18) + | ((bytes[27] as u64) << 10) + | ((bytes[28] as u64) << 2) | (((bytes[29] >> 6) & 0x3) as u64); values[6] = ((((bytes[29]) & 0x3f) as u64) << 33) - | (((bytes[30]) as u64) << 25) - | (((bytes[31]) as u64) << 17) - | (((bytes[32]) as u64) << 9) - | (((bytes[33]) as u64) << 1) + | ((bytes[30] as u64) << 25) + | ((bytes[31] as u64) << 17) + | ((bytes[32] as u64) << 9) + | ((bytes[33] as u64) << 1) | (((bytes[34] >> 7) & 0x1) as u64); values[7] = ((((bytes[34]) & 0x7f) as u64) << 32) - | (((bytes[35]) as u64) << 24) - | (((bytes[36]) as u64) << 16) - | (((bytes[37]) as u64) << 8) - | ((bytes[38]) as u64); + | ((bytes[35] as u64) << 24) + | ((bytes[36] as u64) << 16) + | ((bytes[37] as u64) << 8) + | (bytes[38] as u64); } #[inline] fn unpack_bits_40(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 32) - | (((bytes[1]) as u64) << 24) - | (((bytes[2]) as u64) << 16) - | (((bytes[3]) as u64) << 8) - | ((bytes[4]) as u64); - values[1] = (((bytes[5]) as u64) << 32) - | (((bytes[6]) as u64) << 24) - | (((bytes[7]) as u64) << 16) - | (((bytes[8]) as u64) << 8) - | ((bytes[9]) as u64); - values[2] = (((bytes[10]) as u64) << 32) - | (((bytes[11]) as u64) << 24) - | (((bytes[12]) as u64) << 16) - | (((bytes[13]) as u64) << 8) - | ((bytes[14]) as u64); - values[3] = (((bytes[15]) as u64) << 32) - | (((bytes[16]) as u64) << 24) - | (((bytes[17]) as u64) << 16) - | (((bytes[18]) as u64) << 8) - | ((bytes[19]) as u64); - values[4] = (((bytes[20]) as u64) << 32) - | (((bytes[21]) as u64) << 24) - | (((bytes[22]) as u64) << 16) - | (((bytes[23]) as u64) << 8) - | ((bytes[24]) as u64); - values[5] = (((bytes[25]) as u64) << 32) - | (((bytes[26]) as u64) << 24) - | (((bytes[27]) as u64) << 16) - | (((bytes[28]) as u64) << 8) - | ((bytes[29]) as u64); - values[6] = (((bytes[30]) as u64) << 32) - | (((bytes[31]) as u64) << 24) - | (((bytes[32]) as u64) << 16) - | (((bytes[33]) as u64) << 8) - | ((bytes[34]) as u64); - values[7] = (((bytes[35]) as u64) << 32) - | (((bytes[36]) as u64) << 24) - | (((bytes[37]) as u64) << 16) - | (((bytes[38]) as u64) << 8) - | ((bytes[39]) as u64); + values[0] = ((bytes[0] as u64) << 32) + | ((bytes[1] as u64) << 24) + | ((bytes[2] as u64) << 16) + | ((bytes[3] as u64) << 8) + | (bytes[4] as u64); + values[1] = ((bytes[5] as u64) << 32) + | ((bytes[6] as u64) << 24) + | ((bytes[7] as u64) << 16) + | ((bytes[8] as u64) << 8) + | (bytes[9] as u64); + values[2] = ((bytes[10] as u64) << 32) + | ((bytes[11] as u64) << 24) + | ((bytes[12] as u64) << 16) + | ((bytes[13] as u64) << 8) + | (bytes[14] as u64); + values[3] = ((bytes[15] as u64) << 32) + | ((bytes[16] as u64) << 24) + | ((bytes[17] as u64) << 16) + | ((bytes[18] as u64) << 8) + | (bytes[19] as u64); + values[4] = ((bytes[20] as u64) << 32) + | ((bytes[21] as u64) << 24) + | ((bytes[22] as u64) << 16) + | ((bytes[23] as u64) << 8) + | (bytes[24] as u64); + values[5] = ((bytes[25] as u64) << 32) + | ((bytes[26] as u64) << 24) + | ((bytes[27] as u64) << 16) + | ((bytes[28] as u64) << 8) + | (bytes[29] as u64); + values[6] = ((bytes[30] as u64) << 32) + | ((bytes[31] as u64) << 24) + | ((bytes[32] as u64) << 16) + | ((bytes[33] as u64) << 8) + | (bytes[34] as u64); + values[7] = ((bytes[35] as u64) << 32) + | ((bytes[36] as u64) << 24) + | ((bytes[37] as u64) << 16) + | ((bytes[38] as u64) << 8) + | (bytes[39] as u64); } #[inline] fn unpack_bits_41(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 33) - | (((bytes[1]) as u64) << 25) - | (((bytes[2]) as u64) << 17) - | (((bytes[3]) as u64) << 9) - | (((bytes[4]) as u64) << 1) + values[0] = ((bytes[0] as u64) << 33) + | ((bytes[1] as u64) << 25) + | ((bytes[2] as u64) << 17) + | ((bytes[3] as u64) << 9) + | ((bytes[4] as u64) << 1) | (((bytes[5] >> 7) & 0x1) as u64); values[1] = ((((bytes[5]) & 0x7f) as u64) << 34) - | (((bytes[6]) as u64) << 26) - | (((bytes[7]) as u64) << 18) - | (((bytes[8]) as u64) << 10) - | (((bytes[9]) as u64) << 2) + | ((bytes[6] as u64) << 26) + | ((bytes[7] as u64) << 18) + | ((bytes[8] as u64) << 10) + | ((bytes[9] as u64) << 2) | (((bytes[10] >> 6) & 0x3) as u64); values[2] = ((((bytes[10]) & 0x3f) as u64) << 35) - | (((bytes[11]) as u64) << 27) - | (((bytes[12]) as u64) << 19) - | (((bytes[13]) as u64) << 11) - | (((bytes[14]) as u64) << 3) + | ((bytes[11] as u64) << 27) + | ((bytes[12] as u64) << 19) + | ((bytes[13] as u64) << 11) + | ((bytes[14] as u64) << 3) | (((bytes[15] >> 5) & 0x7) as u64); values[3] = ((((bytes[15]) & 0x1f) as u64) << 36) - | (((bytes[16]) as u64) << 28) - | (((bytes[17]) as u64) << 20) - | (((bytes[18]) as u64) << 12) - | (((bytes[19]) as u64) << 4) + | ((bytes[16] as u64) << 28) + | ((bytes[17] as u64) << 20) + | ((bytes[18] as u64) << 12) + | ((bytes[19] as u64) << 4) | (((bytes[20] >> 4) & 0xf) as u64); values[4] = ((((bytes[20]) & 0xf) as u64) << 37) - | (((bytes[21]) as u64) << 29) - | (((bytes[22]) as u64) << 21) - | (((bytes[23]) as u64) << 13) - | (((bytes[24]) as u64) << 5) + | ((bytes[21] as u64) << 29) + | ((bytes[22] as u64) << 21) + | ((bytes[23] as u64) << 13) + | ((bytes[24] as u64) << 5) | (((bytes[25] >> 3) & 0x1f) as u64); values[5] = ((((bytes[25]) & 0x7) as u64) << 38) - | (((bytes[26]) as u64) << 30) - | (((bytes[27]) as u64) << 22) - | (((bytes[28]) as u64) << 14) - | (((bytes[29]) as u64) << 6) + | ((bytes[26] as u64) << 30) + | ((bytes[27] as u64) << 22) + | ((bytes[28] as u64) << 14) + | ((bytes[29] as u64) << 6) | (((bytes[30] >> 2) & 0x3f) as u64); values[6] = ((((bytes[30]) & 0x3) as u64) << 39) - | (((bytes[31]) as u64) << 31) - | (((bytes[32]) as u64) << 23) - | (((bytes[33]) as u64) << 15) - | (((bytes[34]) as u64) << 7) + | ((bytes[31] as u64) << 31) + | ((bytes[32] as u64) << 23) + | ((bytes[33] as u64) << 15) + | ((bytes[34] as u64) << 7) | (((bytes[35] >> 1) & 0x7f) as u64); values[7] = ((((bytes[35]) & 0x1) as u64) << 40) - | (((bytes[36]) as u64) << 32) - | (((bytes[37]) as u64) << 24) - | (((bytes[38]) as u64) << 16) - | (((bytes[39]) as u64) << 8) - | ((bytes[40]) as u64); + | ((bytes[36] as u64) << 32) + | ((bytes[37] as u64) << 24) + | ((bytes[38] as u64) << 16) + | ((bytes[39] as u64) << 8) + | (bytes[40] as u64); } #[inline] fn unpack_bits_42(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 34) - | (((bytes[1]) as u64) << 26) - | (((bytes[2]) as u64) << 18) - | (((bytes[3]) as u64) << 10) - | (((bytes[4]) as u64) << 2) + values[0] = ((bytes[0] as u64) << 34) + | ((bytes[1] as u64) << 26) + | ((bytes[2] as u64) << 18) + | ((bytes[3] as u64) << 10) + | ((bytes[4] as u64) << 2) | (((bytes[5] >> 6) & 0x3) as u64); values[1] = ((((bytes[5]) & 0x3f) as u64) << 36) - | (((bytes[6]) as u64) << 28) - | (((bytes[7]) as u64) << 20) - | (((bytes[8]) as u64) << 12) - | (((bytes[9]) as u64) << 4) + | ((bytes[6] as u64) << 28) + | ((bytes[7] as u64) << 20) + | ((bytes[8] as u64) << 12) + | ((bytes[9] as u64) << 4) | (((bytes[10] >> 4) & 0xf) as u64); values[2] = ((((bytes[10]) & 0xf) as u64) << 38) - | (((bytes[11]) as u64) << 30) - | (((bytes[12]) as u64) << 22) - | (((bytes[13]) as u64) << 14) - | (((bytes[14]) as u64) << 6) + | ((bytes[11] as u64) << 30) + | ((bytes[12] as u64) << 22) + | ((bytes[13] as u64) << 14) + | ((bytes[14] as u64) << 6) | (((bytes[15] >> 2) & 0x3f) as u64); values[3] = ((((bytes[15]) & 0x3) as u64) << 40) - | (((bytes[16]) as u64) << 32) - | (((bytes[17]) as u64) << 24) - | (((bytes[18]) as u64) << 16) - | (((bytes[19]) as u64) << 8) - | ((bytes[20]) as u64); - values[4] = (((bytes[21]) as u64) << 34) - | (((bytes[22]) as u64) << 26) - | (((bytes[23]) as u64) << 18) - | (((bytes[24]) as u64) << 10) - | (((bytes[25]) as u64) << 2) + | ((bytes[16] as u64) << 32) + | ((bytes[17] as u64) << 24) + | ((bytes[18] as u64) << 16) + | ((bytes[19] as u64) << 8) + | (bytes[20] as u64); + values[4] = ((bytes[21] as u64) << 34) + | ((bytes[22] as u64) << 26) + | ((bytes[23] as u64) << 18) + | ((bytes[24] as u64) << 10) + | ((bytes[25] as u64) << 2) | (((bytes[26] >> 6) & 0x3) as u64); values[5] = ((((bytes[26]) & 0x3f) as u64) << 36) - | (((bytes[27]) as u64) << 28) - | (((bytes[28]) as u64) << 20) - | (((bytes[29]) as u64) << 12) - | (((bytes[30]) as u64) << 4) + | ((bytes[27] as u64) << 28) + | ((bytes[28] as u64) << 20) + | ((bytes[29] as u64) << 12) + | ((bytes[30] as u64) << 4) | (((bytes[31] >> 4) & 0xf) as u64); values[6] = ((((bytes[31]) & 0xf) as u64) << 38) - | (((bytes[32]) as u64) << 30) - | (((bytes[33]) as u64) << 22) - | (((bytes[34]) as u64) << 14) - | (((bytes[35]) as u64) << 6) + | ((bytes[32] as u64) << 30) + | ((bytes[33] as u64) << 22) + | ((bytes[34] as u64) << 14) + | ((bytes[35] as u64) << 6) | (((bytes[36] >> 2) & 0x3f) as u64); values[7] = ((((bytes[36]) & 0x3) as u64) << 40) - | (((bytes[37]) as u64) << 32) - | (((bytes[38]) as u64) << 24) - | (((bytes[39]) as u64) << 16) - | (((bytes[40]) as u64) << 8) - | ((bytes[41]) as u64); + | ((bytes[37] as u64) << 32) + | ((bytes[38] as u64) << 24) + | ((bytes[39] as u64) << 16) + | ((bytes[40] as u64) << 8) + | (bytes[41] as u64); } #[inline] fn unpack_bits_43(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 35) - | (((bytes[1]) as u64) << 27) - | (((bytes[2]) as u64) << 19) - | (((bytes[3]) as u64) << 11) - | (((bytes[4]) as u64) << 3) + values[0] = ((bytes[0] as u64) << 35) + | ((bytes[1] as u64) << 27) + | ((bytes[2] as u64) << 19) + | ((bytes[3] as u64) << 11) + | ((bytes[4] as u64) << 3) | (((bytes[5] >> 5) & 0x7) as u64); values[1] = ((((bytes[5]) & 0x1f) as u64) << 38) - | (((bytes[6]) as u64) << 30) - | (((bytes[7]) as u64) << 22) - | (((bytes[8]) as u64) << 14) - | (((bytes[9]) as u64) << 6) + | ((bytes[6] as u64) << 30) + | ((bytes[7] as u64) << 22) + | ((bytes[8] as u64) << 14) + | ((bytes[9] as u64) << 6) | (((bytes[10] >> 2) & 0x3f) as u64); values[2] = ((((bytes[10]) & 0x3) as u64) << 41) - | (((bytes[11]) as u64) << 33) - | (((bytes[12]) as u64) << 25) - | (((bytes[13]) as u64) << 17) - | (((bytes[14]) as u64) << 9) - | (((bytes[15]) as u64) << 1) + | ((bytes[11] as u64) << 33) + | ((bytes[12] as u64) << 25) + | ((bytes[13] as u64) << 17) + | ((bytes[14] as u64) << 9) + | ((bytes[15] as u64) << 1) | (((bytes[16] >> 7) & 0x1) as u64); values[3] = ((((bytes[16]) & 0x7f) as u64) << 36) - | (((bytes[17]) as u64) << 28) - | (((bytes[18]) as u64) << 20) - | (((bytes[19]) as u64) << 12) - | (((bytes[20]) as u64) << 4) + | ((bytes[17] as u64) << 28) + | ((bytes[18] as u64) << 20) + | ((bytes[19] as u64) << 12) + | ((bytes[20] as u64) << 4) | (((bytes[21] >> 4) & 0xf) as u64); values[4] = ((((bytes[21]) & 0xf) as u64) << 39) - | (((bytes[22]) as u64) << 31) - | (((bytes[23]) as u64) << 23) - | (((bytes[24]) as u64) << 15) - | (((bytes[25]) as u64) << 7) + | ((bytes[22] as u64) << 31) + | ((bytes[23] as u64) << 23) + | ((bytes[24] as u64) << 15) + | ((bytes[25] as u64) << 7) | (((bytes[26] >> 1) & 0x7f) as u64); values[5] = ((((bytes[26]) & 0x1) as u64) << 42) - | (((bytes[27]) as u64) << 34) - | (((bytes[28]) as u64) << 26) - | (((bytes[29]) as u64) << 18) - | (((bytes[30]) as u64) << 10) - | (((bytes[31]) as u64) << 2) + | ((bytes[27] as u64) << 34) + | ((bytes[28] as u64) << 26) + | ((bytes[29] as u64) << 18) + | ((bytes[30] as u64) << 10) + | ((bytes[31] as u64) << 2) | (((bytes[32] >> 6) & 0x3) as u64); values[6] = ((((bytes[32]) & 0x3f) as u64) << 37) - | (((bytes[33]) as u64) << 29) - | (((bytes[34]) as u64) << 21) - | (((bytes[35]) as u64) << 13) - | (((bytes[36]) as u64) << 5) + | ((bytes[33] as u64) << 29) + | ((bytes[34] as u64) << 21) + | ((bytes[35] as u64) << 13) + | ((bytes[36] as u64) << 5) | (((bytes[37] >> 3) & 0x1f) as u64); values[7] = ((((bytes[37]) & 0x7) as u64) << 40) - | (((bytes[38]) as u64) << 32) - | (((bytes[39]) as u64) << 24) - | (((bytes[40]) as u64) << 16) - | (((bytes[41]) as u64) << 8) - | ((bytes[42]) as u64); + | ((bytes[38] as u64) << 32) + | ((bytes[39] as u64) << 24) + | ((bytes[40] as u64) << 16) + | ((bytes[41] as u64) << 8) + | (bytes[42] as u64); } #[inline] fn unpack_bits_44(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 36) - | (((bytes[1]) as u64) << 28) - | (((bytes[2]) as u64) << 20) - | (((bytes[3]) as u64) << 12) - | (((bytes[4]) as u64) << 4) + values[0] = ((bytes[0] as u64) << 36) + | ((bytes[1] as u64) << 28) + | ((bytes[2] as u64) << 20) + | ((bytes[3] as u64) << 12) + | ((bytes[4] as u64) << 4) | (((bytes[5] >> 4) & 0xf) as u64); values[1] = ((((bytes[5]) & 0xf) as u64) << 40) - | (((bytes[6]) as u64) << 32) - | (((bytes[7]) as u64) << 24) - | (((bytes[8]) as u64) << 16) - | (((bytes[9]) as u64) << 8) - | ((bytes[10]) as u64); - values[2] = (((bytes[11]) as u64) << 36) - | (((bytes[12]) as u64) << 28) - | (((bytes[13]) as u64) << 20) - | (((bytes[14]) as u64) << 12) - | (((bytes[15]) as u64) << 4) + | ((bytes[6] as u64) << 32) + | ((bytes[7] as u64) << 24) + | ((bytes[8] as u64) << 16) + | ((bytes[9] as u64) << 8) + | (bytes[10] as u64); + values[2] = ((bytes[11] as u64) << 36) + | ((bytes[12] as u64) << 28) + | ((bytes[13] as u64) << 20) + | ((bytes[14] as u64) << 12) + | ((bytes[15] as u64) << 4) | (((bytes[16] >> 4) & 0xf) as u64); values[3] = ((((bytes[16]) & 0xf) as u64) << 40) - | (((bytes[17]) as u64) << 32) - | (((bytes[18]) as u64) << 24) - | (((bytes[19]) as u64) << 16) - | (((bytes[20]) as u64) << 8) - | ((bytes[21]) as u64); - values[4] = (((bytes[22]) as u64) << 36) - | (((bytes[23]) as u64) << 28) - | (((bytes[24]) as u64) << 20) - | (((bytes[25]) as u64) << 12) - | (((bytes[26]) as u64) << 4) + | ((bytes[17] as u64) << 32) + | ((bytes[18] as u64) << 24) + | ((bytes[19] as u64) << 16) + | ((bytes[20] as u64) << 8) + | (bytes[21] as u64); + values[4] = ((bytes[22] as u64) << 36) + | ((bytes[23] as u64) << 28) + | ((bytes[24] as u64) << 20) + | ((bytes[25] as u64) << 12) + | ((bytes[26] as u64) << 4) | (((bytes[27] >> 4) & 0xf) as u64); values[5] = ((((bytes[27]) & 0xf) as u64) << 40) - | (((bytes[28]) as u64) << 32) - | (((bytes[29]) as u64) << 24) - | (((bytes[30]) as u64) << 16) - | (((bytes[31]) as u64) << 8) - | ((bytes[32]) as u64); - values[6] = (((bytes[33]) as u64) << 36) - | (((bytes[34]) as u64) << 28) - | (((bytes[35]) as u64) << 20) - | (((bytes[36]) as u64) << 12) - | (((bytes[37]) as u64) << 4) + | ((bytes[28] as u64) << 32) + | ((bytes[29] as u64) << 24) + | ((bytes[30] as u64) << 16) + | ((bytes[31] as u64) << 8) + | (bytes[32] as u64); + values[6] = ((bytes[33] as u64) << 36) + | ((bytes[34] as u64) << 28) + | ((bytes[35] as u64) << 20) + | ((bytes[36] as u64) << 12) + | ((bytes[37] as u64) << 4) | (((bytes[38] >> 4) & 0xf) as u64); values[7] = ((((bytes[38]) & 0xf) as u64) << 40) - | (((bytes[39]) as u64) << 32) - | (((bytes[40]) as u64) << 24) - | (((bytes[41]) as u64) << 16) - | (((bytes[42]) as u64) << 8) - | ((bytes[43]) as u64); + | ((bytes[39] as u64) << 32) + | ((bytes[40] as u64) << 24) + | ((bytes[41] as u64) << 16) + | ((bytes[42] as u64) << 8) + | (bytes[43] as u64); } #[inline] fn unpack_bits_45(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 37) - | (((bytes[1]) as u64) << 29) - | (((bytes[2]) as u64) << 21) - | (((bytes[3]) as u64) << 13) - | (((bytes[4]) as u64) << 5) + values[0] = ((bytes[0] as u64) << 37) + | ((bytes[1] as u64) << 29) + | ((bytes[2] as u64) << 21) + | ((bytes[3] as u64) << 13) + | ((bytes[4] as u64) << 5) | (((bytes[5] >> 3) & 0x1f) as u64); values[1] = ((((bytes[5]) & 0x7) as u64) << 42) - | (((bytes[6]) as u64) << 34) - | (((bytes[7]) as u64) << 26) - | (((bytes[8]) as u64) << 18) - | (((bytes[9]) as u64) << 10) - | (((bytes[10]) as u64) << 2) + | ((bytes[6] as u64) << 34) + | ((bytes[7] as u64) << 26) + | ((bytes[8] as u64) << 18) + | ((bytes[9] as u64) << 10) + | ((bytes[10] as u64) << 2) | (((bytes[11] >> 6) & 0x3) as u64); values[2] = ((((bytes[11]) & 0x3f) as u64) << 39) - | (((bytes[12]) as u64) << 31) - | (((bytes[13]) as u64) << 23) - | (((bytes[14]) as u64) << 15) - | (((bytes[15]) as u64) << 7) + | ((bytes[12] as u64) << 31) + | ((bytes[13] as u64) << 23) + | ((bytes[14] as u64) << 15) + | ((bytes[15] as u64) << 7) | (((bytes[16] >> 1) & 0x7f) as u64); values[3] = ((((bytes[16]) & 0x1) as u64) << 44) - | (((bytes[17]) as u64) << 36) - | (((bytes[18]) as u64) << 28) - | (((bytes[19]) as u64) << 20) - | (((bytes[20]) as u64) << 12) - | (((bytes[21]) as u64) << 4) + | ((bytes[17] as u64) << 36) + | ((bytes[18] as u64) << 28) + | ((bytes[19] as u64) << 20) + | ((bytes[20] as u64) << 12) + | ((bytes[21] as u64) << 4) | (((bytes[22] >> 4) & 0xf) as u64); values[4] = ((((bytes[22]) & 0xf) as u64) << 41) - | (((bytes[23]) as u64) << 33) - | (((bytes[24]) as u64) << 25) - | (((bytes[25]) as u64) << 17) - | (((bytes[26]) as u64) << 9) - | (((bytes[27]) as u64) << 1) + | ((bytes[23] as u64) << 33) + | ((bytes[24] as u64) << 25) + | ((bytes[25] as u64) << 17) + | ((bytes[26] as u64) << 9) + | ((bytes[27] as u64) << 1) | (((bytes[28] >> 7) & 0x1) as u64); values[5] = ((((bytes[28]) & 0x7f) as u64) << 38) - | (((bytes[29]) as u64) << 30) - | (((bytes[30]) as u64) << 22) - | (((bytes[31]) as u64) << 14) - | (((bytes[32]) as u64) << 6) + | ((bytes[29] as u64) << 30) + | ((bytes[30] as u64) << 22) + | ((bytes[31] as u64) << 14) + | ((bytes[32] as u64) << 6) | (((bytes[33] >> 2) & 0x3f) as u64); values[6] = ((((bytes[33]) & 0x3) as u64) << 43) - | (((bytes[34]) as u64) << 35) - | (((bytes[35]) as u64) << 27) - | (((bytes[36]) as u64) << 19) - | (((bytes[37]) as u64) << 11) - | (((bytes[38]) as u64) << 3) + | ((bytes[34] as u64) << 35) + | ((bytes[35] as u64) << 27) + | ((bytes[36] as u64) << 19) + | ((bytes[37] as u64) << 11) + | ((bytes[38] as u64) << 3) | (((bytes[39] >> 5) & 0x7) as u64); values[7] = ((((bytes[39]) & 0x1f) as u64) << 40) - | (((bytes[40]) as u64) << 32) - | (((bytes[41]) as u64) << 24) - | (((bytes[42]) as u64) << 16) - | (((bytes[43]) as u64) << 8) - | ((bytes[44]) as u64); + | ((bytes[40] as u64) << 32) + | ((bytes[41] as u64) << 24) + | ((bytes[42] as u64) << 16) + | ((bytes[43] as u64) << 8) + | (bytes[44] as u64); } #[inline] fn unpack_bits_46(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 38) - | (((bytes[1]) as u64) << 30) - | (((bytes[2]) as u64) << 22) - | (((bytes[3]) as u64) << 14) - | (((bytes[4]) as u64) << 6) + values[0] = ((bytes[0] as u64) << 38) + | ((bytes[1] as u64) << 30) + | ((bytes[2] as u64) << 22) + | ((bytes[3] as u64) << 14) + | ((bytes[4] as u64) << 6) | (((bytes[5] >> 2) & 0x3f) as u64); values[1] = ((((bytes[5]) & 0x3) as u64) << 44) - | (((bytes[6]) as u64) << 36) - | (((bytes[7]) as u64) << 28) - | (((bytes[8]) as u64) << 20) - | (((bytes[9]) as u64) << 12) - | (((bytes[10]) as u64) << 4) + | ((bytes[6] as u64) << 36) + | ((bytes[7] as u64) << 28) + | ((bytes[8] as u64) << 20) + | ((bytes[9] as u64) << 12) + | ((bytes[10] as u64) << 4) | (((bytes[11] >> 4) & 0xf) as u64); values[2] = ((((bytes[11]) & 0xf) as u64) << 42) - | (((bytes[12]) as u64) << 34) - | (((bytes[13]) as u64) << 26) - | (((bytes[14]) as u64) << 18) - | (((bytes[15]) as u64) << 10) - | (((bytes[16]) as u64) << 2) + | ((bytes[12] as u64) << 34) + | ((bytes[13] as u64) << 26) + | ((bytes[14] as u64) << 18) + | ((bytes[15] as u64) << 10) + | ((bytes[16] as u64) << 2) | (((bytes[17] >> 6) & 0x3) as u64); values[3] = ((((bytes[17]) & 0x3f) as u64) << 40) - | (((bytes[18]) as u64) << 32) - | (((bytes[19]) as u64) << 24) - | (((bytes[20]) as u64) << 16) - | (((bytes[21]) as u64) << 8) - | ((bytes[22]) as u64); - values[4] = (((bytes[23]) as u64) << 38) - | (((bytes[24]) as u64) << 30) - | (((bytes[25]) as u64) << 22) - | (((bytes[26]) as u64) << 14) - | (((bytes[27]) as u64) << 6) + | ((bytes[18] as u64) << 32) + | ((bytes[19] as u64) << 24) + | ((bytes[20] as u64) << 16) + | ((bytes[21] as u64) << 8) + | (bytes[22] as u64); + values[4] = ((bytes[23] as u64) << 38) + | ((bytes[24] as u64) << 30) + | ((bytes[25] as u64) << 22) + | ((bytes[26] as u64) << 14) + | ((bytes[27] as u64) << 6) | (((bytes[28] >> 2) & 0x3f) as u64); values[5] = ((((bytes[28]) & 0x3) as u64) << 44) - | (((bytes[29]) as u64) << 36) - | (((bytes[30]) as u64) << 28) - | (((bytes[31]) as u64) << 20) - | (((bytes[32]) as u64) << 12) - | (((bytes[33]) as u64) << 4) + | ((bytes[29] as u64) << 36) + | ((bytes[30] as u64) << 28) + | ((bytes[31] as u64) << 20) + | ((bytes[32] as u64) << 12) + | ((bytes[33] as u64) << 4) | (((bytes[34] >> 4) & 0xf) as u64); values[6] = ((((bytes[34]) & 0xf) as u64) << 42) - | (((bytes[35]) as u64) << 34) - | (((bytes[36]) as u64) << 26) - | (((bytes[37]) as u64) << 18) - | (((bytes[38]) as u64) << 10) - | (((bytes[39]) as u64) << 2) + | ((bytes[35] as u64) << 34) + | ((bytes[36] as u64) << 26) + | ((bytes[37] as u64) << 18) + | ((bytes[38] as u64) << 10) + | ((bytes[39] as u64) << 2) | (((bytes[40] >> 6) & 0x3) as u64); values[7] = ((((bytes[40]) & 0x3f) as u64) << 40) - | (((bytes[41]) as u64) << 32) - | (((bytes[42]) as u64) << 24) - | (((bytes[43]) as u64) << 16) - | (((bytes[44]) as u64) << 8) - | ((bytes[45]) as u64); + | ((bytes[41] as u64) << 32) + | ((bytes[42] as u64) << 24) + | ((bytes[43] as u64) << 16) + | ((bytes[44] as u64) << 8) + | (bytes[45] as u64); } #[inline] fn unpack_bits_47(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 39) - | (((bytes[1]) as u64) << 31) - | (((bytes[2]) as u64) << 23) - | (((bytes[3]) as u64) << 15) - | (((bytes[4]) as u64) << 7) + values[0] = ((bytes[0] as u64) << 39) + | ((bytes[1] as u64) << 31) + | ((bytes[2] as u64) << 23) + | ((bytes[3] as u64) << 15) + | ((bytes[4] as u64) << 7) | (((bytes[5] >> 1) & 0x7f) as u64); values[1] = ((((bytes[5]) & 0x1) as u64) << 46) - | (((bytes[6]) as u64) << 38) - | (((bytes[7]) as u64) << 30) - | (((bytes[8]) as u64) << 22) - | (((bytes[9]) as u64) << 14) - | (((bytes[10]) as u64) << 6) + | ((bytes[6] as u64) << 38) + | ((bytes[7] as u64) << 30) + | ((bytes[8] as u64) << 22) + | ((bytes[9] as u64) << 14) + | ((bytes[10] as u64) << 6) | (((bytes[11] >> 2) & 0x3f) as u64); values[2] = ((((bytes[11]) & 0x3) as u64) << 45) - | (((bytes[12]) as u64) << 37) - | (((bytes[13]) as u64) << 29) - | (((bytes[14]) as u64) << 21) - | (((bytes[15]) as u64) << 13) - | (((bytes[16]) as u64) << 5) + | ((bytes[12] as u64) << 37) + | ((bytes[13] as u64) << 29) + | ((bytes[14] as u64) << 21) + | ((bytes[15] as u64) << 13) + | ((bytes[16] as u64) << 5) | (((bytes[17] >> 3) & 0x1f) as u64); values[3] = ((((bytes[17]) & 0x7) as u64) << 44) - | (((bytes[18]) as u64) << 36) - | (((bytes[19]) as u64) << 28) - | (((bytes[20]) as u64) << 20) - | (((bytes[21]) as u64) << 12) - | (((bytes[22]) as u64) << 4) + | ((bytes[18] as u64) << 36) + | ((bytes[19] as u64) << 28) + | ((bytes[20] as u64) << 20) + | ((bytes[21] as u64) << 12) + | ((bytes[22] as u64) << 4) | (((bytes[23] >> 4) & 0xf) as u64); values[4] = ((((bytes[23]) & 0xf) as u64) << 43) - | (((bytes[24]) as u64) << 35) - | (((bytes[25]) as u64) << 27) - | (((bytes[26]) as u64) << 19) - | (((bytes[27]) as u64) << 11) - | (((bytes[28]) as u64) << 3) + | ((bytes[24] as u64) << 35) + | ((bytes[25] as u64) << 27) + | ((bytes[26] as u64) << 19) + | ((bytes[27] as u64) << 11) + | ((bytes[28] as u64) << 3) | (((bytes[29] >> 5) & 0x7) as u64); values[5] = ((((bytes[29]) & 0x1f) as u64) << 42) - | (((bytes[30]) as u64) << 34) - | (((bytes[31]) as u64) << 26) - | (((bytes[32]) as u64) << 18) - | (((bytes[33]) as u64) << 10) - | (((bytes[34]) as u64) << 2) + | ((bytes[30] as u64) << 34) + | ((bytes[31] as u64) << 26) + | ((bytes[32] as u64) << 18) + | ((bytes[33] as u64) << 10) + | ((bytes[34] as u64) << 2) | (((bytes[35] >> 6) & 0x3) as u64); values[6] = ((((bytes[35]) & 0x3f) as u64) << 41) - | (((bytes[36]) as u64) << 33) - | (((bytes[37]) as u64) << 25) - | (((bytes[38]) as u64) << 17) - | (((bytes[39]) as u64) << 9) - | (((bytes[40]) as u64) << 1) + | ((bytes[36] as u64) << 33) + | ((bytes[37] as u64) << 25) + | ((bytes[38] as u64) << 17) + | ((bytes[39] as u64) << 9) + | ((bytes[40] as u64) << 1) | (((bytes[41] >> 7) & 0x1) as u64); values[7] = ((((bytes[41]) & 0x7f) as u64) << 40) - | (((bytes[42]) as u64) << 32) - | (((bytes[43]) as u64) << 24) - | (((bytes[44]) as u64) << 16) - | (((bytes[45]) as u64) << 8) - | ((bytes[46]) as u64); + | ((bytes[42] as u64) << 32) + | ((bytes[43] as u64) << 24) + | ((bytes[44] as u64) << 16) + | ((bytes[45] as u64) << 8) + | (bytes[46] as u64); } #[inline] fn unpack_bits_48(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 40) - | (((bytes[1]) as u64) << 32) - | (((bytes[2]) as u64) << 24) - | (((bytes[3]) as u64) << 16) - | (((bytes[4]) as u64) << 8) - | ((bytes[5]) as u64); - values[1] = (((bytes[6]) as u64) << 40) - | (((bytes[7]) as u64) << 32) - | (((bytes[8]) as u64) << 24) - | (((bytes[9]) as u64) << 16) - | (((bytes[10]) as u64) << 8) - | ((bytes[11]) as u64); - values[2] = (((bytes[12]) as u64) << 40) - | (((bytes[13]) as u64) << 32) - | (((bytes[14]) as u64) << 24) - | (((bytes[15]) as u64) << 16) - | (((bytes[16]) as u64) << 8) - | ((bytes[17]) as u64); - values[3] = (((bytes[18]) as u64) << 40) - | (((bytes[19]) as u64) << 32) - | (((bytes[20]) as u64) << 24) - | (((bytes[21]) as u64) << 16) - | (((bytes[22]) as u64) << 8) - | ((bytes[23]) as u64); - values[4] = (((bytes[24]) as u64) << 40) - | (((bytes[25]) as u64) << 32) - | (((bytes[26]) as u64) << 24) - | (((bytes[27]) as u64) << 16) - | (((bytes[28]) as u64) << 8) - | ((bytes[29]) as u64); - values[5] = (((bytes[30]) as u64) << 40) - | (((bytes[31]) as u64) << 32) - | (((bytes[32]) as u64) << 24) - | (((bytes[33]) as u64) << 16) - | (((bytes[34]) as u64) << 8) - | ((bytes[35]) as u64); - values[6] = (((bytes[36]) as u64) << 40) - | (((bytes[37]) as u64) << 32) - | (((bytes[38]) as u64) << 24) - | (((bytes[39]) as u64) << 16) - | (((bytes[40]) as u64) << 8) - | ((bytes[41]) as u64); - values[7] = (((bytes[42]) as u64) << 40) - | (((bytes[43]) as u64) << 32) - | (((bytes[44]) as u64) << 24) - | (((bytes[45]) as u64) << 16) - | (((bytes[46]) as u64) << 8) - | ((bytes[47]) as u64); + values[0] = ((bytes[0] as u64) << 40) + | ((bytes[1] as u64) << 32) + | ((bytes[2] as u64) << 24) + | ((bytes[3] as u64) << 16) + | ((bytes[4] as u64) << 8) + | (bytes[5] as u64); + values[1] = ((bytes[6] as u64) << 40) + | ((bytes[7] as u64) << 32) + | ((bytes[8] as u64) << 24) + | ((bytes[9] as u64) << 16) + | ((bytes[10] as u64) << 8) + | (bytes[11] as u64); + values[2] = ((bytes[12] as u64) << 40) + | ((bytes[13] as u64) << 32) + | ((bytes[14] as u64) << 24) + | ((bytes[15] as u64) << 16) + | ((bytes[16] as u64) << 8) + | (bytes[17] as u64); + values[3] = ((bytes[18] as u64) << 40) + | ((bytes[19] as u64) << 32) + | ((bytes[20] as u64) << 24) + | ((bytes[21] as u64) << 16) + | ((bytes[22] as u64) << 8) + | (bytes[23] as u64); + values[4] = ((bytes[24] as u64) << 40) + | ((bytes[25] as u64) << 32) + | ((bytes[26] as u64) << 24) + | ((bytes[27] as u64) << 16) + | ((bytes[28] as u64) << 8) + | (bytes[29] as u64); + values[5] = ((bytes[30] as u64) << 40) + | ((bytes[31] as u64) << 32) + | ((bytes[32] as u64) << 24) + | ((bytes[33] as u64) << 16) + | ((bytes[34] as u64) << 8) + | (bytes[35] as u64); + values[6] = ((bytes[36] as u64) << 40) + | ((bytes[37] as u64) << 32) + | ((bytes[38] as u64) << 24) + | ((bytes[39] as u64) << 16) + | ((bytes[40] as u64) << 8) + | (bytes[41] as u64); + values[7] = ((bytes[42] as u64) << 40) + | ((bytes[43] as u64) << 32) + | ((bytes[44] as u64) << 24) + | ((bytes[45] as u64) << 16) + | ((bytes[46] as u64) << 8) + | (bytes[47] as u64); } #[inline] fn unpack_bits_49(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 41) - | (((bytes[1]) as u64) << 33) - | (((bytes[2]) as u64) << 25) - | (((bytes[3]) as u64) << 17) - | (((bytes[4]) as u64) << 9) - | (((bytes[5]) as u64) << 1) + values[0] = ((bytes[0] as u64) << 41) + | ((bytes[1] as u64) << 33) + | ((bytes[2] as u64) << 25) + | ((bytes[3] as u64) << 17) + | ((bytes[4] as u64) << 9) + | ((bytes[5] as u64) << 1) | (((bytes[6] >> 7) & 0x1) as u64); values[1] = ((((bytes[6]) & 0x7f) as u64) << 42) - | (((bytes[7]) as u64) << 34) - | (((bytes[8]) as u64) << 26) - | (((bytes[9]) as u64) << 18) - | (((bytes[10]) as u64) << 10) - | (((bytes[11]) as u64) << 2) + | ((bytes[7] as u64) << 34) + | ((bytes[8] as u64) << 26) + | ((bytes[9] as u64) << 18) + | ((bytes[10] as u64) << 10) + | ((bytes[11] as u64) << 2) | (((bytes[12] >> 6) & 0x3) as u64); values[2] = ((((bytes[12]) & 0x3f) as u64) << 43) - | (((bytes[13]) as u64) << 35) - | (((bytes[14]) as u64) << 27) - | (((bytes[15]) as u64) << 19) - | (((bytes[16]) as u64) << 11) - | (((bytes[17]) as u64) << 3) + | ((bytes[13] as u64) << 35) + | ((bytes[14] as u64) << 27) + | ((bytes[15] as u64) << 19) + | ((bytes[16] as u64) << 11) + | ((bytes[17] as u64) << 3) | (((bytes[18] >> 5) & 0x7) as u64); values[3] = ((((bytes[18]) & 0x1f) as u64) << 44) - | (((bytes[19]) as u64) << 36) - | (((bytes[20]) as u64) << 28) - | (((bytes[21]) as u64) << 20) - | (((bytes[22]) as u64) << 12) - | (((bytes[23]) as u64) << 4) + | ((bytes[19] as u64) << 36) + | ((bytes[20] as u64) << 28) + | ((bytes[21] as u64) << 20) + | ((bytes[22] as u64) << 12) + | ((bytes[23] as u64) << 4) | (((bytes[24] >> 4) & 0xf) as u64); values[4] = ((((bytes[24]) & 0xf) as u64) << 45) - | (((bytes[25]) as u64) << 37) - | (((bytes[26]) as u64) << 29) - | (((bytes[27]) as u64) << 21) - | (((bytes[28]) as u64) << 13) - | (((bytes[29]) as u64) << 5) + | ((bytes[25] as u64) << 37) + | ((bytes[26] as u64) << 29) + | ((bytes[27] as u64) << 21) + | ((bytes[28] as u64) << 13) + | ((bytes[29] as u64) << 5) | (((bytes[30] >> 3) & 0x1f) as u64); values[5] = ((((bytes[30]) & 0x7) as u64) << 46) - | (((bytes[31]) as u64) << 38) - | (((bytes[32]) as u64) << 30) - | (((bytes[33]) as u64) << 22) - | (((bytes[34]) as u64) << 14) - | (((bytes[35]) as u64) << 6) + | ((bytes[31] as u64) << 38) + | ((bytes[32] as u64) << 30) + | ((bytes[33] as u64) << 22) + | ((bytes[34] as u64) << 14) + | ((bytes[35] as u64) << 6) | (((bytes[36] >> 2) & 0x3f) as u64); values[6] = ((((bytes[36]) & 0x3) as u64) << 47) - | (((bytes[37]) as u64) << 39) - | (((bytes[38]) as u64) << 31) - | (((bytes[39]) as u64) << 23) - | (((bytes[40]) as u64) << 15) - | (((bytes[41]) as u64) << 7) + | ((bytes[37] as u64) << 39) + | ((bytes[38] as u64) << 31) + | ((bytes[39] as u64) << 23) + | ((bytes[40] as u64) << 15) + | ((bytes[41] as u64) << 7) | (((bytes[42] >> 1) & 0x7f) as u64); values[7] = ((((bytes[42]) & 0x1) as u64) << 48) - | (((bytes[43]) as u64) << 40) - | (((bytes[44]) as u64) << 32) - | (((bytes[45]) as u64) << 24) - | (((bytes[46]) as u64) << 16) - | (((bytes[47]) as u64) << 8) - | ((bytes[48]) as u64); + | ((bytes[43] as u64) << 40) + | ((bytes[44] as u64) << 32) + | ((bytes[45] as u64) << 24) + | ((bytes[46] as u64) << 16) + | ((bytes[47] as u64) << 8) + | (bytes[48] as u64); } #[inline] fn unpack_bits_50(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 42) - | (((bytes[1]) as u64) << 34) - | (((bytes[2]) as u64) << 26) - | (((bytes[3]) as u64) << 18) - | (((bytes[4]) as u64) << 10) - | (((bytes[5]) as u64) << 2) + values[0] = ((bytes[0] as u64) << 42) + | ((bytes[1] as u64) << 34) + | ((bytes[2] as u64) << 26) + | ((bytes[3] as u64) << 18) + | ((bytes[4] as u64) << 10) + | ((bytes[5] as u64) << 2) | (((bytes[6] >> 6) & 0x3) as u64); values[1] = ((((bytes[6]) & 0x3f) as u64) << 44) - | (((bytes[7]) as u64) << 36) - | (((bytes[8]) as u64) << 28) - | (((bytes[9]) as u64) << 20) - | (((bytes[10]) as u64) << 12) - | (((bytes[11]) as u64) << 4) + | ((bytes[7] as u64) << 36) + | ((bytes[8] as u64) << 28) + | ((bytes[9] as u64) << 20) + | ((bytes[10] as u64) << 12) + | ((bytes[11] as u64) << 4) | (((bytes[12] >> 4) & 0xf) as u64); values[2] = ((((bytes[12]) & 0xf) as u64) << 46) - | (((bytes[13]) as u64) << 38) - | (((bytes[14]) as u64) << 30) - | (((bytes[15]) as u64) << 22) - | (((bytes[16]) as u64) << 14) - | (((bytes[17]) as u64) << 6) + | ((bytes[13] as u64) << 38) + | ((bytes[14] as u64) << 30) + | ((bytes[15] as u64) << 22) + | ((bytes[16] as u64) << 14) + | ((bytes[17] as u64) << 6) | (((bytes[18] >> 2) & 0x3f) as u64); values[3] = ((((bytes[18]) & 0x3) as u64) << 48) - | (((bytes[19]) as u64) << 40) - | (((bytes[20]) as u64) << 32) - | (((bytes[21]) as u64) << 24) - | (((bytes[22]) as u64) << 16) - | (((bytes[23]) as u64) << 8) - | ((bytes[24]) as u64); - values[4] = (((bytes[25]) as u64) << 42) - | (((bytes[26]) as u64) << 34) - | (((bytes[27]) as u64) << 26) - | (((bytes[28]) as u64) << 18) - | (((bytes[29]) as u64) << 10) - | (((bytes[30]) as u64) << 2) + | ((bytes[19] as u64) << 40) + | ((bytes[20] as u64) << 32) + | ((bytes[21] as u64) << 24) + | ((bytes[22] as u64) << 16) + | ((bytes[23] as u64) << 8) + | (bytes[24] as u64); + values[4] = ((bytes[25] as u64) << 42) + | ((bytes[26] as u64) << 34) + | ((bytes[27] as u64) << 26) + | ((bytes[28] as u64) << 18) + | ((bytes[29] as u64) << 10) + | ((bytes[30] as u64) << 2) | (((bytes[31] >> 6) & 0x3) as u64); values[5] = ((((bytes[31]) & 0x3f) as u64) << 44) - | (((bytes[32]) as u64) << 36) - | (((bytes[33]) as u64) << 28) - | (((bytes[34]) as u64) << 20) - | (((bytes[35]) as u64) << 12) - | (((bytes[36]) as u64) << 4) + | ((bytes[32] as u64) << 36) + | ((bytes[33] as u64) << 28) + | ((bytes[34] as u64) << 20) + | ((bytes[35] as u64) << 12) + | ((bytes[36] as u64) << 4) | (((bytes[37] >> 4) & 0xf) as u64); values[6] = ((((bytes[37]) & 0xf) as u64) << 46) - | (((bytes[38]) as u64) << 38) - | (((bytes[39]) as u64) << 30) - | (((bytes[40]) as u64) << 22) - | (((bytes[41]) as u64) << 14) - | (((bytes[42]) as u64) << 6) + | ((bytes[38] as u64) << 38) + | ((bytes[39] as u64) << 30) + | ((bytes[40] as u64) << 22) + | ((bytes[41] as u64) << 14) + | ((bytes[42] as u64) << 6) | (((bytes[43] >> 2) & 0x3f) as u64); values[7] = ((((bytes[43]) & 0x3) as u64) << 48) - | (((bytes[44]) as u64) << 40) - | (((bytes[45]) as u64) << 32) - | (((bytes[46]) as u64) << 24) - | (((bytes[47]) as u64) << 16) - | (((bytes[48]) as u64) << 8) - | ((bytes[49]) as u64); + | ((bytes[44] as u64) << 40) + | ((bytes[45] as u64) << 32) + | ((bytes[46] as u64) << 24) + | ((bytes[47] as u64) << 16) + | ((bytes[48] as u64) << 8) + | (bytes[49] as u64); } #[inline] fn unpack_bits_51(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 43) - | (((bytes[1]) as u64) << 35) - | (((bytes[2]) as u64) << 27) - | (((bytes[3]) as u64) << 19) - | (((bytes[4]) as u64) << 11) - | (((bytes[5]) as u64) << 3) + values[0] = ((bytes[0] as u64) << 43) + | ((bytes[1] as u64) << 35) + | ((bytes[2] as u64) << 27) + | ((bytes[3] as u64) << 19) + | ((bytes[4] as u64) << 11) + | ((bytes[5] as u64) << 3) | (((bytes[6] >> 5) & 0x7) as u64); values[1] = ((((bytes[6]) & 0x1f) as u64) << 46) - | (((bytes[7]) as u64) << 38) - | (((bytes[8]) as u64) << 30) - | (((bytes[9]) as u64) << 22) - | (((bytes[10]) as u64) << 14) - | (((bytes[11]) as u64) << 6) + | ((bytes[7] as u64) << 38) + | ((bytes[8] as u64) << 30) + | ((bytes[9] as u64) << 22) + | ((bytes[10] as u64) << 14) + | ((bytes[11] as u64) << 6) | (((bytes[12] >> 2) & 0x3f) as u64); values[2] = ((((bytes[12]) & 0x3) as u64) << 49) - | (((bytes[13]) as u64) << 41) - | (((bytes[14]) as u64) << 33) - | (((bytes[15]) as u64) << 25) - | (((bytes[16]) as u64) << 17) - | (((bytes[17]) as u64) << 9) - | (((bytes[18]) as u64) << 1) + | ((bytes[13] as u64) << 41) + | ((bytes[14] as u64) << 33) + | ((bytes[15] as u64) << 25) + | ((bytes[16] as u64) << 17) + | ((bytes[17] as u64) << 9) + | ((bytes[18] as u64) << 1) | (((bytes[19] >> 7) & 0x1) as u64); values[3] = ((((bytes[19]) & 0x7f) as u64) << 44) - | (((bytes[20]) as u64) << 36) - | (((bytes[21]) as u64) << 28) - | (((bytes[22]) as u64) << 20) - | (((bytes[23]) as u64) << 12) - | (((bytes[24]) as u64) << 4) + | ((bytes[20] as u64) << 36) + | ((bytes[21] as u64) << 28) + | ((bytes[22] as u64) << 20) + | ((bytes[23] as u64) << 12) + | ((bytes[24] as u64) << 4) | (((bytes[25] >> 4) & 0xf) as u64); values[4] = ((((bytes[25]) & 0xf) as u64) << 47) - | (((bytes[26]) as u64) << 39) - | (((bytes[27]) as u64) << 31) - | (((bytes[28]) as u64) << 23) - | (((bytes[29]) as u64) << 15) - | (((bytes[30]) as u64) << 7) + | ((bytes[26] as u64) << 39) + | ((bytes[27] as u64) << 31) + | ((bytes[28] as u64) << 23) + | ((bytes[29] as u64) << 15) + | ((bytes[30] as u64) << 7) | (((bytes[31] >> 1) & 0x7f) as u64); values[5] = ((((bytes[31]) & 0x1) as u64) << 50) - | (((bytes[32]) as u64) << 42) - | (((bytes[33]) as u64) << 34) - | (((bytes[34]) as u64) << 26) - | (((bytes[35]) as u64) << 18) - | (((bytes[36]) as u64) << 10) - | (((bytes[37]) as u64) << 2) + | ((bytes[32] as u64) << 42) + | ((bytes[33] as u64) << 34) + | ((bytes[34] as u64) << 26) + | ((bytes[35] as u64) << 18) + | ((bytes[36] as u64) << 10) + | ((bytes[37] as u64) << 2) | (((bytes[38] >> 6) & 0x3) as u64); values[6] = ((((bytes[38]) & 0x3f) as u64) << 45) - | (((bytes[39]) as u64) << 37) - | (((bytes[40]) as u64) << 29) - | (((bytes[41]) as u64) << 21) - | (((bytes[42]) as u64) << 13) - | (((bytes[43]) as u64) << 5) + | ((bytes[39] as u64) << 37) + | ((bytes[40] as u64) << 29) + | ((bytes[41] as u64) << 21) + | ((bytes[42] as u64) << 13) + | ((bytes[43] as u64) << 5) | (((bytes[44] >> 3) & 0x1f) as u64); values[7] = ((((bytes[44]) & 0x7) as u64) << 48) - | (((bytes[45]) as u64) << 40) - | (((bytes[46]) as u64) << 32) - | (((bytes[47]) as u64) << 24) - | (((bytes[48]) as u64) << 16) - | (((bytes[49]) as u64) << 8) - | ((bytes[50]) as u64); + | ((bytes[45] as u64) << 40) + | ((bytes[46] as u64) << 32) + | ((bytes[47] as u64) << 24) + | ((bytes[48] as u64) << 16) + | ((bytes[49] as u64) << 8) + | (bytes[50] as u64); } #[inline] fn unpack_bits_52(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 44) - | (((bytes[1]) as u64) << 36) - | (((bytes[2]) as u64) << 28) - | (((bytes[3]) as u64) << 20) - | (((bytes[4]) as u64) << 12) - | (((bytes[5]) as u64) << 4) + values[0] = ((bytes[0] as u64) << 44) + | ((bytes[1] as u64) << 36) + | ((bytes[2] as u64) << 28) + | ((bytes[3] as u64) << 20) + | ((bytes[4] as u64) << 12) + | ((bytes[5] as u64) << 4) | (((bytes[6] >> 4) & 0xf) as u64); values[1] = ((((bytes[6]) & 0xf) as u64) << 48) - | (((bytes[7]) as u64) << 40) - | (((bytes[8]) as u64) << 32) - | (((bytes[9]) as u64) << 24) - | (((bytes[10]) as u64) << 16) - | (((bytes[11]) as u64) << 8) - | ((bytes[12]) as u64); - values[2] = (((bytes[13]) as u64) << 44) - | (((bytes[14]) as u64) << 36) - | (((bytes[15]) as u64) << 28) - | (((bytes[16]) as u64) << 20) - | (((bytes[17]) as u64) << 12) - | (((bytes[18]) as u64) << 4) + | ((bytes[7] as u64) << 40) + | ((bytes[8] as u64) << 32) + | ((bytes[9] as u64) << 24) + | ((bytes[10] as u64) << 16) + | ((bytes[11] as u64) << 8) + | (bytes[12] as u64); + values[2] = ((bytes[13] as u64) << 44) + | ((bytes[14] as u64) << 36) + | ((bytes[15] as u64) << 28) + | ((bytes[16] as u64) << 20) + | ((bytes[17] as u64) << 12) + | ((bytes[18] as u64) << 4) | (((bytes[19] >> 4) & 0xf) as u64); values[3] = ((((bytes[19]) & 0xf) as u64) << 48) - | (((bytes[20]) as u64) << 40) - | (((bytes[21]) as u64) << 32) - | (((bytes[22]) as u64) << 24) - | (((bytes[23]) as u64) << 16) - | (((bytes[24]) as u64) << 8) - | ((bytes[25]) as u64); - values[4] = (((bytes[26]) as u64) << 44) - | (((bytes[27]) as u64) << 36) - | (((bytes[28]) as u64) << 28) - | (((bytes[29]) as u64) << 20) - | (((bytes[30]) as u64) << 12) - | (((bytes[31]) as u64) << 4) + | ((bytes[20] as u64) << 40) + | ((bytes[21] as u64) << 32) + | ((bytes[22] as u64) << 24) + | ((bytes[23] as u64) << 16) + | ((bytes[24] as u64) << 8) + | (bytes[25] as u64); + values[4] = ((bytes[26] as u64) << 44) + | ((bytes[27] as u64) << 36) + | ((bytes[28] as u64) << 28) + | ((bytes[29] as u64) << 20) + | ((bytes[30] as u64) << 12) + | ((bytes[31] as u64) << 4) | (((bytes[32] >> 4) & 0xf) as u64); values[5] = ((((bytes[32]) & 0xf) as u64) << 48) - | (((bytes[33]) as u64) << 40) - | (((bytes[34]) as u64) << 32) - | (((bytes[35]) as u64) << 24) - | (((bytes[36]) as u64) << 16) - | (((bytes[37]) as u64) << 8) - | ((bytes[38]) as u64); - values[6] = (((bytes[39]) as u64) << 44) - | (((bytes[40]) as u64) << 36) - | (((bytes[41]) as u64) << 28) - | (((bytes[42]) as u64) << 20) - | (((bytes[43]) as u64) << 12) - | (((bytes[44]) as u64) << 4) + | ((bytes[33] as u64) << 40) + | ((bytes[34] as u64) << 32) + | ((bytes[35] as u64) << 24) + | ((bytes[36] as u64) << 16) + | ((bytes[37] as u64) << 8) + | (bytes[38] as u64); + values[6] = ((bytes[39] as u64) << 44) + | ((bytes[40] as u64) << 36) + | ((bytes[41] as u64) << 28) + | ((bytes[42] as u64) << 20) + | ((bytes[43] as u64) << 12) + | ((bytes[44] as u64) << 4) | (((bytes[45] >> 4) & 0xf) as u64); values[7] = ((((bytes[45]) & 0xf) as u64) << 48) - | (((bytes[46]) as u64) << 40) - | (((bytes[47]) as u64) << 32) - | (((bytes[48]) as u64) << 24) - | (((bytes[49]) as u64) << 16) - | (((bytes[50]) as u64) << 8) - | ((bytes[51]) as u64); + | ((bytes[46] as u64) << 40) + | ((bytes[47] as u64) << 32) + | ((bytes[48] as u64) << 24) + | ((bytes[49] as u64) << 16) + | ((bytes[50] as u64) << 8) + | (bytes[51] as u64); } #[inline] fn unpack_bits_53(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 45) - | (((bytes[1]) as u64) << 37) - | (((bytes[2]) as u64) << 29) - | (((bytes[3]) as u64) << 21) - | (((bytes[4]) as u64) << 13) - | (((bytes[5]) as u64) << 5) + values[0] = ((bytes[0] as u64) << 45) + | ((bytes[1] as u64) << 37) + | ((bytes[2] as u64) << 29) + | ((bytes[3] as u64) << 21) + | ((bytes[4] as u64) << 13) + | ((bytes[5] as u64) << 5) | (((bytes[6] >> 3) & 0x1f) as u64); values[1] = ((((bytes[6]) & 0x7) as u64) << 50) - | (((bytes[7]) as u64) << 42) - | (((bytes[8]) as u64) << 34) - | (((bytes[9]) as u64) << 26) - | (((bytes[10]) as u64) << 18) - | (((bytes[11]) as u64) << 10) - | (((bytes[12]) as u64) << 2) + | ((bytes[7] as u64) << 42) + | ((bytes[8] as u64) << 34) + | ((bytes[9] as u64) << 26) + | ((bytes[10] as u64) << 18) + | ((bytes[11] as u64) << 10) + | ((bytes[12] as u64) << 2) | (((bytes[13] >> 6) & 0x3) as u64); values[2] = ((((bytes[13]) & 0x3f) as u64) << 47) - | (((bytes[14]) as u64) << 39) - | (((bytes[15]) as u64) << 31) - | (((bytes[16]) as u64) << 23) - | (((bytes[17]) as u64) << 15) - | (((bytes[18]) as u64) << 7) + | ((bytes[14] as u64) << 39) + | ((bytes[15] as u64) << 31) + | ((bytes[16] as u64) << 23) + | ((bytes[17] as u64) << 15) + | ((bytes[18] as u64) << 7) | (((bytes[19] >> 1) & 0x7f) as u64); values[3] = ((((bytes[19]) & 0x1) as u64) << 52) - | (((bytes[20]) as u64) << 44) - | (((bytes[21]) as u64) << 36) - | (((bytes[22]) as u64) << 28) - | (((bytes[23]) as u64) << 20) - | (((bytes[24]) as u64) << 12) - | (((bytes[25]) as u64) << 4) + | ((bytes[20] as u64) << 44) + | ((bytes[21] as u64) << 36) + | ((bytes[22] as u64) << 28) + | ((bytes[23] as u64) << 20) + | ((bytes[24] as u64) << 12) + | ((bytes[25] as u64) << 4) | (((bytes[26] >> 4) & 0xf) as u64); values[4] = ((((bytes[26]) & 0xf) as u64) << 49) - | (((bytes[27]) as u64) << 41) - | (((bytes[28]) as u64) << 33) - | (((bytes[29]) as u64) << 25) - | (((bytes[30]) as u64) << 17) - | (((bytes[31]) as u64) << 9) - | (((bytes[32]) as u64) << 1) + | ((bytes[27] as u64) << 41) + | ((bytes[28] as u64) << 33) + | ((bytes[29] as u64) << 25) + | ((bytes[30] as u64) << 17) + | ((bytes[31] as u64) << 9) + | ((bytes[32] as u64) << 1) | (((bytes[33] >> 7) & 0x1) as u64); values[5] = ((((bytes[33]) & 0x7f) as u64) << 46) - | (((bytes[34]) as u64) << 38) - | (((bytes[35]) as u64) << 30) - | (((bytes[36]) as u64) << 22) - | (((bytes[37]) as u64) << 14) - | (((bytes[38]) as u64) << 6) + | ((bytes[34] as u64) << 38) + | ((bytes[35] as u64) << 30) + | ((bytes[36] as u64) << 22) + | ((bytes[37] as u64) << 14) + | ((bytes[38] as u64) << 6) | (((bytes[39] >> 2) & 0x3f) as u64); values[6] = ((((bytes[39]) & 0x3) as u64) << 51) - | (((bytes[40]) as u64) << 43) - | (((bytes[41]) as u64) << 35) - | (((bytes[42]) as u64) << 27) - | (((bytes[43]) as u64) << 19) - | (((bytes[44]) as u64) << 11) - | (((bytes[45]) as u64) << 3) + | ((bytes[40] as u64) << 43) + | ((bytes[41] as u64) << 35) + | ((bytes[42] as u64) << 27) + | ((bytes[43] as u64) << 19) + | ((bytes[44] as u64) << 11) + | ((bytes[45] as u64) << 3) | (((bytes[46] >> 5) & 0x7) as u64); values[7] = ((((bytes[46]) & 0x1f) as u64) << 48) - | (((bytes[47]) as u64) << 40) - | (((bytes[48]) as u64) << 32) - | (((bytes[49]) as u64) << 24) - | (((bytes[50]) as u64) << 16) - | (((bytes[51]) as u64) << 8) - | ((bytes[52]) as u64); + | ((bytes[47] as u64) << 40) + | ((bytes[48] as u64) << 32) + | ((bytes[49] as u64) << 24) + | ((bytes[50] as u64) << 16) + | ((bytes[51] as u64) << 8) + | (bytes[52] as u64); } #[inline] fn unpack_bits_54(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 46) - | (((bytes[1]) as u64) << 38) - | (((bytes[2]) as u64) << 30) - | (((bytes[3]) as u64) << 22) - | (((bytes[4]) as u64) << 14) - | (((bytes[5]) as u64) << 6) + values[0] = ((bytes[0] as u64) << 46) + | ((bytes[1] as u64) << 38) + | ((bytes[2] as u64) << 30) + | ((bytes[3] as u64) << 22) + | ((bytes[4] as u64) << 14) + | ((bytes[5] as u64) << 6) | (((bytes[6] >> 2) & 0x3f) as u64); values[1] = ((((bytes[6]) & 0x3) as u64) << 52) - | (((bytes[7]) as u64) << 44) - | (((bytes[8]) as u64) << 36) - | (((bytes[9]) as u64) << 28) - | (((bytes[10]) as u64) << 20) - | (((bytes[11]) as u64) << 12) - | (((bytes[12]) as u64) << 4) + | ((bytes[7] as u64) << 44) + | ((bytes[8] as u64) << 36) + | ((bytes[9] as u64) << 28) + | ((bytes[10] as u64) << 20) + | ((bytes[11] as u64) << 12) + | ((bytes[12] as u64) << 4) | (((bytes[13] >> 4) & 0xf) as u64); values[2] = ((((bytes[13]) & 0xf) as u64) << 50) - | (((bytes[14]) as u64) << 42) - | (((bytes[15]) as u64) << 34) - | (((bytes[16]) as u64) << 26) - | (((bytes[17]) as u64) << 18) - | (((bytes[18]) as u64) << 10) - | (((bytes[19]) as u64) << 2) + | ((bytes[14] as u64) << 42) + | ((bytes[15] as u64) << 34) + | ((bytes[16] as u64) << 26) + | ((bytes[17] as u64) << 18) + | ((bytes[18] as u64) << 10) + | ((bytes[19] as u64) << 2) | (((bytes[20] >> 6) & 0x3) as u64); values[3] = ((((bytes[20]) & 0x3f) as u64) << 48) - | (((bytes[21]) as u64) << 40) - | (((bytes[22]) as u64) << 32) - | (((bytes[23]) as u64) << 24) - | (((bytes[24]) as u64) << 16) - | (((bytes[25]) as u64) << 8) - | ((bytes[26]) as u64); - values[4] = (((bytes[27]) as u64) << 46) - | (((bytes[28]) as u64) << 38) - | (((bytes[29]) as u64) << 30) - | (((bytes[30]) as u64) << 22) - | (((bytes[31]) as u64) << 14) - | (((bytes[32]) as u64) << 6) + | ((bytes[21] as u64) << 40) + | ((bytes[22] as u64) << 32) + | ((bytes[23] as u64) << 24) + | ((bytes[24] as u64) << 16) + | ((bytes[25] as u64) << 8) + | (bytes[26] as u64); + values[4] = ((bytes[27] as u64) << 46) + | ((bytes[28] as u64) << 38) + | ((bytes[29] as u64) << 30) + | ((bytes[30] as u64) << 22) + | ((bytes[31] as u64) << 14) + | ((bytes[32] as u64) << 6) | (((bytes[33] >> 2) & 0x3f) as u64); values[5] = ((((bytes[33]) & 0x3) as u64) << 52) - | (((bytes[34]) as u64) << 44) - | (((bytes[35]) as u64) << 36) - | (((bytes[36]) as u64) << 28) - | (((bytes[37]) as u64) << 20) - | (((bytes[38]) as u64) << 12) - | (((bytes[39]) as u64) << 4) + | ((bytes[34] as u64) << 44) + | ((bytes[35] as u64) << 36) + | ((bytes[36] as u64) << 28) + | ((bytes[37] as u64) << 20) + | ((bytes[38] as u64) << 12) + | ((bytes[39] as u64) << 4) | (((bytes[40] >> 4) & 0xf) as u64); values[6] = ((((bytes[40]) & 0xf) as u64) << 50) - | (((bytes[41]) as u64) << 42) - | (((bytes[42]) as u64) << 34) - | (((bytes[43]) as u64) << 26) - | (((bytes[44]) as u64) << 18) - | (((bytes[45]) as u64) << 10) - | (((bytes[46]) as u64) << 2) + | ((bytes[41] as u64) << 42) + | ((bytes[42] as u64) << 34) + | ((bytes[43] as u64) << 26) + | ((bytes[44] as u64) << 18) + | ((bytes[45] as u64) << 10) + | ((bytes[46] as u64) << 2) | (((bytes[47] >> 6) & 0x3) as u64); values[7] = ((((bytes[47]) & 0x3f) as u64) << 48) - | (((bytes[48]) as u64) << 40) - | (((bytes[49]) as u64) << 32) - | (((bytes[50]) as u64) << 24) - | (((bytes[51]) as u64) << 16) - | (((bytes[52]) as u64) << 8) - | ((bytes[53]) as u64); + | ((bytes[48] as u64) << 40) + | ((bytes[49] as u64) << 32) + | ((bytes[50] as u64) << 24) + | ((bytes[51] as u64) << 16) + | ((bytes[52] as u64) << 8) + | (bytes[53] as u64); } #[inline] fn unpack_bits_55(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 47) - | (((bytes[1]) as u64) << 39) - | (((bytes[2]) as u64) << 31) - | (((bytes[3]) as u64) << 23) - | (((bytes[4]) as u64) << 15) - | (((bytes[5]) as u64) << 7) + values[0] = ((bytes[0] as u64) << 47) + | ((bytes[1] as u64) << 39) + | ((bytes[2] as u64) << 31) + | ((bytes[3] as u64) << 23) + | ((bytes[4] as u64) << 15) + | ((bytes[5] as u64) << 7) | (((bytes[6] >> 1) & 0x7f) as u64); values[1] = ((((bytes[6]) & 0x1) as u64) << 54) - | (((bytes[7]) as u64) << 46) - | (((bytes[8]) as u64) << 38) - | (((bytes[9]) as u64) << 30) - | (((bytes[10]) as u64) << 22) - | (((bytes[11]) as u64) << 14) - | (((bytes[12]) as u64) << 6) + | ((bytes[7] as u64) << 46) + | ((bytes[8] as u64) << 38) + | ((bytes[9] as u64) << 30) + | ((bytes[10] as u64) << 22) + | ((bytes[11] as u64) << 14) + | ((bytes[12] as u64) << 6) | (((bytes[13] >> 2) & 0x3f) as u64); values[2] = ((((bytes[13]) & 0x3) as u64) << 53) - | (((bytes[14]) as u64) << 45) - | (((bytes[15]) as u64) << 37) - | (((bytes[16]) as u64) << 29) - | (((bytes[17]) as u64) << 21) - | (((bytes[18]) as u64) << 13) - | (((bytes[19]) as u64) << 5) + | ((bytes[14] as u64) << 45) + | ((bytes[15] as u64) << 37) + | ((bytes[16] as u64) << 29) + | ((bytes[17] as u64) << 21) + | ((bytes[18] as u64) << 13) + | ((bytes[19] as u64) << 5) | (((bytes[20] >> 3) & 0x1f) as u64); values[3] = ((((bytes[20]) & 0x7) as u64) << 52) - | (((bytes[21]) as u64) << 44) - | (((bytes[22]) as u64) << 36) - | (((bytes[23]) as u64) << 28) - | (((bytes[24]) as u64) << 20) - | (((bytes[25]) as u64) << 12) - | (((bytes[26]) as u64) << 4) + | ((bytes[21] as u64) << 44) + | ((bytes[22] as u64) << 36) + | ((bytes[23] as u64) << 28) + | ((bytes[24] as u64) << 20) + | ((bytes[25] as u64) << 12) + | ((bytes[26] as u64) << 4) | (((bytes[27] >> 4) & 0xf) as u64); values[4] = ((((bytes[27]) & 0xf) as u64) << 51) - | (((bytes[28]) as u64) << 43) - | (((bytes[29]) as u64) << 35) - | (((bytes[30]) as u64) << 27) - | (((bytes[31]) as u64) << 19) - | (((bytes[32]) as u64) << 11) - | (((bytes[33]) as u64) << 3) + | ((bytes[28] as u64) << 43) + | ((bytes[29] as u64) << 35) + | ((bytes[30] as u64) << 27) + | ((bytes[31] as u64) << 19) + | ((bytes[32] as u64) << 11) + | ((bytes[33] as u64) << 3) | (((bytes[34] >> 5) & 0x7) as u64); values[5] = ((((bytes[34]) & 0x1f) as u64) << 50) - | (((bytes[35]) as u64) << 42) - | (((bytes[36]) as u64) << 34) - | (((bytes[37]) as u64) << 26) - | (((bytes[38]) as u64) << 18) - | (((bytes[39]) as u64) << 10) - | (((bytes[40]) as u64) << 2) + | ((bytes[35] as u64) << 42) + | ((bytes[36] as u64) << 34) + | ((bytes[37] as u64) << 26) + | ((bytes[38] as u64) << 18) + | ((bytes[39] as u64) << 10) + | ((bytes[40] as u64) << 2) | (((bytes[41] >> 6) & 0x3) as u64); values[6] = ((((bytes[41]) & 0x3f) as u64) << 49) - | (((bytes[42]) as u64) << 41) - | (((bytes[43]) as u64) << 33) - | (((bytes[44]) as u64) << 25) - | (((bytes[45]) as u64) << 17) - | (((bytes[46]) as u64) << 9) - | (((bytes[47]) as u64) << 1) + | ((bytes[42] as u64) << 41) + | ((bytes[43] as u64) << 33) + | ((bytes[44] as u64) << 25) + | ((bytes[45] as u64) << 17) + | ((bytes[46] as u64) << 9) + | ((bytes[47] as u64) << 1) | (((bytes[48] >> 7) & 0x1) as u64); values[7] = ((((bytes[48]) & 0x7f) as u64) << 48) - | (((bytes[49]) as u64) << 40) - | (((bytes[50]) as u64) << 32) - | (((bytes[51]) as u64) << 24) - | (((bytes[52]) as u64) << 16) - | (((bytes[53]) as u64) << 8) - | ((bytes[54]) as u64); + | ((bytes[49] as u64) << 40) + | ((bytes[50] as u64) << 32) + | ((bytes[51] as u64) << 24) + | ((bytes[52] as u64) << 16) + | ((bytes[53] as u64) << 8) + | (bytes[54] as u64); } #[inline] fn unpack_bits_56(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 48) - | (((bytes[1]) as u64) << 40) - | (((bytes[2]) as u64) << 32) - | (((bytes[3]) as u64) << 24) - | (((bytes[4]) as u64) << 16) - | (((bytes[5]) as u64) << 8) - | ((bytes[6]) as u64); - values[1] = (((bytes[7]) as u64) << 48) - | (((bytes[8]) as u64) << 40) - | (((bytes[9]) as u64) << 32) - | (((bytes[10]) as u64) << 24) - | (((bytes[11]) as u64) << 16) - | (((bytes[12]) as u64) << 8) - | ((bytes[13]) as u64); - values[2] = (((bytes[14]) as u64) << 48) - | (((bytes[15]) as u64) << 40) - | (((bytes[16]) as u64) << 32) - | (((bytes[17]) as u64) << 24) - | (((bytes[18]) as u64) << 16) - | (((bytes[19]) as u64) << 8) - | ((bytes[20]) as u64); - values[3] = (((bytes[21]) as u64) << 48) - | (((bytes[22]) as u64) << 40) - | (((bytes[23]) as u64) << 32) - | (((bytes[24]) as u64) << 24) - | (((bytes[25]) as u64) << 16) - | (((bytes[26]) as u64) << 8) - | ((bytes[27]) as u64); - values[4] = (((bytes[28]) as u64) << 48) - | (((bytes[29]) as u64) << 40) - | (((bytes[30]) as u64) << 32) - | (((bytes[31]) as u64) << 24) - | (((bytes[32]) as u64) << 16) - | (((bytes[33]) as u64) << 8) - | ((bytes[34]) as u64); - values[5] = (((bytes[35]) as u64) << 48) - | (((bytes[36]) as u64) << 40) - | (((bytes[37]) as u64) << 32) - | (((bytes[38]) as u64) << 24) - | (((bytes[39]) as u64) << 16) - | (((bytes[40]) as u64) << 8) - | ((bytes[41]) as u64); - values[6] = (((bytes[42]) as u64) << 48) - | (((bytes[43]) as u64) << 40) - | (((bytes[44]) as u64) << 32) - | (((bytes[45]) as u64) << 24) - | (((bytes[46]) as u64) << 16) - | (((bytes[47]) as u64) << 8) - | ((bytes[48]) as u64); - values[7] = (((bytes[49]) as u64) << 48) - | (((bytes[50]) as u64) << 40) - | (((bytes[51]) as u64) << 32) - | (((bytes[52]) as u64) << 24) - | (((bytes[53]) as u64) << 16) - | (((bytes[54]) as u64) << 8) - | ((bytes[55]) as u64); + values[0] = ((bytes[0] as u64) << 48) + | ((bytes[1] as u64) << 40) + | ((bytes[2] as u64) << 32) + | ((bytes[3] as u64) << 24) + | ((bytes[4] as u64) << 16) + | ((bytes[5] as u64) << 8) + | (bytes[6] as u64); + values[1] = ((bytes[7] as u64) << 48) + | ((bytes[8] as u64) << 40) + | ((bytes[9] as u64) << 32) + | ((bytes[10] as u64) << 24) + | ((bytes[11] as u64) << 16) + | ((bytes[12] as u64) << 8) + | (bytes[13] as u64); + values[2] = ((bytes[14] as u64) << 48) + | ((bytes[15] as u64) << 40) + | ((bytes[16] as u64) << 32) + | ((bytes[17] as u64) << 24) + | ((bytes[18] as u64) << 16) + | ((bytes[19] as u64) << 8) + | (bytes[20] as u64); + values[3] = ((bytes[21] as u64) << 48) + | ((bytes[22] as u64) << 40) + | ((bytes[23] as u64) << 32) + | ((bytes[24] as u64) << 24) + | ((bytes[25] as u64) << 16) + | ((bytes[26] as u64) << 8) + | (bytes[27] as u64); + values[4] = ((bytes[28] as u64) << 48) + | ((bytes[29] as u64) << 40) + | ((bytes[30] as u64) << 32) + | ((bytes[31] as u64) << 24) + | ((bytes[32] as u64) << 16) + | ((bytes[33] as u64) << 8) + | (bytes[34] as u64); + values[5] = ((bytes[35] as u64) << 48) + | ((bytes[36] as u64) << 40) + | ((bytes[37] as u64) << 32) + | ((bytes[38] as u64) << 24) + | ((bytes[39] as u64) << 16) + | ((bytes[40] as u64) << 8) + | (bytes[41] as u64); + values[6] = ((bytes[42] as u64) << 48) + | ((bytes[43] as u64) << 40) + | ((bytes[44] as u64) << 32) + | ((bytes[45] as u64) << 24) + | ((bytes[46] as u64) << 16) + | ((bytes[47] as u64) << 8) + | (bytes[48] as u64); + values[7] = ((bytes[49] as u64) << 48) + | ((bytes[50] as u64) << 40) + | ((bytes[51] as u64) << 32) + | ((bytes[52] as u64) << 24) + | ((bytes[53] as u64) << 16) + | ((bytes[54] as u64) << 8) + | (bytes[55] as u64); } #[inline] fn unpack_bits_57(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 49) - | (((bytes[1]) as u64) << 41) - | (((bytes[2]) as u64) << 33) - | (((bytes[3]) as u64) << 25) - | (((bytes[4]) as u64) << 17) - | (((bytes[5]) as u64) << 9) - | (((bytes[6]) as u64) << 1) + values[0] = ((bytes[0] as u64) << 49) + | ((bytes[1] as u64) << 41) + | ((bytes[2] as u64) << 33) + | ((bytes[3] as u64) << 25) + | ((bytes[4] as u64) << 17) + | ((bytes[5] as u64) << 9) + | ((bytes[6] as u64) << 1) | (((bytes[7] >> 7) & 0x1) as u64); values[1] = ((((bytes[7]) & 0x7f) as u64) << 50) - | (((bytes[8]) as u64) << 42) - | (((bytes[9]) as u64) << 34) - | (((bytes[10]) as u64) << 26) - | (((bytes[11]) as u64) << 18) - | (((bytes[12]) as u64) << 10) - | (((bytes[13]) as u64) << 2) + | ((bytes[8] as u64) << 42) + | ((bytes[9] as u64) << 34) + | ((bytes[10] as u64) << 26) + | ((bytes[11] as u64) << 18) + | ((bytes[12] as u64) << 10) + | ((bytes[13] as u64) << 2) | (((bytes[14] >> 6) & 0x3) as u64); values[2] = ((((bytes[14]) & 0x3f) as u64) << 51) - | (((bytes[15]) as u64) << 43) - | (((bytes[16]) as u64) << 35) - | (((bytes[17]) as u64) << 27) - | (((bytes[18]) as u64) << 19) - | (((bytes[19]) as u64) << 11) - | (((bytes[20]) as u64) << 3) + | ((bytes[15] as u64) << 43) + | ((bytes[16] as u64) << 35) + | ((bytes[17] as u64) << 27) + | ((bytes[18] as u64) << 19) + | ((bytes[19] as u64) << 11) + | ((bytes[20] as u64) << 3) | (((bytes[21] >> 5) & 0x7) as u64); values[3] = ((((bytes[21]) & 0x1f) as u64) << 52) - | (((bytes[22]) as u64) << 44) - | (((bytes[23]) as u64) << 36) - | (((bytes[24]) as u64) << 28) - | (((bytes[25]) as u64) << 20) - | (((bytes[26]) as u64) << 12) - | (((bytes[27]) as u64) << 4) + | ((bytes[22] as u64) << 44) + | ((bytes[23] as u64) << 36) + | ((bytes[24] as u64) << 28) + | ((bytes[25] as u64) << 20) + | ((bytes[26] as u64) << 12) + | ((bytes[27] as u64) << 4) | (((bytes[28] >> 4) & 0xf) as u64); values[4] = ((((bytes[28]) & 0xf) as u64) << 53) - | (((bytes[29]) as u64) << 45) - | (((bytes[30]) as u64) << 37) - | (((bytes[31]) as u64) << 29) - | (((bytes[32]) as u64) << 21) - | (((bytes[33]) as u64) << 13) - | (((bytes[34]) as u64) << 5) + | ((bytes[29] as u64) << 45) + | ((bytes[30] as u64) << 37) + | ((bytes[31] as u64) << 29) + | ((bytes[32] as u64) << 21) + | ((bytes[33] as u64) << 13) + | ((bytes[34] as u64) << 5) | (((bytes[35] >> 3) & 0x1f) as u64); values[5] = ((((bytes[35]) & 0x7) as u64) << 54) - | (((bytes[36]) as u64) << 46) - | (((bytes[37]) as u64) << 38) - | (((bytes[38]) as u64) << 30) - | (((bytes[39]) as u64) << 22) - | (((bytes[40]) as u64) << 14) - | (((bytes[41]) as u64) << 6) + | ((bytes[36] as u64) << 46) + | ((bytes[37] as u64) << 38) + | ((bytes[38] as u64) << 30) + | ((bytes[39] as u64) << 22) + | ((bytes[40] as u64) << 14) + | ((bytes[41] as u64) << 6) | (((bytes[42] >> 2) & 0x3f) as u64); values[6] = ((((bytes[42]) & 0x3) as u64) << 55) - | (((bytes[43]) as u64) << 47) - | (((bytes[44]) as u64) << 39) - | (((bytes[45]) as u64) << 31) - | (((bytes[46]) as u64) << 23) - | (((bytes[47]) as u64) << 15) - | (((bytes[48]) as u64) << 7) + | ((bytes[43] as u64) << 47) + | ((bytes[44] as u64) << 39) + | ((bytes[45] as u64) << 31) + | ((bytes[46] as u64) << 23) + | ((bytes[47] as u64) << 15) + | ((bytes[48] as u64) << 7) | (((bytes[49] >> 1) & 0x7f) as u64); values[7] = ((((bytes[49]) & 0x1) as u64) << 56) - | (((bytes[50]) as u64) << 48) - | (((bytes[51]) as u64) << 40) - | (((bytes[52]) as u64) << 32) - | (((bytes[53]) as u64) << 24) - | (((bytes[54]) as u64) << 16) - | (((bytes[55]) as u64) << 8) - | ((bytes[56]) as u64); + | ((bytes[50] as u64) << 48) + | ((bytes[51] as u64) << 40) + | ((bytes[52] as u64) << 32) + | ((bytes[53] as u64) << 24) + | ((bytes[54] as u64) << 16) + | ((bytes[55] as u64) << 8) + | (bytes[56] as u64); } #[inline] fn unpack_bits_58(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 50) - | (((bytes[1]) as u64) << 42) - | (((bytes[2]) as u64) << 34) - | (((bytes[3]) as u64) << 26) - | (((bytes[4]) as u64) << 18) - | (((bytes[5]) as u64) << 10) - | (((bytes[6]) as u64) << 2) + values[0] = ((bytes[0] as u64) << 50) + | ((bytes[1] as u64) << 42) + | ((bytes[2] as u64) << 34) + | ((bytes[3] as u64) << 26) + | ((bytes[4] as u64) << 18) + | ((bytes[5] as u64) << 10) + | ((bytes[6] as u64) << 2) | (((bytes[7] >> 6) & 0x3) as u64); values[1] = ((((bytes[7]) & 0x3f) as u64) << 52) - | (((bytes[8]) as u64) << 44) - | (((bytes[9]) as u64) << 36) - | (((bytes[10]) as u64) << 28) - | (((bytes[11]) as u64) << 20) - | (((bytes[12]) as u64) << 12) - | (((bytes[13]) as u64) << 4) + | ((bytes[8] as u64) << 44) + | ((bytes[9] as u64) << 36) + | ((bytes[10] as u64) << 28) + | ((bytes[11] as u64) << 20) + | ((bytes[12] as u64) << 12) + | ((bytes[13] as u64) << 4) | (((bytes[14] >> 4) & 0xf) as u64); values[2] = ((((bytes[14]) & 0xf) as u64) << 54) - | (((bytes[15]) as u64) << 46) - | (((bytes[16]) as u64) << 38) - | (((bytes[17]) as u64) << 30) - | (((bytes[18]) as u64) << 22) - | (((bytes[19]) as u64) << 14) - | (((bytes[20]) as u64) << 6) + | ((bytes[15] as u64) << 46) + | ((bytes[16] as u64) << 38) + | ((bytes[17] as u64) << 30) + | ((bytes[18] as u64) << 22) + | ((bytes[19] as u64) << 14) + | ((bytes[20] as u64) << 6) | (((bytes[21] >> 2) & 0x3f) as u64); values[3] = ((((bytes[21]) & 0x3) as u64) << 56) - | (((bytes[22]) as u64) << 48) - | (((bytes[23]) as u64) << 40) - | (((bytes[24]) as u64) << 32) - | (((bytes[25]) as u64) << 24) - | (((bytes[26]) as u64) << 16) - | (((bytes[27]) as u64) << 8) - | ((bytes[28]) as u64); - values[4] = (((bytes[29]) as u64) << 50) - | (((bytes[30]) as u64) << 42) - | (((bytes[31]) as u64) << 34) - | (((bytes[32]) as u64) << 26) - | (((bytes[33]) as u64) << 18) - | (((bytes[34]) as u64) << 10) - | (((bytes[35]) as u64) << 2) + | ((bytes[22] as u64) << 48) + | ((bytes[23] as u64) << 40) + | ((bytes[24] as u64) << 32) + | ((bytes[25] as u64) << 24) + | ((bytes[26] as u64) << 16) + | ((bytes[27] as u64) << 8) + | (bytes[28] as u64); + values[4] = ((bytes[29] as u64) << 50) + | ((bytes[30] as u64) << 42) + | ((bytes[31] as u64) << 34) + | ((bytes[32] as u64) << 26) + | ((bytes[33] as u64) << 18) + | ((bytes[34] as u64) << 10) + | ((bytes[35] as u64) << 2) | (((bytes[36] >> 6) & 0x3) as u64); values[5] = ((((bytes[36]) & 0x3f) as u64) << 52) - | (((bytes[37]) as u64) << 44) - | (((bytes[38]) as u64) << 36) - | (((bytes[39]) as u64) << 28) - | (((bytes[40]) as u64) << 20) - | (((bytes[41]) as u64) << 12) - | (((bytes[42]) as u64) << 4) + | ((bytes[37] as u64) << 44) + | ((bytes[38] as u64) << 36) + | ((bytes[39] as u64) << 28) + | ((bytes[40] as u64) << 20) + | ((bytes[41] as u64) << 12) + | ((bytes[42] as u64) << 4) | (((bytes[43] >> 4) & 0xf) as u64); values[6] = ((((bytes[43]) & 0xf) as u64) << 54) - | (((bytes[44]) as u64) << 46) - | (((bytes[45]) as u64) << 38) - | (((bytes[46]) as u64) << 30) - | (((bytes[47]) as u64) << 22) - | (((bytes[48]) as u64) << 14) - | (((bytes[49]) as u64) << 6) + | ((bytes[44] as u64) << 46) + | ((bytes[45] as u64) << 38) + | ((bytes[46] as u64) << 30) + | ((bytes[47] as u64) << 22) + | ((bytes[48] as u64) << 14) + | ((bytes[49] as u64) << 6) | (((bytes[50] >> 2) & 0x3f) as u64); values[7] = ((((bytes[50]) & 0x3) as u64) << 56) - | (((bytes[51]) as u64) << 48) - | (((bytes[52]) as u64) << 40) - | (((bytes[53]) as u64) << 32) - | (((bytes[54]) as u64) << 24) - | (((bytes[55]) as u64) << 16) - | (((bytes[56]) as u64) << 8) - | ((bytes[57]) as u64); + | ((bytes[51] as u64) << 48) + | ((bytes[52] as u64) << 40) + | ((bytes[53] as u64) << 32) + | ((bytes[54] as u64) << 24) + | ((bytes[55] as u64) << 16) + | ((bytes[56] as u64) << 8) + | (bytes[57] as u64); } #[inline] fn unpack_bits_59(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 51) - | (((bytes[1]) as u64) << 43) - | (((bytes[2]) as u64) << 35) - | (((bytes[3]) as u64) << 27) - | (((bytes[4]) as u64) << 19) - | (((bytes[5]) as u64) << 11) - | (((bytes[6]) as u64) << 3) + values[0] = ((bytes[0] as u64) << 51) + | ((bytes[1] as u64) << 43) + | ((bytes[2] as u64) << 35) + | ((bytes[3] as u64) << 27) + | ((bytes[4] as u64) << 19) + | ((bytes[5] as u64) << 11) + | ((bytes[6] as u64) << 3) | (((bytes[7] >> 5) & 0x7) as u64); values[1] = ((((bytes[7]) & 0x1f) as u64) << 54) - | (((bytes[8]) as u64) << 46) - | (((bytes[9]) as u64) << 38) - | (((bytes[10]) as u64) << 30) - | (((bytes[11]) as u64) << 22) - | (((bytes[12]) as u64) << 14) - | (((bytes[13]) as u64) << 6) + | ((bytes[8] as u64) << 46) + | ((bytes[9] as u64) << 38) + | ((bytes[10] as u64) << 30) + | ((bytes[11] as u64) << 22) + | ((bytes[12] as u64) << 14) + | ((bytes[13] as u64) << 6) | (((bytes[14] >> 2) & 0x3f) as u64); values[2] = ((((bytes[14]) & 0x3) as u64) << 57) - | (((bytes[15]) as u64) << 49) - | (((bytes[16]) as u64) << 41) - | (((bytes[17]) as u64) << 33) - | (((bytes[18]) as u64) << 25) - | (((bytes[19]) as u64) << 17) - | (((bytes[20]) as u64) << 9) - | (((bytes[21]) as u64) << 1) + | ((bytes[15] as u64) << 49) + | ((bytes[16] as u64) << 41) + | ((bytes[17] as u64) << 33) + | ((bytes[18] as u64) << 25) + | ((bytes[19] as u64) << 17) + | ((bytes[20] as u64) << 9) + | ((bytes[21] as u64) << 1) | (((bytes[22] >> 7) & 0x1) as u64); values[3] = ((((bytes[22]) & 0x7f) as u64) << 52) - | (((bytes[23]) as u64) << 44) - | (((bytes[24]) as u64) << 36) - | (((bytes[25]) as u64) << 28) - | (((bytes[26]) as u64) << 20) - | (((bytes[27]) as u64) << 12) - | (((bytes[28]) as u64) << 4) + | ((bytes[23] as u64) << 44) + | ((bytes[24] as u64) << 36) + | ((bytes[25] as u64) << 28) + | ((bytes[26] as u64) << 20) + | ((bytes[27] as u64) << 12) + | ((bytes[28] as u64) << 4) | (((bytes[29] >> 4) & 0xf) as u64); values[4] = ((((bytes[29]) & 0xf) as u64) << 55) - | (((bytes[30]) as u64) << 47) - | (((bytes[31]) as u64) << 39) - | (((bytes[32]) as u64) << 31) - | (((bytes[33]) as u64) << 23) - | (((bytes[34]) as u64) << 15) - | (((bytes[35]) as u64) << 7) + | ((bytes[30] as u64) << 47) + | ((bytes[31] as u64) << 39) + | ((bytes[32] as u64) << 31) + | ((bytes[33] as u64) << 23) + | ((bytes[34] as u64) << 15) + | ((bytes[35] as u64) << 7) | (((bytes[36] >> 1) & 0x7f) as u64); values[5] = ((((bytes[36]) & 0x1) as u64) << 58) - | (((bytes[37]) as u64) << 50) - | (((bytes[38]) as u64) << 42) - | (((bytes[39]) as u64) << 34) - | (((bytes[40]) as u64) << 26) - | (((bytes[41]) as u64) << 18) - | (((bytes[42]) as u64) << 10) - | (((bytes[43]) as u64) << 2) + | ((bytes[37] as u64) << 50) + | ((bytes[38] as u64) << 42) + | ((bytes[39] as u64) << 34) + | ((bytes[40] as u64) << 26) + | ((bytes[41] as u64) << 18) + | ((bytes[42] as u64) << 10) + | ((bytes[43] as u64) << 2) | (((bytes[44] >> 6) & 0x3) as u64); values[6] = ((((bytes[44]) & 0x3f) as u64) << 53) - | (((bytes[45]) as u64) << 45) - | (((bytes[46]) as u64) << 37) - | (((bytes[47]) as u64) << 29) - | (((bytes[48]) as u64) << 21) - | (((bytes[49]) as u64) << 13) - | (((bytes[50]) as u64) << 5) + | ((bytes[45] as u64) << 45) + | ((bytes[46] as u64) << 37) + | ((bytes[47] as u64) << 29) + | ((bytes[48] as u64) << 21) + | ((bytes[49] as u64) << 13) + | ((bytes[50] as u64) << 5) | (((bytes[51] >> 3) & 0x1f) as u64); values[7] = ((((bytes[51]) & 0x7) as u64) << 56) - | (((bytes[52]) as u64) << 48) - | (((bytes[53]) as u64) << 40) - | (((bytes[54]) as u64) << 32) - | (((bytes[55]) as u64) << 24) - | (((bytes[56]) as u64) << 16) - | (((bytes[57]) as u64) << 8) - | ((bytes[58]) as u64); + | ((bytes[52] as u64) << 48) + | ((bytes[53] as u64) << 40) + | ((bytes[54] as u64) << 32) + | ((bytes[55] as u64) << 24) + | ((bytes[56] as u64) << 16) + | ((bytes[57] as u64) << 8) + | (bytes[58] as u64); } #[inline] fn unpack_bits_60(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 52) - | (((bytes[1]) as u64) << 44) - | (((bytes[2]) as u64) << 36) - | (((bytes[3]) as u64) << 28) - | (((bytes[4]) as u64) << 20) - | (((bytes[5]) as u64) << 12) - | (((bytes[6]) as u64) << 4) + values[0] = ((bytes[0] as u64) << 52) + | ((bytes[1] as u64) << 44) + | ((bytes[2] as u64) << 36) + | ((bytes[3] as u64) << 28) + | ((bytes[4] as u64) << 20) + | ((bytes[5] as u64) << 12) + | ((bytes[6] as u64) << 4) | (((bytes[7] >> 4) & 0xf) as u64); values[1] = ((((bytes[7]) & 0xf) as u64) << 56) - | (((bytes[8]) as u64) << 48) - | (((bytes[9]) as u64) << 40) - | (((bytes[10]) as u64) << 32) - | (((bytes[11]) as u64) << 24) - | (((bytes[12]) as u64) << 16) - | (((bytes[13]) as u64) << 8) - | ((bytes[14]) as u64); - values[2] = (((bytes[15]) as u64) << 52) - | (((bytes[16]) as u64) << 44) - | (((bytes[17]) as u64) << 36) - | (((bytes[18]) as u64) << 28) - | (((bytes[19]) as u64) << 20) - | (((bytes[20]) as u64) << 12) - | (((bytes[21]) as u64) << 4) + | ((bytes[8] as u64) << 48) + | ((bytes[9] as u64) << 40) + | ((bytes[10] as u64) << 32) + | ((bytes[11] as u64) << 24) + | ((bytes[12] as u64) << 16) + | ((bytes[13] as u64) << 8) + | (bytes[14] as u64); + values[2] = ((bytes[15] as u64) << 52) + | ((bytes[16] as u64) << 44) + | ((bytes[17] as u64) << 36) + | ((bytes[18] as u64) << 28) + | ((bytes[19] as u64) << 20) + | ((bytes[20] as u64) << 12) + | ((bytes[21] as u64) << 4) | (((bytes[22] >> 4) & 0xf) as u64); values[3] = ((((bytes[22]) & 0xf) as u64) << 56) - | (((bytes[23]) as u64) << 48) - | (((bytes[24]) as u64) << 40) - | (((bytes[25]) as u64) << 32) - | (((bytes[26]) as u64) << 24) - | (((bytes[27]) as u64) << 16) - | (((bytes[28]) as u64) << 8) - | ((bytes[29]) as u64); - values[4] = (((bytes[30]) as u64) << 52) - | (((bytes[31]) as u64) << 44) - | (((bytes[32]) as u64) << 36) - | (((bytes[33]) as u64) << 28) - | (((bytes[34]) as u64) << 20) - | (((bytes[35]) as u64) << 12) - | (((bytes[36]) as u64) << 4) + | ((bytes[23] as u64) << 48) + | ((bytes[24] as u64) << 40) + | ((bytes[25] as u64) << 32) + | ((bytes[26] as u64) << 24) + | ((bytes[27] as u64) << 16) + | ((bytes[28] as u64) << 8) + | (bytes[29] as u64); + values[4] = ((bytes[30] as u64) << 52) + | ((bytes[31] as u64) << 44) + | ((bytes[32] as u64) << 36) + | ((bytes[33] as u64) << 28) + | ((bytes[34] as u64) << 20) + | ((bytes[35] as u64) << 12) + | ((bytes[36] as u64) << 4) | (((bytes[37] >> 4) & 0xf) as u64); values[5] = ((((bytes[37]) & 0xf) as u64) << 56) - | (((bytes[38]) as u64) << 48) - | (((bytes[39]) as u64) << 40) - | (((bytes[40]) as u64) << 32) - | (((bytes[41]) as u64) << 24) - | (((bytes[42]) as u64) << 16) - | (((bytes[43]) as u64) << 8) - | ((bytes[44]) as u64); - values[6] = (((bytes[45]) as u64) << 52) - | (((bytes[46]) as u64) << 44) - | (((bytes[47]) as u64) << 36) - | (((bytes[48]) as u64) << 28) - | (((bytes[49]) as u64) << 20) - | (((bytes[50]) as u64) << 12) - | (((bytes[51]) as u64) << 4) + | ((bytes[38] as u64) << 48) + | ((bytes[39] as u64) << 40) + | ((bytes[40] as u64) << 32) + | ((bytes[41] as u64) << 24) + | ((bytes[42] as u64) << 16) + | ((bytes[43] as u64) << 8) + | (bytes[44] as u64); + values[6] = ((bytes[45] as u64) << 52) + | ((bytes[46] as u64) << 44) + | ((bytes[47] as u64) << 36) + | ((bytes[48] as u64) << 28) + | ((bytes[49] as u64) << 20) + | ((bytes[50] as u64) << 12) + | ((bytes[51] as u64) << 4) | (((bytes[52] >> 4) & 0xf) as u64); values[7] = ((((bytes[52]) & 0xf) as u64) << 56) - | (((bytes[53]) as u64) << 48) - | (((bytes[54]) as u64) << 40) - | (((bytes[55]) as u64) << 32) - | (((bytes[56]) as u64) << 24) - | (((bytes[57]) as u64) << 16) - | (((bytes[58]) as u64) << 8) - | ((bytes[59]) as u64); + | ((bytes[53] as u64) << 48) + | ((bytes[54] as u64) << 40) + | ((bytes[55] as u64) << 32) + | ((bytes[56] as u64) << 24) + | ((bytes[57] as u64) << 16) + | ((bytes[58] as u64) << 8) + | (bytes[59] as u64); } #[inline] fn unpack_bits_61(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 53) - | (((bytes[1]) as u64) << 45) - | (((bytes[2]) as u64) << 37) - | (((bytes[3]) as u64) << 29) - | (((bytes[4]) as u64) << 21) - | (((bytes[5]) as u64) << 13) - | (((bytes[6]) as u64) << 5) + values[0] = ((bytes[0] as u64) << 53) + | ((bytes[1] as u64) << 45) + | ((bytes[2] as u64) << 37) + | ((bytes[3] as u64) << 29) + | ((bytes[4] as u64) << 21) + | ((bytes[5] as u64) << 13) + | ((bytes[6] as u64) << 5) | (((bytes[7] >> 3) & 0x1f) as u64); values[1] = ((((bytes[7]) & 0x7) as u64) << 58) - | (((bytes[8]) as u64) << 50) - | (((bytes[9]) as u64) << 42) - | (((bytes[10]) as u64) << 34) - | (((bytes[11]) as u64) << 26) - | (((bytes[12]) as u64) << 18) - | (((bytes[13]) as u64) << 10) - | (((bytes[14]) as u64) << 2) + | ((bytes[8] as u64) << 50) + | ((bytes[9] as u64) << 42) + | ((bytes[10] as u64) << 34) + | ((bytes[11] as u64) << 26) + | ((bytes[12] as u64) << 18) + | ((bytes[13] as u64) << 10) + | ((bytes[14] as u64) << 2) | (((bytes[15] >> 6) & 0x3) as u64); values[2] = ((((bytes[15]) & 0x3f) as u64) << 55) - | (((bytes[16]) as u64) << 47) - | (((bytes[17]) as u64) << 39) - | (((bytes[18]) as u64) << 31) - | (((bytes[19]) as u64) << 23) - | (((bytes[20]) as u64) << 15) - | (((bytes[21]) as u64) << 7) + | ((bytes[16] as u64) << 47) + | ((bytes[17] as u64) << 39) + | ((bytes[18] as u64) << 31) + | ((bytes[19] as u64) << 23) + | ((bytes[20] as u64) << 15) + | ((bytes[21] as u64) << 7) | (((bytes[22] >> 1) & 0x7f) as u64); values[3] = ((((bytes[22]) & 0x1) as u64) << 60) - | (((bytes[23]) as u64) << 52) - | (((bytes[24]) as u64) << 44) - | (((bytes[25]) as u64) << 36) - | (((bytes[26]) as u64) << 28) - | (((bytes[27]) as u64) << 20) - | (((bytes[28]) as u64) << 12) - | (((bytes[29]) as u64) << 4) + | ((bytes[23] as u64) << 52) + | ((bytes[24] as u64) << 44) + | ((bytes[25] as u64) << 36) + | ((bytes[26] as u64) << 28) + | ((bytes[27] as u64) << 20) + | ((bytes[28] as u64) << 12) + | ((bytes[29] as u64) << 4) | (((bytes[30] >> 4) & 0xf) as u64); values[4] = ((((bytes[30]) & 0xf) as u64) << 57) - | (((bytes[31]) as u64) << 49) - | (((bytes[32]) as u64) << 41) - | (((bytes[33]) as u64) << 33) - | (((bytes[34]) as u64) << 25) - | (((bytes[35]) as u64) << 17) - | (((bytes[36]) as u64) << 9) - | (((bytes[37]) as u64) << 1) + | ((bytes[31] as u64) << 49) + | ((bytes[32] as u64) << 41) + | ((bytes[33] as u64) << 33) + | ((bytes[34] as u64) << 25) + | ((bytes[35] as u64) << 17) + | ((bytes[36] as u64) << 9) + | ((bytes[37] as u64) << 1) | (((bytes[38] >> 7) & 0x1) as u64); values[5] = ((((bytes[38]) & 0x7f) as u64) << 54) - | (((bytes[39]) as u64) << 46) - | (((bytes[40]) as u64) << 38) - | (((bytes[41]) as u64) << 30) - | (((bytes[42]) as u64) << 22) - | (((bytes[43]) as u64) << 14) - | (((bytes[44]) as u64) << 6) + | ((bytes[39] as u64) << 46) + | ((bytes[40] as u64) << 38) + | ((bytes[41] as u64) << 30) + | ((bytes[42] as u64) << 22) + | ((bytes[43] as u64) << 14) + | ((bytes[44] as u64) << 6) | (((bytes[45] >> 2) & 0x3f) as u64); values[6] = ((((bytes[45]) & 0x3) as u64) << 59) - | (((bytes[46]) as u64) << 51) - | (((bytes[47]) as u64) << 43) - | (((bytes[48]) as u64) << 35) - | (((bytes[49]) as u64) << 27) - | (((bytes[50]) as u64) << 19) - | (((bytes[51]) as u64) << 11) - | (((bytes[52]) as u64) << 3) + | ((bytes[46] as u64) << 51) + | ((bytes[47] as u64) << 43) + | ((bytes[48] as u64) << 35) + | ((bytes[49] as u64) << 27) + | ((bytes[50] as u64) << 19) + | ((bytes[51] as u64) << 11) + | ((bytes[52] as u64) << 3) | (((bytes[53] >> 5) & 0x7) as u64); values[7] = ((((bytes[53]) & 0x1f) as u64) << 56) - | (((bytes[54]) as u64) << 48) - | (((bytes[55]) as u64) << 40) - | (((bytes[56]) as u64) << 32) - | (((bytes[57]) as u64) << 24) - | (((bytes[58]) as u64) << 16) - | (((bytes[59]) as u64) << 8) - | ((bytes[60]) as u64); + | ((bytes[54] as u64) << 48) + | ((bytes[55] as u64) << 40) + | ((bytes[56] as u64) << 32) + | ((bytes[57] as u64) << 24) + | ((bytes[58] as u64) << 16) + | ((bytes[59] as u64) << 8) + | (bytes[60] as u64); } #[inline] fn unpack_bits_62(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 54) - | (((bytes[1]) as u64) << 46) - | (((bytes[2]) as u64) << 38) - | (((bytes[3]) as u64) << 30) - | (((bytes[4]) as u64) << 22) - | (((bytes[5]) as u64) << 14) - | (((bytes[6]) as u64) << 6) + values[0] = ((bytes[0] as u64) << 54) + | ((bytes[1] as u64) << 46) + | ((bytes[2] as u64) << 38) + | ((bytes[3] as u64) << 30) + | ((bytes[4] as u64) << 22) + | ((bytes[5] as u64) << 14) + | ((bytes[6] as u64) << 6) | (((bytes[7] >> 2) & 0x3f) as u64); values[1] = ((((bytes[7]) & 0x3) as u64) << 60) - | (((bytes[8]) as u64) << 52) - | (((bytes[9]) as u64) << 44) - | (((bytes[10]) as u64) << 36) - | (((bytes[11]) as u64) << 28) - | (((bytes[12]) as u64) << 20) - | (((bytes[13]) as u64) << 12) - | (((bytes[14]) as u64) << 4) + | ((bytes[8] as u64) << 52) + | ((bytes[9] as u64) << 44) + | ((bytes[10] as u64) << 36) + | ((bytes[11] as u64) << 28) + | ((bytes[12] as u64) << 20) + | ((bytes[13] as u64) << 12) + | ((bytes[14] as u64) << 4) | (((bytes[15] >> 4) & 0xf) as u64); values[2] = ((((bytes[15]) & 0xf) as u64) << 58) - | (((bytes[16]) as u64) << 50) - | (((bytes[17]) as u64) << 42) - | (((bytes[18]) as u64) << 34) - | (((bytes[19]) as u64) << 26) - | (((bytes[20]) as u64) << 18) - | (((bytes[21]) as u64) << 10) - | (((bytes[22]) as u64) << 2) + | ((bytes[16] as u64) << 50) + | ((bytes[17] as u64) << 42) + | ((bytes[18] as u64) << 34) + | ((bytes[19] as u64) << 26) + | ((bytes[20] as u64) << 18) + | ((bytes[21] as u64) << 10) + | ((bytes[22] as u64) << 2) | (((bytes[23] >> 6) & 0x3) as u64); values[3] = ((((bytes[23]) & 0x3f) as u64) << 56) - | (((bytes[24]) as u64) << 48) - | (((bytes[25]) as u64) << 40) - | (((bytes[26]) as u64) << 32) - | (((bytes[27]) as u64) << 24) - | (((bytes[28]) as u64) << 16) - | (((bytes[29]) as u64) << 8) - | ((bytes[30]) as u64); - values[4] = (((bytes[31]) as u64) << 54) - | (((bytes[32]) as u64) << 46) - | (((bytes[33]) as u64) << 38) - | (((bytes[34]) as u64) << 30) - | (((bytes[35]) as u64) << 22) - | (((bytes[36]) as u64) << 14) - | (((bytes[37]) as u64) << 6) + | ((bytes[24] as u64) << 48) + | ((bytes[25] as u64) << 40) + | ((bytes[26] as u64) << 32) + | ((bytes[27] as u64) << 24) + | ((bytes[28] as u64) << 16) + | ((bytes[29] as u64) << 8) + | (bytes[30] as u64); + values[4] = ((bytes[31] as u64) << 54) + | ((bytes[32] as u64) << 46) + | ((bytes[33] as u64) << 38) + | ((bytes[34] as u64) << 30) + | ((bytes[35] as u64) << 22) + | ((bytes[36] as u64) << 14) + | ((bytes[37] as u64) << 6) | (((bytes[38] >> 2) & 0x3f) as u64); values[5] = ((((bytes[38]) & 0x3) as u64) << 60) - | (((bytes[39]) as u64) << 52) - | (((bytes[40]) as u64) << 44) - | (((bytes[41]) as u64) << 36) - | (((bytes[42]) as u64) << 28) - | (((bytes[43]) as u64) << 20) - | (((bytes[44]) as u64) << 12) - | (((bytes[45]) as u64) << 4) + | ((bytes[39] as u64) << 52) + | ((bytes[40] as u64) << 44) + | ((bytes[41] as u64) << 36) + | ((bytes[42] as u64) << 28) + | ((bytes[43] as u64) << 20) + | ((bytes[44] as u64) << 12) + | ((bytes[45] as u64) << 4) | (((bytes[46] >> 4) & 0xf) as u64); values[6] = ((((bytes[46]) & 0xf) as u64) << 58) - | (((bytes[47]) as u64) << 50) - | (((bytes[48]) as u64) << 42) - | (((bytes[49]) as u64) << 34) - | (((bytes[50]) as u64) << 26) - | (((bytes[51]) as u64) << 18) - | (((bytes[52]) as u64) << 10) - | (((bytes[53]) as u64) << 2) + | ((bytes[47] as u64) << 50) + | ((bytes[48] as u64) << 42) + | ((bytes[49] as u64) << 34) + | ((bytes[50] as u64) << 26) + | ((bytes[51] as u64) << 18) + | ((bytes[52] as u64) << 10) + | ((bytes[53] as u64) << 2) | (((bytes[54] >> 6) & 0x3) as u64); values[7] = ((((bytes[54]) & 0x3f) as u64) << 56) - | (((bytes[55]) as u64) << 48) - | (((bytes[56]) as u64) << 40) - | (((bytes[57]) as u64) << 32) - | (((bytes[58]) as u64) << 24) - | (((bytes[59]) as u64) << 16) - | (((bytes[60]) as u64) << 8) - | ((bytes[61]) as u64); + | ((bytes[55] as u64) << 48) + | ((bytes[56] as u64) << 40) + | ((bytes[57] as u64) << 32) + | ((bytes[58] as u64) << 24) + | ((bytes[59] as u64) << 16) + | ((bytes[60] as u64) << 8) + | (bytes[61] as u64); } #[inline] fn unpack_bits_63(values: &mut [u64], bytes: &[u8]) { - values[0] = (((bytes[0]) as u64) << 55) - | (((bytes[1]) as u64) << 47) - | (((bytes[2]) as u64) << 39) - | (((bytes[3]) as u64) << 31) - | (((bytes[4]) as u64) << 23) - | (((bytes[5]) as u64) << 15) - | (((bytes[6]) as u64) << 7) + values[0] = ((bytes[0] as u64) << 55) + | ((bytes[1] as u64) << 47) + | ((bytes[2] as u64) << 39) + | ((bytes[3] as u64) << 31) + | ((bytes[4] as u64) << 23) + | ((bytes[5] as u64) << 15) + | ((bytes[6] as u64) << 7) | (((bytes[7] >> 1) & 0x7f) as u64); values[1] = ((((bytes[7]) & 0x1) as u64) << 62) - | (((bytes[8]) as u64) << 54) - | (((bytes[9]) as u64) << 46) - | (((bytes[10]) as u64) << 38) - | (((bytes[11]) as u64) << 30) - | (((bytes[12]) as u64) << 22) - | (((bytes[13]) as u64) << 14) - | (((bytes[14]) as u64) << 6) + | ((bytes[8] as u64) << 54) + | ((bytes[9] as u64) << 46) + | ((bytes[10] as u64) << 38) + | ((bytes[11] as u64) << 30) + | ((bytes[12] as u64) << 22) + | ((bytes[13] as u64) << 14) + | ((bytes[14] as u64) << 6) | (((bytes[15] >> 2) & 0x3f) as u64); values[2] = ((((bytes[15]) & 0x3) as u64) << 61) - | (((bytes[16]) as u64) << 53) - | (((bytes[17]) as u64) << 45) - | (((bytes[18]) as u64) << 37) - | (((bytes[19]) as u64) << 29) - | (((bytes[20]) as u64) << 21) - | (((bytes[21]) as u64) << 13) - | (((bytes[22]) as u64) << 5) + | ((bytes[16] as u64) << 53) + | ((bytes[17] as u64) << 45) + | ((bytes[18] as u64) << 37) + | ((bytes[19] as u64) << 29) + | ((bytes[20] as u64) << 21) + | ((bytes[21] as u64) << 13) + | ((bytes[22] as u64) << 5) | (((bytes[23] >> 3) & 0x1f) as u64); values[3] = ((((bytes[23]) & 0x7) as u64) << 60) - | (((bytes[24]) as u64) << 52) - | (((bytes[25]) as u64) << 44) - | (((bytes[26]) as u64) << 36) - | (((bytes[27]) as u64) << 28) - | (((bytes[28]) as u64) << 20) - | (((bytes[29]) as u64) << 12) - | (((bytes[30]) as u64) << 4) + | ((bytes[24] as u64) << 52) + | ((bytes[25] as u64) << 44) + | ((bytes[26] as u64) << 36) + | ((bytes[27] as u64) << 28) + | ((bytes[28] as u64) << 20) + | ((bytes[29] as u64) << 12) + | ((bytes[30] as u64) << 4) | (((bytes[31] >> 4) & 0xf) as u64); values[4] = ((((bytes[31]) & 0xf) as u64) << 59) - | (((bytes[32]) as u64) << 51) - | (((bytes[33]) as u64) << 43) - | (((bytes[34]) as u64) << 35) - | (((bytes[35]) as u64) << 27) - | (((bytes[36]) as u64) << 19) - | (((bytes[37]) as u64) << 11) - | (((bytes[38]) as u64) << 3) + | ((bytes[32] as u64) << 51) + | ((bytes[33] as u64) << 43) + | ((bytes[34] as u64) << 35) + | ((bytes[35] as u64) << 27) + | ((bytes[36] as u64) << 19) + | ((bytes[37] as u64) << 11) + | ((bytes[38] as u64) << 3) | (((bytes[39] >> 5) & 0x7) as u64); values[5] = ((((bytes[39]) & 0x1f) as u64) << 58) - | (((bytes[40]) as u64) << 50) - | (((bytes[41]) as u64) << 42) - | (((bytes[42]) as u64) << 34) - | (((bytes[43]) as u64) << 26) - | (((bytes[44]) as u64) << 18) - | (((bytes[45]) as u64) << 10) - | (((bytes[46]) as u64) << 2) + | ((bytes[40] as u64) << 50) + | ((bytes[41] as u64) << 42) + | ((bytes[42] as u64) << 34) + | ((bytes[43] as u64) << 26) + | ((bytes[44] as u64) << 18) + | ((bytes[45] as u64) << 10) + | ((bytes[46] as u64) << 2) | (((bytes[47] >> 6) & 0x3) as u64); values[6] = ((((bytes[47]) & 0x3f) as u64) << 57) - | (((bytes[48]) as u64) << 49) - | (((bytes[49]) as u64) << 41) - | (((bytes[50]) as u64) << 33) - | (((bytes[51]) as u64) << 25) - | (((bytes[52]) as u64) << 17) - | (((bytes[53]) as u64) << 9) - | (((bytes[54]) as u64) << 1) + | ((bytes[48] as u64) << 49) + | ((bytes[49] as u64) << 41) + | ((bytes[50] as u64) << 33) + | ((bytes[51] as u64) << 25) + | ((bytes[52] as u64) << 17) + | ((bytes[53] as u64) << 9) + | ((bytes[54] as u64) << 1) | (((bytes[55] >> 7) & 0x1) as u64); values[7] = ((((bytes[55]) & 0x7f) as u64) << 56) - | (((bytes[56]) as u64) << 48) - | (((bytes[57]) as u64) << 40) - | (((bytes[58]) as u64) << 32) - | (((bytes[59]) as u64) << 24) - | (((bytes[60]) as u64) << 16) - | (((bytes[61]) as u64) << 8) - | ((bytes[62]) as u64); + | ((bytes[56] as u64) << 48) + | ((bytes[57] as u64) << 40) + | ((bytes[58] as u64) << 32) + | ((bytes[59] as u64) << 24) + | ((bytes[60] as u64) << 16) + | ((bytes[61] as u64) << 8) + | (bytes[62] as u64); } /// Packs a block of `BLOCK_WIDTH` values using fully-expanded fixed-width bit packing. @@ -4975,7 +4965,7 @@ fn unpack_bits_63(values: &mut [u64], bytes: &[u8]) { /// * Panics if `values.len()` is not equal to `BLOCK_WIDTH`. /// * Panics if `bits` is not in the range `1..=63`. /// * Panics if `bytes.len()` is less than `bits`. -pub(crate) fn pack_bits_block(values: &[u64], bytes: &mut [u8], bits: u8) { +pub(super) fn pack_bits_block(values: &[u64], bytes: &mut [u8], bits: u8) { assert_eq!(values.len(), BLOCK_WIDTH, "values length must be 8"); assert!( (1..=63).contains(&bits), @@ -5058,7 +5048,7 @@ pub(crate) fn pack_bits_block(values: &[u64], bytes: &mut [u8], bits: u8) { /// * Panics if `values.len()` is not equal to `BLOCK_WIDTH`. /// * Panics if `bits` is not in the range `1..=63`. /// * Panics if `bytes.len()` is less than `bits`. -pub(crate) fn unpack_bits_block(values: &mut [u64], bytes: &[u8], bits: u8) { +pub(super) fn unpack_bits_block(values: &mut [u64], bytes: &[u8], bits: u8) { assert_eq!(values.len(), BLOCK_WIDTH, "values length must be 8"); assert!( (1..=63).contains(&bits), @@ -5139,7 +5129,7 @@ mod tests { use super::*; // inverse golden ratio (0.618.. of max uint64_t) - const IGOLDEN64: u64 = 0x9e37_79b9_7f4a_7c13; + const INVERSE_GOLDEN_RATIO: u64 = 0x9e37_79b9_7f4a_7c13; #[test] fn pack_unpack_bits() { @@ -5151,10 +5141,10 @@ mod tests { let mut input = vec![0u64; n]; for item in &mut input { *item = value & mask; - value = value.wrapping_add(IGOLDEN64); + value = value.wrapping_add(INVERSE_GOLDEN_RATIO); } - let mut bytes = vec![0u8; n * std::mem::size_of::()]; + let mut bytes = vec![0u8; n * size_of::()]; let mut packer = BitPacker::new(&mut bytes); for i in 0..n { packer.pack_value(input[i], bits); @@ -5182,7 +5172,7 @@ mod tests { let mut input = vec![0u64; BLOCK_WIDTH]; for item in &mut input { *item = value & mask; - value = value.wrapping_add(IGOLDEN64); + value = value.wrapping_add(INVERSE_GOLDEN_RATIO); } let mut bytes = vec![0u8; bits as usize]; @@ -5207,7 +5197,7 @@ mod tests { let mut input = vec![0u64; BLOCK_WIDTH]; for item in &mut input { *item = value & mask; - value = value.wrapping_add(IGOLDEN64); + value = value.wrapping_add(INVERSE_GOLDEN_RATIO); } let mut bytes = vec![0u8; bits as usize]; @@ -5235,7 +5225,7 @@ mod tests { let mut input = vec![0u64; BLOCK_WIDTH]; for item in &mut input { *item = value & mask; - value = value.wrapping_add(IGOLDEN64); + value = value.wrapping_add(INVERSE_GOLDEN_RATIO); } let mut bytes = vec![0u8; bits as usize]; @@ -5261,10 +5251,10 @@ mod tests { let mut input = vec![0u64; n]; for item in &mut input { *item = value; - value = value.wrapping_add(IGOLDEN64); + value = value.wrapping_add(INVERSE_GOLDEN_RATIO); } - let mut bytes = vec![0u8; n * std::mem::size_of::()]; + let mut bytes = vec![0u8; n * size_of::()]; let mut packer = BitPacker::new(&mut bytes); for &v in &input { packer.pack_value(v, 64); @@ -5311,7 +5301,7 @@ mod tests { let mut input = [0u64; 8]; for item in &mut input { *item = value & mask; - value = value.wrapping_add(IGOLDEN64); + value = value.wrapping_add(INVERSE_GOLDEN_RATIO); } let mut bytes = vec![0u8; bits as usize]; diff --git a/datasketches/src/theta/hash_table.rs b/datasketches/src/theta/hash_table.rs index b06c695..fb8fec9 100644 --- a/datasketches/src/theta/hash_table.rs +++ b/datasketches/src/theta/hash_table.rs @@ -20,24 +20,10 @@ use std::hash::Hash; use crate::common::ResizeFactor; use crate::hash::MurmurHash3X64128; use crate::hash::compute_seed_hash; - -/// Maximum theta value (signed max for compatibility with Java) -pub const MAX_THETA: u64 = i64::MAX as u64; - -/// Minimum log2 of K -pub const MIN_LG_K: u8 = 5; - -/// Maximum log2 of K -pub const MAX_LG_K: u8 = 26; - -/// Default log2 of K -pub const DEFAULT_LG_K: u8 = 12; - -/// Resize threshold (0.5 = 50% load factor) -const RESIZE_THRESHOLD: f64 = 0.5; - -/// Rebuild threshold (15/16 = 93.75% load factor) -const REBUILD_THRESHOLD: f64 = 15.0 / 16.0; +use crate::theta::HASH_TABLE_REBUILD_THRESHOLD; +use crate::theta::HASH_TABLE_RESIZE_THRESHOLD; +use crate::theta::MAX_THETA; +use crate::theta::MIN_LG_K; /// Stride hash bits (7 bits for stride calculation) const STRIDE_HASH_BITS: u8 = 7; @@ -53,7 +39,7 @@ const STRIDE_MASK: u64 = (1 << STRIDE_HASH_BITS) - 1; /// exceeds the threshold, it will rebuild the table: only keep the min 2^lg_nom_size entries and /// update the theta to the k-th smallest entry. #[derive(Debug)] -pub(crate) struct ThetaHashTable { +pub(super) struct ThetaHashTable { lg_cur_size: u8, lg_nom_size: u8, lg_max_size: u8, @@ -61,10 +47,20 @@ pub(crate) struct ThetaHashTable { sampling_probability: f32, hash_seed: u64, + // Logical emptiness of the source set. + // + // * `false` if any update has been attempted (even if screened by theta) + // * `true` if no updates have been attempted. + // + // This can be false even when `num_retained` is 0. + is_empty: bool, + theta: u64, entries: Vec, - num_entries: usize, + + // Number of retained non-zero hashes currently stored in `entries`. + num_retained: usize, } impl ThetaHashTable { @@ -77,34 +73,58 @@ impl ThetaHashTable { ) -> Self { let lg_max_size = lg_nom_size + 1; let lg_cur_size = starting_sub_multiple(lg_max_size, MIN_LG_K, resize_factor.lg_value()); + Self::from_raw_parts( + lg_cur_size, + lg_nom_size, + resize_factor, + sampling_probability, + starting_theta_from_sampling_probability(sampling_probability), + hash_seed, + true, + ) + } + + /// Constructs a table from raw internal state. + /// + /// # Panics + /// + /// Panics if `lg_cur_size > lg_nom_size + 1`. (`lg_nom_size + 1 == lg_max_size`) + pub fn from_raw_parts( + lg_cur_size: u8, + lg_nom_size: u8, + resize_factor: ResizeFactor, + sampling_probability: f32, + theta: u64, + hash_seed: u64, + is_empty: bool, + ) -> Self { + let lg_max_size = lg_nom_size + 1; + assert!( + lg_cur_size <= lg_max_size, + "lg_cur_size must be <= lg_nom_size + 1, got lg_cur_size={lg_cur_size}, lg_nom_size={lg_nom_size}" + ); let size = if lg_cur_size > 0 { 1 << lg_cur_size } else { 0 }; let entries = vec![0u64; size]; - Self { lg_cur_size, lg_nom_size, lg_max_size, resize_factor, sampling_probability, - theta: starting_theta_from_sampling_probability(sampling_probability), hash_seed, + is_empty, + theta, entries, - num_entries: 0, + num_retained: 0, } } - /// Hash and screen a value - /// - /// Returns the hash value if it passes the theta threshold, otherwise 0. - pub fn hash_and_screen(&mut self, value: T) -> u64 { + /// Hash a value with the table seed and return the hash. + fn hash(&self, value: T) -> u64 { let mut hasher = MurmurHash3X64128::with_seed(self.hash_seed); value.hash(&mut hasher); let (h1, _) = hasher.finish128(); - let hash = h1 >> 1; // To make it compatible with Java version - if hash >= self.theta { - return 0; // hash == 0 is reserved for empty slots - } - hash + h1 >> 1 // To make it compatible with Java version } /// Find an entry in the hash table. @@ -142,11 +162,21 @@ impl ThetaHashTable { } } - /// Insert a hash value into the table + /// Hashes and inserts a value into the table. /// /// Returns true if the value was inserted (new), false otherwise. - pub fn try_insert(&mut self, hash: u64) -> bool { - if hash == 0 { + pub fn try_insert(&mut self, value: T) -> bool { + let hash = self.hash(value); + self.try_insert_hash(hash) + } + + /// Inserts a pre-hashed value into the table. + /// + /// Returns true if the value was inserted (new), false otherwise. + pub fn try_insert_hash(&mut self, hash: u64) -> bool { + self.is_empty = false; + + if hash == 0 || hash >= self.theta { return false; } @@ -163,11 +193,11 @@ impl ThetaHashTable { assert_eq!(self.entries[index], 0, "Entry should be empty"); self.entries[index] = hash; - self.num_entries += 1; + self.num_retained += 1; // Check if we need to resize or rebuild let capacity = self.get_capacity(); - if self.num_entries > capacity { + if self.num_retained > capacity { if self.lg_cur_size <= self.lg_nom_size { self.resize(); } else { @@ -180,9 +210,9 @@ impl ThetaHashTable { /// Get capacity threshold fn get_capacity(&self) -> usize { let fraction = if self.lg_cur_size <= self.lg_nom_size { - RESIZE_THRESHOLD + HASH_TABLE_RESIZE_THRESHOLD } else { - REBUILD_THRESHOLD + HASH_TABLE_REBUILD_THRESHOLD }; (fraction * self.entries.len() as f64) as usize } @@ -242,13 +272,13 @@ impl ThetaHashTable { num_inserted, k as usize, "Number of inserted entries should be equal to k." ); - self.num_entries = num_inserted; + self.num_retained = num_inserted; self.entries = new_entries; } /// Trim the table to nominal size k pub fn trim(&mut self) { - if self.num_entries > (1 << self.lg_nom_size) { + if self.num_retained > (1 << self.lg_nom_size) { self.rebuild(); } } @@ -267,14 +297,15 @@ impl ThetaHashTable { self.entries.resize(1 << init_lg_cur, 0); } self.entries.fill(0); - self.num_entries = 0; + self.num_retained = 0; self.theta = init_theta; + self.is_empty = true; self.lg_cur_size = init_lg_cur; } - /// Get number of entries - pub fn num_entries(&self) -> usize { - self.num_entries + /// Return number of retained entries + pub fn num_retained(&self) -> usize { + self.num_retained } /// Get theta @@ -282,9 +313,9 @@ impl ThetaHashTable { self.theta } - /// Check if empty + /// Check if emptiness of the source set pub fn is_empty(&self) -> bool { - self.num_entries == 0 + self.is_empty } /// Get iterator over entries @@ -302,6 +333,50 @@ impl ThetaHashTable { compute_seed_hash(self.hash_seed) } + /// Returns true if the given hash exists in the table. + pub fn contains_hash(&self, hash: u64) -> bool { + if hash == 0 { + return false; + } + let Some(index) = self.find_in_curr_entries(hash) else { + return false; + }; + self.entries[index] == hash + } + + /// Set empty flag + pub fn set_empty(&mut self, is_empty: bool) { + self.is_empty = is_empty; + } + + /// Get the hash seed used by this table. + pub fn hash_seed(&self) -> u64 { + self.hash_seed + } + + /// Sets theta value. + pub fn set_theta(&mut self, theta: u64) { + assert!( + (1..=MAX_THETA).contains(&theta), + "theta must be in [1, {MAX_THETA}], got {theta}" + ); + self.theta = theta; + } + + /// Returns minimal lg_size where rebuild-capacity can hold `count`. + pub fn lg_size_from_count_for_rebuild(count: usize, load_factor: f64) -> u8 { + let log2 = |n: usize| { + if n == 0 { 0_u8 } else { n.ilog2() as u8 } + }; + let log2_n = log2(count); + log2_n + + (if count > (((1u128 << ((log2_n as u32) + 1)) as f64) * load_factor) as usize { + 2 + } else { + 1 + }) + } + /// Get stride for hash table probing fn get_stride(key: u64, lg_size: u8) -> usize { (2 * ((key >> (lg_size)) & STRIDE_MASK) + 1) as usize @@ -344,46 +419,44 @@ mod tests { starting_sub_multiple(8 + 1, MIN_LG_K, ResizeFactor::X8.lg_value()) ); assert_eq!(table.theta, starting_theta_from_sampling_probability(1.0)); - assert_eq!(table.num_entries(), 0); + assert_eq!(table.num_retained(), 0); assert!(table.is_empty()); assert_eq!(table.iter().count(), 0); } #[test] - fn test_hash_and_screen() { + fn test_hash_and_theta_screen_behavior() { let mut table = ThetaHashTable::new(8, ResizeFactor::X8, 1.0, DEFAULT_UPDATE_SEED); - // With MAX_THETA, all hashes should pass - let hash1 = table.hash_and_screen("test1"); - let hash2 = table.hash_and_screen("test2"); + // With MAX_THETA, hashes are computed normally. + let hash1 = table.hash("test1"); + let hash2 = table.hash("test2"); assert_ne!(hash1, 0); assert_ne!(hash2, 0); assert_ne!(hash1, hash2); - // With low theta, some hashes should be filtered + // With low theta, update should be screened out. table.theta = 1; - let hash3 = table.hash_and_screen("test3"); - assert_eq!(hash3, 0); + assert!(!table.try_insert("test3")); } #[test] fn test_try_insert() { let mut table = ThetaHashTable::new(5, ResizeFactor::X8, 1.0, DEFAULT_UPDATE_SEED); - // Insert a hash value - let hash = table.hash_and_screen("test_value"); - assert_ne!(hash, 0); - assert!(table.try_insert(hash)); - assert_eq!(table.num_entries(), 1); + assert!(table.try_insert("test_value")); + assert_eq!(table.num_retained(), 1); assert!(!table.is_empty()); - // Try to insert the same hash again (should fail) - assert!(!table.try_insert(hash)); - assert_eq!(table.num_entries(), 1); + // Try to insert the same value again (should fail) + assert!(!table.try_insert("test_value")); + assert_eq!(table.num_retained(), 1); - // Try to insert 0 (should fail) - assert!(!table.try_insert(0)); - assert_eq!(table.num_entries(), 1); + // Force screening and verify insertion fails + table.theta = 0; + assert!(!table.try_insert("screened")); + assert_eq!(table.num_retained(), 1); + assert!(!table.is_empty()); } #[test] @@ -393,13 +466,12 @@ mod tests { // Insert multiple distinct values let mut inserted_count = 0; for i in 0..10 { - let hash = table.hash_and_screen(format!("value_{}", i)); - if hash != 0 && table.try_insert(hash) { + if table.try_insert(format!("value_{}", i)) { inserted_count += 1; } } - assert_eq!(table.num_entries(), inserted_count); + assert_eq!(table.num_retained(), inserted_count); assert!(!table.is_empty()); assert_eq!(table.iter().count(), inserted_count); } @@ -409,8 +481,7 @@ mod tests { fn populate_values(table: &mut ThetaHashTable, count: usize) -> usize { let mut inserted = 0; for i in 0..count { - let hash = table.hash_and_screen(format!("value_{}", i)); - if hash != 0 && table.try_insert(hash) { + if table.try_insert(format!("value_{}", i)) { inserted += 1; } } @@ -427,8 +498,8 @@ mod tests { let inserted = populate_values(&mut table, 20); // Table should have resized and all values should be inserted - assert!(table.num_entries() > 0); - assert_eq!(table.num_entries(), inserted); + assert!(table.num_retained() > 0); + assert_eq!(table.num_retained(), inserted); assert_eq!(table.entries.len(), 64); } @@ -443,8 +514,8 @@ mod tests { let inserted = populate_values(&mut table, 20); // Table should have resized and all values should be inserted - assert!(table.num_entries() > 0); - assert_eq!(table.num_entries(), inserted); + assert!(table.num_retained() > 0); + assert_eq!(table.num_retained(), inserted); assert_eq!(table.entries.len(), 128); } } @@ -459,10 +530,7 @@ mod tests { // Insert many values to trigger rebuild for i in 0..100 { - let hash = table.hash_and_screen(format!("value_{}", i)); - if hash != 0 { - table.try_insert(hash); - } + let _ = table.try_insert(format!("value_{}", i)); } // After rebuild, theta should be reduced (rebuild is called automatically during insert) @@ -474,10 +542,7 @@ mod tests { // Continue to insert values to trigger rebuild again for i in 100..200 { - let hash = table.hash_and_screen(format!("value_{}", i)); - if hash != 0 { - table.try_insert(hash); - } + let _ = table.try_insert(format!("value_{}", i)); } assert_eq!(table.lg_cur_size, 6); @@ -491,17 +556,14 @@ mod tests { // Insert more than k values for i in 0..100 { - let hash = table.hash_and_screen(format!("value_{}", i)); - if hash != 0 { - table.try_insert(hash); - } + let _ = table.try_insert(format!("value_{}", i)); } - let before_trim = table.num_entries(); + let before_trim = table.num_retained(); assert!(before_trim > 32); table.trim(); - let after_trim = table.num_entries(); + let after_trim = table.num_retained(); assert!(after_trim <= 32); assert!(table.theta() < MAX_THETA); } @@ -512,16 +574,13 @@ mod tests { // Insert fewer than k values for i in 0..10 { - let hash = table.hash_and_screen(format!("value_{}", i)); - if hash != 0 { - table.try_insert(hash); - } + let _ = table.try_insert(format!("value_{}", i)); } - let before_trim = table.num_entries(); + let before_trim = table.num_retained(); let before_theta = table.theta(); table.trim(); - let after_trim = table.num_entries(); + let after_trim = table.num_retained(); // Should not change if already <= k assert_eq!(before_trim, after_trim); @@ -537,20 +596,17 @@ mod tests { // Insert some values for i in 0..10 { - let hash = table.hash_and_screen(format!("value_{}", i)); - if hash != 0 { - table.try_insert(hash); - } + let _ = table.try_insert(format!("value_{}", i)); } assert!(!table.is_empty()); - assert!(table.num_entries() > 0); + assert!(table.num_retained() > 0); // Reset table.reset(); assert!(table.is_empty()); - assert_eq!(table.num_entries(), 0); + assert_eq!(table.num_retained(), 0); assert_eq!(table.theta(), init_theta); assert_eq!(table.lg_cur_size, init_lg_cur); assert_eq!(table.entries.len(), init_entries); @@ -569,10 +625,7 @@ mod tests { // Insert some values for i in 0..10 { - let hash = table.hash_and_screen(format!("value_{}", i)); - if hash != 0 { - table.try_insert(hash); - } + let _ = table.try_insert(format!("value_{}", i)); } table.reset(); @@ -589,15 +642,15 @@ mod tests { // Insert some values let mut inserted_hashes = vec![]; for i in 0..10 { - let hash = table.hash_and_screen(format!("value_{}", i)); - if hash != 0 && table.try_insert(hash) { + let hash = table.hash(i); + if table.try_insert(i) { inserted_hashes.push(hash); } } // Check iterator let iter_hashes: Vec = table.iter().collect(); - assert_eq!(iter_hashes.len(), table.num_entries()); + assert_eq!(iter_hashes.len(), table.num_retained()); assert_eq!(iter_hashes.len(), inserted_hashes.len()); // All inserted hashes should be in iterator @@ -614,7 +667,7 @@ mod tests { let mut table = ThetaHashTable::new(8, ResizeFactor::X8, 1.0, DEFAULT_UPDATE_SEED); assert!(table.is_empty()); - assert_eq!(table.num_entries(), 0); + assert_eq!(table.num_retained(), 0); assert_eq!(table.iter().count(), 0); // Trim on empty table should not panic @@ -635,13 +688,12 @@ mod tests { let mut i = 0; let mut inserted_hashes = vec![]; loop { - let hash = table.hash_and_screen(format!("value_{}", i)); + let hash = table.hash(i); i += 1; - if hash != 0 { - table.try_insert(hash); + if table.try_insert(i - 1) { inserted_hashes.push(hash); } - if table.num_entries() >= k as usize { + if table.num_retained() >= k as usize { break; } } @@ -649,23 +701,21 @@ mod tests { let rebuild_threshold = table.get_capacity(); loop { - let hash = table.hash_and_screen(format!("value_{}", i)); + let hash = table.hash(i); i += 1; - if hash != 0 { - table.try_insert(hash); + if table.try_insert(i - 1) { inserted_hashes.push(hash); } - if table.num_entries() >= rebuild_threshold { + if table.num_retained() >= rebuild_threshold { break; } } // trigger rebuild loop { - let hash = table.hash_and_screen(format!("value_{}", i)); + let hash = table.hash(i); i += 1; - if hash != 0 { - table.try_insert(hash); + if table.try_insert(i - 1) { inserted_hashes.push(hash); break; } diff --git a/datasketches/src/theta/intersection.rs b/datasketches/src/theta/intersection.rs new file mode 100644 index 0000000..85d2eb7 --- /dev/null +++ b/datasketches/src/theta/intersection.rs @@ -0,0 +1,234 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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. + +use crate::common::ResizeFactor; +use crate::error::Error; +use crate::hash::DEFAULT_UPDATE_SEED; +use crate::theta::CompactThetaSketch; +use crate::theta::HASH_TABLE_REBUILD_THRESHOLD; +use crate::theta::MAX_THETA; +use crate::theta::ThetaSketchView; +use crate::theta::hash_table::ThetaHashTable; + +/// Stateful intersection operator for Theta sketches. +/// +/// Before the first [`update`](Self::update), the result is undefined; use +/// [`has_result`](Self::has_result) to check. +#[derive(Debug)] +pub struct ThetaIntersection { + is_valid: bool, + table: ThetaHashTable, +} + +impl ThetaIntersection { + /// Creates a new intersection operator for the given `seed`. + pub fn new(seed: u64) -> Self { + Self { + is_valid: false, + table: ThetaHashTable::from_raw_parts( + 0, + 0, + ResizeFactor::X1, + 1.0, + MAX_THETA, + seed, + false, + ), + } + } + + /// Creates a new intersection operator with the default seed. + pub fn new_with_default_seed() -> Self { + Self::new(DEFAULT_UPDATE_SEED) + } + + /// Updates the intersection with a given sketch. + /// + /// The intersection can be viewed as starting from the "universe" set, + /// and every update can reduce the current set to leave the overlapping + /// subset only. + pub fn update(&mut self, sketch: &S) -> Result<(), Error> { + let new_default_table = |table: &ThetaHashTable| { + ThetaHashTable::from_raw_parts( + 0, + 0, + ResizeFactor::X1, + 1.0, + table.theta(), + table.hash_seed(), + table.is_empty(), + ) + }; + + if self.table.is_empty() { + return Ok(()); + } + + if !sketch.is_empty() && sketch.seed_hash() != self.table.seed_hash() { + return Err(Error::invalid_argument(format!( + "incompatible seed hash: expected {}, got {}", + self.table.seed_hash(), + sketch.seed_hash() + ))); + } + + if sketch.is_empty() { + self.table.set_empty(true); + } + + self.table.set_theta(if self.table.is_empty() { + MAX_THETA + } else { + self.table.theta().min(sketch.theta64()) + }); + + if self.is_valid && self.table.num_retained() == 0 { + return Ok(()); + } + + if sketch.num_retained() == 0 { + self.is_valid = true; + self.table = new_default_table(&self.table); + return Ok(()); + } + + // first update, copy or move incoming sketch + if !self.is_valid { + self.is_valid = true; + let lg_size = ThetaHashTable::lg_size_from_count_for_rebuild( + sketch.num_retained(), + HASH_TABLE_REBUILD_THRESHOLD, + ); + self.table = ThetaHashTable::from_raw_parts( + lg_size, + lg_size - 1, + ResizeFactor::X1, + 1.0, + self.table.theta(), + self.table.hash_seed(), + self.table.is_empty(), + ); + for hash in sketch.iter() { + if !self.table.try_insert_hash(hash) { + return Err(Error::invalid_argument( + "Insert entries from sketch fail, possibly corrupted input sketch", + )); + } + } + // Safety check. + if self.table.num_retained() != sketch.num_retained() { + return Err(Error::invalid_argument( + "num entries mismatch, possibly corrupted input sketch", + )); + } + } else { + let max_matches = self.table.num_retained().min(sketch.num_retained()); + let mut matched_entries = Vec::with_capacity(max_matches); + let mut count = 0; + for hash in sketch.iter() { + if hash < self.table.theta() { + if self.table.contains_hash(hash) { + if matched_entries.len() == max_matches { + return Err(Error::invalid_argument( + "max matches exceeded, possibly corrupted input sketch", + )); + } + matched_entries.push(hash); + } + } else if sketch.is_ordered() { + break; // early stop for ordered sketches + } + count += 1; + } + // Safety check. + if count > sketch.num_retained() { + return Err(Error::invalid_argument( + "more keys than expected, possibly corrupted input sketch", + )); + } else if !sketch.is_ordered() && count < sketch.num_retained() { + return Err(Error::invalid_argument( + "fewer keys than expected, possibly corrupted input sketch", + )); + } + if matched_entries.is_empty() { + self.table = new_default_table(&self.table); + if self.table.theta() == MAX_THETA { + self.table.set_empty(true); + } + } else { + let lg_size = ThetaHashTable::lg_size_from_count_for_rebuild( + matched_entries.len(), + HASH_TABLE_REBUILD_THRESHOLD, + ); + self.table = ThetaHashTable::from_raw_parts( + lg_size, + lg_size - 1, + ResizeFactor::X1, + 1.0, + self.table.theta(), + self.table.hash_seed(), + self.table.is_empty(), + ); + for hash in matched_entries { + if !self.table.try_insert_hash(hash) { + return Err(Error::invalid_argument( + "duplicate key, possibly corrupted input sketch", + )); + } + } + } + } + Ok(()) + } + + /// Returns whether this operator has received at least one update. + pub fn has_result(&self) -> bool { + self.is_valid + } + + /// Returns the intersection result as a compact theta sketch (ordered). + /// + /// # Panics + /// + /// Panics if called before the first [`update`](Self::update). + pub fn result(&self) -> CompactThetaSketch { + self.result_with_ordered(true) + } + + /// Returns the intersection result as a compact theta sketch. + /// + /// # Panics + /// + /// Panics if called before the first [`update`](Self::update). + pub fn result_with_ordered(&self, ordered: bool) -> CompactThetaSketch { + assert!( + self.is_valid, + "ThetaIntersection::result() called before first update()" + ); + let mut hashes: Vec = self.table.iter().collect(); + if ordered { + hashes.sort_unstable(); + } + CompactThetaSketch::from_parts( + hashes, + self.table.theta(), + self.table.seed_hash(), + ordered, + self.table.is_empty(), + ) + } +} diff --git a/datasketches/src/theta/mod.rs b/datasketches/src/theta/mod.rs index 4c96a3f..03b5e2a 100644 --- a/datasketches/src/theta/mod.rs +++ b/datasketches/src/theta/mod.rs @@ -41,9 +41,25 @@ mod bit_pack; mod hash_table; +mod intersection; mod serialization; mod sketch; +pub use self::intersection::ThetaIntersection; pub use self::sketch::CompactThetaSketch; pub use self::sketch::ThetaSketch; pub use self::sketch::ThetaSketchBuilder; +pub use self::sketch::ThetaSketchView; + +/// Maximum theta value (signed max for compatibility with Java) +const MAX_THETA: u64 = i64::MAX as u64; +/// Minimum log2 of K +const MIN_LG_K: u8 = 5; +/// Maximum log2 of K +const MAX_LG_K: u8 = 26; +/// Default log2 of K +const DEFAULT_LG_K: u8 = 12; +/// Resize threshold (0.5 = 50% load factor) +const HASH_TABLE_RESIZE_THRESHOLD: f64 = 0.5; +/// Rebuild threshold (15/16 = 93.75% load factor) +const HASH_TABLE_REBUILD_THRESHOLD: f64 = 15.0 / 16.0; diff --git a/datasketches/src/theta/serialization.rs b/datasketches/src/theta/serialization.rs index 0cd6cf7..ad54307 100644 --- a/datasketches/src/theta/serialization.rs +++ b/datasketches/src/theta/serialization.rs @@ -17,14 +17,14 @@ //! Binary serialization format constants for Theta sketches. -pub(crate) const UNCOMPRESSED_SERIAL_VERSION: u8 = 3; -pub(crate) const COMPRESSED_SERIAL_VERSION: u8 = 4; +pub(super) const UNCOMPRESSED_SERIAL_VERSION: u8 = 3; +pub(super) const COMPRESSED_SERIAL_VERSION: u8 = 4; -pub(crate) const V2_PREAMBLE_EMPTY: u8 = 1; -pub(crate) const V2_PREAMBLE_PRECISE: u8 = 2; -pub(crate) const V2_PREAMBLE_ESTIMATE: u8 = 3; +pub(super) const V2_PREAMBLE_EMPTY: u8 = 1; +pub(super) const V2_PREAMBLE_PRECISE: u8 = 2; +pub(super) const V2_PREAMBLE_ESTIMATE: u8 = 3; -pub(crate) const FLAGS_IS_READ_ONLY: u8 = 1 << 1; -pub(crate) const FLAGS_IS_EMPTY: u8 = 1 << 2; -pub(crate) const FLAGS_IS_COMPACT: u8 = 1 << 3; -pub(crate) const FLAGS_IS_ORDERED: u8 = 1 << 4; +pub(super) const FLAGS_IS_READ_ONLY: u8 = 1 << 1; +pub(super) const FLAGS_IS_EMPTY: u8 = 1 << 2; +pub(super) const FLAGS_IS_COMPACT: u8 = 1 << 3; +pub(super) const FLAGS_IS_ORDERED: u8 = 1 << 4; diff --git a/datasketches/src/theta/sketch.rs b/datasketches/src/theta/sketch.rs index f51c586..c304784 100644 --- a/datasketches/src/theta/sketch.rs +++ b/datasketches/src/theta/sketch.rs @@ -34,21 +34,57 @@ use crate::common::canonical_double; use crate::error::Error; use crate::hash::DEFAULT_UPDATE_SEED; use crate::hash::compute_seed_hash; +use crate::theta::DEFAULT_LG_K; +use crate::theta::MAX_LG_K; +use crate::theta::MAX_THETA; +use crate::theta::MIN_LG_K; use crate::theta::bit_pack::BLOCK_WIDTH; use crate::theta::bit_pack::BitPacker; use crate::theta::bit_pack::BitUnpacker; use crate::theta::bit_pack::pack_bits_block; use crate::theta::bit_pack::unpack_bits_block; -use crate::theta::hash_table::DEFAULT_LG_K; -use crate::theta::hash_table::MAX_LG_K; -use crate::theta::hash_table::MAX_THETA; -use crate::theta::hash_table::MIN_LG_K; use crate::theta::hash_table::ThetaHashTable; use crate::theta::serialization; use crate::theta::serialization::V2_PREAMBLE_EMPTY; use crate::theta::serialization::V2_PREAMBLE_ESTIMATE; use crate::theta::serialization::V2_PREAMBLE_PRECISE; +mod private { + use super::*; + + // Sealed trait to prevent external implementations of ThetaSketchView. + pub trait Sealed {} + + impl Sealed for ThetaSketch {} + impl Sealed for CompactThetaSketch {} +} + +/// Read-only view for Theta sketches. +/// +/// This trait provides a unified input abstraction for APIs that can accept either +/// mutable [`ThetaSketch`] or immutable [`CompactThetaSketch`]. +pub trait ThetaSketchView: private::Sealed { + /// Returns the 16-bit seed hash. + fn seed_hash(&self) -> u16; + + /// Returns theta as `u64`. + fn theta64(&self) -> u64; + + /// Returns true if this sketch is empty. + fn is_empty(&self) -> bool; + + /// Returns an iterator over retained hash values. + fn iter<'a>(&'a self) -> impl Iterator + 'a; + + /// Returns number of retained hash values. + fn num_retained(&self) -> usize; + + /// Returns whether retained entries are ordered in ascending order. + fn is_ordered(&self) -> bool { + false + } +} + /// Mutable theta sketch for building from input data #[derive(Debug)] pub struct ThetaSketch { @@ -82,10 +118,7 @@ impl ThetaSketch { /// assert!(sketch.estimate() >= 1.0); /// ``` pub fn update(&mut self, value: T) { - let hash = self.table.hash_and_screen(value); - if hash != 0 { - self.table.try_insert(hash); - } + self.table.try_insert(value); } /// Update the sketch with a f64 value. @@ -132,7 +165,7 @@ impl ThetaSketch { if self.is_empty() { return 0.0; } - let num_retained = self.table.num_entries() as f64; + let num_retained = self.table.num_retained() as f64; let theta = self.table.theta() as f64 / MAX_THETA as f64; num_retained / theta } @@ -147,6 +180,11 @@ impl ThetaSketch { self.table.theta() } + /// Return 16-bit seed hash. + pub fn seed_hash(&self) -> u16 { + self.table.seed_hash() + } + /// Check if sketch is empty pub fn is_empty(&self) -> bool { self.table.is_empty() @@ -159,7 +197,7 @@ impl ThetaSketch { /// Return number of retained entries pub fn num_retained(&self) -> usize { - self.table.num_entries() + self.table.num_retained() } /// Return lg_k @@ -224,13 +262,7 @@ impl ThetaSketch { entries.sort_unstable(); } - CompactThetaSketch { - entries, - theta, - seed_hash: self.table.seed_hash(), - ordered, - empty, - } + CompactThetaSketch::from_parts(entries, theta, self.table.seed_hash(), ordered, empty) } /// Returns the approximate lower error bound given the specified number of Standard Deviations. @@ -307,6 +339,28 @@ impl ThetaSketch { } } +impl ThetaSketchView for ThetaSketch { + fn seed_hash(&self) -> u16 { + ThetaSketch::seed_hash(self) + } + + fn theta64(&self) -> u64 { + ThetaSketch::theta64(self) + } + + fn is_empty(&self) -> bool { + ThetaSketch::is_empty(self) + } + + fn iter<'a>(&'a self) -> impl Iterator + 'a { + ThetaSketch::iter(self) + } + + fn num_retained(&self) -> usize { + ThetaSketch::num_retained(self) + } +} + /// Compact (immutable) theta sketch. /// /// This is the serialized-friendly form of a theta sketch: a compact array of retained hash values @@ -321,6 +375,22 @@ pub struct CompactThetaSketch { } impl CompactThetaSketch { + pub(super) fn from_parts( + entries: Vec, + theta: u64, + seed_hash: u16, + ordered: bool, + empty: bool, + ) -> Self { + Self { + entries, + theta, + seed_hash, + ordered, + empty, + } + } + /// Returns the cardinality estimate. pub fn estimate(&self) -> f64 { if self.is_empty() { @@ -844,6 +914,32 @@ impl CompactThetaSketch { } } +impl ThetaSketchView for CompactThetaSketch { + fn seed_hash(&self) -> u16 { + CompactThetaSketch::seed_hash(self) + } + + fn theta64(&self) -> u64 { + CompactThetaSketch::theta64(self) + } + + fn is_empty(&self) -> bool { + CompactThetaSketch::is_empty(self) + } + + fn iter<'a>(&'a self) -> impl Iterator + 'a { + CompactThetaSketch::iter(self) + } + + fn num_retained(&self) -> usize { + CompactThetaSketch::num_retained(self) + } + + fn is_ordered(&self) -> bool { + CompactThetaSketch::is_ordered(self) + } +} + /// Builder for ThetaSketch #[derive(Debug)] pub struct ThetaSketchBuilder { @@ -903,7 +999,7 @@ impl ThetaSketchBuilder { /// /// # Panics /// - /// Panics if p is not in range (0.0, 1.0] + /// Panics if p is not in range `(0.0, 1.0]` /// /// # Examples /// diff --git a/datasketches/tests/theta_intersection_test.rs b/datasketches/tests/theta_intersection_test.rs new file mode 100644 index 0000000..4959529 --- /dev/null +++ b/datasketches/tests/theta_intersection_test.rs @@ -0,0 +1,316 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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. + +use datasketches::theta::CompactThetaSketch; +use datasketches::theta::ThetaIntersection; +use datasketches::theta::ThetaSketch; + +fn sketch_with_range(start: u64, count: u64) -> ThetaSketch { + let mut sketch = ThetaSketch::builder().build(); + for i in 0..count { + sketch.update(start + i); + } + sketch +} + +#[test] +fn test_has_result_state_machine() { + let mut a = ThetaSketch::builder().build(); + a.update("x"); + + let mut i = ThetaIntersection::new_with_default_seed(); + assert!(!i.has_result()); + i.update(&a).unwrap(); + assert!(i.has_result()); + assert!(i.result().estimate() >= 1.0); +} + +#[test] +fn test_result_before_update_panics() { + let i = ThetaIntersection::new(123); + let result = std::panic::catch_unwind(|| { + let _ = i.result(); + }); + assert!(result.is_err()); +} + +#[test] +fn test_update_accepts_compact_sketch() { + let mut a = ThetaSketch::builder().build(); + a.update("x"); + a.update("y"); + + let mut b = ThetaSketch::builder().build(); + b.update("y"); + b.update("z"); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&a.compact(true)).unwrap(); + i.update(&b).unwrap(); + + let r = i.result(); + assert!(r.estimate() == 1.0); + assert!(r.is_ordered()); + + let mut c = ThetaSketch::builder().build(); + c.update("a"); + c.update("b"); + c.update("c"); + + i.update(&c.compact(false)).unwrap(); + + let r = i.result_with_ordered(false); + assert!(r.estimate() == 0.0); + assert!(!r.is_ordered()); +} + +#[test] +fn test_seed_mismatch_behaviour_for_empty_sketch() { + let empty_other_seed = ThetaSketch::builder().seed(2).build(); + let mut i = ThetaIntersection::new(1); + + i.update(&empty_other_seed).unwrap(); + assert!(i.has_result()); + let r = i.result(); + assert!(r.is_empty()); +} + +#[test] +fn test_seed_mismatch_behaviour() { + let mut one_other_seed = ThetaSketch::builder().seed(2).build(); + one_other_seed.update("value"); + let mut i = ThetaIntersection::new(1); + + assert!(i.update(&one_other_seed).is_err()); +} + +#[test] +fn test_terminal_empty_state_ignores_future_updates() { + let empty = ThetaSketch::builder().build(); + + let mut non_empty = ThetaSketch::builder().build(); + non_empty.update("x"); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&empty).unwrap(); + i.update(&non_empty).unwrap(); + + let r = i.result(); + assert!(r.is_empty()); +} + +#[test] +fn test_result_with_ordered_false_is_not_ordered() { + let mut a = ThetaSketch::builder().build(); + for i in 0..64 { + a.update(i); + } + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&a).unwrap(); + + let r = i.result_with_ordered(false); + assert!(!r.is_ordered()); +} + +#[test] +fn test_empty_update_twice() { + let empty = ThetaSketch::builder().build(); + let mut i = ThetaIntersection::new_with_default_seed(); + + i.update(&empty).unwrap(); + let r1 = i.result(); + assert_eq!(r1.num_retained(), 0); + assert!(r1.is_empty()); + assert!(!r1.is_estimation_mode()); + assert_eq!(r1.estimate(), 0.0); + + i.update(&empty).unwrap(); + let r2 = i.result(); + assert_eq!(r2.num_retained(), 0); + assert!(r2.is_empty()); + assert!(!r2.is_estimation_mode()); + assert_eq!(r2.estimate(), 0.0); +} + +#[test] +fn test_non_empty_no_retained_keys() { + let mut s = ThetaSketch::builder().sampling_probability(0.001).build(); + s.update(1u64); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&s).unwrap(); + let r1 = i.result(); + assert_eq!(r1.num_retained(), 0); + assert!(!r1.is_empty()); + assert!(r1.is_estimation_mode()); + assert!((r1.theta() - 0.001).abs() < 1e-10); + assert_eq!(r1.estimate(), 0.0); + + i.update(&s).unwrap(); + let r2 = i.result(); + assert_eq!(r2.num_retained(), 0); + assert!(!r2.is_empty()); + assert!(r2.is_estimation_mode()); + assert!((r2.theta() - 0.001).abs() < 1e-10); + assert_eq!(r2.estimate(), 0.0); +} + +#[test] +fn test_exact_half_overlap_unordered() { + let s1 = sketch_with_range(0, 1000); + let s2 = sketch_with_range(500, 1000); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&s1).unwrap(); + i.update(&s2).unwrap(); + let r = i.result(); + + assert!(!r.is_empty()); + assert!(!r.is_estimation_mode()); + assert_eq!(r.estimate(), 500.0); +} + +#[test] +fn test_exact_half_overlap_ordered() { + let s1 = sketch_with_range(0, 1000); + let s2 = sketch_with_range(500, 1000); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&s1.compact(true)).unwrap(); + i.update(&s2.compact(true)).unwrap(); + let r = i.result(); + + assert!(!r.is_empty()); + assert!(!r.is_estimation_mode()); + assert_eq!(r.estimate(), 500.0); +} + +#[test] +fn test_exact_disjoint_unordered() { + let s1 = sketch_with_range(0, 1000); + let s2 = sketch_with_range(1000, 1000); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&s1).unwrap(); + i.update(&s2).unwrap(); + let r = i.result(); + + assert!(r.is_empty()); + assert!(!r.is_estimation_mode()); + assert_eq!(r.estimate(), 0.0); +} + +#[test] +fn test_exact_disjoint_ordered() { + let s1 = sketch_with_range(0, 1000); + let s2 = sketch_with_range(1000, 1000); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&s1.compact(true)).unwrap(); + i.update(&s2.compact(true)).unwrap(); + let r = i.result(); + + assert!(r.is_empty()); + assert!(!r.is_estimation_mode()); + assert_eq!(r.estimate(), 0.0); +} + +#[test] +fn test_estimation_half_overlap_unordered() { + let s1 = sketch_with_range(0, 10000); + let s2 = sketch_with_range(5000, 10000); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&s1).unwrap(); + i.update(&s2).unwrap(); + let r = i.result(); + + assert!(!r.is_empty()); + assert!(r.is_estimation_mode()); + assert!((r.estimate() - 5000.0).abs() <= 5000.0 * 0.02); +} + +#[test] +fn test_estimation_half_overlap_ordered() { + let s1 = sketch_with_range(0, 10000); + let s2 = sketch_with_range(5000, 10000); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&s1.compact(true)).unwrap(); + i.update(&s2.compact(true)).unwrap(); + let r = i.result(); + + assert!(!r.is_empty()); + assert!(r.is_estimation_mode()); + assert!((r.estimate() - 5000.0).abs() <= 5000.0 * 0.02); +} + +#[test] +fn test_estimation_half_overlap_ordered_deserialized_compact() { + let s1 = sketch_with_range(0, 10000); + let s2 = sketch_with_range(5000, 10000); + let c1 = CompactThetaSketch::deserialize(&s1.compact(true).serialize()).unwrap(); + let c2 = CompactThetaSketch::deserialize(&s2.compact(true).serialize()).unwrap(); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&c1).unwrap(); + i.update(&c2).unwrap(); + let r = i.result(); + + assert!(!r.is_empty()); + assert!(r.is_estimation_mode()); + assert!((r.estimate() - 5000.0).abs() <= 5000.0 * 0.02); +} + +#[test] +fn test_estimation_disjoint_unordered() { + let s1 = sketch_with_range(0, 10000); + let s2 = sketch_with_range(10000, 10000); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&s1).unwrap(); + i.update(&s2).unwrap(); + let r = i.result(); + + assert!(!r.is_empty()); + assert!(r.is_estimation_mode()); + assert_eq!(r.estimate(), 0.0); +} + +#[test] +fn test_estimation_disjoint_ordered() { + let s1 = sketch_with_range(0, 10000); + let s2 = sketch_with_range(10000, 10000); + + let mut i = ThetaIntersection::new_with_default_seed(); + i.update(&s1.compact(true)).unwrap(); + i.update(&s2.compact(true)).unwrap(); + let r = i.result(); + + assert!(!r.is_empty()); + assert!(r.is_estimation_mode()); + assert_eq!(r.estimate(), 0.0); +} + +#[test] +fn test_seed_mismatch_non_empty_returns_error() { + let mut s = ThetaSketch::builder().build(); + s.update(1u64); + + let mut i = ThetaIntersection::new(123); + assert!(i.update(&s).is_err()); +}