mod builder;
mod growth_strategy;
mod initialization;
pub use builder::PoolConfigBuilder;
pub use growth_strategy::GrowthStrategy;
pub use initialization::InitializationStrategy;
use core::mem;
pub struct PoolConfig<T> {
pub(crate) capacity: usize,
pub(crate) max_capacity: Option<usize>,
pub(crate) growth_strategy: GrowthStrategy,
pub(crate) alignment: usize,
pub(crate) pre_initialize: bool,
#[allow(dead_code)]
pub(crate) initialization_strategy: InitializationStrategy<T>,
pub(crate) thread_local: bool,
}
impl<T> PoolConfig<T> {
pub fn builder() -> PoolConfigBuilder<T> {
PoolConfigBuilder::new()
}
#[inline]
pub fn capacity(&self) -> usize {
self.capacity
}
#[inline]
pub fn max_capacity(&self) -> Option<usize> {
self.max_capacity
}
#[inline]
pub fn growth_strategy(&self) -> &GrowthStrategy {
&self.growth_strategy
}
#[inline]
pub fn alignment(&self) -> usize {
self.alignment
}
#[inline]
pub fn pre_initialize(&self) -> bool {
self.pre_initialize
}
#[inline]
pub fn thread_local(&self) -> bool {
self.thread_local
}
}
impl<T> Default for PoolConfig<T> {
fn default() -> Self {
Self {
capacity: 100,
max_capacity: None,
growth_strategy: GrowthStrategy::None,
alignment: mem::align_of::<T>(),
pre_initialize: false,
initialization_strategy: InitializationStrategy::Lazy,
thread_local: false,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_config() {
let config = PoolConfig::<i32>::default();
assert_eq!(config.capacity(), 100);
assert_eq!(config.max_capacity(), None);
assert_eq!(config.alignment(), mem::align_of::<i32>());
assert!(!config.pre_initialize());
assert!(!config.thread_local());
}
#[test]
fn builder_creates_config() {
let config = PoolConfig::<i32>::builder().capacity(500).build().unwrap();
assert_eq!(config.capacity(), 500);
}
}