atomic_time/
lib.rs

1//! Atomic time types
2#![cfg_attr(not(feature = "std"), no_std)]
3#![cfg_attr(docsrs, feature(doc_cfg))]
4#![cfg_attr(docsrs, allow(unused_attributes))]
5#![deny(missing_docs, warnings)]
6#![forbid(unsafe_code)]
7
8pub use core::sync::atomic::Ordering;
9
10use portable_atomic::AtomicU128;
11
12mod duration;
13pub use duration::AtomicDuration;
14mod option_duration;
15pub use option_duration::AtomicOptionDuration;
16
17/// Utility functions for encoding/decoding [`Duration`] to other types.
18pub mod utils {
19  #[cfg(feature = "std")]
20  use std::time::{Duration, Instant, SystemTime};
21
22  #[cfg(feature = "std")]
23  fn init(now: Instant) -> (SystemTime, Instant) {
24    static ONCE: once_cell::sync::OnceCell<(SystemTime, Instant)> =
25      once_cell::sync::OnceCell::new();
26
27    *ONCE.get_or_init(|| {
28      let system_now = SystemTime::now();
29      (system_now, now)
30    })
31  }
32
33  /// Encode an [`Instant`] into a [`Duration`].
34  #[cfg(feature = "std")]
35  #[inline]
36  pub fn encode_instant_to_duration(instant: Instant) -> Duration {
37    let (system_now, instant_now) = init(instant);
38    if instant <= instant_now {
39      system_now.duration_since(SystemTime::UNIX_EPOCH).unwrap() + (instant_now - instant)
40    } else {
41      system_now.duration_since(SystemTime::UNIX_EPOCH).unwrap() + (instant - instant_now)
42    }
43  }
44
45  /// Decode an [`Instant`] from a [`Duration`].
46  #[cfg(feature = "std")]
47  #[inline]
48  pub fn decode_instant_from_duration(duration: Duration) -> Instant {
49    let (system_now, instant_now) = init(Instant::now());
50    let system_time = SystemTime::UNIX_EPOCH + duration;
51    if system_time >= system_now {
52      instant_now + system_time.duration_since(system_now).unwrap()
53    } else {
54      instant_now - system_now.duration_since(system_time).unwrap()
55    }
56  }
57
58  pub use super::duration::{decode_duration, encode_duration};
59  pub use super::option_duration::{decode_option_duration, encode_option_duration};
60}
61
62#[cfg(feature = "std")]
63mod system_time;
64
65#[cfg(feature = "std")]
66#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
67pub use system_time::AtomicSystemTime;
68
69#[cfg(feature = "std")]
70mod option_system_time;
71#[cfg(feature = "std")]
72#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
73pub use option_system_time::AtomicOptionSystemTime;
74
75#[cfg(feature = "std")]
76mod instant;
77#[cfg(feature = "std")]
78#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
79pub use instant::AtomicInstant;
80
81#[cfg(feature = "std")]
82mod option_instant;
83#[cfg(feature = "std")]
84#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
85pub use option_instant::AtomicOptionInstant;
86
87#[cfg(feature = "std")]
88use utils::{decode_instant_from_duration, encode_instant_to_duration};