range-alloc-arceos 0.3.8

Generic range allocator
Documentation
use range_alloc_arceos::RangeAllocator;

#[test]
fn test_simple_allocation() {
    let mut allocator = RangeAllocator::new(0..100);

    let r1 = allocator.allocate_range(10).expect("Alloc 10 failed");
    assert_eq!(r1, 0..10);

    let r2 = allocator.allocate_range(20).expect("Alloc 20 failed");
    assert_eq!(r2, 10..30);

    allocator.free_range(r1);

    let r3 = allocator.allocate_range(5).expect("Alloc 5 failed");
    assert_eq!(r3, 0..5);
}

#[test]
fn test_out_of_memory() {
    let mut allocator = RangeAllocator::new(0..10);

    let _r1 = allocator.allocate_range(10).unwrap();

    let r2 = allocator.allocate_range(1);
    assert!(r2.is_err(), "Should return error when OOM");
}

#[test]
fn test_fragmentation_and_merge() {
    let mut allocator = RangeAllocator::new(0..100);

    let a = allocator.allocate_range(20).unwrap();
    let b = allocator.allocate_range(20).unwrap();
    let c = allocator.allocate_range(20).unwrap();
    let _d = allocator.allocate_range(40).unwrap();

    allocator.free_range(a);
    allocator.free_range(c);

    assert!(allocator.allocate_range(30).is_err());

    allocator.free_range(b);

    let big = allocator
        .allocate_range(60)
        .expect("Should merge ranges A, B, C");
    assert_eq!(big, 0..60);
}

#[test]
fn test_alignment_gaps() {
    let mut allocator = RangeAllocator::new(1000..2000);

    let r1 = allocator.allocate_range(100).unwrap();
    assert_eq!(r1, 1000..1100);

    let r2 = allocator.allocate_range(100).unwrap();
    assert_eq!(r2, 1100..1200);
}