quantrs2_core/
buffer_pool.rs1use std::collections::VecDeque;
5use std::marker::PhantomData;
6use std::sync::Mutex;
7
8pub struct BufferPool<T> {
10 pool: Mutex<VecDeque<Vec<T>>>,
11 _phantom: PhantomData<T>,
12}
13
14impl<T: Clone + Default> BufferPool<T> {
15 pub const fn new() -> Self {
17 Self {
18 pool: Mutex::new(VecDeque::new()),
19 _phantom: PhantomData,
20 }
21 }
22
23 pub fn get(&self, size: usize) -> Vec<T> {
25 let mut pool = self.pool.lock().unwrap_or_else(|e| e.into_inner());
26 pool.pop_front().map_or_else(
27 || vec![T::default(); size],
28 |mut buffer| {
29 buffer.resize(size, T::default());
30 buffer
31 },
32 )
33 }
34
35 pub fn put(&self, buffer: Vec<T>) {
37 let mut pool = self.pool.lock().unwrap_or_else(|e| e.into_inner());
38 pool.push_back(buffer);
39 }
40
41 #[inline]
43 pub fn return_buffer(&self, buffer: Vec<T>) {
44 self.put(buffer);
45 }
46
47 pub fn pool_size(&self) -> usize {
49 self.pool.lock().unwrap_or_else(|e| e.into_inner()).len()
50 }
51
52 pub fn clear(&self) {
54 let mut pool = self.pool.lock().unwrap_or_else(|e| e.into_inner());
55 pool.clear();
56 }
57}
58
59impl<T> Default for BufferPool<T> {
60 fn default() -> Self {
61 Self {
62 pool: Mutex::new(VecDeque::new()),
63 _phantom: PhantomData,
64 }
65 }
66}