pub struct ReflectFromPtr { /* private fields */ }Expand description
Reflect values are commonly used in situations where the actual types of values
are not known at runtime. In such situations you might have access to a *const () pointer
that you know implements Reflect, but have no way of turning it into a &dyn Reflect.
This is where ReflectFromPtr comes in, when creating a ReflectFromPtr for a given type T: Reflect.
Internally, this saves a concrete function *const T -> const dyn Reflect which lets you create a trait object of Reflect
from a pointer.
§Example
use bevy_reflect::{TypeRegistry, Reflect, ReflectFromPtr};
use bevy_ptr::Ptr;
use core::ptr::NonNull;
#[derive(Reflect)]
struct Reflected(String);
let mut type_registry = TypeRegistry::default();
type_registry.register::<Reflected>();
let mut value = Reflected("Hello world!".to_string());
let value = Ptr::from(&value);
let reflect_data = type_registry.get(core::any::TypeId::of::<Reflected>()).unwrap();
let reflect_from_ptr = reflect_data.data::<ReflectFromPtr>().unwrap();
// SAFE: `value` is of type `Reflected`, which the `ReflectFromPtr` was created for
let value = unsafe { reflect_from_ptr.as_reflect(value) };
assert_eq!(value.downcast_ref::<Reflected>().unwrap().0, "Hello world!");Implementations§
Source§impl ReflectFromPtr
impl ReflectFromPtr
Sourcepub fn type_id(&self) -> TypeId
pub fn type_id(&self) -> TypeId
Returns the TypeId that the ReflectFromPtr was constructed for.
Sourcepub unsafe fn as_reflect<'a>(&self, val: Ptr<'a>) -> &'a dyn Reflect
pub unsafe fn as_reflect<'a>(&self, val: Ptr<'a>) -> &'a dyn Reflect
Convert Ptr into &dyn Reflect.
§Safety
val must be a pointer to value of the type that the ReflectFromPtr was constructed for.
This can be verified by checking that the type id returned by ReflectFromPtr::type_id is the expected one.
Sourcepub unsafe fn as_reflect_mut<'a>(&self, val: PtrMut<'a>) -> &'a mut dyn Reflect
pub unsafe fn as_reflect_mut<'a>(&self, val: PtrMut<'a>) -> &'a mut dyn Reflect
Convert PtrMut into &mut dyn Reflect.
§Safety
val must be a pointer to a value of the type that the ReflectFromPtr was constructed for
This can be verified by checking that the type id returned by ReflectFromPtr::type_id is the expected one.
Sourcepub fn from_ptr(&self) -> unsafe fn(Ptr<'_>) -> &dyn Reflect
pub fn from_ptr(&self) -> unsafe fn(Ptr<'_>) -> &dyn Reflect
Get a function pointer to turn a Ptr into &dyn Reflect for
the type this ReflectFromPtr was constructed for.
§Safety
When calling the unsafe function returned by this method you must ensure that:
- The input
Ptrpoints to theReflecttype thisReflectFromPtrwas constructed for.
Sourcepub fn from_ptr_mut(&self) -> unsafe fn(PtrMut<'_>) -> &mut dyn Reflect
pub fn from_ptr_mut(&self) -> unsafe fn(PtrMut<'_>) -> &mut dyn Reflect
Get a function pointer to turn a PtrMut into &mut dyn Reflect for
the type this ReflectFromPtr was constructed for.
§Safety
When calling the unsafe function returned by this method you must ensure that:
- The input
PtrMutpoints to theReflecttype thisReflectFromPtrwas constructed for.
Trait Implementations§
Source§impl Clone for ReflectFromPtr
impl Clone for ReflectFromPtr
Source§fn clone(&self) -> ReflectFromPtr
fn clone(&self) -> ReflectFromPtr
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for ReflectFromPtr
impl RefUnwindSafe for ReflectFromPtr
impl Send for ReflectFromPtr
impl Sync for ReflectFromPtr
impl Unpin for ReflectFromPtr
impl UnwindSafe for ReflectFromPtr
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.