trivial_kernel/context/
heap.rs1use 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}