diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2017-08-09 13:56:19 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2017-08-09 13:56:19 -0700 |
| commit | 352577f4bb7c0214570db062d84dc69004348769 (patch) | |
| tree | 7e4e0e77578865cf5b104161d25cc0a2e881d612 /src/librustc_data_structures | |
| parent | c25ddf21f18c3eeeaea2a4dffd70d2f6183068b5 (diff) | |
| download | rust-352577f4bb7c0214570db062d84dc69004348769.tar.gz rust-352577f4bb7c0214570db062d84dc69004348769.zip | |
Initial pass review comments
Diffstat (limited to 'src/librustc_data_structures')
| -rw-r--r-- | src/librustc_data_structures/indexed_set.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/librustc_data_structures/indexed_set.rs b/src/librustc_data_structures/indexed_set.rs index 821e2b01431..9fa47cee659 100644 --- a/src/librustc_data_structures/indexed_set.rs +++ b/src/librustc_data_structures/indexed_set.rs @@ -9,9 +9,11 @@ // except according to those terms. use std::fmt; +use std::iter; use std::marker::PhantomData; use std::mem; use std::ops::{Deref, DerefMut, Range}; +use std::slice; use bitslice::{BitSlice, Word}; use bitslice::{bitwise, Union, Subtract}; use indexed_vec::Idx; @@ -161,4 +163,41 @@ impl<T: Idx> IdxSet<T> { pub fn subtract(&mut self, other: &IdxSet<T>) -> bool { bitwise(self.words_mut(), other.words(), &Subtract) } + + pub fn iter(&self) -> Iter<T> { + Iter { + cur: None, + iter: self.words().iter().enumerate(), + _pd: PhantomData, + } + } +} + +pub struct Iter<'a, T: Idx> { + cur: Option<(Word, usize)>, + iter: iter::Enumerate<slice::Iter<'a, Word>>, + _pd: PhantomData<fn(&T)>, +} + +impl<'a, T: Idx> Iterator for Iter<'a, T> { + type Item = T; + + fn next(&mut self) -> Option<T> { + let word_bits = mem::size_of::<Word>() * 8; + loop { + if let Some((ref mut word, offset)) = self.cur { + let bit_pos = word.trailing_zeros(); + if bit_pos != word_bits as u32 { + let bit = 1 << bit_pos; + *word ^= bit; + return Some(T::new(bit + offset)) + } + } + + match self.iter.next() { + Some((i, word)) => self.cur = Some((*word, word_bits * i)), + None => return None, + } + } + } } |
