#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SlicePlan {
OutOfRange,
Empty,
Read {
offset: u64,
length: u64,
},
}
pub fn plan_slice(offset: u64, length: u64, total_size: u64) -> SlicePlan {
if offset > total_size {
SlicePlan::OutOfRange
} else if length == 0 || offset == total_size {
SlicePlan::Empty
} else {
SlicePlan::Read {
offset,
length: length.min(total_size - offset),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn plan_slice_boundary_matrix() {
assert_eq!(
plan_slice(0, 4, 10),
SlicePlan::Read {
offset: 0,
length: 4
}
);
assert_eq!(
plan_slice(8, 100, 10),
SlicePlan::Read {
offset: 8,
length: 2
}
);
assert_eq!(plan_slice(2, 0, 10), SlicePlan::Empty);
assert_eq!(plan_slice(10, 5, 10), SlicePlan::Empty);
assert_eq!(plan_slice(11, 1, 10), SlicePlan::OutOfRange);
assert_eq!(plan_slice(0, 0, 0), SlicePlan::Empty);
assert_eq!(plan_slice(0, 5, 0), SlicePlan::Empty);
assert_eq!(plan_slice(1, 5, 0), SlicePlan::OutOfRange);
}
}