rrpack_basis/frames/
frame.rs

1use derive_more::Deref;
2use serde::{Deserialize, Serialize};
3use std::collections::VecDeque;
4
5static DEFAULT_SIZE: u32 = 20;
6
7#[derive(Debug, Clone, Serialize, Deserialize, Deref)]
8pub struct Frame<T> {
9    /// Size specified to have predictable seialization behavior.
10    size: u32,
11    #[deref]
12    frame: VecDeque<T>,
13}
14
15impl<T> Default for Frame<T> {
16    fn default() -> Self {
17        Self::new(DEFAULT_SIZE)
18    }
19}
20
21impl<T> Frame<T> {
22    pub fn new(size: u32) -> Self {
23        Self {
24            size,
25            frame: VecDeque::with_capacity(size as usize),
26        }
27    }
28
29    /*
30    /// Returns a reference to the inserted element.
31    pub fn insert(&mut self, item: T) -> &T {
32        self.insert_pop(item);
33        self.frame.back().unwrap()
34    }
35    */
36
37    pub fn insert_pop(&mut self, item: T) -> Option<T> {
38        let result = {
39            if self.frame.len() > self.size as usize {
40                self.frame.pop_front()
41            } else {
42                None
43            }
44        };
45        self.frame.push_back(item);
46        result
47    }
48
49    pub fn size(&self) -> u32 {
50        self.size
51    }
52
53    pub fn clear(&mut self) {
54        self.frame.clear()
55    }
56}