macro_rules! forward_into_iterator {
(<$($generic:ident),+> in $this:ty => $field:tt : $inner:ty; $($mode:ident),+ $(,)?) => { ... };
(<$($generic:ident),+> in $this:ty => $inner:ty; $($mode:ident),+ $(,)?) => { ... };
($this:ty => $field:tt : $inner:ty; $($mode:ident),+ $(,)?) => { ... };
($this:ty => $inner:ty; $($mode:ident),+ $(,)?) => { ... };
(@modes $generics:tt $this:ty => $field:tt : $inner:ty; $($mode:ident),+) => { ... };
(@mode [$($generic:ident),*] $this:ty => $field:tt : $inner:ty; owned) => { ... };
(@mode [$($generic:ident),*] $this:ty => $field:tt : $inner:ty; ref) => { ... };
(@mode [$($generic:ident),*] $this:ty => $field:tt : $inner:ty; ref_mut) => { ... };
(@mode $generics:tt $this:ty => $field:tt : $inner:ty; $mode:ident) => { ... };
}Expand description
Implement IntoIterator by forwarding to a field.
Select one or more modes: owned for Self, ref for &Self, and ref_mut
for &mut Self. Each mode uses the inner type’s item and iterator types.
Only the selected modes are implemented. Emitted code supports no_std.
§Examples
struct Items<T>(Vec<T>);
impl_more::forward_into_iterator!(<T> in Items<T> => Vec<T>; owned, ref, ref_mut);
let mut items = Items(vec![1, 2]);
for item in &mut items { *item += 1; }
assert_eq!((&items).into_iter().copied().collect::<Vec<_>>(), vec![2, 3]);
assert_eq!(items.into_iter().collect::<Vec<_>>(), vec![2, 3]);Select a named field with => field: InnerType:
struct Items { values: Vec<u8> }
impl_more::forward_into_iterator!(Items => values: Vec<u8>; ref);
assert_eq!((&Items { values: vec![1] }).into_iter().next(), Some(&1));