use mio::Token;
use std::collections::HashSet;
pub struct TokenGenerator {
seed: usize,
reserved_end: usize,
max_tokens: usize,
active_tokens: HashSet<Token>,
}
impl TokenGenerator {
pub fn new(reserved_end: usize,max_tokens: Option<usize>) -> TokenGenerator {
TokenGenerator {
seed: reserved_end,
reserved_end: reserved_end,
max_tokens: max_tokens.unwrap_or(usize::max_value() - reserved_end),
active_tokens: HashSet::new(),
}
}
pub fn create(&mut self) -> Option<Token> {
if self.active_tokens.len() == self.max_tokens {
return None;
}
loop {
let token_id = self.seed;
self.seed = self.seed.overflowing_add(1).0;
let token = Token(token_id);
if !self.active_tokens.contains(&token) && token_id >= self.reserved_end {
self.active_tokens.insert(token);
return Some(token);
}
}
}
pub fn remove(&mut self,token: Token) {
self.active_tokens.remove(&token);
}
}