use alloc::boxed::Box;
use crate::reader::Reader;
use crate::sym::{Sym, dense_index_of, dense_sym_at};
#[derive(Clone)]
pub struct LocalReader {
offsets: Box<[u32]>,
buffer: Box<[u8]>,
}
impl LocalReader {
pub(crate) fn new(offsets: Box<[u32]>, buffer: Box<[u8]>) -> Self {
Self { offsets, buffer }
}
#[inline]
#[must_use]
pub fn index_of(&self, sym: Sym) -> Option<usize> {
dense_index_of(self.len(), sym)
}
#[inline]
#[must_use]
pub fn sym_at(&self, index: usize) -> Option<Sym> {
dense_sym_at(self.len(), index)
}
}
impl core::fmt::Debug for LocalReader {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("LocalReader")
.field("len", &Reader::len(self))
.finish_non_exhaustive()
}
}
impl crate::reader::Sealed for LocalReader {}
impl Reader for LocalReader {
#[inline]
fn try_resolve(&self, sym: Sym) -> Option<&str> {
crate::storage::resolve(&self.offsets, &self.buffer, sym.dense())
}
#[inline]
fn len(&self) -> usize {
self.offsets.len() - 1
}
fn iter(&self) -> Box<dyn Iterator<Item = (Sym, &str)> + '_> {
let offsets = &self.offsets;
let buffer = &self.buffer;
Box::new((0..offsets.len() - 1).map(move |i| (Sym::pack_dense(i), crate::storage::str_at(offsets, buffer, i))))
}
}