use rhai::ImmutableString;
#[cfg(feature = "no_std")]
use std::prelude::v1::*;
#[derive(Debug, Default)]
pub(crate) struct Slots {
names: Vec<ImmutableString>,
}
impl Slots {
pub(crate) fn depth(&self) -> usize {
self.names.len()
}
pub(crate) fn declare(&mut self, name: ImmutableString) -> u16 {
let slot = self.names.len();
self.names.push(name);
u16::try_from(slot).expect("slot count is bounded by the compiler's own limit")
}
pub(crate) fn resolve(&self, name: &str) -> Option<u16> {
self.names
.iter()
.rposition(|candidate| candidate.as_str() == name)
.map(|slot| u16::try_from(slot).expect("slot count is bounded"))
}
pub(crate) fn unwind_to(&mut self, depth: usize) {
self.names.truncate(depth);
}
pub(crate) fn is_full(&self) -> bool {
self.names.len() >= u16::MAX as usize
}
}