use std::fmt::Write as _;
use crate::GcRef;
use crate::descriptor::{BuiltinTypeId, FormatSink, Tracer, TypeDescriptor};
#[repr(C)]
pub struct VarCellPayload {
pub value: GcRef,
}
unsafe fn var_cell_trace(payload: *mut u8, tracer: &mut dyn Tracer) {
let p = unsafe { &*(payload as *const VarCellPayload) };
tracer.trace(p.value);
}
unsafe fn var_cell_drop(payload: *mut u8) {
unsafe { std::ptr::drop_in_place(payload as *mut VarCellPayload) };
}
unsafe fn var_cell_format(payload: *const u8, out: &mut FormatSink<'_>) {
let _ = payload;
let _ = out.write_str("<var-cell>");
}
pub static VAR_CELL: TypeDescriptor = TypeDescriptor::builtin::<VarCellPayload>(
BuiltinTypeId::VarCell,
"VarCell",
var_cell_trace,
var_cell_drop,
var_cell_format,
None,
None,
None,
);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn var_cell_descriptor_reports_capabilities() {
assert!(!VAR_CELL.is_equatable());
assert!(!VAR_CELL.is_hashable());
assert_eq!(VAR_CELL.name, "VarCell");
assert_eq!(VAR_CELL.as_builtin(), Some(BuiltinTypeId::VarCell));
}
}