#![no_std]
use core::{any::TypeId, cell::Cell};
extern crate alloc;
use alloc::{borrow::Cow, collections::BTreeMap};
pub type DynamicType<'r> = Cow<'r, ReflectedType<'r>>;
pub type StaticType = DynamicType<'static>;
#[cfg(feature = "derive")]
extern crate refloctopus_derive;
#[doc(hidden)]
pub use memoffset;
#[cfg(feature = "derive")]
#[doc(hidden)]
pub use refloctopus_derive::*;
mod db;
mod metadata;
pub use db::*;
pub use metadata::*;
#[cfg(feature = "use_serde")]
mod de;
#[cfg(feature = "use_serde")]
mod ser;
#[cfg(feature = "use_serde")]
pub(crate) use de::*;
#[cfg(feature = "use_serde")]
pub(crate) use ser::*;
#[cfg(feature = "use_serde")]
type DeserializeTrampoline =
fn(&mut dyn erased_serde::Deserializer, &ShapedOutputLocation) -> erased_serde::Result<()>;
pub unsafe trait Reflect {
type Key: 'static;
fn rust_type() -> StaticType;
fn register(db: &mut Db<'_>);
}
pub trait StaticReflect: Reflect {
const RUST_TYPE: &'static StaticType;
const FIELDS: &'static FieldsStorage<'static>;
}
pub struct ShapedOutputLocation<'data, 'visitor, 'fields> {
ptr: *mut u8,
shape: &'visitor DataShape<'visitor>,
fields: &'visitor FieldsCursor<'fields>,
_data: core::marker::PhantomData<&'data mut ()>,
}
impl<'data, 'visitor, 'fields> ShapedOutputLocation<'data, 'visitor, 'fields> {
pub unsafe fn new(
shape: &'visitor DataShape<'visitor>,
fields: &'visitor FieldsCursor<'fields>,
ptr: *mut u8,
) -> Self {
let _data = Default::default();
ShapedOutputLocation {
shape,
ptr,
fields,
_data,
}
}
unsafe fn write_discriminant(&self, disc: u16) {
self.ptr.cast::<u16>().write(disc)
}
}
pub struct ShapedLocation<'db, 'data, 'fields> {
shape: &'db DataShape<'db>,
ptr: *const u8,
fields: FieldsStorage<'fields>,
_data: core::marker::PhantomData<&'data ()>,
}
impl<'db, 'data, 'fields> ShapedLocation<'db, 'data, 'fields> {
unsafe fn read_discriminant(&self) -> u16 {
debug_assert!(matches!(self.shape, DataShape::Enum { .. }));
self.ptr.cast::<u16>().read()
}
pub(crate) unsafe fn reshape(&'fields self, shape: &'db DataShape<'db>) -> Self {
ShapedLocation {
shape,
ptr: self.ptr,
fields: self.fields.borrow(),
_data: Default::default(),
}
}
pub unsafe fn new(
ty: &'db DynamicType<'db>,
fields: FieldsStorage<'fields>,
ptr: *const u8,
) -> ShapedLocation<'db, 'data, 'fields> {
let _data = Default::default();
ShapedLocation {
shape: &ty.shape,
fields,
ptr,
_data,
}
}
pub unsafe fn from_shape<'z>(
shape: &'db DataShape<'db>,
fields: FieldsStorage<'z>,
ptr: *const u8,
) -> ShapedLocation<'db, 'data, 'z> {
let _data = Default::default();
ShapedLocation {
shape,
fields,
ptr,
_data,
}
}
}
impl<'db, 'data, T: StaticReflect> From<&'data mut T> for ShapedLocation<'db, 'data, 'static> {
fn from(v: &'data mut T) -> Self {
Self {
shape: &T::RUST_TYPE.shape,
ptr: v as *mut _ as *const _,
_data: Default::default(),
fields: FieldsStorage::from_inner(Cow::Borrowed(&T::FIELDS.area)),
}
}
}
impl<'a, T: StaticReflect> From<&'a T> for ShapedLocation<'static, 'a, 'a> {
fn from(v: &'a T) -> Self {
Self {
shape: &T::RUST_TYPE.shape,
ptr: v as *const _ as *const _,
_data: Default::default(),
fields: FieldsStorage::from_inner(Cow::Borrowed(&T::FIELDS.area)),
}
}
}
#[repr(C)]
pub(crate) struct TraitObject {
pub(crate) data: *mut (),
pub(crate) vtable: *mut (),
}