use std::{io, marker::PhantomData, mem};
use crate::{
utils::{check_zst, page_size},
DefaultSegmentBuilder, MmapVec, Segment, SegmentBuilder,
};
pub struct MmapVecBuilder<T, SB: SegmentBuilder = DefaultSegmentBuilder> {
segment_builder: SB,
capacity: usize,
_phantom: PhantomData<T>,
}
impl<T, SB: SegmentBuilder> MmapVecBuilder<T, SB> {
#[inline(always)]
pub fn new() -> Self {
Self::default()
}
#[inline(always)]
pub fn segment_builder(mut self, segment_builder: SB) -> Self {
self.segment_builder = segment_builder;
self
}
#[inline(always)]
pub fn capacity(mut self, capacity: usize) -> Self {
self.capacity = capacity;
self
}
pub fn try_build(self) -> io::Result<MmapVec<T, SB>> {
let path = self.segment_builder.new_segment_path();
let segment = Segment::open_rw(&path, self.capacity)?;
Ok(MmapVec {
segment,
builder: self.segment_builder,
path,
})
}
}
impl<T, SB: SegmentBuilder> Default for MmapVecBuilder<T, SB> {
#[inline(always)]
fn default() -> Self {
check_zst::<T>();
Self {
segment_builder: SB::default(),
capacity: page_size() / mem::size_of::<T>(),
_phantom: PhantomData,
}
}
}