data_frame_rs/
data_frame.rs1use 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}