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}