pub struct Borrow<T> {
value: std::rc::Rc<SharedCell<T>>,
}
pub(crate) use std::fmt::{Debug, Display, Formatter, Result};
impl<T: Debug> Debug for Borrow<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
Debug::fmt(self.get_ref(), f)
}
}
impl<T: Default> Default for Borrow<T> {
fn default() -> Self {
Borrow::new(T::default())
}
}
impl<T: Display> Display for Borrow<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
Display::fmt(self.get_ref(), f)
}
}
impl<T> AsRef<T> for Borrow<T> {
fn as_ref(&self) -> &T {
self.get_ref()
}
}
impl<T> AsMut<T> for Borrow<T> {
fn as_mut(&mut self) -> &mut T {
self.get_mut()
}
}
pub(crate) use std::ops::{Deref, DerefMut};
impl<T> Deref for Borrow<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.get_ref()
}
}
impl<T> DerefMut for Borrow<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.get_mut()
}
}
impl<T> Borrow<T> {
pub fn new(value: T) -> Borrow<T> {
Self {
value: std::rc::Rc::new(SharedCell::new(value)),
}
}
pub(crate) fn get_ref(&self) -> &T {
unsafe { self.value.get_ref() }
}
pub(crate) fn get_mut(&self) -> &mut T {
unsafe { self.value.get_mut() }
}
}
impl<T: PartialEq> PartialEq for Borrow<T> {
fn eq(&self, other: &Self) -> bool {
PartialEq::eq(self.get_ref(), other.get_ref())
}
fn ne(&self, other: &Self) -> bool {
PartialEq::ne(self.get_ref(), other.get_ref())
}
}
impl<T: Eq> Eq for Borrow<T> {}
impl<T: PartialOrd> PartialOrd for Borrow<T> {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
self.get_ref().partial_cmp(other.get_ref())
}
fn lt(&self, other: &Self) -> bool {
self.get_ref().lt(other.get_ref())
}
fn le(&self, other: &Self) -> bool {
self.get_ref().le(other.get_ref())
}
fn gt(&self, other: &Self) -> bool {
self.get_ref().gt(other.get_ref())
}
fn ge(&self, other: &Self) -> bool {
self.get_ref().ge(other.get_ref())
}
}
impl<T: Ord> Ord for Borrow<T> {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.get_ref().cmp(other.get_ref())
}
}
pub(crate) use std::hash::{Hash, Hasher};
impl<T: Hash> Hash for Borrow<T> {
fn hash<'a, H: Hasher>(&'a self, state: &mut H) {
self.get_ref().hash(state)
}
}
impl<T> Clone for Borrow<T> {
fn clone(&self) -> Self {
Self {
value: self.value.clone(),
}
}
}
impl<T> From<T> for Borrow<T> {
fn from(value: T) -> Self {
Borrow::new(value)
}
}
pub(crate) use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::SharedCell;
impl<T: Serialize> Serialize for Borrow<T> {
fn serialize<S: Serializer>(&self, sz: S) -> std::result::Result<S::Ok, S::Error> {
T::serialize(self.get_ref(), sz)
}
}
impl<'d, T: Deserialize<'d>> Deserialize<'d> for Borrow<T> {
fn deserialize<D: Deserializer<'d>>(dz: D) -> std::result::Result<Self, D::Error> {
let value = T::deserialize(dz)?;
Ok(Borrow::new(value))
}
}
impl<T> !Send for Borrow<T> {}
impl<T> !Sync for Borrow<T> {}