use indexmap::IndexMap;
#[derive(Debug, Clone, Default)]
pub struct SharedStrings {
strings: IndexMap<String, usize>,
items: Vec<String>,
}
impl SharedStrings {
pub fn new() -> Self {
Self::default()
}
pub fn add<S: Into<String>>(&mut self, s: S) -> usize {
let s = s.into();
if let Some(&idx) = self.strings.get(&s) {
return idx;
}
let idx = self.items.len();
self.strings.insert(s.clone(), idx);
self.items.push(s);
idx
}
pub fn get(&self, idx: usize) -> Option<&str> {
self.items.get(idx).map(|s| s.as_str())
}
pub fn len(&self) -> usize {
self.items.len()
}
pub fn is_empty(&self) -> bool {
self.items.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = (usize, &str)> {
self.items.iter().enumerate().map(|(i, s)| (i, s.as_str()))
}
}