use thiserror::Error;
#[derive(Debug, Error)]
pub enum TurboQuantError {
#[error("dimension {0} is not a power of two")]
InvalidDimension(usize),
#[error("unsupported bit width {0}, expected 2, 3, or 4")]
UnsupportedBits(u8),
#[error("expected vector of length {expected}, got {actual}")]
DimensionMismatch { expected: usize, actual: usize },
#[error("layer index {index} out of range (num_layers = {num_layers})")]
LayerOutOfRange { index: usize, num_layers: usize },
#[error("range [{start}..{end}) out of bounds for entry_count = {entry_count}")]
RangeOutOfBounds {
start: usize,
end: usize,
entry_count: usize,
},
}
pub type Result<T> = std::result::Result<T, TurboQuantError>;
pub fn require(condition: bool, error: TurboQuantError) -> Result<()> {
if condition {
Ok(())
} else {
Err(error)
}
}
pub(crate) fn values_match(a: usize, b: usize) -> bool {
a == b
}
pub(crate) fn check_values_match(actual: usize, expected: usize) -> Result<()> {
require(
values_match(actual, expected),
TurboQuantError::DimensionMismatch { expected, actual },
)
}