#![feature(dispatch_from_dyn)]
#![feature(unsize)]
#![feature(coerce_unsized)]
mod imp_impls;
mod tests;
use std::{cell::RefCell, rc::Rc};
#[doc = include_str!("../readme.md")]
pub struct Imp<T: ?Sized> {
v: Rc<RefCell<T>>,
}
#[allow(unused)]
impl<T> Imp<T> {
pub unsafe fn new(t: T) -> Self {
Self {
v: Rc::new(RefCell::new(t)),
}
}
pub fn ptr_eq(this: &Self, other: &Self) -> bool {
Rc::ptr_eq(&this.v, &other.v)
}
}
mod clone_impl {
use super::Imp;
use std::clone::Clone;
impl<T: ?Sized> Clone for Imp<T> {
fn clone(&self) -> Self {
Self { v: self.v.clone() }
}
}
}
mod deref_impl {
use std::{
marker::Unsize,
ops::{CoerceUnsized, Deref, DerefMut, DispatchFromDyn},
};
use super::Imp;
impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Imp<U>> for Imp<T> {}
impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Imp<U>> for Imp<T> {}
impl<T: ?Sized> Deref for Imp<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
unsafe { &*self.v.as_ptr() }
}
}
impl<T: ?Sized> DerefMut for Imp<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { &mut *self.v.as_ptr() }
}
}
}