#atomic #traits #order #operations #sync #fetch #generic

no-std atomic-traits

The traits for generic atomic operations

4 releases (breaking)

Uses old Rust 2015

0.4.0 Feb 12, 2024
0.3.0 May 25, 2021
0.2.0 Jul 24, 2020
0.1.0 Jun 4, 2019

#224 in Algorithms

Download history 10519/week @ 2024-07-22 7712/week @ 2024-07-29 8869/week @ 2024-08-05 7891/week @ 2024-08-12 7138/week @ 2024-08-19 7093/week @ 2024-08-26 7440/week @ 2024-09-02 7105/week @ 2024-09-09 8046/week @ 2024-09-16 9957/week @ 2024-09-23 8001/week @ 2024-09-30 8197/week @ 2024-10-07 11006/week @ 2024-10-14 9762/week @ 2024-10-21 8102/week @ 2024-10-28 10560/week @ 2024-11-04

39,791 downloads per month
Used in 24 crates (5 directly)

MIT/Apache

47KB
657 lines

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

Dependencies

~0–24MB
~332K SLoC