ps_ecc/polynomial/implementations/
from_iterator.rs1use crate::Polynomial;
2
3#[allow(clippy::cast_possible_truncation)] impl FromIterator<u8> for Polynomial {
5 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}