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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use super::size::SizeClassError;

#[derive(Debug, PartialEq, Clone)]
pub enum BlockError {
    /// block size is not a power of two
    BadSize(usize),
    /// Cannot allocate memory
    OutOfMemory,
    /// Cannot allocate in block
    NoSpaceForAllocation,
    /// Address have overflow
    AddressOverflow,
}

#[derive(Debug, PartialEq, Clone)]
pub enum AllocError {
    /// Cannot allocate memory
    OutOfMemory,
    /// Size is too big to allocate
    SizeTooBig,
    /// Wrapper for block error
    InternalError(BlockError),
}

impl From<SizeClassError> for AllocError {
    fn from(value: SizeClassError) -> Self {
        match value {
            SizeClassError::TooBig => AllocError::SizeTooBig,
        }
    }
}

impl From<BlockError> for AllocError {
    fn from(value: BlockError) -> Self {
        AllocError::InternalError(value)
    }
}

#[derive(Debug, PartialEq, Clone)]
pub enum ImmixError {
    /// Key already exist
    DuplicatedKey,
    /// Wrapper for alloc error
    InternalError(AllocError),
}

impl From<AllocError> for ImmixError {
    fn from(value: AllocError) -> Self {
        ImmixError::InternalError(value)
    }
}