use alloc::boxed::Box;
use crate::reader::Reader;
use crate::shard_reader::ShardReader;
use crate::sym::{NUM_SHARDS, Sym};
pub(crate) struct ShardedReader {
shards: Box<[ShardReader; NUM_SHARDS]>,
}
impl ShardedReader {
pub(crate) fn new(shards: Box<[ShardReader; NUM_SHARDS]>) -> Self {
Self { shards }
}
}
impl crate::reader::Sealed for ShardedReader {}
impl Reader for ShardedReader {
#[inline]
fn try_resolve(&self, sym: Sym) -> Option<&str> {
let local = sym.local1().checked_sub(1)?;
self.shards[sym.shard()].get(local as usize)
}
#[inline]
fn len(&self) -> usize {
self.shards.iter().map(ShardReader::len).sum()
}
fn iter(&self) -> Box<dyn Iterator<Item = (Sym, &str)> + '_> {
Box::new(self.shards.iter().enumerate().flat_map(|(shard, reader)| {
(0..reader.len()).map(move |local| {
let s = reader.get(local).expect("local comes from 0..reader.len()");
#[expect(clippy::cast_possible_truncation, reason = "local < reader.len() <= LOCAL_MASK fits in u32")]
let sym = Sym::pack(shard, local as u32 + 1);
(sym, s)
})
}))
}
}