dsi-bitstream 0.9.2

A Rust implementation of read/write bit streams supporting several types of instantaneous codes
Documentation
#![doc(hidden)]
// THIS FILE HAS BEEN GENERATED BY THE SCRIPT gen_code_tables.py
// ~~~~~~~~~~~~~~~~~~~ DO NOT MODIFY ~~~~~~~~~~~~~~~~~~~~~~
// Methods for reading and writing values using precomputed tables for delta codes
use crate::traits::{BE, BitRead, BitWrite, LE};
use num_primitive::PrimitiveNumber;
/// How many bits are needed to read the tables
pub const READ_BITS: usize = 10;
/// Maximum value writable using the table(s)
pub const WRITE_MAX: u64 = 255;

/// Reads from the decoding table.
///
/// Returns `(len_with_flag, value_or_gamma)` where:
/// - If len_with_flag >= 0: complete code, value_or_gamma is decoded value, len_with_flag is code length
/// - If len_with_flag < 0: partial code (gamma decoded), value_or_gamma is gamma_len, (len_with_flag & 0x7F) is gamma code length
/// - If len_with_flag = 0: no valid decoding (gamma not decoded)
///
/// The backend position is always advanced by (len_with_flag & 0x7F) bits.
/// Using signed i8 allows testing with `< 0` instead of masking, which is more efficient.
#[inline(always)]
pub fn read_table_le<B: BitRead<LE>>(backend: &mut B) -> (i8, u64) {
    if let Ok(idx) = backend.peek_bits(READ_BITS) {
        let idx: usize = idx.as_to();
        let len_with_flag = READ_LEN_LE[idx];
        let value_or_gamma = READ_LE[idx] as u64;
        backend.skip_bits_after_peek((len_with_flag & 0x7F) as usize);
        (len_with_flag, value_or_gamma)
    } else {
        // Not enough bits available
        (0, 0)
    }
}

/// Reads from the decoding table.
///
/// Returns `(len_with_flag, value_or_gamma)` where:
/// - If len_with_flag >= 0: complete code, value_or_gamma is decoded value, len_with_flag is code length
/// - If len_with_flag < 0: partial code (gamma decoded), value_or_gamma is gamma_len, (len_with_flag & 0x7F) is gamma code length
/// - If len_with_flag = 0: no valid decoding (gamma not decoded)
///
/// The backend position is always advanced by (len_with_flag & 0x7F) bits.
/// Using signed i8 allows testing with `< 0` instead of masking, which is more efficient.
#[inline(always)]
pub fn read_table_be<B: BitRead<BE>>(backend: &mut B) -> (i8, u64) {
    if let Ok(idx) = backend.peek_bits(READ_BITS) {
        let idx: usize = idx.as_to();
        let len_with_flag = READ_LEN_BE[idx];
        let value_or_gamma = READ_BE[idx] as u64;
        backend.skip_bits_after_peek((len_with_flag & 0x7F) as usize);
        (len_with_flag, value_or_gamma)
    } else {
        // Not enough bits available
        (0, 0)
    }
}

/// Writes a value using an encoding table.
///
/// If the result is `Some` the encoding was successful, and
/// length of the code is returned.
#[inline(always)]
pub fn write_table_le<B: BitWrite<LE>>(backend: &mut B, n: u64) -> Result<Option<usize>, B::Error> {
    // We cannot use .get() here because n is a u64
    if n >= WRITE_LE.len() as u64 {
        return Ok(None);
    }
    let n = n as usize;
    let len = WRITE_LEN_LE[n] as usize;
    backend.write_bits(WRITE_LE[n] as u64, len)?;
    Ok(Some(len))
}

