reductionml_core/
object_pool.rs

1use 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}