versatile_data/
row_fragment.rs

1use std::{num::NonZeroU32, path::PathBuf};
2
3use super::FileMmap;
4
5const U32_SIZE: usize = std::mem::size_of::<u32>();
6
7pub struct RowFragment {
8    filemmap: FileMmap,
9}
10impl RowFragment {
11    pub fn new(path: PathBuf) -> Self {
12        let mut filemmap = FileMmap::new(path).unwrap();
13        if filemmap.len() == 0 {
14            filemmap.set_len(U32_SIZE as u64).unwrap();
15        }
16        Self { filemmap }
17    }
18
19    fn blank_count(&self) -> u64 {
20        self.filemmap.len() / U32_SIZE as u64 - 1
21    }
22
23    pub fn insert_blank(&mut self, row: NonZeroU32) {
24        self.filemmap.append(&row.get().to_ne_bytes()).unwrap();
25    }
26
27    pub fn pop(&mut self) -> Option<NonZeroU32> {
28        let count = self.blank_count();
29        (count > 0).then(|| {
30            let last = unsafe { *(self.filemmap.as_ptr() as *mut u32).offset(count as isize) };
31            self.filemmap.set_len(count * U32_SIZE as u64).unwrap();
32            unsafe { NonZeroU32::new_unchecked(last) }
33        })
34    }
35
36    pub fn serial_increment(&mut self) -> NonZeroU32 {
37        let blank_list = unsafe { &mut *(self.filemmap.as_ptr() as *mut u32) };
38        *blank_list += 1;
39        unsafe { NonZeroU32::new_unchecked(*blank_list) }
40    }
41}