versatile_data/
serial.rs

1use idx_binary::{AvltrieeUpdate, IdxFile};
2use std::{num::NonZeroU32, path::PathBuf};
3
4use crate::RowFragment;
5
6pub(crate) struct SerialNumber {
7    serial: IdxFile<u32>,
8    fragment: RowFragment,
9}
10
11impl std::ops::Deref for SerialNumber {
12    type Target = IdxFile<u32>;
13    fn deref(&self) -> &Self::Target {
14        &self.serial
15    }
16}
17
18impl SerialNumber {
19    pub fn new(path: PathBuf, reserve_unit: u32) -> Self {
20        let file_name = path.file_name().map_or("".into(), |f| f.to_string_lossy());
21        SerialNumber {
22            serial: IdxFile::new(
23                {
24                    let mut path = path.clone();
25                    path.set_file_name(&(file_name.to_string() + ".i"));
26                    path
27                },
28                reserve_unit,
29            ),
30            fragment: RowFragment::new({
31                let mut path = path.clone();
32                path.set_file_name(&(file_name.into_owned() + ".f"));
33                path
34            }),
35        }
36    }
37
38    pub fn delete(&mut self, row: NonZeroU32) {
39        self.serial.delete(row);
40        self.fragment.insert_blank(row);
41    }
42
43    pub fn next_row(&mut self) -> NonZeroU32 {
44        let v = self.fragment.serial_increment().get();
45        if let Some(row) = self.fragment.pop() {
46            self.serial.update(row, &v);
47            row
48        } else {
49            self.serial.insert(&v)
50        }
51    }
52}