use alloc::{vec, vec::Vec};
use crate::models::{class::Class, output_data::OutputData};
#[derive(Debug, PartialEq)]
pub enum ObjectData<'a> {
Empty,
Inline(OutputData<'a>),
Groups(Vec<Vec<OutputData<'a>>>),
}
impl<'a> ObjectData<'a> {
#[inline]
pub(crate) fn push_one(&mut self, value: OutputData<'a>) {
match self {
ObjectData::Empty => *self = ObjectData::Inline(value),
ObjectData::Groups(groups) => groups.push(vec![value]),
ObjectData::Inline(_) => {
let ObjectData::Inline(first) = core::mem::replace(self, ObjectData::Empty) else {
unreachable!()
};
*self = ObjectData::Groups(vec![vec![first], vec![value]]);
}
}
}
#[inline]
pub(crate) fn push_many(&mut self, values: Vec<OutputData<'a>>) {
match self {
ObjectData::Empty => *self = ObjectData::Groups(vec![values]),
ObjectData::Groups(groups) => groups.push(values),
ObjectData::Inline(_) => {
let ObjectData::Inline(first) = core::mem::replace(self, ObjectData::Empty) else {
unreachable!()
};
*self = ObjectData::Groups(vec![vec![first], values]);
}
}
}
#[cfg(test)]
pub(crate) fn from_groups(mut groups: Vec<Vec<OutputData<'a>>>) -> Self {
if groups.is_empty() {
ObjectData::Empty
} else if groups.len() == 1 && groups[0].len() == 1 {
ObjectData::Inline(groups.pop().unwrap().pop().unwrap())
} else {
ObjectData::Groups(groups)
}
}
#[must_use]
pub fn group_count(&self) -> usize {
match self {
ObjectData::Empty => 0,
ObjectData::Inline(_) => 1,
ObjectData::Groups(groups) => groups.len(),
}
}
}
#[derive(Debug, PartialEq)]
pub enum Archived<'a> {
Object {
class: usize,
data: ObjectData<'a>,
},
Class(Class),
Placeholder,
Type(usize),
}