generic-atomics 0.1.4

Generic Atomic types for types that implement num-primitive traits
Documentation
#![cfg(test)]
#![expect(clippy::unwrap_used)]
#![expect(clippy::float_cmp)]

use atomic_traits as _;
use generic_atomics::{
    fetch::Add, Atomic, AtomicNumber, IntoAtomicFloat, IntoAtomicInteger, IntoAtomicNumber,
    UseUpdateToAdd, UseUpdateToMax, UseUpdateToMin, UseUpdateToSub,
};
use num_primitive::{PrimitiveFloat, PrimitiveInteger, PrimitiveNumber};
use num_traits as _;
use std::sync::atomic::Ordering;

fn test_primitive_number<T: IntoAtomicNumber + PrimitiveNumber>(t: T) {
    let an: AtomicNumber<_> = AtomicNumber::new(t);
    assert_eq!(t, an.load(Ordering::Relaxed));
}

fn test_primitive_int<T: IntoAtomicInteger + PrimitiveInteger>(t: T) {
    let one: T = T::from_u8(1).unwrap();
    let an: AtomicNumber<_> = AtomicNumber::new(t);
    let af = an.into_atomic_integer();
    af.fetch_add(one, Ordering::Relaxed);
    assert_eq!(t + one, af.load(Ordering::Relaxed));
}

fn test_primitive_float<T: IntoAtomicFloat + PrimitiveFloat>(t: T) {
    let one: T = T::from_u8(1).unwrap();
    let an: AtomicNumber<_> = AtomicNumber::new(t);
    let af = an.into_atomic_float();
    af.fetch_add_via_update(one, Ordering::Relaxed);
    assert_eq!(t + one, af.load(Ordering::Relaxed));
}

#[test]
fn test() {
    test_primitive_number(42.0f32);
    test_primitive_number(42.0f64);
    test_primitive_number(42usize);
    test_primitive_number(42u8);
    test_primitive_number(42i64);
    test_primitive_float(42.0f32);
    test_primitive_float(42.0f64);
    test_primitive_int(42usize);
    test_primitive_int(42u8);
    test_primitive_int(42i64);
}

#[test]
fn test2() {
    let fourtytwo = 42.0f64;
    let one = 1f64;
    let af = fourtytwo.into_atomic_float();
    af.fetch_add_via_update(one, Ordering::Relaxed);
    assert_eq!(fourtytwo + one, af.load(Ordering::Relaxed));
    af.fetch_sub_via_update(one, Ordering::Relaxed);
    assert_eq!(fourtytwo, af.load(Ordering::Relaxed));
    af.fetch_max_via_update(one, Ordering::Relaxed);
    assert_eq!(fourtytwo, af.load(Ordering::Relaxed));
    af.fetch_min_via_update(one, Ordering::Relaxed);
    assert_eq!(one, af.load(Ordering::Relaxed));
}