use core::fmt::Debug;
use crate::{server::Binding, storage_id_type};
storage_id_type!(StorageId);
#[derive(Clone, Debug)]
pub struct StorageUtilization {
pub offset: u64,
pub size: u64,
}
#[derive(new, Clone, Debug)]
pub struct StorageHandle {
pub id: StorageId,
pub utilization: StorageUtilization,
}
impl StorageHandle {
pub fn size(&self) -> u64 {
self.utilization.size
}
pub fn offset(&self) -> u64 {
self.utilization.offset
}
pub fn offset_start(&self, offset_bytes: u64) -> Self {
let utilization = StorageUtilization {
offset: self.offset() + offset_bytes,
size: self.size() - offset_bytes,
};
Self {
id: self.id,
utilization,
}
}
pub fn offset_end(&self, offset_bytes: u64) -> Self {
let utilization = StorageUtilization {
offset: self.offset(),
size: self.size() - offset_bytes,
};
Self {
id: self.id,
utilization,
}
}
}
pub trait ComputeStorage: Send {
type Resource: Send;
fn alignment(&self) -> usize;
fn get(&mut self, handle: &StorageHandle) -> Self::Resource;
fn alloc(&mut self, size: u64) -> StorageHandle;
fn dealloc(&mut self, id: StorageId);
}
#[derive(new, Debug)]
pub struct BindingResource<Resource: Send> {
#[allow(unused)]
binding: Binding,
resource: Resource,
}
impl<Resource: Send> BindingResource<Resource> {
pub fn resource(&self) -> &Resource {
&self.resource
}
}