Struct HlcTimestamp

Source
pub struct HlcTimestamp(/* private fields */);
Expand description

Hybrid logical clock (HLC) timestamp.

This is a lock-free implementation of a hybrid logical clock (HLC) timestamp.

The timestamp is represented as a 64-bit unsigned integer. The upper 42 bits represent the physical time in milliseconds since a custom epoch, and the lower 22 bits represent the logical clock count.

Normally, you don’t need to worry about the details of the representation.

Whenever you need to create a new timestamp, use the new() to create a timestamp with the current time, or from_parts() to create a timestamp with a specific Unix timestamp (in ms) and logical clock count.

When you need to update the timestamp, use the update() method.

Finally, you can use the as_u64() method to get the raw data, which is guaranteed to be monotonically increasing and capturing the happens-before relationship.

To get the physical time and logical clock count, use the timestamp() and count() methods respectively.

Implementations§

Source§

impl HlcTimestamp

Source

pub fn new() -> Self

Creates a new HLC timestamp.

Source

pub fn from_parts(pt: i64, lc: u64) -> HlcResult<Self>

Creates a new HLC timestamp from the given physical time and logical clock count.

Source

pub fn update<F>(&self, new_values: F) -> HlcResult<HlcTimestamp>
where F: Fn(i64, u64) -> HlcResult<(i64, u64)>,

Sets the physical time and logical clock count.

Expected closure gets the current physical time and logical clock count at the moment of the call and must return the new values for both.

This is an atomic operation that ensures thread safety in a lock-free fashion. Either both values are updated or none are.

Source

pub fn as_u64(&self) -> u64

Returns the current HLC timestamp as a number.

Source

pub fn from_u64(value: u64) -> HlcResult<Self>

Creates a new HLC timestamp from the given u64 value.

The encoded value should be in the format of the HLC timestamp.

Source

pub fn parts(&self) -> (i64, u64)

Returns the current physical timestamp and logical clock count as a tuple.

This operation is atomic, as it uses a single load operation to get the inner value.

Trait Implementations§

Source§

impl Clone for HlcTimestamp

Source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for HlcTimestamp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for HlcTimestamp

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Ord for HlcTimestamp

Source§

fn cmp(&self, other: &Self) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for HlcTimestamp

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for HlcTimestamp

Source§

fn partial_cmp(&self, other: &Self) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl TryFrom<u64> for HlcTimestamp

Source§

type Error = HlcError

The type returned in the event of a conversion error.
Source§

fn try_from(value: u64) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl Eq for HlcTimestamp

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.