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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
use core::mem::size_of; use bitflags::bitflags; bitflags! { pub struct RegionFlags: u16 { const IN_USE = 1; } } #[derive(Debug)] pub struct Region { pub size: usize, pub data: usize, pub padding_start: usize, pub padding_end: usize, pub flags: RegionFlags, pub next: usize, } impl Region { pub fn new(addr: usize, size: usize) -> Region { assert!(size >= Self::min_size()); Region { size: size - size_of::<Self>(), data: addr + size_of::<Self>(), padding_start: 0, padding_end: 0, flags: RegionFlags::empty(), next: 0, } } pub fn new_with_padding(addr: usize, size: usize, padding_start: usize, padding_end: usize) -> Region { let mut region = Region::new(addr, size); region.padding_start = padding_start; region.padding_end = padding_end; region } pub fn min_size() -> usize { size_of::<Self>() + (size_of::<usize>() * 2) } pub fn next(&self) -> Option<&mut Region> { if self.next == 0 { return None; } unsafe { Some(&mut *(self.next as *mut Region)) } } pub fn get_used(&self) -> bool { self.flags.contains(RegionFlags::IN_USE) } pub fn set_used(&mut self, used: bool) { self.flags.set(RegionFlags::IN_USE, used); } pub fn size(&self) -> usize { self.padding_start + self.size + self.padding_end } pub unsafe fn data_ptr(&self) -> *mut u8 { (self.data + self.padding_start) as *mut u8 } }