use std::any::TypeId;
use std::sync::Arc;
use dupe::Dupe;
use crate::PagableBoxDeserialize;
use crate::PagableDeserialize;
use crate::PagableDeserializer;
use crate::PagableSerialize;
use crate::PagableSerializer;
use crate::storage::data::DataKey;
pub trait ArcEraseDyn: std::any::Any + Send + Sync + 'static {
fn as_arc_any(&self) -> &dyn std::any::Any;
fn type_name(&self) -> &'static str;
fn identity(&self) -> usize;
fn clone_dyn(&self) -> Box<dyn ArcEraseDyn>;
fn downgrade(&self) -> Option<Box<dyn WeakEraseDyn>>;
fn set_data_key(&self, k: DataKey);
fn needs_paging_out(&self) -> bool;
fn serialize(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()>;
}
static_assertions::assert_obj_safe!(ArcEraseDyn);
pub fn deserialize_arc<'de, T: ArcErase, D: PagableDeserializer<'de> + ?Sized>(
deserializer: &mut D,
) -> anyhow::Result<T> {
fn deserialize_fn<A: ArcErase>(
d: &mut dyn PagableDeserializer<'_>,
) -> crate::Result<Box<dyn ArcEraseDyn>> {
let arc = A::deserialize_inner(d)?;
Ok(Box::new(arc))
}
let arc_box = deserializer.deserialize_arc(TypeId::of::<T>(), deserialize_fn::<T>)?;
let arc = arc_box
.as_arc_any()
.downcast_ref::<T>()
.ok_or_else(|| {
anyhow::anyhow!(
"Type mismatch on deserialize_arc: expected {}, got {}",
std::any::type_name::<T>(),
arc_box.type_name()
)
})?
.dupe_strong();
Ok(arc)
}
impl<T: ArcErase> ArcEraseDyn for T {
fn clone_dyn(&self) -> Box<dyn ArcEraseDyn> {
Box::new(T::dupe_strong(self))
}
fn as_arc_any(&self) -> &dyn std::any::Any {
self
}
fn type_name(&self) -> &'static str {
std::any::type_name::<T>()
}
fn identity(&self) -> usize {
ArcErase::identity(self)
}
fn downgrade(&self) -> Option<Box<dyn WeakEraseDyn>> {
ArcErase::downgrade(self).map(|w| Box::new(w) as Box<dyn WeakEraseDyn>)
}
fn set_data_key(&self, k: DataKey) {
ArcErase::set_data_key(self, k)
}
fn needs_paging_out(&self) -> bool {
ArcErase::needs_paging_out(self)
}
fn serialize(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()> {
ArcErase::serialize_inner(self, ser)
}
}
pub trait WeakEraseDyn: std::any::Any + Send + Sync + 'static {
fn as_weak_any(&self) -> &dyn std::any::Any;
fn upgrade(&self) -> Option<Box<dyn ArcEraseDyn>>;
fn is_expired(&self) -> bool;
}
static_assertions::assert_obj_safe!(WeakEraseDyn);
impl<T: WeakErase> WeakEraseDyn for T {
fn as_weak_any(&self) -> &dyn std::any::Any {
self
}
fn upgrade(&self) -> Option<Box<dyn ArcEraseDyn>> {
WeakErase::upgrade_weak(self)
}
fn is_expired(&self) -> bool {
WeakErase::is_expired(self)
}
}
pub trait WeakErase: std::any::Any + Sized + Send + Sync + 'static {
fn is_expired(&self) -> bool;
fn upgrade_weak(&self) -> Option<Box<dyn ArcEraseDyn>>;
}
pub trait ArcErase: std::any::Any + Sized + Send + Sync + 'static {
type Weak: WeakErase + 'static;
fn dupe_strong(&self) -> Self;
fn downgrade(&self) -> Option<Self::Weak>;
fn upgrade_weak(_weak: &Self::Weak) -> Option<Self> {
None
}
fn erase_type() -> impl ArcEraseType;
fn identity(&self) -> usize;
fn set_data_key(&self, _k: DataKey) {
}
fn needs_paging_out(&self) -> bool {
false
}
fn serialize_inner(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()>;
fn deserialize_inner<'de, D: PagableDeserializer<'de> + ?Sized>(
deser: &mut D,
) -> crate::Result<Self>;
}
impl WeakErase for () {
fn is_expired(&self) -> bool {
true
}
fn upgrade_weak(&self) -> Option<Box<dyn ArcEraseDyn>> {
None
}
}
impl<T: ?Sized + PagableSerialize + for<'de> PagableBoxDeserialize<'de> + Send + Sync + 'static>
WeakErase for std::sync::Weak<T>
{
fn is_expired(&self) -> bool {
self.strong_count() == 0
}
fn upgrade_weak(&self) -> Option<Box<dyn ArcEraseDyn>> {
self.upgrade().map(|t| Box::new(t) as _)
}
}
impl<T: ?Sized + PagableSerialize + for<'de> PagableBoxDeserialize<'de> + Send + Sync + 'static>
ArcErase for std::sync::Arc<T>
{
type Weak = std::sync::Weak<T>;
fn dupe_strong(&self) -> Self {
self.dupe()
}
fn erase_type() -> impl ArcEraseType {
StdArcEraseType::<Self>::new()
}
fn identity(&self) -> usize {
Arc::as_ptr(self) as *const () as usize
}
fn downgrade(&self) -> Option<Self::Weak> {
Some(Arc::downgrade(self))
}
fn serialize_inner(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()> {
T::pagable_serialize(self, ser)
}
fn deserialize_inner<'de, D: PagableDeserializer<'de> + ?Sized>(
deser: &mut D,
) -> crate::Result<Self> {
Ok(Arc::from(T::deserialize_box(deser)?))
}
}
impl<T: PagableSerialize + for<'de> PagableDeserialize<'de> + Send + Sync + 'static> ArcErase
for triomphe::Arc<T>
{
type Weak = ();
fn dupe_strong(&self) -> Self {
(*self).clone()
}
fn erase_type() -> impl ArcEraseType {
StdArcEraseType::<Self>::new()
}
fn identity(&self) -> usize {
self.as_ptr() as usize
}
fn downgrade(&self) -> Option<Self::Weak> {
None
}
fn serialize_inner(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()> {
T::pagable_serialize(self, ser)
}
fn deserialize_inner<'de, D: PagableDeserializer<'de> + ?Sized>(
deser: &mut D,
) -> crate::Result<Self> {
Ok(Self::new(T::pagable_deserialize(deser)?))
}
}
impl ArcErase for triomphe::Arc<str> {
type Weak = ();
fn dupe_strong(&self) -> Self {
(*self).clone()
}
fn erase_type() -> impl ArcEraseType {
StdArcEraseType::<Self>::new()
}
fn identity(&self) -> usize {
self.as_ptr() as *const () as usize
}
fn downgrade(&self) -> Option<Self::Weak> {
None
}
fn serialize_inner(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()> {
<str as PagableSerialize>::pagable_serialize(self, ser)
}
fn deserialize_inner<'de, D: PagableDeserializer<'de> + ?Sized>(
deser: &mut D,
) -> crate::Result<Self> {
let s: String = String::pagable_deserialize(deser)?;
Ok(s.into())
}
}
impl<T: PagableSerialize + for<'de> PagableDeserialize<'de> + Send + Sync + 'static> ArcErase
for triomphe::Arc<[T]>
{
type Weak = ();
fn dupe_strong(&self) -> Self {
(*self).clone()
}
fn erase_type() -> impl ArcEraseType {
StdArcEraseType::<Self>::new()
}
fn identity(&self) -> usize {
self.as_ptr() as *const T as usize
}
fn downgrade(&self) -> Option<Self::Weak> {
None
}
fn serialize_inner(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()> {
<[T] as PagableSerialize>::pagable_serialize(self, ser)
}
fn deserialize_inner<'de, D: PagableDeserializer<'de> + ?Sized>(
deser: &mut D,
) -> crate::Result<Self> {
let vec: Vec<_> = <Box<[T]>>::pagable_deserialize(deser)?.into();
Ok(vec.into())
}
}
impl<
H: PagableSerialize + for<'de> PagableDeserialize<'de> + Send + Sync + 'static,
T: PagableSerialize + for<'de> PagableDeserialize<'de> + Send + Sync + 'static,
> ArcErase for triomphe::ThinArc<H, T>
{
type Weak = ();
fn dupe_strong(&self) -> Self {
(*self).clone()
}
fn erase_type() -> impl ArcEraseType {
StdArcEraseType::<Self>::new()
}
fn identity(&self) -> usize {
self.as_ptr() as usize
}
fn downgrade(&self) -> Option<Self::Weak> {
None
}
fn serialize_inner(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()> {
self.header.header.pagable_serialize(ser)?;
self.slice.pagable_serialize(ser)?;
Ok(())
}
fn deserialize_inner<'de, D: PagableDeserializer<'de> + ?Sized>(
deser: &mut D,
) -> crate::Result<Self> {
let header = H::pagable_deserialize(deser)?;
let slice: Box<[T]> = <Box<[T]>>::pagable_deserialize(deser)?;
Ok(Self::from_header_and_iter(
header,
slice.into_vec().into_iter(),
))
}
}
#[async_trait::async_trait(?Send)]
pub trait ArcEraseType: Send + Sync + 'static {
fn type_name(&self) -> &'static str;
}
static_assertions::assert_obj_safe!(ArcEraseType);
#[async_trait::async_trait(?Send)]
impl<W: 'static, A: ArcErase<Weak = W>> ArcEraseType for StdArcEraseType<A> {
fn type_name(&self) -> &'static str {
std::any::type_name::<A>()
}
}
pub struct StdArcEraseType<T: 'static>(std::marker::PhantomData<T>);
impl<T: 'static> Default for StdArcEraseType<T> {
fn default() -> Self {
Self(std::marker::PhantomData)
}
}
impl<T: 'static> StdArcEraseType<T> {
pub fn new() -> Self {
Self::default()
}
}
unsafe impl<T: 'static> Send for StdArcEraseType<T> {}
unsafe impl<T: 'static> Sync for StdArcEraseType<T> {}
impl<W: 'static, A: ArcErase<Weak = W>> StdArcEraseType<A> {}