o3 0.31.0

shared-nothing primitives
Documentation
use std::cell::Cell;

#[repr(align(128))]
pub struct Entry<'a> {
    pub index: usize,
    pub value: Cell<usize>,
    pub drops: Cell<Option<&'a Cell<Option<usize>>>>,
}

#[repr(align(64))]
pub struct Header<'a> {
    pub drops: &'a Cell<Option<usize>>,
    pub observed: &'a Cell<Option<Option<usize>>>,
}

impl Entry<'_> {
    pub fn new(index: usize) -> Self {
        Self {
            index,
            value: Cell::new(0),
            drops: Cell::new(None),
        }
    }
}

impl Drop for Entry<'_> {
    fn drop(&mut self) {
        if let Some(drops) = self.drops.get() {
            drops.set(drops.get().and_then(|count| count.checked_add(1)));
        }
    }
}

impl Drop for Header<'_> {
    fn drop(&mut self) {
        self.observed.set(Some(self.drops.get()));
        self.drops
            .set(self.drops.get().and_then(|count| count.checked_add(1)));
    }
}