mmap_vec/
vec_builder.rs

1use std::{io, marker::PhantomData, mem};
2
3use crate::{
4    utils::{check_zst, page_size},
5    DefaultSegmentBuilder, MmapVec, Segment, SegmentBuilder,
6};
7
8/// Helps to create vec with custom parameters.
9///
10/// Example usage:
11///
12/// ```rust
13/// # use mmap_vec::{DefaultSegmentBuilder, MmapVecBuilder};
14/// let seg_builder = DefaultSegmentBuilder::with_path("/tmp/rust-mmap");
15/// seg_builder.create_dir_all().expect("Fail to create mmap dir");
16///
17/// let vec = MmapVecBuilder::<usize>::new()
18///     .capacity(500)
19///     .segment_builder(seg_builder.clone())
20///     .try_build()
21///     .expect("Fail to create mmap vec");
22/// ```
23pub 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    /// Create new struct.
31    #[inline(always)]
32    pub fn new() -> Self {
33        Self::default()
34    }
35
36    /// Update segment builder.
37    #[inline(always)]
38    pub fn segment_builder(mut self, segment_builder: SB) -> Self {
39        self.segment_builder = segment_builder;
40        self
41    }
42
43    /// Update capacity.
44    #[inline(always)]
45    pub fn capacity(mut self, capacity: usize) -> Self {
46        self.capacity = capacity;
47        self
48    }
49
50    /// Try building a new vec with given parameter.
51    ///
52    /// This function may failed if segment creation failed.
53    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}