#![allow(unused)]
use crate::slab_alloc::{SlabAlloc, SlabIndex, ZeroBitCounter};
type Idx = SlabIndex<usize, ZeroBitCounter>;
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum ListIndex {
Empty,
Element(Idx),
}
impl Default for ListIndex {
fn default() -> Self {
Self::Empty
}
}
impl ListIndex {
pub fn first(&self) -> Option<ElementIndex> {
match self {
ListIndex::Empty => None,
ListIndex::Element(idx) => Some(ElementIndex { idx: *idx }),
}
}
}
impl From<Idx> for ListIndex {
fn from(idx: Idx) -> Self {
ListIndex::Element(idx)
}
}
impl From<ListIndex> for Option<Idx> {
fn from(idx: ListIndex) -> Self {
match idx {
ListIndex::Empty => None,
ListIndex::Element(i) => Some(i),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct ElementIndex {
idx: Idx,
}
impl From<Idx> for ElementIndex {
fn from(idx: Idx) -> Self {
Self { idx }
}
}
impl From<ElementIndex> for Idx {
fn from(idx: ElementIndex) -> Self {
idx.idx
}
}
#[derive(Clone)]
pub struct LinkedLists<T> {
storage: SlabAlloc<LinkedListEntry<T>, usize, ZeroBitCounter>,
}
impl<T> Default for LinkedLists<T> {
fn default() -> Self {
Self::new()
}
}
impl<T> LinkedLists<T> {
pub fn new() -> Self {
Self {
storage: SlabAlloc::new(),
}
}
pub fn empty_list(&self) -> ListIndex {
ListIndex::Empty
}
pub fn prepend(&mut self, list: &mut ListIndex, value: T) -> ElementIndex {
match list {
ListIndex::Empty => {
let element_index = self.one_element(value);
*list = ListIndex::Element(element_index.into());
element_index
}
ListIndex::Element(idx) => {
let element_index = ElementIndex { idx: *idx };
*idx = self.insert_before(element_index, value).into();
ElementIndex { idx: *idx }
}
}
}
pub fn one_element(&mut self, value: T) -> ElementIndex {
let entry = LinkedListEntry {
value,
prev_entry: None,
next_entry: None,
};
self.storage.insert(entry).into()
}
fn link(&mut self, i1: Option<Idx>, i2: Option<Idx>) {
if let Some(i1) = i1 {
if let Some(e1) = self.storage.get_mut(i1) {
e1.next_entry = i2
}
}
if let Some(i2) = i2 {
if let Some(e2) = self.storage.get_mut(i2) {
e2.prev_entry = i1
}
}
}
pub fn insert_after(&mut self, idx: ElementIndex, value: T) -> ElementIndex {
let entry = LinkedListEntry {
value,
prev_entry: None,
next_entry: None,
};
let prev_idx = idx.into();
let next_idx = self.storage.get(prev_idx).and_then(|prev| prev.next_entry);
let new_idx = self.storage.insert(entry);
self.link(Some(prev_idx), Some(new_idx));
self.link(Some(new_idx), next_idx);
new_idx.into()
}
pub fn insert_before(&mut self, idx: ElementIndex, value: T) -> ElementIndex {
let entry = LinkedListEntry {
value,
prev_entry: None,
next_entry: None,
};
let next_idx = idx.into();
let prev_idx = self.storage.get(next_idx).and_then(|next| next.prev_entry);
let new_idx = self.storage.insert(entry);
self.link(prev_idx, Some(new_idx));
self.link(Some(new_idx), Some(next_idx));
new_idx.into()
}
pub fn get(&self, idx: ElementIndex) -> Option<&T> {
self.storage.get(idx.into()).map(|entry| &entry.value)
}
pub fn get_mut(&mut self, idx: ElementIndex) -> Option<&mut T> {
self.storage
.get_mut(idx.into())
.map(|entry| &mut entry.value)
}
pub fn next(&self, idx: ElementIndex) -> Option<ElementIndex> {
self.storage
.get(idx.into())
.and_then(|element| element.next_entry)
.map(|i| i.into())
}
pub fn prev(&self, idx: ElementIndex) -> Option<ElementIndex> {
self.storage
.get(idx.into())
.and_then(|element| element.prev_entry)
.map(|i| i.into())
}
fn remove_element(&mut self, idx: ElementIndex) -> T {
let idx = idx.into();
let LinkedListEntry {
value,
prev_entry,
next_entry,
} = self.storage.remove(idx).expect("index not present");
{
if let Some(p) = prev_entry {
if let Some(prev_entry) = self.storage.get_mut(p) {
prev_entry.next_entry = next_entry;
}
}
if let Some(n) = next_entry {
if let Some(next_entry) = self.storage.get_mut(n) {
next_entry.prev_entry = prev_entry;
}
}
}
value
}
pub fn remove(&mut self, list: &mut ListIndex, idx: ElementIndex) -> T {
if list == &ListIndex::Element(idx.into()) {
let next_idx = self.next(idx);
match next_idx {
Some(next_idx) => *list = ListIndex::Element(next_idx.into()),
None => *list = ListIndex::Empty,
}
}
self.remove_element(idx)
}
fn iter_idx(&self, list: &ListIndex) -> LinkedListIdxIter<T> {
LinkedListIdxIter {
container: self,
current_index: list.first(),
iterate_forward: true,
}
}
fn iter(&self, list: &ListIndex) -> LinkedListIter<T> {
self.iter_idx(list).into()
}
fn iter_idx_from(&self, idx: ElementIndex) -> LinkedListIdxIter<T> {
LinkedListIdxIter {
container: self,
current_index: Some(idx),
iterate_forward: true,
}
}
fn iter_from(&self, idx: ElementIndex) -> LinkedListIter<T> {
self.iter_idx_from(idx).into()
}
}
#[derive(Clone)]
struct LinkedListEntry<T> {
value: T,
prev_entry: Option<Idx>,
next_entry: Option<Idx>,
}
pub struct LinkedListIter<'a, T> {
idx_iter: LinkedListIdxIter<'a, T>,
}
impl<'a, T> From<LinkedListIdxIter<'a, T>> for LinkedListIter<'a, T> {
fn from(it: LinkedListIdxIter<'a, T>) -> Self {
Self { idx_iter: it }
}
}
impl<'a, T> Iterator for LinkedListIter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.idx_iter
.next()
.and_then(|idx| self.idx_iter.container.get(idx))
}
}
pub struct LinkedListIdxIter<'a, T> {
container: &'a LinkedLists<T>,
current_index: Option<ElementIndex>,
iterate_forward: bool,
}
impl<'a, T> Iterator for LinkedListIdxIter<'a, T> {
type Item = ElementIndex;
fn next(&mut self) -> Option<Self::Item> {
let output = self.current_index;
let next = self
.current_index
.and_then(|idx| match self.iterate_forward {
false => self.container.prev(idx),
true => self.container.next(idx),
});
self.current_index = next;
output
}
}
#[test]
fn test_create_linked_list() {
let mut lists = LinkedLists::new();
let e1 = lists.one_element(1);
let e2 = lists.insert_after(e1, 2);
assert_eq!(lists.get(e1), Some(&1));
assert_eq!(lists.get(e2), Some(&2));
assert_eq!(lists.prev(e1), None);
assert_eq!(lists.prev(e2), Some(e1));
assert_eq!(lists.next(e1), Some(e2));
assert_eq!(lists.next(e2), None);
}
#[test]
fn test_iter_empty_list() {
let lists: LinkedLists<()> = LinkedLists::new();
let empty = lists.empty_list();
assert_eq!(lists.iter(&empty).count(), 0);
}
#[test]
fn test_linked_list_iter() {
let mut lists = LinkedLists::new();
let mut l = lists.empty_list();
lists.prepend(&mut l, 3);
lists.prepend(&mut l, 2);
lists.prepend(&mut l, 1);
let v: Vec<_> = lists.iter(&l).copied().collect();
assert_eq!(v, vec![1, 2, 3]);
}
#[test]
fn test_prepend() {
let mut lists = LinkedLists::new();
let mut l = lists.empty_list();
let e2 = lists.prepend(&mut l, 2);
assert_eq!(lists.get(e2), Some(&2));
let e1 = lists.prepend(&mut l, 1);
assert_eq!(lists.get(e1), Some(&1));
assert_eq!(lists.get(e2), Some(&2));
}
#[test]
fn test_remove_element() {
let mut lists = LinkedLists::new();
let mut l = lists.empty_list();
let e3 = lists.prepend(&mut l, 3);
let e2 = lists.prepend(&mut l, 2);
let e1 = lists.prepend(&mut l, 1);
assert_eq!(lists.remove(&mut l, e2), 2);
assert_eq!(lists.iter(&l).count(), 2);
assert_eq!(lists.remove(&mut l, e1), 1);
assert_eq!(lists.iter(&l).count(), 1);
assert_eq!(lists.remove(&mut l, e3), 3);
assert_eq!(lists.iter(&l).count(), 0);
}