use allocative::Allocative;
use dupe::Dupe;
use starlark_map::small_set::SmallSet;
use crate::util::arc_str::ArcStr;
#[derive(Default, Clone, Allocative)]
pub(crate) struct StringIndex {
strings: SmallSet<ArcStr>,
}
#[derive(Copy, Clone, Dupe, Debug, Eq, PartialEq, Hash, Allocative)]
pub(crate) struct StringId(
pub(crate) usize,
);
impl StringIndex {
pub(crate) fn index(&mut self, s: &str) -> StringId {
if let Some(index) = self.strings.get_index_of(s) {
return StringId(index);
}
let inserted = self.strings.insert(ArcStr::from(s));
assert!(inserted);
StringId(self.strings.len() - 1)
}
pub(crate) fn get(&self, id: StringId) -> &ArcStr {
self.strings.get_index(id.0).expect("invalid string id")
}
}