#[repr(C)]pub struct Timed<T, S = Timestamp> {
pub stamp: S,
pub value: T,
}Expand description
A value T and the stamp S its writer captured it with.
The stamp comes from the writer: by the time a reader holds the value the moment has gone, and
a clock read on the reading side would time the reader. The stamp comes first, so the derived
order is chronological, and the value is reached through Deref.
§Examples
use t2t_core::{Timed, Timedelta, Timestamp};
let captured = Timestamp::from_secs(1_700_000_000);
let sample = Timed::new(captured, 101_u64);
assert_eq!(*sample, 101, "the value, through `Deref`");
let now = captured + Timedelta::from_millis(5);
assert_eq!(sample.elapsed(now), Timedelta::from_millis(5), "its age");Fields§
§stamp: SWhen the value was captured.
value: TWhat was captured.
Implementations§
Source§impl<T, S> Timed<T, S>
impl<T, S> Timed<T, S>
Sourcepub const fn new(stamp: S, value: T) -> Timed<T, S>
pub const fn new(stamp: S, value: T) -> Timed<T, S>
value, captured at stamp.
Examples found in repository?
examples/time-tour.rs (line 43)
20fn main() {
21 // A span is written and read the way a config spells it.
22 let stale = Timedelta::SECOND;
23 println!("stale after {stale}");
24 println!("\"1h30m\" reads as {:?}", "1h30m".parse::<Timedelta>());
25
26 // An instant is a point; the difference of two is a span.
27 let published = Timestamp::from_secs(1_700_000_000);
28 let captured = published + Timedelta::from_micros(850);
29 println!("published {published}");
30 println!("captured {captured:.6}");
31 println!("on the wire {}", captured - published);
32
33 // The same instant, read as a date; and the minute it falls in.
34 let date_time = captured.to_utc();
35 println!(
36 "that is {}-{:02}-{:02}, {} ns past the second",
37 date_time.year, date_time.month, date_time.day, date_time.nanosecond
38 );
39 let minute = captured.floor(Timedelta::MINUTE);
40 println!("its minute {minute:.0} to {:.0}", minute + Timedelta::MINUTE);
41
42 // A value carries the stamp its writer captured it with, and says how old it is.
43 let sample = Timed::new(captured, Weather { celsius: 21, humidity: 40 });
44 let age = sample.elapsed(captured + Timedelta::from_millis(1_500));
45 println!(
46 "sample {} °C, {}%, {age} old, stale: {}",
47 sample.celsius,
48 sample.humidity,
49 age > stale
50 );
51
52 // A counter's ticks mean nothing until a rate says what one is worth.
53 let start = Tickstamp::from_ticks(1_000_000);
54 let ticks = start + Tickdelta::from_ticks(4_250) - start;
55 let rate = TickRate::GIGAHERTZ;
56 println!("counter ran {ticks}: {} at {rate}", ticks.to_timedelta(rate));
57}Sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
The value, without its stamp.
Sourcepub fn into_parts(self) -> (S, T)
pub fn into_parts(self) -> (S, T)
The stamp and the value.
Source§impl<T, S> Timed<T, S>where
S: TimePoint,
impl<T, S> Timed<T, S>where
S: TimePoint,
Sourcepub fn elapsed(&self, now: S) -> <S as TimePoint>::Span
pub fn elapsed(&self, now: S) -> <S as TimePoint>::Span
The span from capture to now, negative for a stamp still ahead.
Examples found in repository?
examples/time-tour.rs (line 44)
20fn main() {
21 // A span is written and read the way a config spells it.
22 let stale = Timedelta::SECOND;
23 println!("stale after {stale}");
24 println!("\"1h30m\" reads as {:?}", "1h30m".parse::<Timedelta>());
25
26 // An instant is a point; the difference of two is a span.
27 let published = Timestamp::from_secs(1_700_000_000);
28 let captured = published + Timedelta::from_micros(850);
29 println!("published {published}");
30 println!("captured {captured:.6}");
31 println!("on the wire {}", captured - published);
32
33 // The same instant, read as a date; and the minute it falls in.
34 let date_time = captured.to_utc();
35 println!(
36 "that is {}-{:02}-{:02}, {} ns past the second",
37 date_time.year, date_time.month, date_time.day, date_time.nanosecond
38 );
39 let minute = captured.floor(Timedelta::MINUTE);
40 println!("its minute {minute:.0} to {:.0}", minute + Timedelta::MINUTE);
41
42 // A value carries the stamp its writer captured it with, and says how old it is.
43 let sample = Timed::new(captured, Weather { celsius: 21, humidity: 40 });
44 let age = sample.elapsed(captured + Timedelta::from_millis(1_500));
45 println!(
46 "sample {} °C, {}%, {age} old, stale: {}",
47 sample.celsius,
48 sample.humidity,
49 age > stale
50 );
51
52 // A counter's ticks mean nothing until a rate says what one is worth.
53 let start = Tickstamp::from_ticks(1_000_000);
54 let ticks = start + Tickdelta::from_ticks(4_250) - start;
55 let rate = TickRate::GIGAHERTZ;
56 println!("counter ran {ticks}: {} at {rate}", ticks.to_timedelta(rate));
57}Trait Implementations§
impl<T, S> Copy for Timed<T, S>
impl<T, S> Eq for Timed<T, S>
Source§impl<T, S> FromBytes for Timed<T, S>
impl<T, S> FromBytes for Timed<T, S>
Source§fn ref_from_bytes(
source: &[u8],
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>where
Self: KnownLayout + Immutable,
fn ref_from_bytes(
source: &[u8],
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>where
Self: KnownLayout + Immutable,
Source§fn ref_from_prefix(
source: &[u8],
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>where
Self: KnownLayout + Immutable,
fn ref_from_prefix(
source: &[u8],
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>where
Self: KnownLayout + Immutable,
Source§fn ref_from_suffix(
source: &[u8],
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>where
Self: Immutable + KnownLayout,
fn ref_from_suffix(
source: &[u8],
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>where
Self: Immutable + KnownLayout,
Interprets the suffix of the given bytes as a
&Self. Read moreSource§fn mut_from_bytes(
source: &mut [u8],
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>where
Self: IntoBytes + KnownLayout,
fn mut_from_bytes(
source: &mut [u8],
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>where
Self: IntoBytes + KnownLayout,
Source§fn mut_from_prefix(
source: &mut [u8],
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>where
Self: IntoBytes + KnownLayout,
fn mut_from_prefix(
source: &mut [u8],
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>where
Self: IntoBytes + KnownLayout,
Source§fn mut_from_suffix(
source: &mut [u8],
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>where
Self: IntoBytes + KnownLayout,
fn mut_from_suffix(
source: &mut [u8],
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>where
Self: IntoBytes + KnownLayout,
Source§fn ref_from_bytes_with_elems(
source: &[u8],
count: usize,
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>
fn ref_from_bytes_with_elems( source: &[u8], count: usize, ) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>
Source§fn ref_from_prefix_with_elems(
source: &[u8],
count: usize,
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>
fn ref_from_prefix_with_elems( source: &[u8], count: usize, ) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>
Source§fn ref_from_suffix_with_elems(
source: &[u8],
count: usize,
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>
fn ref_from_suffix_with_elems( source: &[u8], count: usize, ) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, !>>
Source§fn mut_from_bytes_with_elems(
source: &mut [u8],
count: usize,
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>
fn mut_from_bytes_with_elems( source: &mut [u8], count: usize, ) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>
Source§fn mut_from_prefix_with_elems(
source: &mut [u8],
count: usize,
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>
fn mut_from_prefix_with_elems( source: &mut [u8], count: usize, ) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>
Source§fn mut_from_suffix_with_elems(
source: &mut [u8],
count: usize,
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>
fn mut_from_suffix_with_elems( source: &mut [u8], count: usize, ) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, !>>
Source§fn read_from_prefix(
source: &[u8],
) -> Result<(Self, &[u8]), SizeError<&[u8], Self>>where
Self: Sized,
fn read_from_prefix(
source: &[u8],
) -> Result<(Self, &[u8]), SizeError<&[u8], Self>>where
Self: Sized,
Source§impl<T, S> FromZeros for Timed<T, S>
impl<T, S> FromZeros for Timed<T, S>
Source§fn new_zeroed() -> Selfwhere
Self: Sized,
fn new_zeroed() -> Selfwhere
Self: Sized,
Creates an instance of
Self from zeroed bytes. Read moreSource§fn new_box_zeroed() -> Result<Box<Self>, AllocError>where
Self: Sized,
fn new_box_zeroed() -> Result<Box<Self>, AllocError>where
Self: Sized,
Available on crate features
alloc only.Creates a
Box<Self> from zeroed bytes. Read moreSource§fn new_box_zeroed_with_elems(count: usize) -> Result<Box<Self>, AllocError>where
Self: KnownLayout<PointerMetadata = usize>,
fn new_box_zeroed_with_elems(count: usize) -> Result<Box<Self>, AllocError>where
Self: KnownLayout<PointerMetadata = usize>,
Available on crate feature
alloc only.Creates a
Box<[Self]> (a boxed slice) from zeroed bytes. Read moreSource§fn new_vec_zeroed(len: usize) -> Result<Vec<Self>, AllocError>where
Self: Sized,
fn new_vec_zeroed(len: usize) -> Result<Vec<Self>, AllocError>where
Self: Sized,
Available on crate feature
alloc only.Creates a
Vec<Self> from zeroed bytes. Read moreSource§fn extend_vec_zeroed(
v: &mut Vec<Self>,
additional: usize,
) -> Result<(), AllocError>where
Self: Sized,
fn extend_vec_zeroed(
v: &mut Vec<Self>,
additional: usize,
) -> Result<(), AllocError>where
Self: Sized,
Available on crate feature
alloc and non-no_zerocopy_panic_in_const_and_vec_try_reserve_1_57_0 only.Extends a
Vec<Self> by pushing additional new items onto the end of
the vector. The new items are initialized with zeros.Source§fn insert_vec_zeroed(
v: &mut Vec<Self>,
position: usize,
additional: usize,
) -> Result<(), AllocError>where
Self: Sized,
fn insert_vec_zeroed(
v: &mut Vec<Self>,
position: usize,
additional: usize,
) -> Result<(), AllocError>where
Self: Sized,
Available on crate feature
alloc and non-no_zerocopy_panic_in_const_and_vec_try_reserve_1_57_0 only.Inserts
additional new items into Vec<Self> at position. The new
items are initialized with zeros. Read moreimpl<T, S> Immutable for Timed<T, S>
Source§impl<T, S> KnownLayout for Timed<T, S>where
T: KnownLayout,
impl<T, S> KnownLayout for Timed<T, S>where
T: KnownLayout,
Source§type PointerMetadata = <T as KnownLayout>::PointerMetadata
type PointerMetadata = <T as KnownLayout>::PointerMetadata
The type of metadata stored in a pointer to
Self. Read moreSource§fn size_for_metadata(meta: Self::PointerMetadata) -> Option<usize>
fn size_for_metadata(meta: Self::PointerMetadata) -> Option<usize>
Computes the size of an object of type
Self with the given pointer
metadata. Read moreSource§impl<T, S> Ord for Timed<T, S>
impl<T, S> Ord for Timed<T, S>
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the minimum of two values. Read more
Source§impl<T, S> PartialOrd for Timed<T, S>where
T: PartialOrd,
S: PartialOrd,
impl<T, S> PartialOrd for Timed<T, S>where
T: PartialOrd,
S: PartialOrd,
impl<T, S> StructuralPartialEq for Timed<T, S>
Source§impl<T, S> TryFromBytes for Timed<T, S>where
S: TryFromBytes,
T: TryFromBytes,
impl<T, S> TryFromBytes for Timed<T, S>where
S: TryFromBytes,
T: TryFromBytes,
Source§fn try_ref_from_bytes(
source: &[u8],
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
fn try_ref_from_bytes(
source: &[u8],
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
Source§fn try_ref_from_prefix(
source: &[u8],
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
fn try_ref_from_prefix(
source: &[u8],
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
Source§fn try_ref_from_suffix(
source: &[u8],
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
fn try_ref_from_suffix(
source: &[u8],
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
Source§fn try_mut_from_bytes(
bytes: &mut [u8],
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
fn try_mut_from_bytes(
bytes: &mut [u8],
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
Source§fn try_mut_from_prefix(
source: &mut [u8],
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
fn try_mut_from_prefix(
source: &mut [u8],
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
Source§fn try_mut_from_suffix(
source: &mut [u8],
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
fn try_mut_from_suffix(
source: &mut [u8],
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
Source§fn try_ref_from_bytes_with_elems(
source: &[u8],
count: usize,
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
fn try_ref_from_bytes_with_elems( source: &[u8], count: usize, ) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
Source§fn try_ref_from_prefix_with_elems(
source: &[u8],
count: usize,
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
fn try_ref_from_prefix_with_elems( source: &[u8], count: usize, ) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
Attempts to interpret the prefix of the given
source as a &Self with
a DST length equal to count. Read moreSource§fn try_ref_from_suffix_with_elems(
source: &[u8],
count: usize,
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
fn try_ref_from_suffix_with_elems( source: &[u8], count: usize, ) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
Attempts to interpret the suffix of the given
source as a &Self with
a DST length equal to count. Read moreSource§fn try_mut_from_bytes_with_elems(
source: &mut [u8],
count: usize,
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
fn try_mut_from_bytes_with_elems( source: &mut [u8], count: usize, ) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
Source§fn try_mut_from_prefix_with_elems(
source: &mut [u8],
count: usize,
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
fn try_mut_from_prefix_with_elems( source: &mut [u8], count: usize, ) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
Attempts to interpret the prefix of the given
source as a &mut Self
with a DST length equal to count. Read moreSource§fn try_mut_from_suffix_with_elems(
source: &mut [u8],
count: usize,
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
fn try_mut_from_suffix_with_elems( source: &mut [u8], count: usize, ) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
Attempts to interpret the suffix of the given
source as a &mut Self
with a DST length equal to count. Read moreSource§fn try_read_from_bytes(
source: &[u8],
) -> Result<Self, ConvertError<!, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
fn try_read_from_bytes(
source: &[u8],
) -> Result<Self, ConvertError<!, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
Source§fn try_read_from_prefix(
source: &[u8],
) -> Result<(Self, &[u8]), ConvertError<!, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
fn try_read_from_prefix(
source: &[u8],
) -> Result<(Self, &[u8]), ConvertError<!, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
Source§fn try_read_from_suffix(
source: &[u8],
) -> Result<(&[u8], Self), ConvertError<!, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
fn try_read_from_suffix(
source: &[u8],
) -> Result<(&[u8], Self), ConvertError<!, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
Auto Trait Implementations§
impl<T, S> Freeze for Timed<T, S>
impl<T, S> RefUnwindSafe for Timed<T, S>where
S: RefUnwindSafe,
T: RefUnwindSafe,
impl<T, S> Send for Timed<T, S>
impl<T, S> Sync for Timed<T, S>
impl<T, S> Unpin for Timed<T, S>
impl<T, S> UnsafeUnpin for Timed<T, S>where
S: UnsafeUnpin,
T: UnsafeUnpin,
impl<T, S> UnwindSafe for Timed<T, S>where
S: UnwindSafe,
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more