Skip to main content

parallel_disk_usage/hardlink/hardlink_list/
iter.rs

1use super::{HardlinkList, InodeKey, Value};
2use crate::{device::DeviceNumber, hardlink::LinkPathList, inode::InodeNumber};
3use dashmap::{iter::Iter as DashIter, mapref::multiple::RefMulti};
4use pipe_trait::Pipe;
5
6/// Iterator over entries in [`HardlinkList`].
7#[derive(derive_more::Debug)]
8#[debug(bound())]
9#[debug("Iter(..)")]
10pub struct Iter<'a, Size>(DashIter<'a, InodeKey, Value<Size>>);
11
12impl<Size> HardlinkList<Size> {
13    /// Iterate over the recorded entries.
14    pub fn iter(&self) -> Iter<'_, Size> {
15        self.0.iter().pipe(Iter)
16    }
17}
18
19/// [Item](Iterator::Item) of [`Iter`].
20#[derive(derive_more::Debug)]
21#[debug(bound())]
22#[debug("Item(..)")]
23pub struct Item<'a, Size>(RefMulti<'a, InodeKey, Value<Size>>);
24
25impl<'a, Size> Iterator for Iter<'a, Size> {
26    type Item = Item<'a, Size>;
27    fn next(&mut self) -> Option<Self::Item> {
28        self.0.next().map(Item)
29    }
30}
31
32impl<'a, Size> Item<'a, Size> {
33    /// The inode number of the file.
34    #[inline]
35    pub fn ino(&self) -> InodeNumber {
36        self.0.key().ino
37    }
38
39    /// The device number of the filesystem the inode belongs to.
40    #[inline]
41    pub fn dev(&self) -> DeviceNumber {
42        self.0.key().dev
43    }
44
45    /// Size of the file.
46    #[inline]
47    pub fn size(&self) -> &Size {
48        &self.0.value().size
49    }
50
51    /// Total number of links of the file, both listed (in [`Self::paths`]) and unlisted.
52    #[inline]
53    pub fn links(&self) -> u64 {
54        self.0.value().links
55    }
56
57    /// Paths to the detected links of the file.
58    #[inline]
59    pub fn paths(&self) -> &LinkPathList {
60        &self.0.value().paths
61    }
62}