libpijul_compat/backend/
file_id.rs1use 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}