use std::any::Any;
use vortex_session::ArcSwapMap;
use vortex_session::SessionExt;
use vortex_session::SessionGuard;
use vortex_session::SessionVar;
use vortex_session::registry::Id;
use crate::LayoutEncoding;
use crate::LayoutEncodingRef;
use crate::layouts::chunked::Chunked;
use crate::layouts::dict::Dict;
use crate::layouts::flat::Flat;
use crate::layouts::list::List;
use crate::layouts::struct_::Struct;
use crate::layouts::zoned::LegacyStats;
use crate::layouts::zoned::Zoned;
pub type LayoutRegistry = ArcSwapMap<Id, LayoutEncodingRef>;
#[derive(Clone, Debug)]
pub struct LayoutSession {
registry: LayoutRegistry,
}
impl LayoutSession {
pub fn register(&self, layout_ref: impl Into<LayoutEncodingRef>) {
let layout = layout_ref.into();
self.registry.insert(layout.id(), layout);
}
pub fn register_many(&self, layouts: impl IntoIterator<Item = LayoutEncodingRef>) {
for layout in layouts {
self.registry.insert(layout.id(), layout);
}
}
pub fn registry(&self) -> &LayoutRegistry {
&self.registry
}
}
impl Default for LayoutSession {
fn default() -> Self {
let this = Self {
registry: LayoutRegistry::default(),
};
this.register(&Chunked as &dyn LayoutEncoding);
this.register(&Flat as &dyn LayoutEncoding);
this.register(&Struct as &dyn LayoutEncoding);
this.register(&Zoned as &dyn LayoutEncoding);
this.register(&LegacyStats as &dyn LayoutEncoding);
this.register(&Dict as &dyn LayoutEncoding);
this.register(&List as &dyn LayoutEncoding);
this
}
}
impl SessionVar for LayoutSession {
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
pub trait LayoutSessionExt: SessionExt {
fn layouts(&self) -> SessionGuard<'_, LayoutSession> {
self.get::<LayoutSession>()
}
}
impl<S: SessionExt> LayoutSessionExt for S {}