1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
use crate::memory_address::MemoryAddress;
use std::alloc::AllocErr;
use std::fmt::Debug;
use std::num::NonZeroUsize;

/// A memory source is a sort-of crude allocator that can obtain and release memory, from, say, the operating system, an arena or some fixed range.
///
/// It is thread-aware but not necessarily thread-safe.
pub trait MemorySource: Debug {
    /// Obtain memory from the operating system, say.
    ///
    /// Alignment will be whatever is appropriate, but is likely to be quite large.
    fn obtain(&self, non_zero_size: NonZeroUsize) -> Result<MemoryAddress, AllocErr>;

    /// Release memory to the operating system, say.
    ///
    /// Alignment will be whatever is appropriate, but is likely to be quite large.
    fn release(&self, non_zero_size: NonZeroUsize, current_memory: MemoryAddress);
}