use linkrs_core::types::INVALID_EDGE_ID;
use linkrs_core::types::{EdgeId, Timestamp, VertexId};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct HotNbr {
pub endpoint: u32,
pub rank: i64,
pub edge_id: EdgeId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ColdStamps {
pub delete_ts: Timestamp,
}
impl HotNbr {
pub fn dead_gap() -> Self {
Self {
endpoint: 0,
rank: 0,
edge_id: INVALID_EDGE_ID,
}
}
}
impl ColdStamps {
pub fn dead_gap() -> Self {
Self { delete_ts: 0 }
}
#[inline]
pub fn is_live(&self) -> bool {
self.delete_ts == Timestamp::MAX
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Nbr {
pub endpoint: u32,
pub rank: i64,
pub edge_id: EdgeId,
pub delete_ts: Timestamp,
}
impl Nbr {
pub fn new(endpoint: u32, rank: i64, edge_id: EdgeId) -> Self {
Self {
endpoint,
rank,
edge_id,
delete_ts: Timestamp::MAX,
}
}
pub fn with_create_ts(
endpoint: u32,
rank: i64,
edge_id: EdgeId,
_create_ts: Timestamp,
) -> Self {
Self {
endpoint,
rank,
edge_id,
delete_ts: Timestamp::MAX,
}
}
pub fn with_timestamps(
endpoint: u32,
rank: i64,
edge_id: EdgeId,
delete_ts: Timestamp,
) -> Self {
Self {
endpoint,
rank,
edge_id,
delete_ts,
}
}
pub fn dead_gap() -> Self {
Self {
endpoint: 0,
rank: 0,
edge_id: INVALID_EDGE_ID,
delete_ts: 0,
}
}
#[inline]
pub(in crate::edge) fn is_alive_at(&self, ts: Timestamp) -> bool {
ts < self.delete_ts
}
#[inline]
pub fn hot(&self) -> HotNbr {
HotNbr {
endpoint: self.endpoint,
rank: self.rank,
edge_id: self.edge_id,
}
}
#[inline]
pub fn cold(&self) -> ColdStamps {
ColdStamps {
delete_ts: self.delete_ts,
}
}
#[inline]
pub fn from_parts(hot: HotNbr, cold: ColdStamps) -> Self {
Self {
endpoint: hot.endpoint,
rank: hot.rank,
edge_id: hot.edge_id,
delete_ts: cold.delete_ts,
}
}
#[inline]
pub fn to_vertex_id(&self) -> VertexId {
VertexId::edge_endpoint_key(self.endpoint, self.rank)
}
}