cyclotrace 0.1.0

A high-performance, wait-free ring buffer in Rust. Supports SPMC with peek-based semantics instead of destructive consumption.
Documentation
use core::mem::MaybeUninit;

use crate::buffer::Slot;

cfg_if::cfg_if!(
if #[cfg(feature = "loom")] {
    pub(crate) fn init_array<T: Copy, const N: usize>() -> [Slot<T>; N] {
        let mut arr: MaybeUninit<[Slot<T>; N]> = MaybeUninit::uninit();
        let ptr = arr.as_mut_ptr() as *mut Slot<T>;
        let mut i = 0;

        while i < N {
            unsafe {
                ptr.add(i).write(Slot::new());
            }
            i += 1;
        }

        unsafe { arr.assume_init() }
    }
} else {
    #[inline]
    pub(crate) const fn init_array<T: Copy, const N: usize>() -> [Slot<T>; N] {
        let mut arr: MaybeUninit<[Slot<T>; N]> = MaybeUninit::uninit();
        let ptr = arr.as_mut_ptr() as *mut Slot<T>;
        let mut i = 0;

        while i < N {
            unsafe {
                ptr.add(i).write(Slot::new());
            }
            i += 1;
        }

        unsafe { arr.assume_init() }
    }
}
);