easy_pool/
pool_seg_queue.rs1use std::{fmt::Debug, sync::Arc};
2
3use crossbeam::queue::SegQueue;
4
5use crate::{Clear, PoolObjectContainer, PoolType};
6
7#[derive(Debug)]
8pub struct PoolSegQueue<T> {
9 pub(crate) values: SegQueue<T>,
10 pub(crate) max_size: usize,
11}
12
13impl<T: Clear> PoolSegQueue<T> {
14 pub fn new(max_size: usize) -> Self {
15 Self {
16 values: SegQueue::new(),
17 max_size,
18 }
19 }
20
21 #[inline]
23 pub fn create(self: &Arc<Self>) -> PoolObjectContainer<T>
24 where
25 T: Clear + Default,
26 {
27 self.create_with(|| Default::default())
28 }
29
30 pub fn create_with<F: FnOnce() -> T>(self: &Arc<Self>, f: F) -> PoolObjectContainer<T> {
34 let val = self.values.pop().unwrap_or_else(f);
35 PoolObjectContainer::new(val, PoolType::SegQueue(Arc::clone(&self)))
36 }
37
38 #[inline]
39 pub fn len(&self) -> usize {
40 self.values.len()
41 }
42}
43
44impl<T: Clear> Default for PoolSegQueue<T> {
45 fn default() -> Self {
46 Self::new(1024)
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53
54 #[test]
55 fn test() {
56 let pool = Arc::new(PoolSegQueue::<Vec<u8>>::new(1024));
57 let mut new_vec = pool.create();
58 new_vec.extend_from_slice(&[0, 0, 0, 0, 1, 1]);
59 let capacity = new_vec.capacity();
60 drop(new_vec);
61 assert!(!pool.values.is_empty());
62 let new_vec = pool.create();
63 assert!(new_vec.capacity() > 0 && new_vec.capacity() == capacity);
64 assert!(new_vec.is_empty());
65 assert!(pool.values.is_empty());
66 drop(new_vec);
67 }
68
69 #[test]
70 fn test_create_with() {
71 let pool = Arc::new(PoolSegQueue::<Vec<u8>>::new(1024));
72 let r = pool.create_with(|| Vec::with_capacity(4096));
73 assert_eq!(r.capacity(), 4096);
74 }
75
76 #[test]
77 fn test_create() {
78 let pool = Arc::new(PoolSegQueue::<Vec<u8>>::new(1024));
79 let r = pool.create();
80 assert_eq!(r.capacity(), Vec::<u8>::default().capacity());
81 }
82
83 #[test]
84 fn test_len() {
85 let pool = Arc::new(PoolSegQueue::<Vec<u8>>::new(1024));
86 assert_eq!(pool.len(), 0);
87 let new_vec = pool.create();
88 drop(new_vec);
89 assert_eq!(pool.len(), 1);
90 }
91}