Add iter_many_manual QueryState method (#8772)
# Objective `QueryState` exposes a `get_manual` and `iter_manual` method. However, there is now `iter_many_manual`. `iter_many_manual` is useful when you have a `&World` (eg: the `world` in a `Scene`) and want to run a query several times on it (eg: iteratively navigate a hierarchy by calling `iter_many` on `Children` component). `iter_many`'s need for a `&mut World` makes the API much less flexible. The exclusive access pattern requires doing some very funky dance and excludes a category of algorithms for hierarchy traversal. ## Solution - Add a `iter_many_manual` method to `QueryState` ### Alternative My current workaround is to use `get_manual`. However, this doesn't benefit from the optimizations on `QueryManyIter`. --- ## Changelog - Add a `iter_many_manual` method to `QueryState`
This commit is contained in:
parent
32faf4cb5c
commit
527d3a5885
@ -652,6 +652,41 @@ impl<Q: WorldQuery, F: ReadOnlyWorldQuery> QueryState<Q, F> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns an [`Iterator`] over the read-only query items generated from an [`Entity`] list.
|
||||||
|
///
|
||||||
|
/// Items are returned in the order of the list of entities.
|
||||||
|
/// Entities that don't match the query are skipped.
|
||||||
|
///
|
||||||
|
/// If `world` archetypes changed since [`Self::update_archetypes`] was last called,
|
||||||
|
/// this will skip entities contained in new archetypes.
|
||||||
|
///
|
||||||
|
/// This can only be called for read-only queries.
|
||||||
|
///
|
||||||
|
/// # See also
|
||||||
|
///
|
||||||
|
/// - [`iter_many`](Self::iter_many) to update archetypes.
|
||||||
|
/// - [`iter_manual`](Self::iter_manual) to iterate over all query items.
|
||||||
|
#[inline]
|
||||||
|
pub fn iter_many_manual<'w, 's, EntityList: IntoIterator>(
|
||||||
|
&'s self,
|
||||||
|
world: &'w World,
|
||||||
|
entities: EntityList,
|
||||||
|
) -> QueryManyIter<'w, 's, Q::ReadOnly, F::ReadOnly, EntityList::IntoIter>
|
||||||
|
where
|
||||||
|
EntityList::Item: Borrow<Entity>,
|
||||||
|
{
|
||||||
|
self.validate_world(world);
|
||||||
|
// SAFETY: query is read only, world id is validated
|
||||||
|
unsafe {
|
||||||
|
self.as_readonly().iter_many_unchecked_manual(
|
||||||
|
entities,
|
||||||
|
world,
|
||||||
|
world.last_change_tick(),
|
||||||
|
world.read_change_tick(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns an iterator over the query items generated from an [`Entity`] list.
|
/// Returns an iterator over the query items generated from an [`Entity`] list.
|
||||||
///
|
///
|
||||||
/// Items are returned in the order of the list of entities.
|
/// Items are returned in the order of the list of entities.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user