#[cfg(not(feature = "std"))]
use alloc::vec::Vec;
pub const MAX_BLOCK_SIZE: u32 = 4 * 1_024 * 1_024;
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct BlockSizePolicy(Vec<u32>);
impl core::ops::Deref for BlockSizePolicy {
type Target = [u32];
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl BlockSizePolicy {
pub(crate) fn get(&self, level: usize) -> u32 {
#[expect(clippy::expect_used, reason = "policy is expected not to be empty")]
self.0
.get(level)
.copied()
.unwrap_or_else(|| self.last().copied().expect("policy should not be empty"))
}
#[must_use]
pub fn all(c: u32) -> Self {
assert!(c <= MAX_BLOCK_SIZE, "block size must be <= 4 MiB");
Self(vec![c])
}
#[must_use]
pub fn new(policy: impl Into<Vec<u32>>) -> Self {
let policy = policy.into();
assert!(!policy.is_empty(), "block size policy may not be empty");
assert!(policy.len() <= 255, "block size policy is too large");
assert!(
policy.iter().all(|&size| size <= MAX_BLOCK_SIZE),
"block size must be <= 4 MiB",
);
Self(policy)
}
}
#[cfg(test)]
mod tests;