data_frame_rs/
data_frame.rs

1use std::hash::BuildHasherDefault;
2use std::collections::HashMap;
3use twox_hash::XxHash64;
4use std::fmt::Debug;
5use super::DroppedValueConsumer;
6
7
8pub struct DataFrame<T, C> where C: DroppedValueConsumer<T> {
9    size: usize,
10    index: usize,
11    items: HashMap<usize, T, BuildHasherDefault<XxHash64>>,
12    consumer: C,
13}
14
15impl<T, C> DataFrame<T, C> where C: DroppedValueConsumer<T> {
16    pub fn new( size: usize, consumer: C ) -> Self {
17        Self {
18            size,
19            index: 0,
20            items: HashMap::with_capacity_and_hasher(size, BuildHasherDefault::<XxHash64>::default()),
21            consumer,
22        }
23    }
24    pub fn from_frame( items: Vec<T>, consumer: C ) -> Self {
25        let size = items.len();
26        Self {
27            size,
28            index: 0,
29            items: HashMap::with_capacity_and_hasher(size, BuildHasherDefault::<XxHash64>::default()),
30            consumer,
31        }
32    }
33    pub fn len( &self ) -> usize {
34        self.size
35    }
36    fn remove_overflow( &mut self ) {
37        if self.index > self.size {
38            let val = self.items.remove(&(self.index - self.size));
39            self.consumer.consume(val.unwrap()); 
40        }
41    }
42    pub fn get( &self, index: usize ) -> Option<&T> {
43        self.items.get(&(self.index - self.size + index + 1))
44    }
45    pub fn get_slice( &self ) -> Vec<Option<&T>> {
46        let mut res = vec![];
47        for i in (self.index - self.size + 1)..=self.index {
48            res.push(self.items.get(&i));
49        }
50        res
51    }
52    pub fn add( &mut self, item: T ) {
53        self.index += 1;
54        self.items.insert(self.index, item);
55        self.remove_overflow();
56    } 
57}
58
59impl<T, C> Debug for DataFrame<T, C> where C: DroppedValueConsumer<T> + Default  {
60    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
61        f.debug_struct("DataFrame").field("size", &self.size).field("index", &self.index).finish()
62    }
63}
64
65#[cfg(test)]
66mod test {
67    use super::DataFrame;
68    use crate::DefaultConsumer;
69
70    #[test]
71    pub fn test_1() {
72        let mut data_frame = DataFrame::new(3, DefaultConsumer::new());
73        assert_eq!(data_frame.len(), 3);
74        data_frame.add(5);
75        data_frame.add(4);
76        data_frame.add(3);
77
78        assert_eq!(data_frame.get_slice(), vec![Some(&5), Some(&4), Some(&3)]);
79
80        data_frame.add(3);
81
82        assert_eq!(data_frame.get_slice(), vec![Some(&4), Some(&3), Some(&3)]);
83
84        data_frame.add(20);
85
86        assert_eq!(data_frame.get(0), Some(&3));        
87        assert_eq!(data_frame.get(1), Some(&3));
88        assert_eq!(data_frame.get(2), Some(&20));
89    }
90}