Skip to main content

forward_into_iterator

Macro forward_into_iterator 

Source
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);