use super::node_ref::NodeStorageRef;
use crate::graph::variants::storage_variants3::StorageVariants3;
use raphtory_api::core::entities::VID;
use raphtory_core::storage::ReadLockedStorage;
use rayon::iter::ParallelIterator;
#[cfg(feature = "storage")]
use crate::disk::storage_interface::nodes_ref::DiskNodesRef;
#[derive(Debug)]
pub enum NodesStorageEntry<'a> {
Mem(&'a ReadLockedStorage),
Unlocked(ReadLockedStorage),
#[cfg(feature = "storage")]
Disk(DiskNodesRef<'a>),
}
macro_rules! for_all_variants {
($value:expr, $pattern:pat => $result:expr) => {
match $value {
NodesStorageEntry::Mem($pattern) => StorageVariants3::Mem($result),
NodesStorageEntry::Unlocked($pattern) => StorageVariants3::Unlocked($result),
#[cfg(feature = "storage")]
NodesStorageEntry::Disk($pattern) => StorageVariants3::Disk($result),
}
};
}
impl<'a> NodesStorageEntry<'a> {
pub fn node(&self, vid: VID) -> NodeStorageRef<'_> {
match self {
NodesStorageEntry::Mem(store) => NodeStorageRef::Mem(store.get_entry(vid)),
NodesStorageEntry::Unlocked(store) => NodeStorageRef::Mem(store.get_entry(vid)),
#[cfg(feature = "storage")]
NodesStorageEntry::Disk(store) => NodeStorageRef::Disk(store.node(vid)),
}
}
pub fn len(&self) -> usize {
match self {
NodesStorageEntry::Mem(store) => store.len(),
NodesStorageEntry::Unlocked(store) => store.len(),
#[cfg(feature = "storage")]
NodesStorageEntry::Disk(store) => store.len(),
}
}
pub fn par_iter(&self) -> impl ParallelIterator<Item = NodeStorageRef<'_>> {
for_all_variants!(self, nodes => nodes.par_iter().map(|n| n.into()))
}
pub fn iter(&self) -> impl Iterator<Item = NodeStorageRef<'_>> {
for_all_variants!(self, nodes => nodes.iter().map(|n| n.into()))
}
}