use crate::mutex_object_pool::MutexObjectPool;
use std::mem::ManuallyDrop;
use std::ops::{Deref, DerefMut};
use std::sync::Arc;
pub struct MutexOwnedReusable<T> {
pool: Arc<MutexObjectPool<T>>,
data: ManuallyDrop<T>,
}
impl<T> MutexOwnedReusable<T> {
#[inline]
pub fn new(pool: Arc<MutexObjectPool<T>>, data: ManuallyDrop<T>) -> Self {
Self { pool, data }
}
}
impl<T> DerefMut for MutexOwnedReusable<T> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.data
}
}
impl<T> Deref for MutexOwnedReusable<T> {
type Target = T;
#[inline]
fn deref(&self) -> &Self::Target {
&self.data
}
}
impl<T> Drop for MutexOwnedReusable<T> {
#[inline]
fn drop(&mut self) {
let data = unsafe {
ManuallyDrop::take(&mut self.data)
};
self.pool.attach(data);
}
}