Optimize Events::extend and impl std::iter::Extend (#2207)
The previous implementation of `Events::extend` iterated through each event and manually `sent` it via `Events:;send`. However, this could be a minor performance hit since calling `Vec::push` in a loop is not optimal. This refactors the code to use `Vec::extend`.
This commit is contained in:
parent
29bc4e3657
commit
a42343d847
@ -277,7 +277,7 @@ impl<T: Component> Events<T> {
|
||||
id: self.event_count,
|
||||
_marker: PhantomData,
|
||||
};
|
||||
trace!("Events::send() -> {}", event_id);
|
||||
trace!("Events::send() -> id: {}", event_id);
|
||||
|
||||
let event_instance = EventInstance { event_id, event };
|
||||
|
||||
@ -361,15 +361,6 @@ impl<T: Component> Events<T> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn extend<I>(&mut self, events: I)
|
||||
where
|
||||
I: Iterator<Item = T>,
|
||||
{
|
||||
for event in events {
|
||||
self.send(event);
|
||||
}
|
||||
}
|
||||
|
||||
/// Iterates over events that happened since the last "update" call.
|
||||
/// WARNING: You probably don't want to use this call. In most cases you should use an
|
||||
/// `EventReader`. You should only use this if you know you only need to consume events
|
||||
@ -384,6 +375,35 @@ impl<T: Component> Events<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> std::iter::Extend<T> for Events<T> {
|
||||
fn extend<I>(&mut self, iter: I)
|
||||
where
|
||||
I: IntoIterator<Item = T>,
|
||||
{
|
||||
let mut event_count = self.event_count;
|
||||
let events = iter.into_iter().map(|event| {
|
||||
let event_id = EventId {
|
||||
id: event_count,
|
||||
_marker: PhantomData,
|
||||
};
|
||||
event_count += 1;
|
||||
EventInstance { event_id, event }
|
||||
});
|
||||
|
||||
match self.state {
|
||||
State::A => self.events_a.extend(events),
|
||||
State::B => self.events_b.extend(events),
|
||||
}
|
||||
|
||||
trace!(
|
||||
"Events::extend() -> ids: ({}..{})",
|
||||
self.event_count,
|
||||
event_count
|
||||
);
|
||||
self.event_count = event_count;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
@ -526,4 +546,15 @@ mod tests {
|
||||
assert!(events.drain().eq(vec![E(0), E(1)].into_iter()));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_events_extend_impl() {
|
||||
let mut events = Events::<TestEvent>::default();
|
||||
let mut reader = events.get_reader();
|
||||
|
||||
events.extend(vec![TestEvent { i: 0 }, TestEvent { i: 1 }]);
|
||||
assert!(reader
|
||||
.iter(&events)
|
||||
.eq([TestEvent { i: 0 }, TestEvent { i: 1 }].iter()));
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user