use super::*;
impl<T> ObjectPool<T> {
pub fn new(initial: Vec<T>) -> ObjectPool<T> {
ObjectPool {
active: 0,
free: initial,
}
}
pub fn empty() -> ObjectPool<T> {
ObjectPool {
active: 0,
free: Vec::with_capacity(POOL_DEFAULT_PREWARM),
}
}
pub fn get_active(&self) -> usize {
self.active
}
pub fn set_active(&mut self, active: usize) {
self.active = active;
}
pub fn get_free(&self) -> &Vec<T> {
&self.free
}
pub fn get_mut_free(&mut self) -> &mut Vec<T> {
&mut self.free
}
pub fn available(&self) -> usize {
self.get_free().len()
}
pub fn len(&self) -> usize {
self.get_active() + self.available()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn acquire(&mut self) -> Option<T> {
let value: Option<T> = self.get_mut_free().pop();
if value.is_some() {
let active: usize = self.get_active() + 1;
self.set_active(active);
}
value
}
pub fn acquire_with<F>(&mut self, mut make: F) -> T
where
F: FnMut() -> T,
{
if self.available() > 0
&& let Some(value) = self.acquire()
{
return value;
}
let value: T = make();
let active: usize = self.get_active() + 1;
self.set_active(active);
value
}
pub fn release(&mut self, value: T) {
let active: usize = self.get_active().saturating_sub(1);
self.set_active(active);
self.get_mut_free().push(value);
}
pub fn prewarm<F>(&mut self, count: usize, mut make: F) -> usize
where
F: FnMut() -> T,
{
for _ in 0..count {
let value: T = make();
self.get_mut_free().push(value);
}
self.available()
}
pub fn clear(&mut self) -> usize {
let discarded: usize = self.available();
self.get_mut_free().clear();
self.set_active(0);
discarded
}
}
impl<T> Default for ObjectPool<T> {
fn default() -> ObjectPool<T> {
ObjectPool::empty()
}
}
impl<T> Debug for ObjectPool<T> {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("ObjectPool")
.field("active", &self.active)
.field("available", &self.free.len())
.finish()
}
}