use core::ffi::c_void;
use super::ProgressFn;
#[derive(Debug, Clone, Copy)]
pub struct ScanRange {
pub start: u64,
pub end: u64,
pub stride: u64,
}
impl ScanRange {
pub const WHOLE: ScanRange = ScanRange { start: 0, end: 0, stride: 1 };
pub fn new(start: u64, end: u64) -> ScanRange {
ScanRange { start: start, end: end, stride: 1 }
}
pub fn from(start: u64) -> ScanRange {
ScanRange { start: start, end: 0, stride: 1 }
}
pub fn stride(mut self, stride: u64) -> ScanRange {
self.stride = stride;
self
}
}
pub type ProgressSink<'a> = &'a mut dyn FnMut(u64, u64);
pub fn progress_thunk(sink: &mut Option<ProgressSink<'_>>) -> (*mut c_void, ProgressFn) {
match sink {
None => (core::ptr::null_mut(), None),
Some(_) => (core::ptr::from_mut(sink).cast(), Some(report)),
}
}
unsafe extern "C" fn report(obj: *mut c_void, done: u64, total: u64) {
let sink: &mut Option<ProgressSink<'_>> = unsafe { &mut *obj.cast() };
if let Some(f) = sink {
f(done, total);
}
}