1use crate::config::POOL_SIZE;
6use crate::nodes::chunk::Chunk;
7use crate::nodes::rrb::Node;
8use crate::util::Pool;
9
10pub struct RRBPool<A> {
12    pub(crate) node_pool: Pool<Chunk<Node<A>>>,
13    pub(crate) value_pool: Pool<Chunk<A>>,
14    pub(crate) size_pool: Pool<Chunk<usize>>,
15}
16
17impl<A> RRBPool<A> {
18    pub fn new(size: usize) -> Self {
20        Self::with_sizes(size, size, size)
21    }
22
23    pub fn with_sizes(
25        node_pool_size: usize,
26        leaf_pool_size: usize,
27        size_table_pool_size: usize,
28    ) -> Self {
29        Self {
30            node_pool: Pool::new(node_pool_size),
31            value_pool: Pool::new(leaf_pool_size),
32            size_pool: Pool::new(size_table_pool_size),
33        }
34    }
35
36    pub fn fill(&self) {
38        self.node_pool.fill();
39        self.value_pool.fill();
40        self.size_pool.fill();
41    }
42
43    pub fn node_pool_size(&self) -> usize {
45        self.node_pool.get_pool_size()
46    }
47
48    pub fn leaf_pool_size(&self) -> usize {
50        self.value_pool.get_pool_size()
51    }
52
53    pub fn size_table_pool_size(&self) -> usize {
55        self.size_pool.get_pool_size()
56    }
57}
58
59impl<A> Default for RRBPool<A> {
60    fn default() -> Self {
62        Self::new(POOL_SIZE)
63    }
64}
65
66impl<A> Clone for RRBPool<A> {
67    fn clone(&self) -> Self {
68        Self {
69            node_pool: self.node_pool.clone(),
70            value_pool: self.value_pool.clone(),
71            size_pool: self.size_pool.clone(),
72        }
73    }
74}