use crate::*;
pub(crate) fn get_signal_inner_rc<T>(addr: usize) -> Rc<RefCell<SignalInner<T>>>
where
T: Clone + PartialEq + 'static,
{
let registry_ref: &HashMap<usize, Rc<dyn Any>> = signal_inner_registry();
let any_rc: &Rc<dyn Any> = registry_ref
.get(&addr)
.expect("Signal inner not found in registry");
let any_ptr: *const dyn Any = Rc::as_ptr(any_rc);
let concrete_ptr: *const RefCell<SignalInner<T>> = any_ptr as *const RefCell<SignalInner<T>>;
let concrete_rc: Rc<RefCell<SignalInner<T>>> = unsafe { Rc::from_raw(concrete_ptr) };
let result: Rc<RefCell<SignalInner<T>>> = concrete_rc.clone();
let _ = Rc::into_raw(concrete_rc);
result
}
pub(crate) fn clear_signal_listeners_by_addr(addr: usize) {
let registry_ref: &HashMap<usize, Rc<dyn Any>> = signal_inner_registry();
if let Some(any_rc) = registry_ref.get(&addr) {
let any_ptr: *const dyn Any = Rc::as_ptr(any_rc);
let concrete_ptr: *const RefCell<SignalInner<String>> =
any_ptr as *const RefCell<SignalInner<String>>;
let concrete_rc: Rc<RefCell<SignalInner<String>>> = unsafe { Rc::from_raw(concrete_ptr) };
{
let mut inner: RefMut<SignalInner<String>> = concrete_rc.borrow_mut();
inner.set_alive(false);
inner.get_mut_listeners().clear();
}
let _ = Rc::into_raw(concrete_rc);
}
}
#[allow(static_mut_refs)]
fn ensure_signal_inner_registry() -> &'static HashMap<usize, Rc<dyn Any>> {
unsafe {
if (*SIGNAL_INNER_REGISTRY.get_0().get()).is_none() {
(*SIGNAL_INNER_REGISTRY.get_0().get()) = Some(HashMap::new());
}
(*SIGNAL_INNER_REGISTRY.get_0().get())
.as_ref()
.unwrap_unchecked()
}
}
#[allow(static_mut_refs)]
fn ensure_signal_inner_registry_mut() -> &'static mut HashMap<usize, Rc<dyn Any>> {
unsafe {
if (*SIGNAL_INNER_REGISTRY.get_0().get()).is_none() {
(*SIGNAL_INNER_REGISTRY.get_0().get()) = Some(HashMap::new());
}
(*SIGNAL_INNER_REGISTRY.get_0().get())
.as_mut()
.unwrap_unchecked()
}
}
pub(crate) fn signal_inner_registry() -> &'static HashMap<usize, Rc<dyn Any>> {
ensure_signal_inner_registry()
}
pub(crate) fn signal_inner_registry_mut() -> &'static mut HashMap<usize, Rc<dyn Any>> {
ensure_signal_inner_registry_mut()
}