use super::{HardlinkList, InodeKey, Value};
use crate::{device::DeviceNumber, hardlink::LinkPathList, inode::InodeNumber};
use dashmap::{iter::Iter as DashIter, mapref::multiple::RefMulti};
use pipe_trait::Pipe;
#[derive(derive_more::Debug)]
#[debug(bound())]
#[debug("Iter(..)")]
pub struct Iter<'a, Size>(DashIter<'a, InodeKey, Value<Size>>);
impl<Size> HardlinkList<Size> {
pub fn iter(&self) -> Iter<'_, Size> {
self.0.iter().pipe(Iter)
}
}
#[derive(derive_more::Debug)]
#[debug(bound())]
#[debug("Item(..)")]
pub struct Item<'a, Size>(RefMulti<'a, InodeKey, Value<Size>>);
impl<'a, Size> Iterator for Iter<'a, Size> {
type Item = Item<'a, Size>;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(Item)
}
}
impl<'a, Size> Item<'a, Size> {
#[inline]
pub fn ino(&self) -> InodeNumber {
self.0.key().ino
}
#[inline]
pub fn dev(&self) -> DeviceNumber {
self.0.key().dev
}
#[inline]
pub fn size(&self) -> &Size {
&self.0.value().size
}
#[inline]
pub fn links(&self) -> u64 {
self.0.value().links
}
#[inline]
pub fn paths(&self) -> &LinkPathList {
&self.0.value().paths
}
}