// This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. use crate::config::POOL_SIZE; use crate::nodes::chunk::Chunk; use crate::nodes::rrb::Node; use crate::util::Pool; /// A memory pool for `Vector`. pub struct RRBPool { pub(crate) node_pool: Pool>>, pub(crate) value_pool: Pool>, pub(crate) size_pool: Pool>, } impl RRBPool { /// Create a new memory pool with the given size. pub fn new(size: usize) -> Self { Self::with_sizes(size, size, size) } /// Create a new memory pool with the given sizes for each subpool. pub fn with_sizes( node_pool_size: usize, leaf_pool_size: usize, size_table_pool_size: usize, ) -> Self { Self { node_pool: Pool::new(node_pool_size), value_pool: Pool::new(leaf_pool_size), size_pool: Pool::new(size_table_pool_size), } } /// Fill the memory pool with preallocated chunks. pub fn fill(&self) { self.node_pool.fill(); self.value_pool.fill(); self.size_pool.fill(); } /// Get the size of the node subpool. pub fn node_pool_size(&self) -> usize { self.node_pool.get_pool_size() } /// Get the size of the leaf node subpool. pub fn leaf_pool_size(&self) -> usize { self.value_pool.get_pool_size() } /// Get the size of the size table subpool. pub fn size_table_pool_size(&self) -> usize { self.size_pool.get_pool_size() } } impl Default for RRBPool { /// Construct a pool with a reasonable default pool size. fn default() -> Self { Self::new(POOL_SIZE) } } impl Clone for RRBPool { fn clone(&self) -> Self { Self { node_pool: self.node_pool.clone(), value_pool: self.value_pool.clone(), size_pool: self.size_pool.clone(), } } }