Skip to content

Commit d485372

Browse files
committed
Add Number and Atomic impls for usize
Signed-off-by: Ben Kimock <[email protected]>
1 parent 6e81890 commit d485372

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

src/atomic64.rs

+60-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
use std::cmp::*;
55
use std::f64;
66
use std::ops::*;
7-
use std::sync::atomic::{AtomicI64 as StdAtomicI64, AtomicU64 as StdAtomicU64, Ordering};
7+
use std::sync::atomic::{
8+
AtomicI64 as StdAtomicI64, AtomicU64 as StdAtomicU64, AtomicUsize as StdAtomicUsize, Ordering,
9+
};
810

911
/// An interface for numbers. Used to generically model float metrics and integer metrics, i.e.
1012
/// [`Counter`](crate::Counter) and [`IntCounter`](crate::Counter).
@@ -53,6 +55,18 @@ impl Number for f64 {
5355
}
5456
}
5557

58+
impl Number for usize {
59+
#[inline]
60+
fn from_i64(v: i64) -> Self {
61+
v as Self
62+
}
63+
64+
#[inline]
65+
fn into_f64(self) -> f64 {
66+
self as f64
67+
}
68+
}
69+
5670
/// An interface for atomics. Used to generically model float metrics and integer metrics, i.e.
5771
/// [`Counter`](crate::Counter) and [`IntCounter`](crate::IntCounter).
5872
pub trait Atomic: Send + Sync {
@@ -239,6 +253,42 @@ impl AtomicU64 {
239253
}
240254
}
241255

256+
/// A atomic unsigned integer.
257+
#[derive(Debug)]
258+
pub struct AtomicUsize {
259+
inner: StdAtomicUsize,
260+
}
261+
262+
impl Atomic for AtomicUsize {
263+
type T = usize;
264+
265+
fn new(val: Self::T) -> AtomicUsize {
266+
AtomicUsize {
267+
inner: StdAtomicUsize::new(val),
268+
}
269+
}
270+
271+
#[inline]
272+
fn set(&self, val: Self::T) {
273+
self.inner.store(val, Ordering::Relaxed);
274+
}
275+
276+
#[inline]
277+
fn get(&self) -> Self::T {
278+
self.inner.load(Ordering::Relaxed)
279+
}
280+
281+
#[inline]
282+
fn inc_by(&self, delta: Self::T) {
283+
self.inner.fetch_add(delta, Ordering::Relaxed);
284+
}
285+
286+
#[inline]
287+
fn dec_by(&self, delta: Self::T) {
288+
self.inner.fetch_sub(delta, Ordering::Relaxed);
289+
}
290+
}
291+
242292
#[cfg(test)]
243293
mod test {
244294
use std::f64::consts::PI;
@@ -275,4 +325,13 @@ mod test {
275325
au64.inc_by(123);
276326
assert_eq!(au64.get(), 123);
277327
}
328+
329+
#[test]
330+
fn test_atomic_usize() {
331+
let ausize = AtomicUsize::new(0);
332+
assert_eq!(ausize.get(), 0);
333+
334+
ausize.inc_by(123);
335+
assert_eq!(ausize.get(), 123);
336+
}
278337
}

0 commit comments

Comments
 (0)