#![warn(missing_docs)]
#![forbid(unsafe_code)]
mod fast;
mod math;
mod packed;
#[cfg(feature = "serde")]
mod serde_impl;
pub use fast::ExaLogLogFast;
pub use packed::ExaLogLog;
pub const T: u32 = 2;
pub const MIN_P: u32 = 3;
pub const MAX_P: u32 = 26;
pub(crate) const MAGIC: [u8; 4] = *b"ELL\0";
pub(crate) const FORMAT_VERSION: u8 = 1;
#[derive(Debug, PartialEq, Eq)]
pub enum MergeError {
PrecisionMismatch {
lhs: u32,
rhs: u32,
},
}
impl std::fmt::Display for MergeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
MergeError::PrecisionMismatch { lhs, rhs } => {
write!(f, "precision mismatch: lhs p={lhs}, rhs p={rhs}")
}
}
}
}
impl std::error::Error for MergeError {}
#[derive(Debug, PartialEq, Eq)]
pub enum DeserializeError {
TooShort {
got: usize,
need: usize,
},
BadMagic,
UnsupportedVersion(u8),
ParameterMismatch {
t: u8,
d: u8,
},
InvalidPrecision(u8),
LengthMismatch {
got: usize,
expected: usize,
},
}
impl std::fmt::Display for DeserializeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DeserializeError::TooShort { got, need } => {
write!(f, "byte slice too short: got {got}, need at least {need}")
}
DeserializeError::BadMagic => write!(f, "bad magic prefix"),
DeserializeError::UnsupportedVersion(v) => {
write!(f, "unsupported format version: {v}")
}
DeserializeError::ParameterMismatch { t, d } => {
write!(f, "parameter mismatch: encoded t={t}, d={d}")
}
DeserializeError::InvalidPrecision(p) => {
write!(f, "invalid precision p={p} (allowed: {MIN_P}..={MAX_P})")
}
DeserializeError::LengthMismatch { got, expected } => {
write!(f, "length mismatch: got {got} bytes, expected {expected}")
}
}
}
}
impl std::error::Error for DeserializeError {}