Skip to content
Snippets Groups Projects
extent.rs 1.13 KiB
Newer Older
Jeremy Soller's avatar
Jeremy Soller committed
use core::cmp::min;
use BLOCK_SIZE;

pub struct BlockIter {
    block: u64,
    length: u64,
Xavier L'Heureux's avatar
Xavier L'Heureux committed
    i: u64,
Xavier L'Heureux's avatar
Xavier L'Heureux committed
impl Iterator for BlockIter {
    type Item = (u64, u64);
    fn next(&mut self) -> Option<Self::Item> {
Xavier L'Heureux's avatar
Xavier L'Heureux committed
        if self.i < (self.length + BLOCK_SIZE - 1) / BLOCK_SIZE {
            let ret = Some((
                self.block + self.i,
                min(BLOCK_SIZE, self.length - self.i * BLOCK_SIZE),
            ));
Liam Naddell's avatar
Liam Naddell committed
/// A disk extent, [wikipedia](https://en.wikipedia.org/wiki/Extent_(file_systems))
#[derive(Copy, Clone, Debug, Default)]
#[repr(packed)]
pub struct Extent {
    pub block: u64,
    pub length: u64,
}
Jeremy Soller's avatar
Jeremy Soller committed
    pub fn default() -> Extent {
        Extent {
            block: 0,
Xavier L'Heureux's avatar
Xavier L'Heureux committed
            length: 0,
Jeremy Soller's avatar
Jeremy Soller committed
        }
    }

    pub fn new(block: u64, length: u64) -> Extent {
        Extent {
            block: block,
Xavier L'Heureux's avatar
Xavier L'Heureux committed
            length: length,

    pub fn blocks(&self) -> BlockIter {
        BlockIter {
            block: self.block,
            length: self.length,
Xavier L'Heureux's avatar
Xavier L'Heureux committed
            i: 0,