dynamic_pooling/
object.rs1use crate::{
2	pool::{Pool, PoolInner},
3	reset::Reset,
4};
5use alloc::sync::{Arc, Weak};
6use core::{
7	borrow::{Borrow, BorrowMut},
8	cmp::Ordering,
9	fmt::{self, Debug, Display},
10	hash::{Hash, Hasher},
11	ops::{Deref, DerefMut},
12};
13
14pub struct Pooled<T: Default + Reset> {
18	pool_inner: Weak<PoolInner<T>>,
19
20	object: Option<T>,
26}
27
28impl<T: Default + Reset> Pooled<T> {
29	pub(super) fn new(object: T, pool: &Pool<T>) -> Self {
30		Self {
31			object: Some(object),
32			pool_inner: Arc::downgrade(&pool.inner),
33		}
34	}
35
36	pub fn detach(mut this: Self) -> T {
50		this.object.take().expect("always some")
51	}
52
53	pub fn get_pool(this: &Self) -> Option<Pool<T>> {
66		this.pool_inner.upgrade().map(|inner| Pool { inner })
67	}
68}
69
70impl<T: Default + Reset> Drop for Pooled<T> {
71	fn drop(&mut self) {
72		if let Some(pool_inner) = self.pool_inner.upgrade() {
73			if let Some(mut object) = self.object.take() {
74				object.reset();
75				let _ = pool_inner.push(object);
76			}
77		}
78	}
79}
80
81impl<T: Default + Reset> Deref for Pooled<T> {
82	type Target = T;
83	fn deref(&self) -> &Self::Target {
84		self.object.as_ref().expect("always some")
85	}
86}
87
88impl<T: Default + Reset> DerefMut for Pooled<T> {
89	fn deref_mut(&mut self) -> &mut Self::Target {
90		self.object.as_mut().expect("always some")
91	}
92}
93
94impl<T: Default + Reset> AsRef<T> for Pooled<T> {
95	fn as_ref(&self) -> &T {
96		self
97	}
98}
99
100impl<T: Default + Reset> AsMut<T> for Pooled<T> {
101	fn as_mut(&mut self) -> &mut T {
102		self
103	}
104}
105
106impl<T: Default + Reset> Borrow<T> for Pooled<T> {
107	fn borrow(&self) -> &T {
108		self
109	}
110}
111
112impl<T: Default + Reset> BorrowMut<T> for Pooled<T> {
113	fn borrow_mut(&mut self) -> &mut T {
114		self
115	}
116}
117
118impl<T: Default + Reset> Hash for Pooled<T>
119where
120	T: Hash,
121{
122	fn hash<H: Hasher>(&self, state: &mut H) {
123		(**self).hash(state);
124	}
125}
126
127impl<T: Default + Reset> PartialEq for Pooled<T>
128where
129	T: PartialEq<T>,
130{
131	fn eq(&self, other: &Self) -> bool {
132		(**self).eq(other)
133	}
134}
135
136impl<T: Default + Reset> PartialEq<T> for Pooled<T>
137where
138	T: PartialEq<T>,
139{
140	fn eq(&self, other: &T) -> bool {
141		(**self).eq(other)
142	}
143}
144
145impl<T: Default + Reset> Eq for Pooled<T> where T: Eq {}
146
147impl<T: Default + Reset> PartialOrd for Pooled<T>
148where
149	T: PartialOrd<T>,
150{
151	fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
152		(**self).partial_cmp(other)
153	}
154}
155
156impl<T: Default + Reset> Ord for Pooled<T>
157where
158	T: Ord,
159{
160	fn cmp(&self, other: &Self) -> Ordering {
161		(**self).cmp(other)
162	}
163}
164
165impl<T: Default + Reset + PartialOrd<T>> PartialOrd<T> for Pooled<T> {
166	fn partial_cmp(&self, other: &T) -> Option<Ordering> {
167		(**self).partial_cmp(other)
168	}
169}
170
171impl<T: Default + Reset> Debug for Pooled<T>
172where
173	T: Debug,
174{
175	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
176		(**self).fmt(f)
177	}
178}
179
180impl<T: Default + Reset> Display for Pooled<T>
181where
182	T: Display,
183{
184	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
185		(**self).fmt(f)
186	}
187}