use super::{Element, Elements};
impl<'t> IntoIterator for Elements<'t> {
type Item = Element<'t>;
type IntoIter = OwnedElementsIterator<'t>;
fn into_iter(self) -> Self::IntoIter {
let elements = match self {
Elements::None => vec![],
Elements::Single(element) => vec![element],
Elements::Multiple(mut elements) => {
elements.reverse();
elements
}
};
OwnedElementsIterator { elements }
}
}
#[derive(Debug)]
pub struct OwnedElementsIterator<'t> {
elements: Vec<Element<'t>>,
}
impl<'t> Iterator for OwnedElementsIterator<'t> {
type Item = Element<'t>;
#[inline]
fn next(&mut self) -> Option<Element<'t>> {
self.elements.pop()
}
}
#[test]
fn iter() {
macro_rules! test {
($elements:expr, $expected:expr $(,)?) => {{
let elements = $elements;
let actual: Vec<Element> = elements.into_iter().collect();
let expected = $expected;
assert_eq!(
actual, expected,
"Actual element iteration doesn't match expected",
);
}};
}
test!(Elements::None, vec![]);
test!(Elements::Single(text!("a")), vec![text!("a")]);
test!(
Elements::Multiple(vec![]), vec![],
);
test!(
Elements::Multiple(vec![text!("a")]), vec![text!("a")],
);
test!(
Elements::Multiple(vec![text!("a"), text!("b")]),
vec![text!("a"), text!("b")],
);
test!(
Elements::Multiple(vec![text!("a"), text!("b"), text!("c")]),
vec![text!("a"), text!("b"), text!("c")],
);
}