use std::collections::{BTreeSet, HashMap};
use mathtex_engine::{HostBox, HostBoxRequest, HostBoxes};
use mathtex_ir::Length;
#[derive(Default)]
pub(crate) struct SessionBoxes {
sizes: HashMap<u32, (Length, Length, Length, u64)>,
provider: Option<Box<dyn HostBoxes>>,
counter: u64,
}
impl SessionBoxes {
pub(crate) fn set_size(&mut self, token: u32, width: Length, height: Length, depth: Length) {
self.counter += 1;
self.sizes.insert(token, (width, height, depth, self.counter));
}
pub(crate) fn copy_size(&mut self, old: u32, new: u32) {
if let Some(&(w, h, d, _)) = self.sizes.get(&old) {
self.set_size(new, w, h, d);
}
}
pub(crate) fn set_provider(&mut self, provider: Option<Box<dyn HostBoxes>>) {
self.provider = provider;
}
pub(crate) fn retain(&mut self, live: &BTreeSet<u32>) {
self.sizes.retain(|token, _| live.contains(token));
}
}
impl HostBoxes for SessionBoxes {
fn host_box(&self, request: &HostBoxRequest) -> Option<HostBox> {
match self.sizes.get(&request.token) {
Some(&(w, h, d, _)) => Some(HostBox::new(w, h, d)),
None => self.provider.as_ref()?.host_box(request),
}
}
fn revision(&self, token: u32) -> Option<u64> {
match (self.sizes.get(&token), &self.provider) {
(Some(&(.., revision)), _) => Some(revision | 1 << 63),
(None, Some(provider)) => provider.revision(token),
(None, None) => Some(0),
}
}
}