stanislav-tkach / rust-atomic-traits

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

atomic-traits crate documentation Travis status MSRV

The traits for generic atomic operations in Rust.

Compatibility

The crate is tested for stable and nightly compiler.

Current MSRV is 1.32.0.

Usage

Add this to your Cargo.toml:

[dependencies]
atomic-traits = "0.3"

and this to your crate root:

extern crate atomic_traits;

Example

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);

About

License:Apache License 2.0


Languages

Language:Rust 100.0%