use ahash::HashMap;
use crate::view::system_execution_output::VisualizerViewReport;
use crate::{SystemExecutionOutput, ViewClass, ViewId, ViewState, VisualizerTypeReport};
#[derive(Default)]
pub struct ViewStates {
states: HashMap<ViewId, Box<dyn ViewState>>,
visualizer_reports: HashMap<ViewId, VisualizerViewReport>,
}
impl re_byte_size::SizeBytes for ViewStates {
fn heap_size_bytes(&self) -> u64 {
let Self {
states,
visualizer_reports: visualizer_errors,
} = self;
states
.iter()
.map(|(key, state)| key.total_size_bytes() + state.size_bytes())
.sum::<u64>()
+ visualizer_errors.heap_size_bytes()
}
}
impl ViewStates {
pub fn get(&self, view_id: ViewId) -> Option<&dyn ViewState> {
self.states.get(&view_id).map(|s| s.as_ref())
}
pub fn get_mut_or_create(
&mut self,
view_id: ViewId,
view_class: &dyn ViewClass,
) -> &mut dyn ViewState {
self.states
.entry(view_id)
.or_insert_with(|| view_class.new_state())
.as_mut()
}
pub fn ensure_state_exists(&mut self, view_id: ViewId, view_class: &dyn ViewClass) {
self.states
.entry(view_id)
.or_insert_with(|| view_class.new_state());
}
pub fn reset_visualizer_reports(&mut self) {
self.visualizer_reports.clear();
}
pub fn add_visualizer_reports_from_output(
&mut self,
view_id: ViewId,
system_output: &SystemExecutionOutput,
) {
let per_visualizer_reports = self.visualizer_reports.entry(view_id).or_default();
per_visualizer_reports.extend(system_output.visualizer_execution_output.iter().filter_map(
|(id, result)| VisualizerTypeReport::from_result(result).map(|error| (*id, error)),
));
}
pub fn per_visualizer_type_reports(&self, view_id: ViewId) -> Option<&VisualizerViewReport> {
self.visualizer_reports.get(&view_id)
}
}