Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-srv/src/abis/abi_sysroot/ra_server/symbol.rs')
| -rw-r--r-- | crates/proc-macro-srv/src/abis/abi_sysroot/ra_server/symbol.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/crates/proc-macro-srv/src/abis/abi_sysroot/ra_server/symbol.rs b/crates/proc-macro-srv/src/abis/abi_sysroot/ra_server/symbol.rs new file mode 100644 index 0000000000..b97e2aecf3 --- /dev/null +++ b/crates/proc-macro-srv/src/abis/abi_sysroot/ra_server/symbol.rs @@ -0,0 +1,34 @@ +use std::collections::HashMap; +use tt::SmolStr; + +// Identifier for an interned symbol. +#[derive(Hash, Eq, PartialEq, Copy, Clone)] +pub struct Symbol(u32); + +#[derive(Default)] +struct IdentInterner { + idents: HashMap<SmolStr, u32>, + ident_data: Vec<SmolStr>, +} + +impl IdentInterner { + fn intern(&mut self, data: &str) -> Symbol { + if let Some(index) = self.idents.get(data) { + return *index; + } + + let index = self.idents.len() as u32; + self.ident_data.push(data.clone()); + self.idents.insert(data.clone(), index); + index + } + + fn get(&self, index: u32) -> &SmolStr { + &self.ident_data[index as usize] + } + + #[allow(unused)] + fn get_mut(&mut self, index: u32) -> &mut SmolStr { + self.ident_data.get_mut(index as usize).expect("Should be consistent") + } +} |