#![forbid(unsafe_code)]
pub const DEFAULT_MAX_CHUNK_SIZE: u64 = 256 * 1024;
pub const DEFAULT_CHUNK_CLASS: u64 = 64 * 1024;
pub const DEFAULT_MAX_DESCRIPTOR_BYTES: u64 = 8192;
pub const DEFAULT_MAX_REFERENCE_DEPTH: u8 = 4;
pub const DEFAULT_MAX_DECODE_WORK: u64 = 1 << 26;
pub const DEFAULT_MAX_ALLOC_BYTES: u64 = 1024 * 1024;
pub const DEFAULT_MAX_FANOUT: u32 = 4096;
pub const DEFAULT_MAX_MODEL_BYTES: u64 = 2048;
pub const DEFAULT_MAX_INLINE_BYTES: u64 = 4096;
pub const DEFAULT_MAX_PERIOD: u32 = 1024;
pub const DEFAULT_MAX_PALETTE: usize = 16;
pub const CHUNK_CLASSES: [u64; 4] = [4 * 1024, 16 * 1024, 64 * 1024, 256 * 1024];
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Limits {
pub max_chunk_size: u64,
pub chunk_class: u64,
pub max_descriptor_bytes: u64,
pub max_reference_depth: u8,
pub max_decode_work: u64,
pub max_alloc_bytes: u64,
pub max_fanout: u32,
pub max_model_bytes: u64,
pub max_inline_bytes: u64,
pub max_period: u32,
pub max_palette: usize,
}
impl Default for Limits {
fn default() -> Self {
Self {
max_chunk_size: DEFAULT_MAX_CHUNK_SIZE,
chunk_class: DEFAULT_CHUNK_CLASS,
max_descriptor_bytes: DEFAULT_MAX_DESCRIPTOR_BYTES,
max_reference_depth: DEFAULT_MAX_REFERENCE_DEPTH,
max_decode_work: DEFAULT_MAX_DECODE_WORK,
max_alloc_bytes: DEFAULT_MAX_ALLOC_BYTES,
max_fanout: DEFAULT_MAX_FANOUT,
max_model_bytes: DEFAULT_MAX_MODEL_BYTES,
max_inline_bytes: DEFAULT_MAX_INLINE_BYTES,
max_period: DEFAULT_MAX_PERIOD,
max_palette: DEFAULT_MAX_PALETTE,
}
}
}
impl Limits {
pub fn class_for_len(&self, len: u64) -> Option<u64> {
CHUNK_CLASSES.iter().copied().find(|&c| c == len)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_are_consistent() {
let l = Limits::default();
assert!(l.max_chunk_size >= l.chunk_class);
assert!(l.max_fanout > 0);
assert!(l.max_reference_depth >= 1);
assert_eq!(l.class_for_len(64 * 1024), Some(64 * 1024));
assert_eq!(l.class_for_len(12345), None);
}
}