Struct orzir_core::Caster
source · pub struct Caster<T: ?Sized + 'static> { /* private fields */ }Expand description
A caster for trait-to-trait casting.
Given a trait object and the dyn Target type, first upcast it to dyn Any, then get the caster using the concrete type id fetched from the Any
object, and the type id of the concrete caster Caster<dyn Target>. The
just get the caster from the storage and do the cast.
The caster functions can be simply implemented by downcasting the Any
object to the concrete type and then just let rust do the rest type
checking.
§Example
A caster can be implemented like this:
ⓘ
let caster = Caster::<dyn Target> {
cast_ref: |any| any.downcast_ref::<Concrete>().unwrap() as &dyn Target,
cast_mut: |any| any.downcast_mut::<Concrete>().unwrap() as &mut dyn Target,
}Implementations§
Auto Trait Implementations§
impl<T> Freeze for Caster<T>where
T: ?Sized,
impl<T> RefUnwindSafe for Caster<T>where
T: ?Sized,
impl<T> Send for Caster<T>where
T: ?Sized,
impl<T> Sync for Caster<T>where
T: ?Sized,
impl<T> Unpin for Caster<T>where
T: ?Sized,
impl<T> UnwindSafe for Caster<T>where
T: ?Sized,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.