1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use super::blocks::{BLOCK_CAPACITY, LINE_SIZE};

// Object size range
const SMALL_MIN: usize = 1;
const SMALL_MAX: usize = LINE_SIZE;

const MEDIUM_MIN: usize = SMALL_MAX + 1;
const MEDIUM_MAX: usize = BLOCK_CAPACITY;

const LARGE_MIN: usize = MEDIUM_MAX + 1;
const LARGE_MAX: usize = std::usize::MAX;
/// Represent Object's size
/// - Small fit inside a line
/// - Medium more than one line but small than block
/// - Large span multiple blocks
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum SizeClass {
    Small,
    Medium,
    Large,
}

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum SizeClassError {
    TooBig,
}

impl SizeClass {
    pub fn from(size: usize) -> Result<SizeClass, SizeClassError> {
        match size {
            SMALL_MIN..=SMALL_MAX => Ok(SizeClass::Small),
            MEDIUM_MIN..=MEDIUM_MAX => Ok(SizeClass::Medium),
            LARGE_MIN..=LARGE_MAX => Ok(SizeClass::Large),
            __TooBig => Err(SizeClassError::TooBig),
        }
    }
}