rlst/operator/space/
frame.rs

1//! A frame is a collection of elements of a space.
2
3use crate::operator::Element;
4
5/// A frame
6///
7/// A frame is a collection of elements of a space.
8pub trait Frame {
9    /// Element type
10    type E: Element;
11    /// Iterator
12    type Iter<'iter>: std::iter::Iterator<Item = &'iter Self::E>
13    where
14        Self: 'iter;
15    /// Mutable iterator
16    type IterMut<'iter>: std::iter::Iterator<Item = &'iter mut Self::E>
17    where
18        Self: 'iter;
19    /// Get an element
20    fn get(&self, index: usize) -> Option<&Self::E>;
21    /// Get a mutable element
22    fn get_mut(&mut self, index: usize) -> Option<&mut Self::E>;
23    /// Number of elements
24    fn len(&self) -> usize;
25    /// Is empty
26    fn is_empty(&self) -> bool {
27        self.len() == 0
28    }
29    /// Get iterator
30    fn iter(&self) -> Self::Iter<'_>;
31    /// Get mutable iterator
32    fn iter_mut(&mut self) -> Self::IterMut<'_>;
33    /// Add an element
34    fn push(&mut self, elem: Self::E);
35    /// Evaluate
36    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
44/// A vector frame
45pub struct VectorFrame<Elem: Element> {
46    data: Vec<Elem>,
47}
48
49impl<Elem: Element> VectorFrame<Elem> {
50    /// Create a new vector frame
51    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}