use core::ops::Deref;
use super::SfsFs;
use crate::dev::Device;
use crate::fs::structures::block::BlockWrapper;
#[derive(Clone)]
pub struct InnerBlock<Dev: Device> {
number: u64,
filesystem: SfsFs<Dev>,
}
impl<Dev: Device> crate::fs::structures::block::Block<Dev> for InnerBlock<Dev> {
type Num = u64;
fn size(&self) -> u32 {
self.filesystem.lock().super_block().bytes_per_block()
}
fn number(&self) -> Self::Num {
self.number
}
fn device(&mut self) -> crate::celled::Celled<Dev> {
let fs = self.filesystem.lock();
fs.device.clone()
}
}
pub type Block<Dev> = BlockWrapper<Dev, InnerBlock<Dev>>;
impl<Dev: Device> Block<Dev> {
#[must_use]
pub const fn new(filesystem: SfsFs<Dev>, number: u64) -> Self {
Self::new_wrapper(InnerBlock { number, filesystem })
}
#[must_use]
pub const fn number(&self) -> u64 {
self.deref().number
}
}
impl<Dev: Device> From<Block<Dev>> for u64 {
fn from(block: Block<Dev>) -> Self {
block.number
}
}