ember_os 0.1.3

A simple OS kernel implemented in rust, which has referenced https://os.phil-opp.com/
Documentation
use super::*;
use core::marker::PhantomData;

impl<T> FromIterator<T> for Vec<T> {
  fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
    let mut vec = Self::new();
    iter.into_iter().for_each(|e| vec.push(e));
    vec
  }
}

pub struct Iter<'a, T> {
  data: NonNull<T>,
  len: usize,
  next_index: usize,
  prev_index: usize,
  is_head: bool,
  marker: PhantomData<&'a T>,
}

impl<T> DoubleEndedIterator for Iter<'_, T> {
  fn next_back(&mut self) -> Option<Self::Item> {
    if self.is_head {
      return None;
    }
    let curr_index = self.prev_index;
    let curr = unsafe { self.data.as_ptr().add(self.prev_index).as_ref() };
    if curr_index == 0 {
      self.is_head = true;
    } else {
      self.prev_index -= 1;
    }
    curr
  }
}

impl<'a, T> Iterator for Iter<'a, T> {
  type Item = &'a T;

  fn next(&mut self) -> Option<Self::Item> {
    let curr_index = self.next_index;
    if curr_index >= self.len {
      return None;
    }
    let curr = unsafe { self.data.as_ptr().add(self.next_index).as_ref() };
    self.next_index += 1;
    curr
  }
}

impl<'a, T> IntoIterator for &'a Vec<T> {
  type Item = &'a T;
  type IntoIter = Iter<'a, T>;

  fn into_iter(self) -> Self::IntoIter {
    Iter {
      data: self.data,
      len: self.len,
      next_index: 0,
      prev_index: if self.is_empty() { 0 } else { self.len - 1 },
      is_head: false,
      marker: PhantomData,
    }
  }
}

pub struct IterMut<'a, T> {
  data: NonNull<T>,
  len: usize,
  next_index: usize,
  prev_index: usize,
  is_head: bool,
  marker: PhantomData<&'a mut T>,
}

impl<T> DoubleEndedIterator for IterMut<'_, T> {
  fn next_back(&mut self) -> Option<Self::Item> {
    if self.is_head {
      return None;
    }
    let curr_index = self.prev_index;
    let curr = unsafe { self.data.as_ptr().add(self.prev_index).as_mut() };
    if curr_index == 0 {
      self.is_head = true;
    } else {
      self.prev_index -= 1;
    }
    curr
  }
}

impl<'a, T> Iterator for IterMut<'a, T> {
  type Item = &'a mut T;

  fn next(&mut self) -> Option<Self::Item> {
    let curr_index = self.next_index;
    if curr_index >= self.len {
      return None;
    }
    let curr = unsafe { self.data.as_ptr().add(self.next_index).as_mut() };
    self.next_index += 1;
    curr
  }
}

impl<'a, T> IntoIterator for &'a mut Vec<T> {
  type Item = &'a mut T;
  type IntoIter = IterMut<'a, T>;

  fn into_iter(self) -> Self::IntoIter {
    IterMut {
      data: self.data,
      len: self.len,
      next_index: 0,
      prev_index: if self.is_empty() { 0 } else { self.len - 1 },
      is_head: false,
      marker: PhantomData,
    }
  }
}

impl<T> Vec<T> {
  pub fn iter(&self) -> Iter<T> {
    self.into_iter()
  }

  pub fn iter_mut(&mut self) -> IterMut<T> {
    self.into_iter()
  }
}