use crate::bytes::{le_u32, le_u64};
pub const BLOCK_DESCRIPTOR_LEN: usize = 32;
pub const STORE_BLOCK_RANGE_LEN: usize = 24;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BlockDescriptorFlags(pub u32);
impl BlockDescriptorFlags {
pub const FORWARDER: u32 = 0x01;
pub const OVERLAY: u32 = 0x02;
pub const NOT_USED: u32 = 0x04;
#[must_use]
pub fn bits(self) -> u32 {
self.0
}
#[must_use]
pub fn contains(self, flag: u32) -> bool {
self.0 & flag != 0
}
#[must_use]
pub fn is_forwarder(self) -> bool {
self.contains(Self::FORWARDER)
}
#[must_use]
pub fn is_overlay(self) -> bool {
self.contains(Self::OVERLAY)
}
#[must_use]
pub fn is_not_used(self) -> bool {
self.contains(Self::NOT_USED)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BlockDescriptor {
pub original_offset: u64,
pub relative_store_offset: u64,
pub store_offset: u64,
pub flags: BlockDescriptorFlags,
pub allocation_bitmap: u32,
}
impl BlockDescriptor {
#[must_use]
pub fn parse(buf: &[u8]) -> Self {
BlockDescriptor {
original_offset: le_u64(buf, 0),
relative_store_offset: le_u64(buf, 8),
store_offset: le_u64(buf, 16),
flags: BlockDescriptorFlags(le_u32(buf, 24)),
allocation_bitmap: le_u32(buf, 28),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StoreBlockRange {
pub store_offset: u64,
pub relative_offset: u64,
pub range_size: u64,
}
impl StoreBlockRange {
#[must_use]
pub fn parse(buf: &[u8]) -> Self {
StoreBlockRange {
store_offset: le_u64(buf, 0),
relative_offset: le_u64(buf, 8),
range_size: le_u64(buf, 16),
}
}
}