rlst/operator/space/
frame.rs1use crate::operator::Element;
4
5pub trait Frame {
9 type E: Element;
11 type Iter<'iter>: std::iter::Iterator<Item = &'iter Self::E>
13 where
14 Self: 'iter;
15 type IterMut<'iter>: std::iter::Iterator<Item = &'iter mut Self::E>
17 where
18 Self: 'iter;
19 fn get(&self, index: usize) -> Option<&Self::E>;
21 fn get_mut(&mut self, index: usize) -> Option<&mut Self::E>;
23 fn len(&self) -> usize;
25 fn is_empty(&self) -> bool {
27 self.len() == 0
28 }
29 fn iter(&self) -> Self::Iter<'_>;
31 fn iter_mut(&mut self) -> Self::IterMut<'_>;
33 fn push(&mut self, elem: Self::E);
35 fn evaluate(&self, coeffs: &[<Self::E as Element>::F], result: &mut Self::E) {
37 assert_eq!(coeffs.len(), self.len());
38 for (elem, coeff) in self.iter().zip(coeffs.iter().copied()) {
39 result.axpy_inplace(coeff, elem);
40 }
41 }
42}
43
44pub struct VectorFrame<Elem: Element> {
46 data: Vec<Elem>,
47}
48
49impl<Elem: Element> VectorFrame<Elem> {
50 pub fn new() -> Self {
52 Self { data: Vec::new() }
53 }
54}
55
56impl<Elem: Element> Default for VectorFrame<Elem> {
57 fn default() -> Self {
58 Self::new()
59 }
60}
61
62impl<Elem: Element> Frame for VectorFrame<Elem> {
63 type E = Elem;
64
65 type Iter<'iter> = std::slice::Iter<'iter, Self::E>
66 where
67 Self: 'iter;
68
69 type IterMut<'iter> = std::slice::IterMut<'iter, Self::E>
70 where
71 Self: 'iter;
72
73 fn get(&self, index: usize) -> Option<&Self::E> {
74 self.data.get(index)
75 }
76
77 fn get_mut(&mut self, index: usize) -> Option<&mut Self::E> {
78 self.data.get_mut(index)
79 }
80
81 fn len(&self) -> usize {
82 self.data.len()
83 }
84
85 fn iter(&self) -> Self::Iter<'_> {
86 self.data.iter()
87 }
88
89 fn iter_mut(&mut self) -> Self::IterMut<'_> {
90 self.data.iter_mut()
91 }
92
93 fn push(&mut self, elem: Self::E) {
94 self.data.push(elem)
95 }
96}