libpijul_compat/backend/
file_id.rs

1use super::inode::*;
2use super::small_string::*;
3use sanakirja::{Alignment, Representable};
4use std;
5
6#[derive(Debug, Hash, Eq, PartialEq, Clone)]
7#[repr(packed)]
8pub struct OwnedFileId {
9    pub parent_inode: Inode,
10    pub basename: SmallString,
11}
12
13impl OwnedFileId {
14    pub fn as_file_id(&self) -> FileId {
15        FileId {
16            parent_inode: self.parent_inode,
17            basename: self.basename.as_small_str(),
18        }
19    }
20}
21
22#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
23pub struct FileId<'a> {
24    pub parent_inode: Inode,
25    pub basename: SmallStr<'a>,
26}
27
28#[derive(Clone, Copy, Debug)]
29pub struct UnsafeFileId {
30    parent_inode: Inode,
31    basename: UnsafeSmallStr,
32}
33
34impl<'a> FileId<'a> {
35    pub fn to_owned(&self) -> OwnedFileId {
36        OwnedFileId {
37            parent_inode: self.parent_inode.clone(),
38            basename: self.basename.to_owned(),
39        }
40    }
41    pub fn to_unsafe(&self) -> UnsafeFileId {
42        UnsafeFileId {
43            parent_inode: self.parent_inode,
44            basename: self.basename.to_unsafe(),
45        }
46    }
47    pub unsafe fn from_unsafe(p: UnsafeFileId) -> FileId<'a> {
48        FileId {
49            parent_inode: p.parent_inode,
50            basename: SmallStr::from_unsafe(p.basename),
51        }
52    }
53}
54
55impl Representable for UnsafeFileId {
56    fn alignment() -> Alignment {
57        Alignment::B1
58    }
59    fn onpage_size(&self) -> u16 {
60        INODE_SIZE as u16 + self.basename.onpage_size()
61    }
62    unsafe fn write_value(&self, p: *mut u8) {
63        trace!("write_value {:?}", p);
64        self.parent_inode.write_value(p);
65        self.basename.write_value(p.offset(INODE_SIZE as isize));
66    }
67    unsafe fn read_value(p: *const u8) -> Self {
68        trace!("read_value {:?}", p);
69        UnsafeFileId {
70            parent_inode: Inode::read_value(p),
71            basename: UnsafeSmallStr::read_value(p.offset(INODE_SIZE as isize)),
72        }
73    }
74    unsafe fn cmp_value<T>(&self, _: &T, x: Self) -> std::cmp::Ordering {
75        trace!("cmp_value file_id");
76        let a: FileId = FileId::from_unsafe(*self);
77        let b: FileId = FileId::from_unsafe(x);
78        a.cmp(&b)
79    }
80    type PageOffsets = std::iter::Empty<u64>;
81    fn page_offsets(&self) -> Self::PageOffsets {
82        std::iter::empty()
83    }
84}