use std::cell::RefCell;
use std::ops::{Deref, DerefMut};
#[derive(Debug)]
pub struct ValueGuard<'a, T> {
offset: NonZeroU64,
value: T,
in_use_flag: &'a RefCell<bool>,
}
impl<'a, T> ValueGuard<'a, T> {
pub fn new(offset: NonZeroU64, value: T, in_use_flag: &'a RefCell<bool>) -> Self {
Self {
offset,
value,
in_use_flag,
}
}
pub fn offset(&self) -> NonZeroU64 {
self.offset
}
}
impl<T> Deref for ValueGuard<'_, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<T> DerefMut for ValueGuard<'_, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.value
}
}
impl<T> Drop for ValueGuard<'_, T> {
fn drop(&mut self) {
*self.in_use_flag.borrow_mut() = false;
}
}
use crate::file::{HashableObject, HashableObjectMut};
use std::num::NonZeroU64;
impl<T: HashableObject> HashableObject for ValueGuard<'_, T> {
fn hash(&self) -> u64 {
self.value.hash()
}
fn raw_payload(&self) -> &[u8] {
self.value.raw_payload()
}
fn is_compressed(&self) -> bool {
self.value.is_compressed()
}
fn decompress(&self, buf: &mut Vec<u8>) -> crate::error::Result<usize> {
self.value.decompress(buf)
}
fn next_hash_offset(&self) -> Option<NonZeroU64> {
self.value.next_hash_offset()
}
fn object_type() -> super::object::ObjectType {
T::object_type()
}
}
impl<T: HashableObjectMut> HashableObjectMut for ValueGuard<'_, T> {
fn set_next_hash_offset(&mut self, offset: NonZeroU64) {
self.value.set_next_hash_offset(offset);
}
fn set_payload(&mut self, data: &[u8]) {
self.value.set_payload(data);
}
}