interns/backend/
string_buf.rs

1use crate::Backend;
2
3struct Span {
4    pub offset: usize,
5    pub len: usize,
6}
7
8/// Backend for strings
9#[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}