use crate::{RawRef, RefType};
use alloc::boxed::Box;
#[derive(Debug)]
pub struct ElementSegment {
ty: RefType,
items: Box<[RawRef]>,
}
impl ElementSegment {
pub fn new<I>(ty: RefType, items: I) -> Self
where
I: IntoIterator<Item = RawRef>,
{
let items: Box<[RawRef]> = items.into_iter().collect();
assert!(
u32::try_from(items.len()).is_ok(),
"element segment has too many items: {}",
items.len()
);
Self { ty, items }
}
pub fn as_ref(&self) -> ElementSegmentRef<'_> {
ElementSegmentRef::from(self)
}
pub fn ty(&self) -> RefType {
self.ty
}
pub fn items(&self) -> &[RawRef] {
&self.items[..]
}
pub fn size(&self) -> u32 {
self.as_ref().size()
}
pub fn drop_items(&mut self) {
self.items = [].into();
}
}
#[derive(Debug, Copy, Clone)]
pub struct ElementSegmentRef<'a> {
ty: RefType,
items: &'a [RawRef],
}
impl<'a> From<&'a ElementSegment> for ElementSegmentRef<'a> {
fn from(element: &'a ElementSegment) -> Self {
Self {
ty: element.ty(),
items: element.items(),
}
}
}
impl<'a> ElementSegmentRef<'a> {
pub fn ty(self) -> RefType {
self.ty
}
pub fn items(self) -> &'a [RawRef] {
self.items
}
pub fn size(self) -> u32 {
let len = self.items().len();
u32::try_from(len).unwrap_or_else(|_| {
panic!("element segments are ensured to have at most 2^32 items but found: {len}")
})
}
}