use std::sync::Arc;
use crate::errors::Result;
use crate::mmap::MemoryMappedFile;
use crate::utils::slice_range;
#[derive(Clone, Debug)]
pub struct Segment {
parent: Arc<MemoryMappedFile>,
offset: u64,
len: u64,
}
impl Segment {
pub fn new(parent: Arc<MemoryMappedFile>, offset: u64, len: u64) -> Result<Self> {
let total = parent.current_len()?;
let _ = slice_range(offset, len, total)?;
Ok(Self {
parent,
offset,
len,
})
}
pub fn as_slice(&self) -> Result<crate::mmap::MappedSlice<'_>> {
self.parent.as_slice(self.offset, self.len)
}
#[must_use]
pub fn len(&self) -> u64 {
self.len
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.len == 0
}
#[must_use]
pub fn offset(&self) -> u64 {
self.offset
}
#[must_use]
pub fn parent(&self) -> &MemoryMappedFile {
&self.parent
}
#[must_use]
pub fn is_valid(&self) -> bool {
match self.parent.current_len() {
Ok(total) => crate::utils::ensure_in_bounds(self.offset, self.len, total).is_ok(),
Err(_) => false,
}
}
}
#[derive(Clone, Debug)]
pub struct SegmentMut {
parent: Arc<MemoryMappedFile>,
offset: u64,
len: u64,
}
impl SegmentMut {
pub fn new(parent: Arc<MemoryMappedFile>, offset: u64, len: u64) -> Result<Self> {
let total = parent.current_len()?;
let _ = slice_range(offset, len, total)?;
Ok(Self {
parent,
offset,
len,
})
}
pub fn as_slice_mut(&self) -> Result<crate::mmap::MappedSliceMut<'_>> {
self.parent.as_slice_mut(self.offset, self.len)
}
pub fn write(&self, data: &[u8]) -> Result<()> {
self.parent.update_region(self.offset, data)
}
#[must_use]
pub fn len(&self) -> u64 {
self.len
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.len == 0
}
#[must_use]
pub fn offset(&self) -> u64 {
self.offset
}
#[must_use]
pub fn parent(&self) -> &MemoryMappedFile {
&self.parent
}
#[must_use]
pub fn is_valid(&self) -> bool {
match self.parent.current_len() {
Ok(total) => crate::utils::ensure_in_bounds(self.offset, self.len, total).is_ok(),
Err(_) => false,
}
}
}