use {ErrorKind, Result};
pub(crate) use self::aligned_bytes::AlignedBytes;
mod aligned_bytes;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct BlockSize(u16);
impl BlockSize {
pub const MIN: u16 = 512;
pub fn min() -> Self {
BlockSize(Self::MIN)
}
#[allow(clippy::new_ret_no_self)]
pub fn new(block_size: u16) -> Result<Self> {
track_assert!(block_size >= Self::MIN, ErrorKind::InvalidInput);
track_assert_eq!(block_size % Self::MIN, 0, ErrorKind::InvalidInput);
Ok(BlockSize(block_size))
}
pub fn ceil_align(self, position: u64) -> u64 {
let block_size = u64::from(self.0);
(position + block_size - 1) / block_size * block_size
}
pub fn floor_align(self, position: u64) -> u64 {
let block_size = u64::from(self.0);
(position / block_size) * block_size
}
pub fn as_u16(self) -> u16 {
self.0
}
pub fn contains(self, other: BlockSize) -> bool {
self.0 >= other.0 && self.0 % other.0 == 0
}
pub fn is_aligned(self, position: u64) -> bool {
(position % u64::from(self.0)) == 0
}
}
impl Default for BlockSize {
fn default() -> Self {
Self::min()
}
}