use crate::arc::Arc;
use std::fmt;
use std::sync::Weak as StdWeak;
#[derive(Clone, Default)]
#[repr(transparent)]
pub struct Weak<T: ?Sized>(StdWeak<T>);
impl<T> Weak<T> {
#[must_use]
pub fn new() -> Weak<T> {
Weak(StdWeak::new())
}
}
impl<T: ?Sized> Weak<T> {
#[inline]
pub fn into_std(self) -> StdWeak<T> {
self.0
}
#[inline]
pub fn from_std(w: StdWeak<T>) -> Self {
Weak(w)
}
#[must_use = "this returns a new `Arc`, \
without modifying the original weak pointer"]
#[inline]
pub fn upgrade(&self) -> Option<Arc<T>> {
self.0.upgrade().map(Arc::from_std)
}
#[must_use]
#[inline]
pub fn strong_count(&self) -> usize {
self.0.strong_count()
}
#[must_use]
#[inline]
pub fn weak_count(&self) -> usize {
self.0.weak_count()
}
#[inline]
#[must_use]
pub fn ptr_eq(&self, other: &Self) -> bool {
self.0.ptr_eq(&other.0)
}
}
impl<T: ?Sized + fmt::Debug> fmt::Debug for Weak<T> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(&self.0, f)
}
}
#[cfg(feature = "serde")]
mod serde {
use crate::Weak;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
impl<T> Serialize for Weak<T>
where
T: ?Sized + Serialize,
{
#[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.upgrade().serialize(serializer)
}
}
impl<'de, T> Deserialize<'de> for Weak<T>
where
T: Deserialize<'de>,
{
#[inline]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let _ = Option::<T>::deserialize(deserializer)?;
Ok(Weak::new())
}
}
}