#[cfg(feature = "document-write")]
use std::collections::HashMap;
use std::sync::Arc;
use crate::scales::geometry::Geometry;
use crate::text::rich::RichTextStyleSheet;
#[cfg(feature = "document-write")]
#[derive(Debug, Default)]
pub(crate) struct WriteTables {
geometry_index: HashMap<*const Geometry, u32>,
geometries: Vec<Arc<Geometry>>,
sheet_index: HashMap<*const RichTextStyleSheet, u32>,
sheets: Vec<Arc<RichTextStyleSheet>>,
string_index: HashMap<Arc<str>, u32>,
strings: Vec<Arc<str>>,
}
#[cfg(feature = "document-write")]
impl WriteTables {
pub(crate) fn geometry(&mut self, g: &Arc<Geometry>) -> u32 {
let key = Arc::as_ptr(g);
if let Some(&i) = self.geometry_index.get(&key) {
return i;
}
let i = self.geometries.len() as u32;
self.geometries.push(g.clone());
self.geometry_index.insert(key, i);
i
}
pub(crate) fn sheet(&mut self, s: &Arc<RichTextStyleSheet>) -> u32 {
let key = Arc::as_ptr(s);
if let Some(&i) = self.sheet_index.get(&key) {
return i;
}
let i = self.sheets.len() as u32;
self.sheets.push(s.clone());
self.sheet_index.insert(key, i);
i
}
pub(crate) fn geometries(&self) -> &[Arc<Geometry>] {
&self.geometries
}
pub(crate) fn string(&mut self, s: &Arc<str>) -> u32 {
if let Some(&i) = self.string_index.get(s) {
return i;
}
let i = self.strings.len() as u32;
self.strings.push(s.clone());
self.string_index.insert(s.clone(), i);
i
}
pub(crate) fn sheets(&self) -> &[Arc<RichTextStyleSheet>] {
&self.sheets
}
pub(crate) fn strings(&self) -> &[Arc<str>] {
&self.strings
}
}
#[cfg(feature = "document-read")]
#[derive(Debug, Default, Clone)]
pub(crate) struct ReadTables {
geometries: Vec<Arc<Geometry>>,
sheets: Vec<Arc<RichTextStyleSheet>>,
strings: Vec<Arc<str>>,
}
#[cfg(feature = "document-read")]
impl ReadTables {
pub(crate) fn set_geometries(&mut self, gs: Vec<Arc<Geometry>>) {
self.geometries = gs;
}
pub(crate) fn set_sheets(&mut self, ss: Vec<Arc<RichTextStyleSheet>>) {
self.sheets = ss;
}
pub(crate) fn geometry(&self, index: u32) -> Option<Arc<Geometry>> {
self.geometries.get(index as usize).cloned()
}
pub(crate) fn sheet(&self, index: u32) -> Option<Arc<RichTextStyleSheet>> {
self.sheets.get(index as usize).cloned()
}
pub(crate) fn set_strings(&mut self, ss: Vec<Arc<str>>) {
self.strings = ss;
}
pub(crate) fn string(&self, index: u32) -> Option<Arc<str>> {
self.strings.get(index as usize).cloned()
}
}