use ahash::HashMap;
use re_log_types::StoreId;
use crate::view::system_execution_output::VisualizerViewReport;
use crate::{SystemExecutionOutput, ViewClass, ViewId, ViewState, VisualizerTypeReport};
type ViewStateKey = (StoreId, ViewId);
#[derive(Default)]
pub struct ViewStates {
states: HashMap<ViewStateKey, Box<dyn ViewState>>,
visualizer_reports: HashMap<ViewStateKey, 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, store_id: &StoreId, view_id: ViewId) -> Option<&dyn ViewState> {
self.states
.get(&(store_id.clone(), view_id))
.map(|s| s.as_ref())
}
pub fn get_mut_or_create(
&mut self,
store_id: &StoreId,
view_id: ViewId,
view_class: &dyn ViewClass,
) -> &mut dyn ViewState {
self.states
.entry((store_id.clone(), view_id))
.or_insert_with(|| view_class.new_state())
.as_mut()
}
pub fn ensure_state_exists(
&mut self,
store_id: &StoreId,
view_id: ViewId,
view_class: &dyn ViewClass,
) {
self.states
.entry((store_id.clone(), 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,
store_id: &StoreId,
view_id: ViewId,
system_output: &SystemExecutionOutput,
) {
let per_visualizer_reports = self
.visualizer_reports
.entry((store_id.clone(), 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,
store_id: &StoreId,
view_id: ViewId,
) -> Option<&VisualizerViewReport> {
self.visualizer_reports.get(&(store_id.clone(), view_id))
}
}