flash_lso/amf3/
element_cache.rs1use crate::amf3::length::Length;
2use std::cell::RefCell;
3use std::fmt::Debug;
4
5#[derive(Clone, Debug)]
7pub struct ElementCache<T> {
8 cache: RefCell<Vec<T>>,
9}
10
11impl<T> Default for ElementCache<T> {
12 fn default() -> Self {
14 ElementCache {
15 cache: RefCell::new(Vec::new()),
16 }
17 }
18}
19
20impl<T: PartialEq + Clone + Debug> ElementCache<T> {
21 #[inline]
23 pub(crate) fn has(&self, val: &T) -> bool {
24 self.cache.borrow().contains(val)
25 }
26
27 #[inline]
29 pub(crate) fn store(&self, val: T) {
30 if !self.has(&val) {
31 self.cache.borrow_mut().push(val);
32 }
33 }
34
35 #[inline]
37 pub fn get_element(&self, index: usize) -> Option<T> {
38 self.cache.borrow().get(index).cloned()
39 }
40
41 #[inline]
43 pub(crate) fn get_index(&self, val: T) -> Option<usize> {
44 self.cache.borrow().iter().position(|i| *i == val)
45 }
46
47 pub(crate) fn to_length(&self, val: T, length: u32) -> Length {
51 if let Some(i) = self.get_index(val) {
52 Length::Reference(i)
53 } else {
54 Length::Size(length)
55 }
56 }
57
58 pub(crate) fn to_length_store(&self, val: T, length: u32) -> Length {
60 let len = self.to_length(val.clone(), length);
61 self.store(val);
62 len
63 }
64}
65
66impl<T: PartialEq + Clone + Debug> ElementCache<Vec<T>> {
67 #[inline]
69 pub(crate) fn store_slice(&self, val: &[T]) {
70 self.store(val.to_vec());
71 }
72
73 #[inline]
75 pub fn get_slice_index(&self, val: &[T]) -> Option<usize> {
76 self.get_index(val.to_vec())
77 }
78}