use crate::io::assert_finite_f32;
use crate::sys;
use std::cell::UnsafeCell;
#[repr(transparent)]
pub struct Io(UnsafeCell<sys::ImGuiIO>);
const _: [(); std::mem::size_of::<sys::ImGuiIO>()] = [(); std::mem::size_of::<Io>()];
const _: [(); std::mem::align_of::<sys::ImGuiIO>()] = [(); std::mem::align_of::<Io>()];
impl Io {
#[inline]
pub(crate) fn inner(&self) -> &sys::ImGuiIO {
unsafe { &*self.0.get() }
}
#[inline]
pub(crate) fn inner_mut(&mut self) -> &mut sys::ImGuiIO {
unsafe { &mut *self.0.get() }
}
fn frame_count(&self) -> i32 {
let ctx = self.inner().Ctx;
if ctx.is_null() {
0
} else {
unsafe { (*ctx).FrameCount }
}
}
pub(crate) fn assert_delta_time(&self, caller: &str, delta_time: f32) {
assert_finite_f32(caller, "delta_time", delta_time);
if self.frame_count() == 0 {
assert!(
delta_time >= 0.0,
"{caller} delta_time must be non-negative before the first frame"
);
} else {
assert!(
delta_time > 0.0,
"{caller} delta_time must be positive after the first frame"
);
}
}
}