lockfree_object_pool/
none_object_pool.rs

1use crate::none_reusable::NoneReusable;
2use std::sync::Arc;
3
4/// Basic allocation without pull. Used to compare default rust allocation with different kind of object pool.
5/// # Example
6/// ```rust
7///  use lockfree_object_pool::NoneObjectPool;
8///
9///  let pool = NoneObjectPool::<u32>::new(|| Default::default());
10///  let mut item = pool.pull();
11///
12///  *item = 5;
13///  let work = *item * 5;
14/// ```
15pub struct NoneObjectPool<T> {
16    init: Box<dyn Fn() -> T + Send + Sync>,
17}
18
19impl<T> NoneObjectPool<T> {
20    ///
21    /// Create an new [`NoneObjectPool`]
22    ///
23    /// # Arguments
24    /// * `init` closure to create new item
25    ///
26    /// # Example
27    /// ```rust
28    ///  use lockfree_object_pool::NoneObjectPool;
29    ///
30    ///  let pool = NoneObjectPool::<u32>::new(|| Default::default());
31    /// ```
32    #[inline]
33    pub fn new<I>(init: I) -> Self
34    where
35        I: Fn() -> T + Send + Sync + 'static,
36    {
37        Self {
38            init: Box::new(init),
39        }
40    }
41
42    ///
43    /// Create a new element. When the element is dropped, it doesn't return in the pull.
44    ///
45    /// # Example
46    /// ```rust
47    ///  use lockfree_object_pool::NoneObjectPool;
48    ///
49    ///  let pool = NoneObjectPool::<u32>::new(|| Default::default());
50    ///  let mut item = pool.pull();
51    /// ```
52    #[inline]
53    pub fn pull(&self) -> NoneReusable<T> {
54        NoneReusable::new((self.init)())
55    }
56
57    ///
58    /// Create a new element. When the element is dropped, it doesn't return in the pull.
59    ///
60    /// # Example
61    /// ```rust
62    ///  use std::sync::Arc;
63    ///  use lockfree_object_pool::NoneObjectPool;
64    ///
65    ///  let pool = Arc::new(NoneObjectPool::<u32>::new(|| Default::default()));
66    ///  let mut item = pool.pull_owned();
67    /// ```
68    #[inline]
69    pub fn pull_owned(self: &Arc<Self>) -> NoneReusable<T> {
70        NoneReusable::new((self.init)())
71    }
72}