Skip to content

Commit

Permalink
fix DoubleEndedIterator impl for Name
Browse files Browse the repository at this point in the history
  • Loading branch information
bluejekyll committed Feb 17, 2022
1 parent 13c0793 commit 62bcbc3
Showing 1 changed file with 24 additions and 22 deletions.
46 changes: 24 additions & 22 deletions crates/proto/src/rr/domain/name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,7 @@ impl Name {
LabelIter {
name: self,
index: 0,
started: false,
finished: false,
len: self.label_ends.len(),
}
}

Expand Down Expand Up @@ -930,27 +929,23 @@ impl LabelEnc for LabelEncUtf8 {
pub struct LabelIter<'a> {
name: &'a Name,
index: usize,
started: bool,
finished: bool,
len: usize,
}

impl<'a> Iterator for LabelIter<'a> {
type Item = &'a [u8];

fn next(&mut self) -> Option<Self::Item> {
if self.finished {
if self.index >= self.len {
return None;
}
self.started = true;

let end = *self.name.label_ends.get(self.index)?;
let start = match self.index {
0 => 0,
_ => self.name.label_ends[self.index - 1],
};
self.index += 1;
if self.index == self.name.label_ends.len() {
self.finished = true;
}
Some(&self.name.label_data[start as usize..end as usize])
}

Expand All @@ -964,23 +959,18 @@ impl<'a> ExactSizeIterator for LabelIter<'a> {}

impl<'a> DoubleEndedIterator for LabelIter<'a> {
fn next_back(&mut self) -> Option<Self::Item> {
if self.finished {
if self.len <= self.index {
return None;
}
if !self.started {
self.index = self.name.label_ends.len().checked_sub(1)?;
}
self.started = true;
let end = *self.name.label_ends.get(self.index)?;
let start = match self.index {

self.len -= 1;

let end = *self.name.label_ends.get(self.len)?;
let start = match self.len {
0 => 0,
_ => self.name.label_ends[self.index - 1],
_ => self.name.label_ends[self.len - 1],
};
if self.index == 0 {
self.finished = true;
} else {
self.index -= 1;
}

Some(&self.name.label_data[start as usize..end as usize])
}
}
Expand Down Expand Up @@ -1909,4 +1899,16 @@ mod tests {
_ => panic!("expected too long message"),
}
}

#[test]
fn test_double_ended_iterator() {
let name = Name::from_ascii("www.example.com").unwrap();
let mut iter = name.iter();

assert_eq!(iter.next().unwrap(), b"www");
assert_eq!(iter.next_back().unwrap(), b"com");
assert_eq!(iter.next().unwrap(), b"example");
assert!(iter.next_back().is_none());
assert!(iter.next().is_none());
}
}

0 comments on commit 62bcbc3

Please sign in to comment.