/// Writes a value using an encoding table.
///
/// If the result is `Some` the encoding was successful, and
/// length of the code is returned.
#[inline(always)]
pub fn write_table_be<B: BitWrite<BE>>(backend: &mut B, n: u64) -> Result<Option<usize>, B::Error> {
    // We cannot use .get() here because n is a u64
    if n >= WRITE_BE.len() as u64 {
        return Ok(None);
    }
    let n = n as usize;
    let len = WRITE_LEN_BE[n] as usize;
    backend.write_bits(WRITE_BE[n] as u64, len)?;
    Ok(Some(len))
}
/// Precomputed table for reading delta codes
/// For complete codes: stores the decoded value
/// For partial codes: stores the gamma_len (length of the following fixed part)
pub const READ_BE: &[u8] = &[
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26,
    27, 27, 28, 28, 29, 29, 30, 30, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9,
    9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12,
    12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 8, 8,
    8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14,
    14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26,
    26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
    46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
];
/// Precomputed lengths table for reading delta codes
/// Positive (< 0x80): complete code length
/// Negative (>= 0x80 when viewed as u8): (value & 0x7F) is gamma code length (bits consumed)
/// Zero: no valid decoding (gamma not decoded)
pub const READ_LEN_BE: &[i8] = &[
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119,
    -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119,
    -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121,
    -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121,
    -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121,
    -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123,
    -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123,
    -123, -123, -123, -123, -123, -123, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
];
/// Precomputed table for reading delta codes
/// For complete codes: stores the decoded value
/// For partial codes: stores the gamma_len (length of the following fixed part)
pub const READ_LE: &[u8] = &[
    0, 0, 1, 0, 7, 0, 3, 0, 7, 0, 2, 0, 15, 0, 4, 0, 15, 0, 1, 0, 31, 0, 5, 0, 8, 0, 2, 0, 6, 0, 6,
    0, 0, 0, 1, 0, 8, 0, 3, 0, 9, 0, 2, 0, 16, 0, 4, 0, 16, 0, 1, 0, 32, 0, 5, 0, 10, 0, 2, 0, 6,
    0, 6, 0, 0, 0, 1, 0, 9, 0, 3, 0, 11, 0, 2, 0, 17, 0, 4, 0, 17, 0, 1, 0, 33, 0, 5, 0, 12, 0, 2,
    0, 6, 0, 6, 0, 0, 0, 1, 0, 10, 0, 3, 0, 13, 0, 2, 0, 18, 0, 4, 0, 18, 0, 1, 0, 34, 0, 5, 0, 14,
    0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 11, 0, 3, 0, 7, 0, 2, 0, 19, 0, 4, 0, 19, 0, 1, 0, 35, 0, 5,
    0, 8, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 12, 0, 3, 0, 9, 0, 2, 0, 20, 0, 4, 0, 20, 0, 1, 0, 36,
    0, 5, 0, 10, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 13, 0, 3, 0, 11, 0, 2, 0, 21, 0, 4, 0, 21, 0, 1,
    0, 37, 0, 5, 0, 12, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 14, 0, 3, 0, 13, 0, 2, 0, 22, 0, 4, 0, 22,
    0, 1, 0, 38, 0, 5, 0, 14, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 7, 0, 3, 0, 7, 0, 2, 0, 23, 0, 4, 0,
    23, 0, 1, 0, 39, 0, 5, 0, 8, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 8, 0, 3, 0, 9, 0, 2, 0, 24, 0, 4,
    0, 24, 0, 1, 0, 40, 0, 5, 0, 10, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 9, 0, 3, 0, 11, 0, 2, 0, 25,
    0, 4, 0, 25, 0, 1, 0, 41, 0, 5, 0, 12, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 10, 0, 3, 0, 13, 0, 2,
    0, 26, 0, 4, 0, 26, 0, 1, 0, 42, 0, 5, 0, 14, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 11, 0, 3, 0, 7,
    0, 2, 0, 27, 0, 4, 0, 27, 0, 1, 0, 43, 0, 5, 0, 8, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 12, 0, 3,
    0, 9, 0, 2, 0, 28, 0, 4, 0, 28, 0, 1, 0, 44, 0, 5, 0, 10, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 13,
    0, 3, 0, 11, 0, 2, 0, 29, 0, 4, 0, 29, 0, 1, 0, 45, 0, 5, 0, 12, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1,
    0, 14, 0, 3, 0, 13, 0, 2, 0, 30, 0, 4, 0, 30, 0, 1, 0, 46, 0, 5, 0, 14, 0, 2, 0, 6, 0, 6, 0, 0,
    0, 1, 0, 7, 0, 3, 0, 7, 0, 2, 0, 15, 0, 4, 0, 15, 0, 1, 0, 47, 0, 5, 0, 8, 0, 2, 0, 6, 0, 6, 0,
    0, 0, 1, 0, 8, 0, 3, 0, 9, 0, 2, 0, 16, 0, 4, 0, 16, 0, 1, 0, 48, 0, 5, 0, 10, 0, 2, 0, 6, 0,
    6, 0, 0, 0, 1, 0, 9, 0, 3, 0, 11, 0, 2, 0, 17, 0, 4, 0, 17, 0, 1, 0, 49, 0, 5, 0, 12, 0, 2, 0,
    6, 0, 6, 0, 0, 0, 1, 0, 10, 0, 3, 0, 13, 0, 2, 0, 18, 0, 4, 0, 18, 0, 1, 0, 50, 0, 5, 0, 14, 0,
    2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 11, 0, 3, 0, 7, 0, 2, 0, 19, 0, 4, 0, 19, 0, 1, 0, 51, 0, 5, 0,
    8, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 12, 0, 3, 0, 9, 0, 2, 0, 20, 0, 4, 0, 20, 0, 1, 0, 52, 0,
    5, 0, 10, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 13, 0, 3, 0, 11, 0, 2, 0, 21, 0, 4, 0, 21, 0, 1, 0,
    53, 0, 5, 0, 12, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 14, 0, 3, 0, 13, 0, 2, 0, 22, 0, 4, 0, 22, 0,
    1, 0, 54, 0, 5, 0, 14, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 7, 0, 3, 0, 7, 0, 2, 0, 23, 0, 4, 0,
    23, 0, 1, 0, 55, 0, 5, 0, 8, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 8, 0, 3, 0, 9, 0, 2, 0, 24, 0, 4,
    0, 24, 0, 1, 0, 56, 0, 5, 0, 10, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 9, 0, 3, 0, 11, 0, 2, 0, 25,
    0, 4, 0, 25, 0, 1, 0, 57, 0, 5, 0, 12, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 10, 0, 3, 0, 13, 0, 2,
    0, 26, 0, 4, 0, 26, 0, 1, 0, 58, 0, 5, 0, 14, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 11, 0, 3, 0, 7,
    0, 2, 0, 27, 0, 4, 0, 27, 0, 1, 0, 59, 0, 5, 0, 8, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 12, 0, 3,
    0, 9, 0, 2, 0, 28, 0, 4, 0, 28, 0, 1, 0, 60, 0, 5, 0, 10, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1, 0, 13,
    0, 3, 0, 11, 0, 2, 0, 29, 0, 4, 0, 29, 0, 1, 0, 61, 0, 5, 0, 12, 0, 2, 0, 6, 0, 6, 0, 0, 0, 1,
    0, 14, 0, 3, 0, 13, 0, 2, 0, 30, 0, 4, 0, 30, 0, 1, 0, 62, 0, 5, 0, 14, 0, 2, 0, 6, 0, 6, 0,
];
/// Precomputed lengths table for reading delta codes
/// Positive (< 0x80): complete code length
/// Negative (>= 0x80 when viewed as u8): (value & 0x7F) is gamma code length (bits consumed)
/// Zero: no valid decoding (gamma not decoded)
pub const READ_LEN_LE: &[i8] = &[
    0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1,
    -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1,
    -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1,
    10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1,
    -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4,
    1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5,
    1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1,
    4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123,
    1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121,
    1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10,
    1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119,
    1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9,
    1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1,
    -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4,
    1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1,
    5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1,
    4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1,
    5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1,
    4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1,
    5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121,
    1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8,
    1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1,
    0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1,
    -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1,
    -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1,
    10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1,
    -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4,
    1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5,
    1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1,
    4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123,
    1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121,
    1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10,
    1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119,
    1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1, -121, 1, 4, 1, 9,
    1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4, 1, 8, 1, 5, 1,
    -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1, 5, 1, 0, 1, 4,
    1, 8, 1, 5, 1, -121, 1, 4, 1, 9, 1, 5, 1, -119, 1, 4, 1, 10, 1, 5, 1, -121, 1, 4, 1, -123, 1,
    5, 1,
];
/// Table used to speed up the writing of delta codes
pub const WRITE_BE: &[u16] = &[
    1, 4, 5, 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, 80, 81, 82, 83, 84, 85, 86, 87, 88,
    89, 90, 91, 92, 93, 94, 95, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
    205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
    448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466,
    467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485,
    486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504,
    505, 506, 507, 508, 509, 510, 511, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033,
    1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049,
    1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065,
    1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081,
    1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097,
    1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113,
    1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129,
    1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145,
    1146, 1147, 1148, 1149, 1150, 1151, 2304,
];
/// Table used to speed up the writing of delta codes
pub const WRITE_LEN_BE: &[u16] = &[
    1, 4, 4, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 15,
];
/// Table used to speed up the writing of delta codes
pub const WRITE_LE: &[u16] = &[
    1, 2, 10, 6, 14, 22, 30, 4, 36, 68, 100, 132, 164, 196, 228, 12, 44, 76, 108, 140, 172, 204,
    236, 268, 300, 332, 364, 396, 428, 460, 492, 20, 52, 84, 116, 148, 180, 212, 244, 276, 308,
    340, 372, 404, 436, 468, 500, 532, 564, 596, 628, 660, 692, 724, 756, 788, 820, 852, 884, 916,
    948, 980, 1012, 28, 60, 92, 124, 156, 188, 220, 252, 284, 316, 348, 380, 412, 444, 476, 508,
    540, 572, 604, 636, 668, 700, 732, 764, 796, 828, 860, 892, 924, 956, 988, 1020, 1052, 1084,
    1116, 1148, 1180, 1212, 1244, 1276, 1308, 1340, 1372, 1404, 1436, 1468, 1500, 1532, 1564, 1596,
    1628, 1660, 1692, 1724, 1756, 1788, 1820, 1852, 1884, 1916, 1948, 1980, 2012, 2044, 8, 136,
    264, 392, 520, 648, 776, 904, 1032, 1160, 1288, 1416, 1544, 1672, 1800, 1928, 2056, 2184, 2312,
    2440, 2568, 2696, 2824, 2952, 3080, 3208, 3336, 3464, 3592, 3720, 3848, 3976, 4104, 4232, 4360,
    4488, 4616, 4744, 4872, 5000, 5128, 5256, 5384, 5512, 5640, 5768, 5896, 6024, 6152, 6280, 6408,
    6536, 6664, 6792, 6920, 7048, 7176, 7304, 7432, 7560, 7688, 7816, 7944, 8072, 8200, 8328, 8456,
    8584, 8712, 8840, 8968, 9096, 9224, 9352, 9480, 9608, 9736, 9864, 9992, 10120, 10248, 10376,
    10504, 10632, 10760, 10888, 11016, 11144, 11272, 11400, 11528, 11656, 11784, 11912, 12040,
    12168, 12296, 12424, 12552, 12680, 12808, 12936, 13064, 13192, 13320, 13448, 13576, 13704,
    13832, 13960, 14088, 14216, 14344, 14472, 14600, 14728, 14856, 14984, 15112, 15240, 15368,
    15496, 15624, 15752, 15880, 16008, 16136, 16264, 24,
];
/// Table used to speed up the writing of delta codes
pub const WRITE_LEN_LE: &[u16] = &[
    1, 4, 4, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 15,
];
/// Table used to speed up the skipping of delta codes
pub const LEN: &[u8] = &[
    1, 4, 4, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 15,
];
/// Asserts at compile time that `peek_bits` is large enough for these tables.
pub const fn check_read_table(peek_bits: usize) {
    assert!(
        peek_bits >= READ_BITS,
        "BitRead peek word too small for delta code read tables (10 bits required)"
    );
}