use super::*;
pub mod local;
pub mod logical;
pub mod view;
pub use local::LocalBlockData as BlockData;
pub trait BlockDataExt<S: Storage>: Send + Sync + 'static + std::fmt::Debug {
fn block_id(&self) -> BlockId;
fn block_set_id(&self) -> usize;
fn worker_id(&self) -> WorkerID;
fn storage_type(&self) -> &StorageType;
fn is_fully_contiguous(&self) -> bool;
fn num_layers(&self) -> usize;
fn page_size(&self) -> usize;
fn num_outer_dims(&self) -> usize;
fn num_inner_dims(&self) -> usize;
fn is_local(&self) -> Option<&dyn BlockDataViews<S>>;
fn is_local_mut(&mut self) -> Option<&mut dyn BlockDataViews<S>>;
fn layer_view(
&self,
layer_idx: usize,
outer_idx: usize,
) -> BlockResult<view::LayerView<'_, S>> {
match self.is_local() {
Some(views) => views.local_layer_view(layer_idx, outer_idx),
None => Err(BlockError::ViewsNotAvailableOnLogicalBlocks),
}
}
fn layer_view_mut(
&mut self,
layer_idx: usize,
outer_idx: usize,
) -> BlockResult<view::LayerViewMut<'_, S>> {
match self.is_local_mut() {
Some(views) => views.local_layer_view_mut(layer_idx, outer_idx),
None => Err(BlockError::ViewsNotAvailableOnLogicalBlocks),
}
}
fn block_view(&self) -> BlockResult<view::BlockView<'_, S>> {
match self.is_local() {
Some(views) => views.local_block_view(),
None => Err(BlockError::ViewsNotAvailableOnLogicalBlocks),
}
}
fn block_view_mut(&mut self) -> BlockResult<view::BlockViewMut<'_, S>> {
match self.is_local_mut() {
Some(views) => views.local_block_view_mut(),
None => Err(BlockError::ViewsNotAvailableOnLogicalBlocks),
}
}
}
pub trait BlockDataViews<S: Storage> {
fn local_layer_view(
&self,
layer_idx: usize,
outer_idx: usize,
) -> BlockResult<view::LayerView<'_, S>>;
fn local_layer_view_mut(
&mut self,
layer_idx: usize,
outer_idx: usize,
) -> BlockResult<view::LayerViewMut<'_, S>>;
fn local_block_view(&self) -> BlockResult<view::BlockView<'_, S>>;
fn local_block_view_mut(&mut self) -> BlockResult<view::BlockViewMut<'_, S>>;
}
pub trait BlockDataProvider: StorageTypeProvider {
type Locality: LocalityProvider;
fn block_data(&self) -> &impl BlockDataExt<Self::StorageType>;
}
pub trait BlockDataProviderMut: BlockDataProvider {
type Locality: LocalityProvider;
fn block_data_mut(&mut self) -> &mut impl BlockDataExt<Self::StorageType>;
}