reed_solomon_16/
encoder_result.rs1use crate::rate::EncoderWork;
2
3pub struct EncoderResult<'a> {
14 work: &'a mut EncoderWork,
15}
16
17impl<'a> EncoderResult<'a> {
18 pub fn recovery(&self, index: usize) -> Option<&[u8]> {
24 self.work.recovery(index)
25 }
26
27 pub fn recovery_iter(&self) -> Recovery {
32 Recovery::new(self.work)
33 }
34}
35
36impl<'a> EncoderResult<'a> {
40 pub(crate) fn new(work: &'a mut EncoderWork) -> Self {
41 Self { work }
42 }
43}
44
45impl<'a> Drop for EncoderResult<'a> {
49 fn drop(&mut self) {
50 self.work.reset_received();
51 }
52}
53
54pub struct Recovery<'a> {
61 ended: bool,
62 next_index: usize,
63 work: &'a EncoderWork,
64}
65
66impl<'a> Iterator for Recovery<'a> {
70 type Item = &'a [u8];
71 fn next(&mut self) -> Option<&'a [u8]> {
72 if self.ended {
73 None
74 } else if let Some(next) = self.work.recovery(self.next_index) {
75 self.next_index += 1;
76 Some(next)
77 } else {
78 self.ended = true;
79 None
80 }
81 }
82}
83
84impl<'a> Recovery<'a> {
88 pub(crate) fn new(work: &'a EncoderWork) -> Self {
89 Self {
90 ended: false,
91 next_index: 0,
92 work,
93 }
94 }
95}
96
97#[cfg(test)]
101mod tests {
102 use super::*;
103 use crate::{test_util, ReedSolomonEncoder};
104
105 #[test]
106 fn encoder_result() {
110 let original = test_util::generate_original(2, 1024, 123);
111 let mut encoder = ReedSolomonEncoder::new(2, 3, 1024).unwrap();
112
113 for original in &original {
114 encoder.add_original_shard(original).unwrap();
115 }
116
117 let result: EncoderResult = encoder.encode().unwrap();
118
119 let mut all = Vec::new();
120 all.push(result.recovery(0).unwrap());
121 all.push(result.recovery(1).unwrap());
122 all.push(result.recovery(2).unwrap());
123 assert!(result.recovery(3).is_none());
124 test_util::assert_hash(all, test_util::LOW_2_3);
125
126 let mut iter: Recovery = result.recovery_iter();
127 let mut all = Vec::new();
128 all.push(iter.next().unwrap());
129 all.push(iter.next().unwrap());
130 all.push(iter.next().unwrap());
131 assert!(iter.next().is_none());
132 test_util::assert_hash(all, test_util::LOW_2_3);
133 }
134}