Skip to main content

ps_ecc/polynomial/implementations/
from_iterator.rs

1use crate::Polynomial;
2
3#[allow(clippy::cast_possible_truncation)] // len(coefficients) < u8::MAX
4impl FromIterator<u8> for Polynomial {
5    /// Collects coefficients from degree 0 (constant term) to the leading term.
6    ///
7    /// Consumes at most 255 elements; excess elements are ignored.
8    /// Leading zeros are trimmed. Safe for infinite iterators.
9    fn from_iter<I: IntoIterator<Item = u8>>(iter: I) -> Self {
10        let mut poly = Self::default();
11
12        poly.degree = poly
13            .coefficients
14            .iter_mut()
15            .zip(iter)
16            .map(|(coef, value)| *coef = value)
17            .count() as u8;
18
19        poly.trim_degree();
20
21        poly
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use crate::Polynomial;
28
29    #[test]
30    fn empty_iterator() {
31        let poly: Polynomial = std::iter::empty().collect();
32
33        assert_eq!(poly.degree(), 0);
34        assert_eq!(poly.coefficients(), &[0]);
35    }
36
37    #[test]
38    fn collect_vec() {
39        let poly: Polynomial = vec![1u8, 2, 3].into_iter().collect();
40
41        assert_eq!(poly.degree(), 2);
42        assert_eq!(poly.coefficients(), &[1, 2, 3]);
43    }
44
45    #[test]
46    fn collect_slice_copied() {
47        let slice: &[u8] = &[1, 2, 3];
48        let poly: Polynomial = slice.iter().copied().collect();
49
50        assert_eq!(poly.coefficients(), &[1, 2, 3]);
51    }
52
53    #[test]
54    fn trims_leading_zeros() {
55        let poly: Polynomial = [1u8, 2, 0, 0].into_iter().collect();
56
57        assert_eq!(poly.degree(), 1);
58        assert_eq!(poly.coefficients(), &[1, 2]);
59    }
60
61    #[test]
62    fn max_size() {
63        let poly: Polynomial = [1u8; 255].into_iter().collect();
64
65        assert_eq!(poly.degree(), 254);
66        assert_eq!(poly.coefficients().len(), 255);
67    }
68
69    #[test]
70    fn truncates_excess_elements() {
71        let poly: Polynomial = [1u8; 256].into_iter().collect();
72
73        assert_eq!(poly.degree(), 254);
74        assert_eq!(poly.coefficients().len(), 255);
75    }
76
77    #[test]
78    fn infinite_iterator() {
79        let poly: Polynomial = std::iter::repeat(1u8).collect();
80
81        assert_eq!(poly.degree(), 254);
82        assert_eq!(poly.coefficients().len(), 255);
83    }
84}