#![forbid(unsafe_code)]
#![deny(missing_docs)]
use std::{error::Error, fmt};
use sim_lib_mutation::{ArenaError, EdgeId, ManagedId};
mod collector;
mod correctness;
mod finalization;
pub use collector::{collect, collect_with_finalization};
pub use correctness::CorrectnessDimension;
pub use finalization::{FinalizationRecord, FinalizationRegistry};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct CollectionLimits {
pub objects: usize,
pub edges: usize,
pub stack: usize,
pub work: usize,
pub clears: usize,
pub finalizers: usize,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum LimitKind {
Objects,
Edges,
Stack,
Work,
Clears,
Finalizers,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct FailureReceipt {
pub mutation_epoch: u64,
pub kind: LimitKind,
pub limit: usize,
pub required: usize,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CollectionReceipt {
pub mutation_epoch: u64,
pub marked: Vec<ManagedId>,
pub swept: Vec<ManagedId>,
pub edges: usize,
pub work: usize,
pub cleared_weak: Vec<(ManagedId, EdgeId)>,
pub cleared_ephemerons: Vec<(ManagedId, EdgeId)>,
pub finalization: Vec<FinalizationRecord>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum CollectionError {
Limit(FailureReceipt),
Arena(ArenaError),
}
impl fmt::Display for CollectionError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Limit(r) => write!(
f,
"collection {:?} limit {} requires {}",
r.kind, r.limit, r.required
),
Self::Arena(error) => error.fmt(f),
}
}
}
impl Error for CollectionError {}
impl From<ArenaError> for CollectionError {
fn from(value: ArenaError) -> Self {
Self::Arena(value)
}
}
#[cfg(test)]
mod tests;