1use std::{io, marker::PhantomData, mem};
2
3use crate::{
4 utils::{check_zst, page_size},
5 DefaultSegmentBuilder, MmapVec, Segment, SegmentBuilder,
6};
7
8pub struct MmapVecBuilder<T, SB: SegmentBuilder = DefaultSegmentBuilder> {
24 segment_builder: SB,
25 capacity: usize,
26 _phantom: PhantomData<T>,
27}
28
29impl<T, SB: SegmentBuilder> MmapVecBuilder<T, SB> {
30 #[inline(always)]
32 pub fn new() -> Self {
33 Self::default()
34 }
35
36 #[inline(always)]
38 pub fn segment_builder(mut self, segment_builder: SB) -> Self {
39 self.segment_builder = segment_builder;
40 self
41 }
42
43 #[inline(always)]
45 pub fn capacity(mut self, capacity: usize) -> Self {
46 self.capacity = capacity;
47 self
48 }
49
50 pub fn try_build(self) -> io::Result<MmapVec<T, SB>> {
54 let path = self.segment_builder.new_segment_path();
55 let segment = Segment::open_rw(&path, self.capacity)?;
56
57 Ok(MmapVec {
58 segment,
59 builder: self.segment_builder,
60 path,
61 })
62 }
63}
64
65impl<T, SB: SegmentBuilder> Default for MmapVecBuilder<T, SB> {
66 #[inline(always)]
67 fn default() -> Self {
68 check_zst::<T>();
69 Self {
70 segment_builder: SB::default(),
71 capacity: page_size() / mem::size_of::<T>(),
72 _phantom: PhantomData,
73 }
74 }
75}