atomic-traits

Crates.ioatomic-traits
lib.rsatomic-traits
version0.4.0
sourcesrc
created_at2019-06-04 08:27:00.95921
updated_at2024-02-12 11:53:01.331264
descriptionThe traits for generic atomic operations
homepagehttps://github.com/flier/rust-atomic-traits
repository
max_upload_size
id138821
size61,409
Flier Lu (flier)

documentation

https://docs.rs/atomic-traits

README

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);
Commit count: 0

cargo fmt