urcu2 0.1.3

Safe API to liburcu
Documentation
use std::marker::PhantomData;

pub struct RcuContextBuilder<F, const READ: bool = false, const DEFER: bool = false>(
    PhantomData<F>,
);

impl<F, const READ: bool, const DEFER: bool> RcuContextBuilder<F, READ, DEFER> {
    pub fn new() -> RcuContextBuilder<F> {
        RcuContextBuilder::<F, false, false>(PhantomData)
    }
}

impl<F, const DEFER: bool> RcuContextBuilder<F, false, DEFER> {
    pub fn with_read_context(self) -> RcuContextBuilder<F, true, DEFER> {
        RcuContextBuilder::<F, true, DEFER>(PhantomData)
    }
}

impl<F, const READ: bool> RcuContextBuilder<F, READ, false> {
    pub fn with_defer_context(self) -> RcuContextBuilder<F, READ, true> {
        RcuContextBuilder::<F, READ, true>(PhantomData)
    }
}

#[cfg(feature = "flavor-bp")]
mod bp {
    use super::*;

    use crate::rcu::context::RcuContextBp;
    use crate::rcu::flavor::RcuFlavorBp;

    impl<const READ: bool, const DEFER: bool> RcuContextBuilder<RcuFlavorBp, READ, DEFER> {
        pub fn register_thread(self) -> Option<RcuContextBp<READ, DEFER>> {
            RcuContextBp::<READ, DEFER>::new()
        }
    }
}

#[cfg(feature = "flavor-mb")]
mod mb {
    use super::*;

    use crate::rcu::context::RcuContextMb;
    use crate::rcu::flavor::RcuFlavorMb;

    impl<const READ: bool, const DEFER: bool> RcuContextBuilder<RcuFlavorMb, READ, DEFER> {
        pub fn register_thread(self) -> Option<RcuContextMb<READ, DEFER>> {
            RcuContextMb::<READ, DEFER>::new()
        }
    }
}

#[cfg(feature = "flavor-memb")]
mod memb {
    use super::*;

    use crate::rcu::context::RcuContextMemb;
    use crate::rcu::flavor::RcuFlavorMemb;

    impl<const READ: bool, const DEFER: bool> RcuContextBuilder<RcuFlavorMemb, READ, DEFER> {
        pub fn register_thread(self) -> Option<RcuContextMemb<READ, DEFER>> {
            RcuContextMemb::<READ, DEFER>::new()
        }
    }
}

#[cfg(feature = "flavor-qsbr")]
mod qsbr {
    use super::*;

    use crate::rcu::context::RcuContextQsbr;
    use crate::rcu::flavor::RcuFlavorQsbr;

    impl<const READ: bool, const DEFER: bool> RcuContextBuilder<RcuFlavorQsbr, READ, DEFER> {
        pub fn register_thread(self) -> Option<RcuContextQsbr<READ, DEFER>> {
            RcuContextQsbr::<READ, DEFER>::new()
        }
    }
}