[][src]Macro wfqueue::codegen

macro_rules! codegen {
    (
        pub struct $name:ident ( $item:ty );

        fn into_nonzero = $into:expr;
        fn from_nonzero = $from:expr;
    ) => { ... };
}

Wait-free queue codegen macro

Generate a queue type and use a separate thread local storage to store the context.

Example

use std::num::NonZeroUsize;

fn box_into_nonzero(input: Box<usize>) -> NonZeroUsize {
    let input = Box::into_raw(input) as usize;

    unsafe {
        NonZeroUsize::new_unchecked(input)
    }
}

fn box_from_nonzero(output: NonZeroUsize) -> Box<usize> {
    let output = output.get() as *mut usize;

    unsafe {
        Box::from_raw(output)
    }
}

wfqueue::codegen! {
    pub struct BoxQueue(Box<usize>);

    fn into_nonzero = box_into_nonzero;
    fn from_nonzero = box_from_nonzero;
}

let queue = BoxQueue::new(3);

queue.push(Box::new(0x42)).unwrap();
let output = queue.pop().unwrap();

assert_eq!(*output, 0x42);