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§

source§

impl<T: ?Sized + 'static> Caster<T>

source

pub fn new( cast_ref: fn(_: &dyn Any) -> &T, cast_mut: fn(_: &mut dyn Any) -> &mut T ) -> Self

Create a new caster.

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> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: 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>

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)

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)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.