Add a keys() iterator to EntityMap.

This commit is contained in:
Jakob Stoklund Olesen
2016-07-22 14:10:39 -07:00
parent 8296e92ddc
commit ba76f444ab

View File

@@ -81,6 +81,15 @@ impl<K, V> EntityMap<K, V>
pub fn len(&self) -> usize { pub fn len(&self) -> usize {
self.elems.len() self.elems.len()
} }
/// Iterate over all the keys in this map.
pub fn keys(&self) -> Keys<K> {
Keys {
pos: 0,
len: self.elems.len(),
unused: PhantomData,
}
}
} }
/// Additional methods for value types that implement `Clone` and `Default`. /// Additional methods for value types that implement `Clone` and `Default`.
@@ -127,12 +136,37 @@ impl<K, V> IndexMut<K> for EntityMap<K, V>
} }
} }
/// Iterate over all keys in order.
pub struct Keys<K>
where K: EntityRef
{
pos: usize,
len: usize,
unused: PhantomData<K>,
}
impl<K> Iterator for Keys<K>
where K: EntityRef
{
type Item = K;
fn next(&mut self) -> Option<Self::Item> {
if self.pos < self.len {
let k = K::new(self.pos);
self.pos += 1;
Some(k)
} else {
None
}
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
// EntityRef impl for testing. // EntityRef impl for testing.
#[derive(Clone, Copy, PartialEq, Eq)] #[derive(Clone, Copy, Debug, PartialEq, Eq)]
struct E(u32); struct E(u32);
impl EntityRef for E { impl EntityRef for E {
@@ -151,6 +185,9 @@ mod tests {
let r2 = E(2); let r2 = E(2);
let mut m = EntityMap::new(); let mut m = EntityMap::new();
let v: Vec<E> = m.keys().collect();
assert_eq!(v, []);
assert!(!m.is_valid(r0)); assert!(!m.is_valid(r0));
m.ensure(r2); m.ensure(r2);
m[r2] = 3; m[r2] = 3;
@@ -160,6 +197,9 @@ mod tests {
assert_eq!(m[r1], 5); assert_eq!(m[r1], 5);
assert_eq!(m[r2], 3); assert_eq!(m[r2], 3);
let v: Vec<E> = m.keys().collect();
assert_eq!(v, [r0, r1, r2]);
let shared = &m; let shared = &m;
assert_eq!(shared[r0], 0); assert_eq!(shared[r0], 0);
assert_eq!(shared[r1], 5); assert_eq!(shared[r1], 5);