Implement Clone for Fetches (#2641)
# Objective
This:
```rust
use bevy::prelude::*;
fn main() {
    App::new()
    .add_system(test)
    .run();
}
fn test(entities: Query<Entity>) {
    let mut combinations = entities.iter_combinations_mut();
    while let Some([e1, e2]) = combinations.fetch_next() {    
        dbg!(e1);
    }
}
```
fails with the message "the trait bound `bevy::ecs::query::EntityFetch: std::clone::Clone` is not satisfied". 
## Solution
It works after adding the naive clone implementation to EntityFetch. I'm not super familiar with ECS internals, so I'd appreciate input on this.
			
			
This commit is contained in:
		
							parent
							
								
									6aedb2500a
								
							
						
					
					
						commit
						96f0e02728
					
				@ -137,6 +137,7 @@ impl WorldQuery for Entity {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// The [`Fetch`] of [`Entity`].
 | 
			
		||||
#[derive(Clone)]
 | 
			
		||||
pub struct EntityFetch {
 | 
			
		||||
    entities: *const Entity,
 | 
			
		||||
}
 | 
			
		||||
@ -573,6 +574,7 @@ impl<T: WorldQuery> WorldQuery for Option<T> {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// The [`Fetch`] of `Option<T>`.
 | 
			
		||||
#[derive(Clone)]
 | 
			
		||||
pub struct OptionFetch<T> {
 | 
			
		||||
    fetch: T,
 | 
			
		||||
    matches: bool,
 | 
			
		||||
@ -807,6 +809,21 @@ pub struct ChangeTrackersFetch<T> {
 | 
			
		||||
    change_tick: u32,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T> Clone for ChangeTrackersFetch<T> {
 | 
			
		||||
    fn clone(&self) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            storage_type: self.storage_type,
 | 
			
		||||
            table_ticks: self.table_ticks,
 | 
			
		||||
            entity_table_rows: self.entity_table_rows,
 | 
			
		||||
            entities: self.entities,
 | 
			
		||||
            sparse_set: self.sparse_set,
 | 
			
		||||
            marker: self.marker,
 | 
			
		||||
            last_change_tick: self.last_change_tick,
 | 
			
		||||
            change_tick: self.change_tick,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// SAFETY: access is read only
 | 
			
		||||
unsafe impl<T> ReadOnlyFetch for ChangeTrackersFetch<T> {}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user