summaryrefslogtreecommitdiff
path: root/src/cached_inode.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cached_inode.rs')
-rw-r--r--src/cached_inode.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/cached_inode.rs b/src/cached_inode.rs
index 814c1aa..a4e8202 100644
--- a/src/cached_inode.rs
+++ b/src/cached_inode.rs
@@ -1,3 +1,4 @@
+use crate::disk::data_block::{Block, DataBlock};
use crate::disk::inode::Inode;
pub struct CachedInode {
@@ -5,3 +6,28 @@ pub struct CachedInode {
pub index: usize,
pub dirty: bool,
}
+
+#[derive(Clone)]
+pub struct CachedBlock<T: Block> {
+ pub block: T,
+ pub index: usize,
+ pub dirty: bool,
+}
+
+impl<T: Block> CachedBlock<T> {
+ fn cast<U: Block>(&self) -> CachedBlock<U> {
+ unsafe { std::mem::transmute_copy(&self) }
+ }
+}
+
+pub fn convert_mut<U: Block, T: Block>(input_block: &mut CachedBlock<U>) -> &mut CachedBlock<T> {
+ let ptr = input_block as *const CachedBlock<U> as *mut u8;
+ let block = ptr.cast::<CachedBlock<T>>();
+ unsafe { &mut *block }
+}
+
+pub fn convert<U: Block, T: Block>(input_block: &CachedBlock<U>) -> &CachedBlock<T> {
+ let ptr = input_block as *const CachedBlock<U> as *mut u8;
+ let block = ptr.cast::<CachedBlock<T>>();
+ unsafe { &*block }
+}