use core::cell::UnsafeCell;
use core::sync::atomic::{AtomicU64, Ordering};
use melinoe::atomic::{BrandedAtomic, Relaxed};
use melinoe::reentrant::GuardedCell;
use melinoe::{CellCowExt, CellSliceExt, ExclusiveToken, MelinoeCell, SharedReadToken};
#[no_mangle]
#[inline(never)]
fn melinoe_write(cell: &MelinoeCell<'static, u64>, tok: &mut ExclusiveToken<'static>, v: u64) {
*cell.borrow_mut(tok) = v;
}
#[no_mangle]
#[inline(never)]
fn raw_write(p: &UnsafeCell<u64>, v: u64) {
unsafe { *p.get() = v };
}
#[no_mangle]
#[inline(never)]
fn melinoe_read(cell: &MelinoeCell<'static, u64>, tok: &ExclusiveToken<'static>) -> u64 {
*cell.borrow(tok)
}
#[no_mangle]
#[inline(never)]
fn melinoe_slice_sum(
cells: &[MelinoeCell<'static, u64>],
tok: SharedReadToken<'static, 'static>,
) -> u64 {
cells.borrow_slice(tok).iter().sum()
}
#[no_mangle]
#[inline(never)]
fn raw_slice_sum(s: &[u64]) -> u64 {
s.iter().sum()
}
#[no_mangle]
#[inline(never)]
fn melinoe_cow_borrow_sum(
cells: &[MelinoeCell<'static, u64>],
tok: SharedReadToken<'static, 'static>,
) -> u64 {
cells.borrow_cow(tok).iter().sum()
}
#[no_mangle]
#[inline(never)]
fn branded_atomic_plain_store(
a: &BrandedAtomic<'static, AtomicU64>,
tok: &mut ExclusiveToken<'static>,
v: u64,
) {
a.store_exclusive(v, tok);
}
#[no_mangle]
#[inline(never)]
fn branded_atomic_fetch_add(
a: &BrandedAtomic<'static, AtomicU64>,
tok: SharedReadToken<'static, 'static>,
v: u64,
) -> u64 {
a.fetch_add(v, tok, Ordering::Relaxed)
}
#[no_mangle]
#[inline(never)]
fn branded_atomic_fetch_add_relaxed(
a: &BrandedAtomic<'static, AtomicU64>,
tok: SharedReadToken<'static, 'static>,
v: u64,
) -> u64 {
a.fetch_add_with(v, tok, Relaxed)
}
#[no_mangle]
#[inline(never)]
fn branded_atomic_interop_fetch_add(
a: &BrandedAtomic<'static, AtomicU64>,
tok: SharedReadToken<'static, 'static>,
v: u64,
) -> u64 {
a.as_atomic(tok).fetch_add(v, Ordering::Relaxed)
}
#[no_mangle]
#[inline(never)]
fn raw_atomic_fetch_add(a: &AtomicU64, v: u64) -> u64 {
a.fetch_add(v, Ordering::Relaxed)
}
#[no_mangle]
#[inline(never)]
fn guarded_get_mut(cell: &mut GuardedCell<u64>) -> u64 {
let v = cell.get_mut();
*v += 1;
*v
}
fn main() {}