macro_rules! forward_into_iterator {
(<$($generic:ident),+> in $($rest:tt)+) => { ... };
(<const $($rest:tt)+) => { ... };
(<$generic:ident, $($rest:tt)+) => { ... };
(@impl [$($generic:tt)+] $this:ty => $field:tt : $inner:ty; $($mode:ident),+ $(,)?) => { ... };
(@impl [$($generic:tt)+] $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:tt)*] $this:ty => $field:tt : $inner:ty; owned) => { ... };
(@mode [$($generic:tt)*] $this:ty => $field:tt : $inner:ty; ref) => { ... };
(@mode [$($generic:tt)*] $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.
Declare type and const parameters before in.
§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));With type and const parameters:
struct Array<T, const N: usize>([T; N]);
impl_more::forward_into_iterator!(
<T, const N: usize> in Array<T, N> => [T; N]; owned, ref, ref_mut
);
assert_eq!(Array([1, 2, 3]).into_iter().sum::<u32>(), 6);