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 std::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(std::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
Ptr
points to theReflect
type thisReflectFromPtr
was 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
PtrMut
points to theReflect
type thisReflectFromPtr
was 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§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)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>
. Box<dyn Any>
can
then be further downcast
into Box<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>
. Rc<Any>
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.