parallel_disk_usage/hardlink/hardlink_list/
iter.rs

1use super::{HardlinkList, Value};
2use crate::{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, InodeNumber, 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, InodeNumber, 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()
37    }
38
39    /// Size of the file.
40    #[inline]
41    pub fn size(&self) -> &Size {
42        &self.0.value().size
43    }
44
45    /// Total number of links of the file, both listed (in [`Self::paths`]) and unlisted.
46    #[inline]
47    pub fn links(&self) -> u64 {
48        self.0.value().links
49    }
50
51    /// Paths to the detected links of the file.
52    #[inline]
53    pub fn paths(&self) -> &LinkPathList {
54        &self.0.value().paths
55    }
56}