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}