reductionml_core/
object_pool.rs1use parking_lot::Mutex;
2
3pub struct Pool<T> {
4 objects: Mutex<Vec<T>>,
5}
6
7impl<T: Default> Pool<T> {
8 #[inline]
9 pub fn new() -> Pool<T> {
10 Pool {
11 objects: Mutex::new(Vec::new()),
12 }
13 }
14
15 #[inline]
16 pub fn len(&self) -> usize {
17 self.objects.lock().len()
18 }
19
20 #[inline]
21 pub fn is_empty(&self) -> bool {
22 self.objects.lock().is_empty()
23 }
24
25 #[inline]
26 pub fn get_object(&self) -> T {
27 self.objects.lock().pop().unwrap_or_else(|| T::default())
28 }
29
30 #[inline]
31 pub fn return_object(&self, t: T) {
32 self.objects.lock().push(t)
33 }
34}
35
36impl<T: Default> Default for Pool<T> {
37 #[inline]
38 fn default() -> Pool<T> {
39 Pool::new()
40 }
41}
42
43unsafe impl<T: Default> Sync for Pool<T> {}
44unsafe impl<T: Default> Send for Pool<T> {}
45
46pub trait PoolReturnable<T: Default> {
47 fn clear_and_return_object(self, pool: &Pool<T>);
48}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53
54 #[test]
55 fn test_pool() {
56 let pool = Pool::<usize>::new();
57 assert_eq!(pool.len(), 0);
58 assert!(pool.is_empty());
59 assert_eq!(pool.get_object(), 0);
60 assert_eq!(pool.len(), 0);
61 assert!(pool.is_empty());
62 pool.return_object(1);
63 assert_eq!(pool.len(), 1);
64 assert!(!pool.is_empty());
65 assert_eq!(pool.get_object(), 1);
66 assert_eq!(pool.len(), 0);
67 assert!(pool.is_empty());
68 }
69}