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}