use crate::generation::r#ref::GenerationRef;
use crate::object::DynObjectPtr;
use crate::pointer::{GcMemberPtr, GcPtr};
use crate::prelude::GcMemberPtrNew;
use std::fmt;
use std::pin::Pin;
#[derive(Clone)]
pub struct Metadata {
this_object: Pin<DynObjectPtr>,
}
impl fmt::Debug for Metadata {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
if self.this_object.has_data() {
f.write_str("Metadata(initialized)")
} else {
f.write_str("Metadata(uninitialized object)")
}
}
}
impl Metadata {
#[inline]
pub(crate) const fn new(this_object: Pin<DynObjectPtr>) -> Metadata {
Metadata { this_object }
}
#[inline]
pub fn generation(&self) -> GenerationRef {
GenerationRef::new_from_ptr(self.this_object.get_generation_ptr())
}
}
impl<T> GcMemberPtrNew<GcPtr<T>, GcMemberPtr<T>> for Metadata
where
T: 'static,
{
#[inline]
fn new_pointer(&self, sp: GcPtr<T>) -> GcMemberPtr<T> {
GcMemberPtr::new_ptr(self.this_object.clone(), sp)
}
}
#[cfg(feature = "multi_thread")]
impl<T> GcMemberPtrNew<crate::pointer::sync::GcMtPtr<T>, GcMemberPtr<T>> for Metadata
where
T: 'static + Send + Sync,
{
#[inline]
fn new_pointer(&self, sp: crate::pointer::sync::GcMtPtr<T>) -> GcMemberPtr<T> {
GcMemberPtr::new_mt_ptr(self.this_object.clone(), sp)
}
}
#[cfg(feature = "multi_thread")]
impl<T> GcMemberPtrNew<crate::pointer::sync::GcMtPtr<T>, crate::pointer::sync::GcMtMemberPtr<T>>
for Metadata
where
T: 'static + Send + Sync,
{
#[inline]
fn new_pointer(
&self,
sp: crate::pointer::sync::GcMtPtr<T>,
) -> crate::pointer::sync::GcMtMemberPtr<T> {
crate::pointer::sync::GcMtMemberPtr::new_ptr(self.this_object.clone(), sp)
}
}
#[cfg(feature = "multi_thread")]
pub(crate) mod sync {
use crate::generation::r#ref::sync::GenerationRef;
use crate::object::DynMTObjectPtr;
use crate::pointer::sync::{GcMtMemberPtr, GcMtPtr};
use crate::prelude::GcMemberPtrNew;
use std::fmt;
use std::pin::Pin;
#[derive(Clone)]
pub struct Metadata {
this_object: Pin<DynMTObjectPtr>,
}
impl fmt::Debug for Metadata {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
if self.this_object.has_data() {
f.write_str("Metadata(initialized)")
} else {
f.write_str("Metadata(uninitialized object)")
}
}
}
impl Metadata {
#[inline]
pub(crate) const fn new(this_object: Pin<DynMTObjectPtr>) -> Metadata {
Metadata { this_object }
}
#[inline]
pub fn generation(&self) -> GenerationRef {
GenerationRef::new_from_ptr(self.this_object.get_generation_ptr())
}
}
impl<T> GcMemberPtrNew<GcMtPtr<T>, GcMtMemberPtr<T>> for Metadata
where
T: 'static + Send + Sync,
{
#[inline]
fn new_pointer(&self, sp: GcMtPtr<T>) -> GcMtMemberPtr<T> {
GcMtMemberPtr::new_mt_ptr(self.this_object.clone(), sp)
}
}
}