use crate::{Pattern, PatternBackend};
use alloc::boxed::Box;
use zerovec::{
maps::ZeroMapKV,
ule::{UleError, VarULE},
VarZeroSlice, VarZeroVec,
};
impl<'a, B: PatternBackend> ZeroMapKV<'a> for Pattern<B>
where
Pattern<B>: VarULE,
{
type Container = VarZeroVec<'a, Pattern<B>>;
type Slice = VarZeroSlice<Pattern<B>>;
type GetType = Pattern<B>;
type OwnedType = Box<Pattern<B>>;
}
unsafe impl<B, S: ?Sized + VarULE> VarULE for Pattern<B>
where
B: PatternBackend<Store = S>,
{
fn validate_bytes(bytes: &[u8]) -> Result<(), UleError> {
let store = S::parse_bytes(bytes)?;
B::validate_store(store).map_err(|_| UleError::parse::<Self>())
}
unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
let store = S::from_bytes_unchecked(bytes);
Self::from_ref_store_unchecked(store)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::SinglePlaceholderPattern;
use litemap::LiteMap;
use zerovec::ZeroMap;
#[test]
fn test_zeromap() {
let pattern =
SinglePlaceholderPattern::try_from_str("Hello, {0}!", Default::default()).unwrap();
let mut litemap = LiteMap::<u32, Box<SinglePlaceholderPattern>>::new_vec();
litemap.insert(0, pattern.clone());
let zeromap = ZeroMap::<u32, SinglePlaceholderPattern>::from_iter(litemap);
let recovered_pattern = zeromap.get(&0).unwrap();
assert_eq!(&*pattern, recovered_pattern);
}
}