use std::sync::Arc;
use ztensor::{Catalog, Opaque, Result, Source, Store, Vocabulary};
pub(crate) struct Projection {
pub catalog: Catalog,
pub occupied: Vec<(u64, u64)>,
pub opaque: Option<Box<dyn Opaque>>,
}
impl Projection {
pub fn new(catalog: Catalog) -> Self {
Self {
catalog,
occupied: Vec::new(),
opaque: None,
}
}
pub fn occupying(mut self, ranges: Vec<(u64, u64)>) -> Self {
self.occupied = ranges;
self
}
pub fn with_opaque(mut self, opaque: Box<dyn Opaque>) -> Self {
self.opaque = Some(opaque);
self
}
pub fn into_source(self, store: Store, vocab: Option<&Vocabulary>) -> Result<Source> {
let mut store = store.with_occupied(self.occupied);
if let Some(opaque) = self.opaque {
store = store.with_opaque(opaque);
}
match vocab {
None => Source::from_parts(vec![store], self.catalog),
Some(v) => Source::from_parts_with(vec![store], self.catalog, Arc::new(v.clone())),
}
}
}