From 3740bd8ebfddd50f12dfab44a19269a86dba08a5 2020-02-14 11:46:13 From: Christopher Esterhuyse Date: 2020-02-14 11:46:13 Subject: [PATCH] trying out a matrix representation for components --- diff --git a/src/runtime/ecs.rs b/src/runtime/ecs.rs index 184e8eadaeb5e0ba67bd8628ac3568fe4bb311bf..b9f6ce444bceb163f8a742ef50ddc769d42f8c0e 100644 --- a/src/runtime/ecs.rs +++ b/src/runtime/ecs.rs @@ -75,9 +75,6 @@ impl BitSet { } } -#[derive(Debug, Default)] -struct BitMasks(HashMap<(ChannelId, bool), BitSet>); - struct BitChunkIter> { chunk_iter: I, next_bit_index: usize, @@ -158,44 +155,6 @@ impl Iterator for AndChunkIter<'_> { } } -/// Returns an iterator over chunks for bits in range 0..bits_to_go but skipping -/// indices for which ANY of the given bitsets has a 1 -struct NoneChunkIter<'a> { - // this value is not overwritten during iteration - // invariant: !sets.is_empty() - sets: &'a [&'a [u32]], - next_chunk_index: usize, - bits_to_go: usize, -} -impl<'a> NoneChunkIter<'a> { - /// a set of bitsets. the u32s of each are in ascending order of significant digits - /// i.e., &[0,1] means {1<<32, 0} while &[0,1] is identical to &[1] and means {1}. - fn new(sets: &'a [&'a [u32]], max_bit: usize) -> Self { - let sets = if sets.is_empty() { &[&[] as &[_]] } else { sets }; - Self { sets, next_chunk_index: 0, bits_to_go: max_bit } - } -} -impl Iterator for NoneChunkIter<'_> { - type Item = u32; - fn next(&mut self) -> Option { - let neutral = match self.bits_to_go { - 0 => None, - x @ 1..=31 => Some(!0u32 >> (32 - x)), - _ => Some(!0u32), - }; - self.bits_to_go = self.bits_to_go.saturating_sub(32); - - let old_chunk_index = self.next_chunk_index; - self.next_chunk_index += 1; - - self.sets.iter().fold(neutral, move |a, b| { - let a = a?; - let b = *b.get(old_chunk_index)?; - Some(a & !b) - }) - } -} - #[test] fn test_bit_iter() { static SETS: &[&[u32]] = &[ @@ -203,8 +162,7 @@ fn test_bit_iter() { &[0b101001, 0b101001], &[0b100001, 0b101001], ]; - let _ = BitChunkIter::new(AndChunkIter::new(SETS)); - let iter = BitChunkIter::new(NoneChunkIter::new(SETS, 9)); + let iter = BitChunkIter::new(AndChunkIter::new(SETS)); let indices = iter.collect::>(); println!("indices {:?}", indices); }