use crate::*;
impl HookContext {
pub fn from_inner(inner: *mut HookContextInner) -> Self {
HookContext { inner }
}
#[allow(clippy::mut_from_ref)]
fn get_inner_mut(&self) -> &mut HookContextInner {
unsafe { &mut *self.inner }
}
pub fn get_hook_index(&self) -> usize {
self.get_inner_mut().get_hook_index()
}
pub fn set_hook_index(&mut self, index: usize) {
self.get_inner_mut().set_hook_index(index);
}
pub fn get_hooks(&self) -> &Vec<Box<dyn Any>> {
self.get_inner_mut().get_hooks()
}
pub fn get_mut_hooks(&mut self) -> &mut Vec<Box<dyn Any>> {
self.get_inner_mut().get_mut_hooks()
}
pub fn get_mut_cleanups(&mut self) -> &mut Vec<Box<dyn FnOnce()>> {
self.get_inner_mut().get_mut_cleanups()
}
pub fn reset_hook_index(&mut self) {
self.set_hook_index(0_usize);
}
pub fn set_arm_changed(&mut self, changed: bool) {
let inner: &mut HookContextInner = self.get_inner_mut();
if inner.get_arm_changed() != changed {
let cleanups: Vec<Box<dyn FnOnce()>> = std::mem::take(inner.get_mut_cleanups());
for cleanup in cleanups {
cleanup();
}
inner.get_mut_hooks().clear();
inner.set_arm_changed(changed);
}
self.reset_hook_index();
}
}
impl Clone for HookContext {
fn clone(&self) -> Self {
*self
}
}
impl Copy for HookContext {}
impl Default for HookContext {
fn default() -> Self {
let boxed: Box<HookContextInner> = Box::default();
HookContext::from_inner(Box::leak(boxed) as *mut HookContextInner)
}
}
impl HookContextInner {
pub const fn new() -> Self {
HookContextInner {
hooks: Vec::new(),
arm_changed: false,
hook_index: 0_usize,
cleanups: Vec::new(),
}
}
}
impl Default for HookContextInner {
fn default() -> Self {
Self::new()
}
}
unsafe impl Sync for HookContextCell {}