simple Debug impls for query iterators (#13476)

# Objective

The current query iterators cannot be used in positions with a `Debug`
bound.
F.e. when they are packaged in `Result` in the error position, `expect`
cannot be called on them.
Required for `QueryManyIter::entities_all_unique` in #13477.

## Solution

Add simple `Debug` impls that print the query iterator names.

## Changelog

`QueryIter`, `QueryManyIter`, `QueryCombinationIter`, and
`QuerySortedIter` now implement `Debug`.
This commit is contained in:
Vic 2024-05-22 20:56:09 +02:00 committed by GitHub
parent dda7a744cf
commit c4cedb12c8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -6,7 +6,14 @@ use crate::{
storage::{Table, TableRow, Tables}, storage::{Table, TableRow, Tables},
world::unsafe_world_cell::UnsafeWorldCell, world::unsafe_world_cell::UnsafeWorldCell,
}; };
use std::{borrow::Borrow, cmp::Ordering, iter::FusedIterator, mem::MaybeUninit, ops::Range}; use std::{
borrow::Borrow,
cmp::Ordering,
fmt::{self, Debug, Formatter},
iter::FusedIterator,
mem::MaybeUninit,
ops::Range,
};
use super::{QueryData, QueryFilter, ReadOnlyQueryData}; use super::{QueryData, QueryFilter, ReadOnlyQueryData};
@ -857,6 +864,12 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Iterator for QueryIter<'w, 's, D, F>
// This is correct as [`QueryIter`] always returns `None` once exhausted. // This is correct as [`QueryIter`] always returns `None` once exhausted.
impl<'w, 's, D: QueryData, F: QueryFilter> FusedIterator for QueryIter<'w, 's, D, F> {} impl<'w, 's, D: QueryData, F: QueryFilter> FusedIterator for QueryIter<'w, 's, D, F> {}
impl<'w, 's, D: QueryData, F: QueryFilter> Debug for QueryIter<'w, 's, D, F> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.debug_struct("QueryIter").finish()
}
}
/// An [`Iterator`] over sorted query results of a [`Query`](crate::system::Query). /// An [`Iterator`] over sorted query results of a [`Query`](crate::system::Query).
/// ///
/// This struct is created by the [`QueryIter::sort`], [`QueryIter::sort_unstable`], /// This struct is created by the [`QueryIter::sort`], [`QueryIter::sort_unstable`],
@ -985,6 +998,14 @@ where
{ {
} }
impl<'w, 's, D: QueryData, F: QueryFilter, I: Iterator<Item = Entity>> Debug
for QuerySortedIter<'w, 's, D, F, I>
{
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.debug_struct("QuerySortedIter").finish()
}
}
/// An [`Iterator`] over the query items generated from an iterator of [`Entity`]s. /// An [`Iterator`] over the query items generated from an iterator of [`Entity`]s.
/// ///
/// Items are returned in the order of the provided iterator. /// Items are returned in the order of the provided iterator.
@ -1131,6 +1152,15 @@ where
{ {
} }
impl<'w, 's, D: QueryData, F: QueryFilter, I: Iterator> Debug for QueryManyIter<'w, 's, D, F, I>
where
I::Item: Borrow<Entity>,
{
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.debug_struct("QueryManyIter").finish()
}
}
/// An iterator over `K`-sized combinations of query items without repetition. /// An iterator over `K`-sized combinations of query items without repetition.
/// ///
/// A combination is an arrangement of a collection of items where order does not matter. /// A combination is an arrangement of a collection of items where order does not matter.
@ -1364,6 +1394,14 @@ impl<'w, 's, D: ReadOnlyQueryData, F: QueryFilter, const K: usize> FusedIterator
{ {
} }
impl<'w, 's, D: QueryData, F: QueryFilter, const K: usize> Debug
for QueryCombinationIter<'w, 's, D, F, K>
{
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.debug_struct("QueryCombinationIter").finish()
}
}
struct QueryIterationCursor<'w, 's, D: QueryData, F: QueryFilter> { struct QueryIterationCursor<'w, 's, D: QueryData, F: QueryFilter> {
storage_id_iter: std::slice::Iter<'s, StorageId>, storage_id_iter: std::slice::Iter<'s, StorageId>,
table_entities: &'w [Entity], table_entities: &'w [Entity],