use crate::pool::AutoPool;
use std::ops::{Deref, DerefMut};
pub struct PoolObject<'a, T: Send + 'static> {
inner: Option<T>,
parent: &'a AutoPool<T>,
}
impl<'a, T: Send + 'static> PoolObject<'a, T> {
pub(crate) fn new(inner: T, parent: &'a AutoPool<T>) -> Self {
Self {
inner: Some(inner),
parent,
}
}
pub fn release(mut self) {
self.inner = None;
}
}
impl<T: Send + 'static> Deref for PoolObject<'_, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.inner.as_ref().unwrap()
}
}
impl<T: Send + 'static> DerefMut for PoolObject<'_, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.inner.as_mut().unwrap()
}
}
impl<T: Send + 'static> Drop for PoolObject<'_, T> {
fn drop(&mut self) {
if let Some(inner) = self.inner.take() {
self.parent.put(inner);
}
}
}