diff -r bfd185ad03e7 -r 42b710b0f883 rust/hwphysics/src/common.rs --- a/rust/hwphysics/src/common.rs Thu Jul 25 21:59:20 2019 +0300 +++ b/rust/hwphysics/src/common.rs Thu Jul 25 22:31:24 2019 +0300 @@ -1,10 +1,40 @@ -pub type GearId = std::num::NonZeroU16; +use std::{collections::BinaryHeap, num::NonZeroU16}; + +pub type GearId = NonZeroU16; pub trait GearData {} pub trait GearDataProcessor { fn add(&mut self, gear_id: GearId, gear_data: T); + fn remove(&mut self, gear_id: GearId); } pub trait GearDataAggregator { fn find_processor(&mut self) -> &mut GearDataProcessor; } + +pub struct GearAllocator { + max_id: u16, + free_ids: BinaryHeap, +} + +impl GearAllocator { + pub fn new() -> Self { + Self { + max_id: 0, + free_ids: BinaryHeap::with_capacity(1024), + } + } + + pub fn alloc(&mut self) -> Option { + self.free_ids.pop().or_else(|| { + self.max_id.checked_add(1).and_then(|new_max_id| { + self.max_id = new_max_id; + NonZeroU16::new(new_max_id) + }) + }) + } + + pub fn free(&mut self, gear_id: GearId) { + self.free_ids.push(gear_id) + } +}