rust-atomic-traits

The traits for generic atomic operations in Rust.

APACHE-2.0 License

Downloads
1.2M
Stars
8
Committers
4

atomic-traits crate documentation Continuous integration MSRV

The traits for generic atomic operations in Rust.

Compatibility

The crate is tested for stable and nightly compiler.

Current MSRV is 1.34.0.

Usage

Add this to your Cargo.toml:

[dependencies]
atomic-traits = "0.4"

and this to your crate root:

extern crate atomic_traits;

Example

extern crate num_traits;
extern crate atomic_traits;

use std::sync::atomic::{AtomicUsize, Ordering};

use num_traits::One;
use atomic_traits::{Atomic, NumOps, fetch};

#[derive(Debug, Default)]
pub struct RefCnt<T>(T);

impl<T> RefCnt<T>
where
    T: Atomic + NumOps + Default,
    <T as Atomic>::Type: One
{
    pub fn inc(&self) -> <T as Atomic>::Type {
        self.0.fetch_add(<T as Atomic>::Type::one(), Ordering::Acquire)
    }

    pub fn dec(&self) -> <T as Atomic>::Type {
        self.0.fetch_sub(<T as Atomic>::Type::one(), Ordering::Release)
    }

    pub fn val(&self) -> <T as Atomic>::Type {
        self.0.load(Ordering::SeqCst)
    }
}

let refcnt = RefCnt::<AtomicUsize>::default();

assert_eq!(refcnt.inc(), 0);
assert_eq!(refcnt.dec(), 1);
assert_eq!(refcnt.val(), 0);