pub mod local;
pub mod logical;
pub use local::LocalBlockDataFactory;
use crate::block_manager::{LayoutConfig, OffloadFilter};
use super::*;
use derive_getters::Dissolve;
pub trait BlockFactory<S: Storage, L: LocalityProvider> {
fn create_block_data(&self, block_id: BlockId) -> BlockResult<L::BlockData<S>>;
fn create_block<M: BlockMetadata + Default>(
&self,
block_id: BlockId,
) -> BlockResult<Block<S, L, M>> {
let block_data = self.create_block_data(block_id)?;
Block::new(block_data, M::default())
}
fn create_block_with_metadata<M: BlockMetadata>(
&self,
block_id: BlockId,
metadata: M,
) -> BlockResult<Block<S, L, M>> {
let block_data = self.create_block_data(block_id)?;
Block::new(block_data, metadata)
}
fn num_blocks(&self) -> usize;
fn layout_config(&self) -> &LayoutConfig;
fn offload_filter(&self) -> Option<Arc<dyn OffloadFilter>>;
}
pub trait IntoBlocks<S: Storage, L: LocalityProvider>: BlockFactory<S, L> + Sized {
fn into_blocks<M: BlockMetadata + Default>(self) -> BlockResult<Vec<Block<S, L, M>>> {
let num_blocks = self.num_blocks();
let mut blocks = Vec::with_capacity(num_blocks);
for block_idx in 0..num_blocks {
let block = self.create_block(block_idx)?;
blocks.push(block);
}
Ok(blocks)
}
fn into_blocks_with_metadata<M: BlockMetadata + Clone>(
self,
metadata: M,
) -> BlockResult<Vec<Block<S, L, M>>> {
let num_blocks = self.num_blocks();
let mut blocks = Vec::with_capacity(num_blocks);
for block_idx in 0..num_blocks {
let block = self.create_block_with_metadata(block_idx, metadata.clone())?;
blocks.push(block);
}
Ok(blocks)
}
}