use std::ops::Range; pub trait CoreSelector { fn next_core(&mut self, previous_cpu: i32) -> i32; } pub struct RoundRobinSelector { offset: u32, num_cores: u32, last_used: u32, } impl RoundRobinSelector { pub fn new(cores: &Range) -> RoundRobinSelector { Self { offset: cores.start as u32, num_cores: cores.len() as u32, last_used: 0, } } } impl CoreSelector for RoundRobinSelector { fn next_core(&mut self, previous_cpu: i32) -> i32 { if (self.offset..(self.offset + self.num_cores)).contains(&(previous_cpu as u32)) { return previous_cpu; } self.last_used += 1; (self.offset + (self.last_used % self.num_cores.max(1))) as i32 } }