fast_pull/base/
total.rs

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