use std::collections::hash_map::Entry;
use std::collections::HashMap;
use crate::Quota;
use crate::QuotaPolicy;
pub struct QuotaPool {
quotas: Vec<Quota>,
last_access_times_ns: Vec<u64>,
policy: QuotaPolicy,
key_map: HashMap<&'static str, usize>,
initial_available_tokens: u64,
}
impl QuotaPool {
#[inline]
pub fn new(policy: QuotaPolicy) -> QuotaPool {
QuotaPool {
quotas: Vec::new(),
last_access_times_ns: Vec::new(),
policy,
key_map: HashMap::new(),
initial_available_tokens: 0,
}
}
pub fn quota(&mut self, key: &'static str) -> &Quota {
match self.key_map.entry(key) {
Entry::Occupied(occupied_entry) => {
&self.quotas[*occupied_entry.get()]
}
Entry::Vacant(vacant_entry) => unsafe {
let new_index = self.quotas.len();
vacant_entry.insert(new_index);
self.quotas.push(Quota::with_initial_tokens(self.initial_available_tokens));
self.last_access_times_ns.push(0);
&self.quotas.get_unchecked(new_index)
}
}
}
}
#[cfg(test)]
mod tests;