file_system/fundamentals/identifiers/
file_system.rs

1use core::ops::{Add, AddAssign};
2
3/// File system identifier inner type
4///
5/// This is the inner/raw type of [`File_system_identifier_type`].
6/// It size is the half of the `target_pointer_width` :
7/// - 16 bits on 32 bits systems
8/// - 32 bits on 64 bits systems
9#[cfg(target_pointer_width = "32")]
10pub type FileSystemIdentifierInner = u16;
11#[cfg(target_pointer_width = "64")]
12pub type FileSystemIdentifierInner = u32;
13
14/// File system identifier type
15///
16/// This type is used to identify a file system in the virtual file system.
17/// It is a wrapper around [`FileSystemIdentifierInner`].
18#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Ord, PartialOrd)]
19#[repr(transparent)]
20pub struct FileSystemIdentifier(FileSystemIdentifierInner);
21
22impl FileSystemIdentifier {
23    pub const PIPE_FILE_SYSTEM: FileSystemIdentifier = FileSystemIdentifier::new(0);
24    pub const DEVICE_FILE_SYSTEM: FileSystemIdentifier = FileSystemIdentifier::new(1);
25    pub const NETWORK_SOCKET_FILE_SYSTEM: FileSystemIdentifier = FileSystemIdentifier::new(2);
26    pub const LOCAL_SOCKET_FILE_SYSTEM: FileSystemIdentifier = FileSystemIdentifier::new(3);
27
28    pub const MINIMUM: FileSystemIdentifier = FileSystemIdentifier::new(4);
29    pub const MAXIMUM: FileSystemIdentifier =
30        FileSystemIdentifier::new(FileSystemIdentifierInner::MAX);
31
32    pub const fn new(identifier: FileSystemIdentifierInner) -> Self {
33        Self(identifier)
34    }
35
36    pub const fn as_inner(self) -> FileSystemIdentifierInner {
37        self.0
38    }
39}
40
41impl AddAssign<FileSystemIdentifierInner> for FileSystemIdentifier {
42    fn add_assign(&mut self, rhs: FileSystemIdentifierInner) {
43        self.0 += rhs;
44    }
45}
46
47impl Add<FileSystemIdentifierInner> for FileSystemIdentifier {
48    type Output = Self;
49
50    fn add(self, rhs: FileSystemIdentifierInner) -> Self::Output {
51        Self(self.0 + rhs)
52    }
53}
54
55impl From<FileSystemIdentifierInner> for FileSystemIdentifier {
56    fn from(internal_file_system_identifier: FileSystemIdentifierInner) -> Self {
57        FileSystemIdentifier(internal_file_system_identifier)
58    }
59}
60
61impl From<FileSystemIdentifier> for FileSystemIdentifierInner {
62    fn from(internal_file_system_identifier: FileSystemIdentifier) -> Self {
63        internal_file_system_identifier.0
64    }
65}
66
67#[cfg(test)]
68mod tests {
69    use super::*;
70
71    #[test]
72    fn test_file_system_identifier() {
73        let identifier = FileSystemIdentifier::from(0x1234);
74        assert_eq!(identifier, FileSystemIdentifier::new(0x1234));
75        assert_eq!(FileSystemIdentifierInner::from(identifier), 0x1234);
76    }
77}