use crate::{IntoIter, Iter, Map};
impl<'a, V: Clone + 'a> Iterator for Iter<'a, V> {
type Item = (usize, &'a V);
#[inline]
#[must_use]
fn next(&mut self) -> Option<Self::Item> {
while self.pos < self.max {
let item = unsafe { &*self.head.add(self.pos) };
if let Some(p) = item {
let i = self.pos;
self.pos += 1;
return Some((i, p));
}
self.pos += 1;
}
None
}
}
impl<V: Copy> Iterator for IntoIter<V> {
type Item = (usize, V);
#[inline]
#[must_use]
fn next(&mut self) -> Option<Self::Item> {
while self.pos < self.max {
let item = unsafe { &*self.head.add(self.pos) };
if let Some(v) = item {
let i = self.pos;
self.pos += 1;
return Some((i, *v));
}
self.pos += 1;
}
None
}
}
impl<'a, V: Copy> IntoIterator for &'a Map<V> {
type Item = (usize, V);
type IntoIter = IntoIter<V>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
IntoIter {
max: self.max,
pos: 0,
head: self.head,
}
}
}
#[test]
fn empty_iterator() {
let m: Map<u32> = Map::with_capacity_none(16);
assert!(m.into_iter().next().is_none());
}
#[test]
fn insert_and_jump_over_next() {
let mut m: Map<&str> = Map::with_capacity_none(16);
m.insert(0, "foo");
let mut iter = m.into_iter();
assert_eq!("foo", iter.next().unwrap().1);
assert!(iter.next().is_none());
}
#[test]
fn insert_and_iterate() {
let mut m: Map<&str> = Map::with_capacity_none(16);
m.insert(0, "one");
m.insert(1, "two");
m.insert(2, "three");
let mut sum = 0;
let mut count = 0;
for (k, _v) in m.iter() {
sum += k;
count += 1;
}
assert_eq!(3, count);
assert_eq!(3, sum);
}
#[test]
fn insert_and_into_iterate() {
let mut m: Map<&str> = Map::with_capacity_none(16);
m.insert(0, "one");
m.insert(1, "two");
m.insert(2, "three");
let mut sum = 0;
let mut count = 0;
for (k, _v) in m.into_iter() {
sum += k;
count += 1;
}
assert_eq!(3, count);
assert_eq!(3, sum);
}
#[test]
fn iterate_without_function() {
let mut m: Map<&str> = Map::with_capacity_none(16);
m.insert(0, "test");
let mut count = 0;
for (_, _) in &m {
count += 1;
}
assert_eq!(1, count);
}