fast_pull/base/
total.rs

1use crate::ProgressEntry;
2
3pub trait Total {
4    fn total(&self) -> u64;
5}
6
7impl Total for ProgressEntry {
8    fn total(&self) -> u64 {
9        self.end.saturating_sub(self.start)
10    }
11}
12
13impl<T: Total> Total for Vec<T> {
14    fn total(&self) -> u64 {
15        self.iter().map(|r| r.total()).sum()
16    }
17}
18
19impl<T: Total> Total for [T] {
20    fn total(&self) -> u64 {
21        self.iter().map(|r| r.total()).sum()
22    }
23}
24
25impl<T: Total> Total for &T {
26    fn total(&self) -> u64 {
27        (*self).total()
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn test_range_total() {
37        let range = 10..20;
38        assert_eq!(range.total(), 10);
39    }
40
41    #[test]
42    fn test_vec_total() {
43        let ranges = vec![1..5, 10..15, 20..30];
44        assert_eq!(ranges.total(), (5 - 1) + (15 - 10) + (30 - 20));
45    }
46
47    #[test]
48    fn test_slice_total() {
49        let ranges = [1..5, 10..15, 20..30];
50        assert_eq!(ranges.total(), (5 - 1) + (15 - 10) + (30 - 20));
51    }
52
53    #[test]
54    fn test_empty_range() {
55        let range = 0..0;
56        assert_eq!(range.total(), 0);
57    }
58
59    #[test]
60    fn test_empty_vec() {
61        let ranges: Vec<ProgressEntry> = vec![];
62        assert_eq!(ranges.total(), 0);
63    }
64}