trivial_kernel/context/
heap.rs

1use super::{PackedPtr, Store};
2
3#[derive(Debug, Default, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
4pub struct Heap {
5    data: Vec<PackedPtr>,
6}
7
8impl Heap {
9    pub fn to_display<'a, S: Store>(&'a self, store: &'a S) -> DisplayHeap<'a, S> {
10        DisplayHeap(self, store)
11    }
12
13    pub fn clear(&mut self) {
14        self.data.clear();
15    }
16
17    pub fn push(&mut self, idx: PackedPtr) {
18        self.data.push(idx);
19    }
20
21    pub fn len(&self) -> usize {
22        self.data.len()
23    }
24
25    pub fn clone_from(&mut self, other: &[PackedPtr]) {
26        self.data.clear();
27        self.data.extend_from_slice(other);
28    }
29
30    pub fn get(&self, idx: u32) -> Option<PackedPtr> {
31        self.data.get(idx as usize).copied()
32    }
33
34    pub fn as_slice(&self) -> &[PackedPtr] {
35        &self.data
36    }
37
38    pub fn extend(&mut self, ext: &[PackedPtr]) {
39        self.data.extend_from_slice(ext);
40    }
41}
42
43use core::fmt::{self, Display, Formatter};
44
45pub struct DisplayHeap<'a, S: Store>(&'a Heap, &'a S);
46
47impl<'a, S: Store> Display for DisplayHeap<'a, S> {
48    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
49        for i in self.0.data.iter().rev() {
50            let ptr = i.into();
51
52            match self.1.get_element(ptr) {
53                Some(el) => writeln!(f, "> {} {}", i, el.to_display(self.1))?,
54                None => writeln!(f, "> Invalid ptr")?,
55            }
56        }
57
58        Ok(())
59    }
60}