interns/backend/
vec.rs

1use super::Backend;
2
3/// Backend that stores elements inside a [Vec]
4pub struct VecBackend<T> {
5    buf: Vec<T>,
6}
7
8impl<T> Default for VecBackend<T> {
9    fn default() -> Self {
10        Self { buf: Default::default() }
11    }
12}
13
14#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
15#[repr(transparent)]
16pub struct Symbol(usize);
17
18impl<T: Clone> Backend<T> for VecBackend<T> {
19    type Symbol = Symbol;
20
21    fn intern(&mut self, src: &T) -> Self::Symbol {
22        let sym = Symbol(self.buf.len());
23        self.buf.push(src.clone());
24        sym
25    }
26
27    fn get(&self, sym: Symbol) -> Option<&T> {
28        let val = self.buf.get(sym.0)?;
29        Some(val)
30    }
31}