adar 0.2.0

Collection of architectural tools including flags, state machine, enum and tuple operations.
Documentation
pub struct TupleIterator<'a, T, const N: usize> {
    items: [&'a T; N],
    idx: usize,
}

impl<'a, T, const N: usize> Iterator for TupleIterator<'a, T, N> {
    type Item = &'a T;

    fn next(&mut self) -> Option<Self::Item> {
        if self.idx < N {
            let out = self.items[self.idx];
            self.idx += 1;
            Some(out)
        } else {
            None
        }
    }
}

pub trait TupleIter<T, const N: usize> {
    fn iter(&self) -> TupleIterator<'_, T, N>;
}

macro_rules! impl_tuple_iter {
    ($len:expr, ( $( $T:ident => $idx:tt ),* )) => {
        impl<T> TupleIter<T, $len> for ( $( $T ,)* ) {
            fn iter(&self) -> TupleIterator<'_, T, $len> {
                TupleIterator {
                    items: [ $( &self.$idx ),* ],
                    idx: 0,
                }
            }
        }
    };
}

impl_tuple_iter!(1, (T=>0));
impl_tuple_iter!(2, (T=>0, T=>1));
impl_tuple_iter!(3, (T=>0, T=>1, T=>2));
impl_tuple_iter!(4, (T=>0, T=>1, T=>2, T=>3));
impl_tuple_iter!(5, (T=>0, T=>1, T=>2, T=>3, T=>4));
impl_tuple_iter!(6, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5));
impl_tuple_iter!(7, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6));
impl_tuple_iter!(8, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6, T=>7));
impl_tuple_iter!(9, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6, T=>7, T=>8));
impl_tuple_iter!(10, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6, T=>7, T=>8, T=>9));
impl_tuple_iter!(11, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6, T=>7, T=>8, T=>9, T=>10));
impl_tuple_iter!(12, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6, T=>7, T=>8, T=>9, T=>10, T=>11));
impl_tuple_iter!(13, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6, T=>7, T=>8, T=>9, T=>10, T=>11, T=>12));
impl_tuple_iter!(14, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6, T=>7, T=>8, T=>9, T=>10, T=>11, T=>12, T=>13));
impl_tuple_iter!(15, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6, T=>7, T=>8, T=>9, T=>10, T=>11, T=>12, T=>13, T=>14));
impl_tuple_iter!(16, (T=>0, T=>1, T=>2, T=>3, T=>4, T=>5, T=>6, T=>7, T=>8, T=>9, T=>10, T=>11, T=>12, T=>13, T=>14, T=>15));

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_tuple_iter3() {
        let tuple = (0, 1, 2);

        let mut iter = tuple.iter();
        assert_eq!(iter.next(), Some(&tuple.0));
        assert_eq!(iter.next(), Some(&tuple.1));
        assert_eq!(iter.next(), Some(&tuple.2));
        assert_eq!(iter.next(), None);
    }

    #[test]
    fn test_tuple_iter16() {
        let tuple = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);

        let mut iter = tuple.iter();
        assert_eq!(iter.next(), Some(&tuple.0));
        assert_eq!(iter.next(), Some(&tuple.1));
        assert_eq!(iter.next(), Some(&tuple.2));
        assert_eq!(iter.next(), Some(&tuple.3));
        assert_eq!(iter.next(), Some(&tuple.4));
        assert_eq!(iter.next(), Some(&tuple.5));
        assert_eq!(iter.next(), Some(&tuple.6));
        assert_eq!(iter.next(), Some(&tuple.7));
        assert_eq!(iter.next(), Some(&tuple.8));
        assert_eq!(iter.next(), Some(&tuple.9));
        assert_eq!(iter.next(), Some(&tuple.10));
        assert_eq!(iter.next(), Some(&tuple.11));
        assert_eq!(iter.next(), Some(&tuple.12));
        assert_eq!(iter.next(), Some(&tuple.13));
        assert_eq!(iter.next(), Some(&tuple.14));
        assert_eq!(iter.next(), Some(&tuple.15));
        assert_eq!(iter.next(), None);
    }
}