versatile_data/
row_fragment.rs1use 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}