#[repr(C)]
#[derive(Copy, Clone, Default, Debug, Eq, PartialEq)]
pub(crate) struct PendingEdge {
pub(crate) source: u32,
pub(crate) target: u32,
pub(crate) connection_type: u64,
}
const _: () = assert!(std::mem::size_of::<PendingEdge>() == 16);
const _: () = assert!(std::mem::align_of::<PendingEdge>() == 8);
const _: () = assert!(std::mem::offset_of!(PendingEdge, source) == 0);
const _: () = assert!(std::mem::offset_of!(PendingEdge, target) == 4);
const _: () = assert!(std::mem::offset_of!(PendingEdge, connection_type) == 8);
unsafe impl crate::graph::storage::mapped::mmap_vec::MmapPod for PendingEdge {}
#[repr(C)]
#[derive(Copy, Clone, Default, Debug, serde::Serialize, serde::Deserialize)]
pub struct CsrEdge {
pub peer: u32,
pub edge_idx: u32,
}
unsafe impl crate::graph::storage::mapped::mmap_vec::MmapPod for CsrEdge {}
const _: () = assert!(std::mem::size_of::<CsrEdge>() == 8);
#[repr(C)]
#[derive(Copy, Clone, Default)]
pub(super) struct MergeSortEntry {
pub(super) key: u32, pub(super) padding: u32, pub(super) conn_type: u64, pub(super) peer: u32, pub(super) orig_idx: u32, }
unsafe impl crate::graph::storage::mapped::mmap_vec::MmapPod for MergeSortEntry {}
const _: () = assert!(std::mem::size_of::<MergeSortEntry>() == 24);
#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct EdgeEndpoints {
pub source: u32,
pub target: u32,
pub connection_type: u64,
}
unsafe impl crate::graph::storage::mapped::mmap_vec::MmapPod for EdgeEndpoints {}
const _: () = assert!(std::mem::size_of::<EdgeEndpoints>() == 16);
pub const TOMBSTONE_EDGE: u32 = u32::MAX;
#[repr(C)]
#[derive(Copy, Clone, Default, Debug)]
pub struct DiskNodeSlot {
pub node_type: u64, pub row_id: u32, pub flags: u32, }
unsafe impl crate::graph::storage::mapped::mmap_vec::MmapPod for DiskNodeSlot {}
const _: () = assert!(std::mem::size_of::<DiskNodeSlot>() == 16);
impl DiskNodeSlot {
pub(super) const ALIVE_BIT: u32 = 1;
#[inline]
pub fn is_alive(&self) -> bool {
self.flags & Self::ALIVE_BIT != 0
}
}
#[cfg(test)]
mod tests {
use super::PendingEdge;
use crate::graph::storage::mapped::mmap_vec::MmapOrVec;
#[test]
fn pending_edge_raw_bytes_round_trip_heap_and_mapped() {
let record = PendingEdge {
source: 0x1122_3344,
target: 0x5566_7788,
connection_type: 0x99aa_bbcc_ddee_ff00,
};
let expected = [
record.source.to_ne_bytes().as_slice(),
record.target.to_ne_bytes().as_slice(),
record.connection_type.to_ne_bytes().as_slice(),
]
.concat();
let heap = MmapOrVec::from_vec(vec![record]);
assert_eq!(heap.as_raw_bytes(), expected);
assert_eq!(heap.get(0), record);
let dir = tempfile::tempdir().unwrap();
let mapped_path = dir.path().join("pending-edge.mmap");
let saved_path = dir.path().join("pending-edge.raw");
let mut mapped = MmapOrVec::mapped(&mapped_path, 1).unwrap();
mapped.push(record);
assert_eq!(mapped.as_raw_bytes(), expected);
mapped.save_to_file(&saved_path).unwrap();
let reloaded = MmapOrVec::<PendingEdge>::load_mapped(&saved_path, 1).unwrap();
assert_eq!(reloaded.as_raw_bytes(), expected);
assert_eq!(reloaded.get(0), record);
}
}