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
use num::Integer; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct IdAllocator<T: Integer + Copy> { next: T, free_list: Vec<T>, } impl<T: Integer + Copy> IdAllocator<T> { pub fn new() -> Self { Self { next: T::zero(), free_list: Vec::new(), } } pub fn allocate(&mut self) -> T { if let Some(id) = self.free_list.pop() { id } else { let id = self.next; self.next = self.next + T::one(); id } } pub fn peek(&self) -> T { self.next } pub fn free(&mut self, id: T) { self.free_list.push(id); } }