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 bfe3eaa
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 30 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ All notes should be prepended with the location of the change, e.g. `(proto)` or

### Fixed

- (clien) Fix AsyncClient::clone always setting use_edns (ecton) #1598
- (proto) fix DoubleEndedIterator impl for Name #1639
- (client) Fix AsyncClient::clone always setting use_edns (ecton) #1598
- (resolver) Use stream connections if datagram connections are not available (@pinkisemils) #1592
- (server) Release resources when a server future is dropped (@pinkisemils) #1587
- (proto) Panic when name exceeds maximal domain name length during display #1447
Expand Down
78 changes: 49 additions & 29 deletions crates/proto/src/rr/domain/name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,8 @@ impl Name {
pub fn iter(&self) -> LabelIter<'_> {
LabelIter {
name: self,
index: 0,
started: false,
finished: false,
start: 0,
end: self.label_ends.len(),
}
}

Expand Down Expand Up @@ -929,33 +928,29 @@ impl LabelEnc for LabelEncUtf8 {
/// An iterator over labels in a name
pub struct LabelIter<'a> {
name: &'a Name,
index: usize,
started: bool,
finished: bool,
start: usize,
end: usize,
}

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

fn next(&mut self) -> Option<Self::Item> {
if self.finished {
if self.start >= self.end {
return None;
}
self.started = true;
let end = *self.name.label_ends.get(self.index)?;
let start = match self.index {

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

fn size_hint(&self) -> (usize, Option<usize>) {
let len = self.name.label_ends.len() - self.index;
let len = self.end.saturating_sub(self.start);
(len, Some(len))
}
}
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.end <= self.start {
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.end -= 1;

let end = *self.name.label_ends.get(self.end)?;
let start = match self.end {
0 => 0,
_ => self.name.label_ends[self.index - 1],
_ => self.name.label_ends[self.end - 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,34 @@ 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());
}

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

assert_eq!(iter.size_hint().0, 3);
assert_eq!(iter.next().unwrap(), b"www");
assert_eq!(iter.size_hint().0, 2);
assert_eq!(iter.next_back().unwrap(), b"com");
assert_eq!(iter.size_hint().0, 1);
assert_eq!(iter.next().unwrap(), b"example");
assert_eq!(iter.size_hint().0, 0);
assert!(iter.next_back().is_none());
assert_eq!(iter.size_hint().0, 0);
assert!(iter.next().is_none());
assert_eq!(iter.size_hint().0, 0);
}
}

0 comments on commit bfe3eaa

Please sign in to comment.