interns/backend/
string_buf.rs1use crate::Backend;
2
3struct Span {
4 pub offset: usize,
5 pub len: usize,
6}
7
8#[derive(Default)]
10pub struct StringBuf {
11 buf: String,
12 spans: Vec<Span>,
13}
14
15#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
16#[repr(transparent)]
17pub struct Symbol(usize);
18
19impl Symbol {
20 pub fn as_usize(&self) -> usize { self.0 }
21}
22
23impl Backend<str> for StringBuf {
24 type Symbol = Symbol;
25
26 fn intern(&mut self, src: &str) -> Self::Symbol {
27 let offset = self.buf.len();
28 let len = src.len();
29 self.buf.push_str(src);
30
31 let span = Span { offset, len };
32 let sym = Symbol(self.spans.len());
33 self.spans.push(span);
34 sym
35 }
36
37 fn get(&self, sym: Symbol) -> Option<&str> {
38 let span = self.spans.get(sym.0)?;
39 let src = &self.buf[span.offset..span.offset + span.len];
40 Some(src)
41 }
42}