pub
mod any;
mod custom_dyn;
pub
mod fn_once;
use crate::{
marker::{NoAutoTraits, Sendness, Syncness},
prelude::*,
};
use ::core::ptr;
mod ty { pub struct Erased(()); }
pub(in crate)
mod __ {
pub
trait DynCoerce<StackBoxImplTrait> {
fn fatten (it: StackBoxImplTrait)
-> Self
;
}
}
use __::DynCoerce;
impl<'frame, ImplTrait : 'frame> StackBox<'frame, ImplTrait> {
pub
fn into_dyn<StackBoxDynTrait> (self: StackBox<'frame, ImplTrait>)
-> StackBoxDynTrait
where
StackBoxDynTrait : DynCoerce<StackBox<'frame, ImplTrait>>,
{
DynCoerce::fatten(self)
}
}
#[cfg(any(test, doctest))]
mod tests;
#[cfg(test)]
mod my_test {
use ::stackbox::prelude::*;
macro_rules! custom_dyn {
(
@as_item
$item:item
) => (
$item
);
(
$($input:tt)*
) => (
custom_dyn! {@as_item
::stackbox::prelude::custom_dyn! {
$($input)*
}
}
);
}
#[test]
fn fn_once_higher_order_param ()
{
custom_dyn! {
dyn FnOnceRef<Arg> : FnOnce(&Arg)
where {
Arg : ?Sized,
}
{
fn call (
self: Self,
s: &'_ Arg,
)
{
self(s)
}
}
}
let not_send = 42;
stackbox!(let f = |_: &str| { let _ = (not_send, ); });
let f: StackBoxDynFnOnceRef<'_, str, dyn Send + Sync> = f.into_dyn();
let f = |s: &str| f.call(s);
f("");
}
#[test]
fn manual_any_non_owned_receiver ()
{
use ::core::any;
custom_dyn! {
dyn Any<'__> : any::Any
{
fn type_id (self: &'_ Self, __: &'__ ())
-> any::TypeId
{
any::TypeId::of::<Self>()
}
}
}
let it = ();
stackbox!(let it);
let it: StackBoxDynAny<'_, '_> = it.into_dyn();
assert_eq!(it.type_id(&()), any::TypeId::of::<()>());
assert_eq!(it.type_id(&()), any::TypeId::of::<()>());
}
}