#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(transparent)]
pub struct TxnId(u64);
impl TxnId {
#[inline]
#[must_use]
pub const fn new(id: u64) -> Self {
Self(id)
}
#[inline]
#[must_use]
pub const fn get(self) -> u64 {
self.0
}
}
impl From<u64> for TxnId {
#[inline]
fn from(id: u64) -> Self {
Self(id)
}
}
impl From<TxnId> for u64 {
#[inline]
fn from(id: TxnId) -> Self {
id.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(transparent)]
pub struct ResourceId(u64);
impl ResourceId {
#[inline]
#[must_use]
pub const fn new(id: u64) -> Self {
Self(id)
}
#[inline]
#[must_use]
pub const fn get(self) -> u64 {
self.0
}
}
impl From<u64> for ResourceId {
#[inline]
fn from(id: u64) -> Self {
Self(id)
}
}
impl From<ResourceId> for u64 {
#[inline]
fn from(id: ResourceId) -> Self {
id.0
}
}
#[cfg(test)]
mod tests {
use super::{ResourceId, TxnId};
#[test]
fn test_txn_roundtrip_through_u64() {
let t = TxnId::new(u64::MAX);
assert_eq!(t.get(), u64::MAX);
assert_eq!(u64::from(t), u64::MAX);
assert_eq!(TxnId::from(7), TxnId::new(7));
}
#[test]
fn test_resource_roundtrip_through_u64() {
let r = ResourceId::new(0);
assert_eq!(r.get(), 0);
assert_eq!(u64::from(r), 0);
assert_eq!(ResourceId::from(7), ResourceId::new(7));
}
#[test]
fn test_distinct_ids_are_unequal() {
assert_ne!(TxnId::new(1), TxnId::new(2));
assert_ne!(ResourceId::new(1), ResourceId::new(2));
}
#[test]
fn test_ids_are_ordered_by_value() {
assert!(TxnId::new(1) < TxnId::new(2));
assert!(ResourceId::new(1) < ResourceId::new(2));
}
}