buddy_system/
lib.rs

1pub mod arena;
2pub mod buddy;
3
4pub mod pretty_print {
5    use std::ops::Range;
6
7    use generational_arena::{Arena, Index};
8
9    use crate::{
10        arena::BuddyBookkeeping,
11        buddy::{Block, BlockState},
12    };
13
14    #[derive(Debug)]
15    pub enum PrettyState {
16        Split(Box<PrettyBlock>, Box<PrettyBlock>),
17        Available,
18        Occupied,
19    }
20
21    #[derive(Debug)]
22    pub struct PrettyBlock {
23        pub range: Range<usize>,
24        pub state: PrettyState,
25    }
26
27    pub fn prettify(arena: &BuddyBookkeeping) -> PrettyBlock {
28        fn build(arena: &Arena<Block>, current: Index) -> PrettyBlock {
29            PrettyBlock {
30                range: arena[current].range.clone(),
31                state: match arena[current].state {
32                    BlockState::Available => PrettyState::Available,
33                    BlockState::Occupied => PrettyState::Occupied,
34                    BlockState::Split(first, second) => PrettyState::Split(
35                        Box::new(build(arena, first)),
36                        Box::new(build(arena, second)),
37                    ),
38                },
39            }
40        }
41
42        build(&arena.blocks, arena.root)
43    }
44}