use core::fmt::{Debug, Display}; use core::hash::Hash; use core::marker::PhantomData; use core::ops::{Deref, DerefMut}; use super::{PoisonFlag, PoisonGuard, PoisonRef}; impl<'a, Guard> PoisonRef<'a, Guard> { // This is used so that we don't keep accidentally adding the flag reference #[allow(clippy::allow_attributes)] #[allow(unused_variables)] pub(super) const fn new(flag: &'a PoisonFlag, guard: Guard) -> Self { Self { guard, #[cfg(all(feature = "std", panic = "unwind"))] flag, _phantom: PhantomData, } } } impl Drop for PoisonRef<'_, Guard> { fn drop(&mut self) { #[cfg(all(feature = "std", panic = "unwind"))] if std::thread::panicking() { self.flag.poison(); } } } #[mutants::skip] // hashing involves RNG and is hard to test #[cfg(not(tarpaulin_include))] impl Hash for PoisonRef<'_, Guard> { fn hash(&self, state: &mut H) { self.guard.hash(state) } } #[mutants::skip] #[cfg(not(tarpaulin_include))] impl Debug for PoisonRef<'_, Guard> { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { Debug::fmt(&**self, f) } } impl Display for PoisonRef<'_, Guard> { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { Display::fmt(&**self, f) } } impl Deref for PoisonRef<'_, Guard> { type Target = Guard; fn deref(&self) -> &Self::Target { &self.guard } } impl DerefMut for PoisonRef<'_, Guard> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.guard } } impl AsRef for PoisonRef<'_, Guard> { fn as_ref(&self) -> &Guard { &self.guard } } impl AsMut for PoisonRef<'_, Guard> { fn as_mut(&mut self) -> &mut Guard { &mut self.guard } } #[mutants::skip] // hashing involves RNG and is hard to test #[cfg(not(tarpaulin_include))] impl Hash for PoisonGuard<'_, Guard> { fn hash(&self, state: &mut H) { self.guard.hash(state) } } #[mutants::skip] #[cfg(not(tarpaulin_include))] impl Debug for PoisonGuard<'_, Guard> { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { Debug::fmt(&self.guard, f) } } impl Display for PoisonGuard<'_, Guard> { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { Display::fmt(&self.guard, f) } } impl> Deref for PoisonGuard<'_, Guard> { type Target = T; fn deref(&self) -> &Self::Target { #[expect(clippy::explicit_auto_deref)] // fixing this results in a compiler error &*self.guard.guard } } impl> DerefMut for PoisonGuard<'_, Guard> { fn deref_mut(&mut self) -> &mut Self::Target { #[expect(clippy::explicit_auto_deref)] // fixing this results in a compiler error &mut *self.guard.guard } } impl AsRef for PoisonGuard<'_, Guard> { fn as_ref(&self) -> &Guard { &self.guard.guard } } impl AsMut for PoisonGuard<'_, Guard> { fn as_mut(&mut self) -> &mut Guard { &mut self.guard.guard } }