bare-test 0.8.3

A test framework for bare metal.
Documentation
use core::ptr::slice_from_raw_parts;

use crate::TestCase;

#[repr(C)]
pub struct ListRef {
    data: *const u8,
    len: usize,
}

impl ListRef {
    pub fn from_raw(data: &'static [u8]) -> Self {
        Self {
            data: data.as_ptr() as _,
            len: data.len(),
        }
    }

    pub fn iter(&self) -> Iter<'static> {
        Iter::new(unsafe { core::slice::from_raw_parts(self.data, self.len) })
    }
}

pub struct Iter<'a> {
    data: &'a [u8],
    iter: usize,
}

impl<'a> Iter<'a> {
    pub fn new(data: &'a [u8]) -> Self {
        Iter { data, iter: 0 }
    }
}

impl Iterator for Iter<'_> {
    type Item = TestCase;

    fn next(&mut self) -> Option<Self::Item> {
        if self.data.is_empty() {
            return None;
        }

        let slice = unsafe {
            &*slice_from_raw_parts(
                self.data.as_ptr() as *const TestCase,
                self.data.len() / size_of::<TestCase>(),
            )
        };
        let out = slice.get(self.iter).cloned();
        self.iter += 1;
        out
    }
}