1use crate::common::*;
2
3#[derive(Debug, Clone)]
5pub struct Count<T> {
6 count: usize,
7 _phantom: PhantomData<T>,
8}
9
10impl<T> Count<T> {
11 pub fn get(&self) -> usize {
12 self.count
13 }
14}
15
16impl<T> Default for Count<T> {
17 fn default() -> Self {
18 Self {
19 count: 0,
20 _phantom: PhantomData,
21 }
22 }
23}
24
25impl<A> FromIterator<A> for Count<A> {
26 fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self {
27 Self {
28 count: iter.into_iter().count(),
29 _phantom: PhantomData,
30 }
31 }
32}
33
34impl<A> Extend<A> for Count<A> {
35 fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T) {
36 self.count += iter.into_iter().count();
37 }
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn count_test() {
46 {
47 let mut count: Count<_> = iter::empty().collect();
48 count.extend(0..10);
49 assert!(count.get() == 10);
50 }
51
52 {
53 let mut count: Count<_> = (0..10).collect();
54 assert!(count.get() == 10);
55
56 count.extend(10..20);
57 assert!(count.get() == 20);
58
59 count.extend(iter::empty());
60 assert!(count.get() == 20);
61 }
62 }
63}