|
4 | 4 | use std::cmp::*;
|
5 | 5 | use std::f64;
|
6 | 6 | 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 | +}; |
8 | 10 |
|
9 | 11 | /// An interface for numbers. Used to generically model float metrics and integer metrics, i.e.
|
10 | 12 | /// [`Counter`](crate::Counter) and [`IntCounter`](crate::Counter).
|
@@ -53,6 +55,18 @@ impl Number for f64 {
|
53 | 55 | }
|
54 | 56 | }
|
55 | 57 |
|
| 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 | + |
56 | 70 | /// An interface for atomics. Used to generically model float metrics and integer metrics, i.e.
|
57 | 71 | /// [`Counter`](crate::Counter) and [`IntCounter`](crate::IntCounter).
|
58 | 72 | pub trait Atomic: Send + Sync {
|
@@ -239,6 +253,42 @@ impl AtomicU64 {
|
239 | 253 | }
|
240 | 254 | }
|
241 | 255 |
|
| 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 | + |
242 | 292 | #[cfg(test)]
|
243 | 293 | mod test {
|
244 | 294 | use std::f64::consts::PI;
|
@@ -275,4 +325,13 @@ mod test {
|
275 | 325 | au64.inc_by(123);
|
276 | 326 | assert_eq!(au64.get(), 123);
|
277 | 327 | }
|
| 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 | + } |
278 | 337 | }
|
0 commit comments