Skip to content

Commit

Permalink
Merge pull request #13 from spastorino/change-struct-repr
Browse files Browse the repository at this point in the history
Change struct representation to transparent
  • Loading branch information
tmandry authored Aug 26, 2024
2 parents 294dadb + 70f18a0 commit d5c5995
Show file tree
Hide file tree
Showing 9 changed files with 177 additions and 374 deletions.
46 changes: 0 additions & 46 deletions dynosaur/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,49 +1,3 @@
#![doc = include_str!("../../README.md")]

pub use dynosaur_derive::*;

pub mod macro_lib {
pub struct Ref<T> {
t: T,
}

impl<T> Ref<T> {
pub unsafe fn new(t: T) -> Self {
Self { t }
}
}

impl<T> std::ops::Deref for Ref<T> {
type Target = T;

fn deref(&self) -> &T {
&self.t
}
}

/// Newtype that permits borrowed (`&mut T`) or shared (`&T`) access,
/// but nothing else.
pub struct RefMut<T> {
t: T,
}

impl<T> RefMut<T> {
pub fn new(t: T) -> Self {
Self { t }
}
}

impl<T> std::ops::Deref for RefMut<T> {
type Target = T;

fn deref(&self) -> &T {
&self.t
}
}

impl<T> std::ops::DerefMut for RefMut<T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.t
}
}
}
55 changes: 20 additions & 35 deletions dynosaur/tests/pass/basic-mut.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -27,56 +27,41 @@ mod _dynosaur_macro_DynMyTrait {
Box::pin(<Self as MyTrait>::foo(self))
}
}
#[repr(transparent)]
pub struct DynMyTrait<'dynosaur_struct> {
ptr: *mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: bool,
ptr: dyn ErasedMyTrait + 'dynosaur_struct,
}
impl<'dynosaur_struct> MyTrait for DynMyTrait<'dynosaur_struct> {
fn foo(&mut self) -> impl ::core::future::Future<Output = ()> {
let fut:
::core::pin::Pin<Box<dyn ::core::future::Future<Output =
()> + '_>> = unsafe { &mut *self.ptr }.foo();
()> + '_>> = self.ptr.foo();
let fut:
::core::pin::Pin<Box<dyn ::core::future::Future<Output =
()> + 'static>> = unsafe { ::core::mem::transmute(fut) };
fut
}
}
impl<'dynosaur_struct> DynMyTrait<'dynosaur_struct> {
pub fn new<DYNOSAUR>(value: DYNOSAUR) -> Self where
DYNOSAUR: MyTrait + 'dynosaur_struct {
let value = Box::new(value);
Self {
ptr: Box::into_raw(value as
Box<dyn ErasedMyTrait + 'dynosaur_struct>) as
*mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: true,
}
pub fn new(value: Box<impl MyTrait + 'dynosaur_struct>)
-> Box<DynMyTrait<'dynosaur_struct>> {
let value: Box<dyn ErasedMyTrait + 'dynosaur_struct> = value;
unsafe { ::core::mem::transmute(value) }
}
pub fn from_ref<DYNOSAUR>(value: &'dynosaur_struct DYNOSAUR)
-> ::dynosaur::macro_lib::Ref<Self> where DYNOSAUR: MyTrait +
'dynosaur_struct {
let this =
Self {
ptr: value as
&'dynosaur_struct (dyn ErasedMyTrait + 'dynosaur_struct) as
*const (dyn ErasedMyTrait + 'dynosaur_struct) as
*mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: false,
};
unsafe { ::dynosaur::macro_lib::Ref::new(this) }
pub fn boxed(value: impl MyTrait + 'dynosaur_struct)
-> Box<DynMyTrait<'dynosaur_struct>> {
Self::new(Box::new(value))
}
pub fn from_mut<DYNOSAUR>(value: &'dynosaur_struct mut DYNOSAUR)
-> ::dynosaur::macro_lib::RefMut<Self> where DYNOSAUR: MyTrait +
'dynosaur_struct {
let this =
Self {
ptr: value as
&'dynosaur_struct mut (dyn ErasedMyTrait + 'dynosaur_struct)
as *mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: false,
};
unsafe { ::dynosaur::macro_lib::RefMut::new(this) }
pub fn from_ref(value: &(impl MyTrait + 'dynosaur_struct))
-> &DynMyTrait<'dynosaur_struct> {
let value: &(dyn ErasedMyTrait + 'dynosaur_struct) = &*value;
unsafe { ::core::mem::transmute(value) }
}
pub fn from_mut(value: &mut (impl MyTrait + 'dynosaur_struct))
-> &mut DynMyTrait<'dynosaur_struct> {
let value: &mut (dyn ErasedMyTrait + 'dynosaur_struct) =
&mut *value;
unsafe { ::core::mem::transmute(value) }
}
}
}
Expand Down
55 changes: 20 additions & 35 deletions dynosaur/tests/pass/basic-no-ret.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -27,56 +27,41 @@ mod _dynosaur_macro_DynMyTrait {
Box::pin(<Self as MyTrait>::foo(self))
}
}
#[repr(transparent)]
pub struct DynMyTrait<'dynosaur_struct> {
ptr: *mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: bool,
ptr: dyn ErasedMyTrait + 'dynosaur_struct,
}
impl<'dynosaur_struct> MyTrait for DynMyTrait<'dynosaur_struct> {
fn foo(&self) -> impl ::core::future::Future<Output = ()> {
let fut:
::core::pin::Pin<Box<dyn ::core::future::Future<Output =
()> + '_>> = unsafe { &*self.ptr }.foo();
()> + '_>> = self.ptr.foo();
let fut:
::core::pin::Pin<Box<dyn ::core::future::Future<Output =
()> + 'static>> = unsafe { ::core::mem::transmute(fut) };
fut
}
}
impl<'dynosaur_struct> DynMyTrait<'dynosaur_struct> {
pub fn new<DYNOSAUR>(value: DYNOSAUR) -> Self where
DYNOSAUR: MyTrait + 'dynosaur_struct {
let value = Box::new(value);
Self {
ptr: Box::into_raw(value as
Box<dyn ErasedMyTrait + 'dynosaur_struct>) as
*mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: true,
}
pub fn new(value: Box<impl MyTrait + 'dynosaur_struct>)
-> Box<DynMyTrait<'dynosaur_struct>> {
let value: Box<dyn ErasedMyTrait + 'dynosaur_struct> = value;
unsafe { ::core::mem::transmute(value) }
}
pub fn from_ref<DYNOSAUR>(value: &'dynosaur_struct DYNOSAUR)
-> ::dynosaur::macro_lib::Ref<Self> where DYNOSAUR: MyTrait +
'dynosaur_struct {
let this =
Self {
ptr: value as
&'dynosaur_struct (dyn ErasedMyTrait + 'dynosaur_struct) as
*const (dyn ErasedMyTrait + 'dynosaur_struct) as
*mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: false,
};
unsafe { ::dynosaur::macro_lib::Ref::new(this) }
pub fn boxed(value: impl MyTrait + 'dynosaur_struct)
-> Box<DynMyTrait<'dynosaur_struct>> {
Self::new(Box::new(value))
}
pub fn from_mut<DYNOSAUR>(value: &'dynosaur_struct mut DYNOSAUR)
-> ::dynosaur::macro_lib::RefMut<Self> where DYNOSAUR: MyTrait +
'dynosaur_struct {
let this =
Self {
ptr: value as
&'dynosaur_struct mut (dyn ErasedMyTrait + 'dynosaur_struct)
as *mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: false,
};
unsafe { ::dynosaur::macro_lib::RefMut::new(this) }
pub fn from_ref(value: &(impl MyTrait + 'dynosaur_struct))
-> &DynMyTrait<'dynosaur_struct> {
let value: &(dyn ErasedMyTrait + 'dynosaur_struct) = &*value;
unsafe { ::core::mem::transmute(value) }
}
pub fn from_mut(value: &mut (impl MyTrait + 'dynosaur_struct))
-> &mut DynMyTrait<'dynosaur_struct> {
let value: &mut (dyn ErasedMyTrait + 'dynosaur_struct) =
&mut *value;
unsafe { ::core::mem::transmute(value) }
}
}
}
Expand Down
56 changes: 20 additions & 36 deletions dynosaur/tests/pass/basic-rpitit.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -25,54 +25,38 @@ mod _dynosaur_macro_DynMyTrait {
Box::pin(<Self as MyTrait>::foo(self))
}
}
#[repr(transparent)]
pub struct DynMyTrait<'dynosaur_struct> {
ptr: *mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: bool,
ptr: dyn ErasedMyTrait + 'dynosaur_struct,
}
impl<'dynosaur_struct> MyTrait for DynMyTrait<'dynosaur_struct> {
fn foo(&self) -> impl Send {
let fut: ::core::pin::Pin<Box<dyn Send + '_>> =
unsafe { &*self.ptr }.foo();
let fut: ::core::pin::Pin<Box<dyn Send + '_>> = self.ptr.foo();
let fut: ::core::pin::Pin<Box<dyn Send + 'static>> =
unsafe { ::core::mem::transmute(fut) };
fut
}
}
impl<'dynosaur_struct> DynMyTrait<'dynosaur_struct> {
pub fn new<DYNOSAUR>(value: DYNOSAUR) -> Self where
DYNOSAUR: MyTrait + 'dynosaur_struct {
let value = Box::new(value);
Self {
ptr: Box::into_raw(value as
Box<dyn ErasedMyTrait + 'dynosaur_struct>) as
*mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: true,
}
pub fn new(value: Box<impl MyTrait + 'dynosaur_struct>)
-> Box<DynMyTrait<'dynosaur_struct>> {
let value: Box<dyn ErasedMyTrait + 'dynosaur_struct> = value;
unsafe { ::core::mem::transmute(value) }
}
pub fn from_ref<DYNOSAUR>(value: &'dynosaur_struct DYNOSAUR)
-> ::dynosaur::macro_lib::Ref<Self> where DYNOSAUR: MyTrait +
'dynosaur_struct {
let this =
Self {
ptr: value as
&'dynosaur_struct (dyn ErasedMyTrait + 'dynosaur_struct) as
*const (dyn ErasedMyTrait + 'dynosaur_struct) as
*mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: false,
};
unsafe { ::dynosaur::macro_lib::Ref::new(this) }
pub fn boxed(value: impl MyTrait + 'dynosaur_struct)
-> Box<DynMyTrait<'dynosaur_struct>> {
Self::new(Box::new(value))
}
pub fn from_mut<DYNOSAUR>(value: &'dynosaur_struct mut DYNOSAUR)
-> ::dynosaur::macro_lib::RefMut<Self> where DYNOSAUR: MyTrait +
'dynosaur_struct {
let this =
Self {
ptr: value as
&'dynosaur_struct mut (dyn ErasedMyTrait + 'dynosaur_struct)
as *mut (dyn ErasedMyTrait + 'dynosaur_struct),
owned: false,
};
unsafe { ::dynosaur::macro_lib::RefMut::new(this) }
pub fn from_ref(value: &(impl MyTrait + 'dynosaur_struct))
-> &DynMyTrait<'dynosaur_struct> {
let value: &(dyn ErasedMyTrait + 'dynosaur_struct) = &*value;
unsafe { ::core::mem::transmute(value) }
}
pub fn from_mut(value: &mut (impl MyTrait + 'dynosaur_struct))
-> &mut DynMyTrait<'dynosaur_struct> {
let value: &mut (dyn ErasedMyTrait + 'dynosaur_struct) =
&mut *value;
unsafe { ::core::mem::transmute(value) }
}
}
}
Expand Down
66 changes: 26 additions & 40 deletions dynosaur/tests/pass/basic-with-self.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,17 @@ mod _dynosaur_macro_DynMyTrait {
Box::pin(<Self as MyTrait>::foo(self))
}
}
#[repr(transparent)]
pub struct DynMyTrait<'dynosaur_struct, Item> {
ptr: *mut (dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct),
owned: bool,
ptr: dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct,
}
impl<'dynosaur_struct, Item> MyTrait for
DynMyTrait<'dynosaur_struct, Item> {
type Item = Item;
fn foo(&self) -> impl ::core::future::Future<Output = Self::Item> {
let fut:
::core::pin::Pin<Box<dyn ::core::future::Future<Output =
Self::Item> + '_>> = unsafe { &*self.ptr }.foo();
Self::Item> + '_>> = self.ptr.foo();
let fut:
::core::pin::Pin<Box<dyn ::core::future::Future<Output =
Self::Item> + 'static>> =
Expand All @@ -51,45 +51,31 @@ mod _dynosaur_macro_DynMyTrait {
}
}
impl<'dynosaur_struct, Item> DynMyTrait<'dynosaur_struct, Item> {
pub fn new<DYNOSAUR>(value: DYNOSAUR) -> Self where
DYNOSAUR: MyTrait<Item = Item> + 'dynosaur_struct,
Item: 'dynosaur_struct {
let value = Box::new(value);
Self {
ptr: Box::into_raw(value as
Box<dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct>) as
*mut (dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct),
owned: true,
}
pub fn new(value: Box<impl MyTrait<Item = Item> + 'dynosaur_struct>)
-> Box<DynMyTrait<'dynosaur_struct, Item>> {
let value:
Box<dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct> =
value;
unsafe { ::core::mem::transmute(value) }
}
pub fn from_ref<DYNOSAUR>(value: &'dynosaur_struct DYNOSAUR)
-> ::dynosaur::macro_lib::Ref<Self> where
DYNOSAUR: MyTrait<Item = Item> + 'dynosaur_struct,
Item: 'dynosaur_struct {
let this =
Self {
ptr: value as
&'dynosaur_struct (dyn ErasedMyTrait<Item = Item> +
'dynosaur_struct) as
*const (dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct)
as *mut (dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct),
owned: false,
};
unsafe { ::dynosaur::macro_lib::Ref::new(this) }
pub fn boxed(value: impl MyTrait<Item = Item> + 'dynosaur_struct)
-> Box<DynMyTrait<'dynosaur_struct, Item>> {
Self::new(Box::new(value))
}
pub fn from_mut<DYNOSAUR>(value: &'dynosaur_struct mut DYNOSAUR)
-> ::dynosaur::macro_lib::RefMut<Self> where
DYNOSAUR: MyTrait<Item = Item> + 'dynosaur_struct,
Item: 'dynosaur_struct {
let this =
Self {
ptr: value as
&'dynosaur_struct mut (dyn ErasedMyTrait<Item = Item> +
'dynosaur_struct) as
*mut (dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct),
owned: false,
};
unsafe { ::dynosaur::macro_lib::RefMut::new(this) }
pub fn from_ref(value:
&(impl MyTrait<Item = Item> + 'dynosaur_struct))
-> &DynMyTrait<'dynosaur_struct, Item> {
let value: &(dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct) =
&*value;
unsafe { ::core::mem::transmute(value) }
}
pub fn from_mut(value:
&mut (impl MyTrait<Item = Item> + 'dynosaur_struct))
-> &mut DynMyTrait<'dynosaur_struct, Item> {
let value:
&mut (dyn ErasedMyTrait<Item = Item> + 'dynosaur_struct) =
&mut *value;
unsafe { ::core::mem::transmute(value) }
}
}
}
Expand Down
Loading

0 comments on commit d5c5995

Please sign in to comment.