change return type of World::resource_ref to Ref (#15263)
# Objective Closes #11825 ## Solution Change return type of `get_resource_ref` and `resource_ref` from `Res` to `Ref` and implement `From Res<T> for Ref<T>`.
This commit is contained in:
parent
417e6ccaf1
commit
66a474a9d9
@ -587,6 +587,19 @@ impl<'w, T: Resource> From<ResMut<'w, T>> for Res<'w, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'w, T: Resource> From<Res<'w, T>> for Ref<'w, T> {
|
||||||
|
/// Convert a `Res` into a `Ref`. This allows keeping the change-detection feature of `Ref`
|
||||||
|
/// while losing the specificity of `Res` for resources.
|
||||||
|
fn from(res: Res<'w, T>) -> Self {
|
||||||
|
Self {
|
||||||
|
value: res.value,
|
||||||
|
ticks: res.ticks,
|
||||||
|
#[cfg(feature = "track_change_detection")]
|
||||||
|
changed_by: res.changed_by,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'w, 'a, T: Resource> IntoIterator for &'a Res<'w, T>
|
impl<'w, 'a, T: Resource> IntoIterator for &'a Res<'w, T>
|
||||||
where
|
where
|
||||||
&'a T: IntoIterator,
|
&'a T: IntoIterator,
|
||||||
|
|||||||
@ -40,7 +40,7 @@ use crate::{
|
|||||||
removal_detection::RemovedComponentEvents,
|
removal_detection::RemovedComponentEvents,
|
||||||
schedule::{Schedule, ScheduleLabel, Schedules},
|
schedule::{Schedule, ScheduleLabel, Schedules},
|
||||||
storage::{ResourceData, Storages},
|
storage::{ResourceData, Storages},
|
||||||
system::{Commands, Res, Resource},
|
system::{Commands, Resource},
|
||||||
world::{command_queue::RawCommandQueue, error::TryRunScheduleError},
|
world::{command_queue::RawCommandQueue, error::TryRunScheduleError},
|
||||||
};
|
};
|
||||||
use bevy_ptr::{OwningPtr, Ptr};
|
use bevy_ptr::{OwningPtr, Ptr};
|
||||||
@ -1612,7 +1612,7 @@ impl World {
|
|||||||
/// use [`get_resource_or_insert_with`](World::get_resource_or_insert_with).
|
/// use [`get_resource_or_insert_with`](World::get_resource_or_insert_with).
|
||||||
#[inline]
|
#[inline]
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn resource_ref<R: Resource>(&self) -> Res<R> {
|
pub fn resource_ref<R: Resource>(&self) -> Ref<R> {
|
||||||
match self.get_resource_ref() {
|
match self.get_resource_ref() {
|
||||||
Some(x) => x,
|
Some(x) => x,
|
||||||
None => panic!(
|
None => panic!(
|
||||||
@ -1660,7 +1660,7 @@ impl World {
|
|||||||
|
|
||||||
/// Gets a reference including change detection to the resource of the given type if it exists.
|
/// Gets a reference including change detection to the resource of the given type if it exists.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get_resource_ref<R: Resource>(&self) -> Option<Res<R>> {
|
pub fn get_resource_ref<R: Resource>(&self) -> Option<Ref<R>> {
|
||||||
// SAFETY:
|
// SAFETY:
|
||||||
// - `as_unsafe_world_cell_readonly` gives permission to access everything immutably
|
// - `as_unsafe_world_cell_readonly` gives permission to access everything immutably
|
||||||
// - `&self` ensures nothing in world is borrowed mutably
|
// - `&self` ensures nothing in world is borrowed mutably
|
||||||
@ -2400,7 +2400,7 @@ impl World {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Runs both [`clear_entities`](Self::clear_entities) and [`clear_resources`](Self::clear_resources),
|
/// Runs both [`clear_entities`](Self::clear_entities) and [`clear_resources`](Self::clear_resources),
|
||||||
/// invalidating all [`Entity`] and resource fetches such as [`Res`], [`ResMut`](crate::system::ResMut)
|
/// invalidating all [`Entity`] and resource fetches such as [`Res`](crate::system::Res), [`ResMut`](crate::system::ResMut)
|
||||||
pub fn clear_all(&mut self) {
|
pub fn clear_all(&mut self) {
|
||||||
self.clear_entities();
|
self.clear_entities();
|
||||||
self.clear_resources();
|
self.clear_resources();
|
||||||
|
|||||||
@ -14,7 +14,7 @@ use crate::{
|
|||||||
query::{DebugCheckedUnwrap, ReadOnlyQueryData},
|
query::{DebugCheckedUnwrap, ReadOnlyQueryData},
|
||||||
removal_detection::RemovedComponentEvents,
|
removal_detection::RemovedComponentEvents,
|
||||||
storage::{ComponentSparseSet, Storages, Table},
|
storage::{ComponentSparseSet, Storages, Table},
|
||||||
system::{Res, Resource},
|
system::Resource,
|
||||||
world::RawCommandQueue,
|
world::RawCommandQueue,
|
||||||
};
|
};
|
||||||
use bevy_ptr::Ptr;
|
use bevy_ptr::Ptr;
|
||||||
@ -353,7 +353,7 @@ impl<'w> UnsafeWorldCell<'w> {
|
|||||||
/// - the [`UnsafeWorldCell`] has permission to access the resource
|
/// - the [`UnsafeWorldCell`] has permission to access the resource
|
||||||
/// - no mutable reference to the resource exists at the same time
|
/// - no mutable reference to the resource exists at the same time
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn get_resource_ref<R: Resource>(self) -> Option<Res<'w, R>> {
|
pub unsafe fn get_resource_ref<R: Resource>(self) -> Option<Ref<'w, R>> {
|
||||||
let component_id = self.components().get_resource_id(TypeId::of::<R>())?;
|
let component_id = self.components().get_resource_id(TypeId::of::<R>())?;
|
||||||
|
|
||||||
// SAFETY: caller ensures `self` has permission to access the resource
|
// SAFETY: caller ensures `self` has permission to access the resource
|
||||||
@ -371,7 +371,7 @@ impl<'w> UnsafeWorldCell<'w> {
|
|||||||
#[cfg(feature = "track_change_detection")]
|
#[cfg(feature = "track_change_detection")]
|
||||||
let caller = unsafe { _caller.deref() };
|
let caller = unsafe { _caller.deref() };
|
||||||
|
|
||||||
Some(Res {
|
Some(Ref {
|
||||||
value,
|
value,
|
||||||
ticks,
|
ticks,
|
||||||
#[cfg(feature = "track_change_detection")]
|
#[cfg(feature = "track_change_detection")]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user