diff --git a/src/fname.rs b/src/fname.rs index f539a84..e60d68a 100644 --- a/src/fname.rs +++ b/src/fname.rs @@ -34,8 +34,8 @@ impl FName { .unwrap() .as_names() .unwrap() - .iter() - .position(|entry| entry.as_str() == name) + .enumerate() + .find_map(|(i, entry)| (entry.as_str() == name).then_some(i)) .context("could not find fname.")? as u32; entry.insert(name); diff --git a/src/global_tables/names.rs b/src/global_tables/names.rs index 8fbb63b..7b73f12 100644 --- a/src/global_tables/names.rs +++ b/src/global_tables/names.rs @@ -115,6 +115,10 @@ impl NameEntryArray { NamesIterator::new(self) } + pub fn enumerate(&self) -> NamesEnumerator { + NamesEnumerator::new(self) + } + pub fn len(&self) -> usize { self.num_elements as usize } @@ -176,3 +180,32 @@ impl<'a> IntoIterator for &'a NameEntryArray { } } } + +pub struct NamesEnumerator<'a> { + names: &'a NameEntryArray, + index: usize, +} + +impl<'a> NamesEnumerator<'a> { + pub fn new(names: &'a NameEntryArray) -> Self { + Self { names, index: 0 } + } +} + +impl<'a> Iterator for NamesEnumerator<'a> { + type Item = (usize, &'a FNameEntry); + + fn next(&mut self) -> Option { + loop { + if !self.names.is_valid_index(self.index) { + break None; + } + let item = self.names.get_index(self.index); + self.index += 1; + // skip empty entries, we dont care about them + if let Some(item) = item { + break Some((self.index - 1, item)); + } + } + } +}